Week 13's assignment
#define trigPin 6
#define echoPin 7
#define redLEDPin 10
#define blueLEDPin 11
#define greenLEDPin 9
int redValue = 0;
int blueValue = 0;
int greenValue = 0;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
for(int pinNumber = 9; pinNumber<12; pinNumber++){
pinMode(pinNumber, OUTPUT);
//digitalWrite(pinNumber, LOW);
}
}
void loop() {
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
Serial.println(distance);
delay(1);
//read the distance value and change the color of the LED according to it.
if(distance<10){
redValue = 255;
greenValue = 0;
blueValue = 0;
}
else if(distance >=10 && distance < 20){
redValue = 100;
greenValue = 255;
blueValue = 0;
}
else if(distance >=20){
redValue = 0;
greenValue = 255;
blueValue = 0;
}
analogWrite(redLEDPin, redValue);
analogWrite(blueLEDPin, blueValue);
analogWrite(greenLEDPin, greenValue);
delay(1);
}
For testing I used an Arduino board with the sensor and a RGB. Each color pin of the LED is connected to the Arduino through a 220ohm resistor.Week13 - Test1 from Thomas Feminier on Vimeo.
#define trigPin 6
#define echoPin 7
#define redLEDPin 10
#define blueLEDPin 11
#define greenLEDPin 9
int redValue = 0;
int blueValue = 0;
int greenValue = 0;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
for(int pinNumber = 9; pinNumber<12; pinNumber++){
pinMode(pinNumber, OUTPUT);
//digitalWrite(pinNumber, LOW);
}
}
void loop() {
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
Serial.println(distance);
delay(1);
//read the distance value and change the color of the LED according to it.
redValue = 255-(distance*4);
greenValue = distance*4;
blueValue = 0;
analogWrite(redLEDPin, redValue);
analogWrite(blueLEDPin, blueValue);
analogWrite(greenLEDPin, greenValue);
delay(1);
}
And the proof video of this code :Week13 - Test2 from Thomas Feminier on Vimeo.
Microcontroller pins generally have three states: "high" (5 V), "low" (0 V) and "input". Input mode puts the pin into a high-impedance state, which, electrically speaking, "disconnects" that pin from the circuit, meaning little or no current will flow through it. This allows the circuit to see any number of pins connected at any time, simply by changing the state of the pin.
/* Charliplexing 12 LEDs
const int LED_1 = 13; //LED row 1
const int LED_2 = 12; //LED row 2
const int LED_3 = 11; //LED row 3
const int LED_4 = 10; //LED row 4
void setup()
{
}
void loop()
{
//turn on LED L1
pinMode(LED_1, OUTPUT); //row 1
digitalWrite(LED_1, LOW);
pinMode(LED_2, OUTPUT); //row 2
digitalWrite(LED_2, HIGH);
pinMode(LED_3, INPUT); //row 3
digitalWrite(LED_3, LOW);
pinMode(LED_4, INPUT); //row 4
digitalWrite(LED_4, LOW);
delay(2000);
//turn on LED L2
pinMode(LED_1, INPUT); //row 1
digitalWrite(LED_1, LOW);
pinMode(LED_2, OUTPUT); //row 2
digitalWrite(LED_2, LOW);
pinMode(LED_3, OUTPUT); //row 3
digitalWrite(LED_3, HIGH);
pinMode(LED_4, INPUT); //row 4
digitalWrite(LED_4, LOW);
delay(2000);
//turn on LED L3
pinMode(LED_1, INPUT); //row 1
digitalWrite(LED_1, LOW);
pinMode(LED_2, INPUT); //row 2
digitalWrite(LED_2, LOW);
pinMode(LED_3, OUTPUT); //row 3
digitalWrite(LED_3, LOW);
pinMode(LED_4, INPUT); //row 4
digitalWrite(LED_4, HIGH);
delay(2000);
//turn on LED L4
pinMode(LED_1, INPUT); //row 1
digitalWrite(LED_1, LOW);
pinMode(LED_2, INPUT); //row 2
digitalWrite(LED_2, LOW);
pinMode(LED_3, OUTPUT); //row 3
digitalWrite(LED_3, HIGH);
pinMode(LED_4, INPUT); //row 4
digitalWrite(LED_4, LOW);
delay(2000);
//turn on LED L5
pinMode(LED_1, INPUT); //row 1
digitalWrite(LED_1, LOW);
pinMode(LED_2, OUTPUT); //row 2
digitalWrite(LED_2, HIGH);
pinMode(LED_3, OUTPUT); //row 3
digitalWrite(LED_3, LOW);
pinMode(LED_4, INPUT); //row 4
digitalWrite(LED_4, LOW);
delay(2000);
//turn on LED L6
pinMode(LED_1, OUTPUT); //row 1
digitalWrite(LED_1, HIGH);
pinMode(LED_2, OUTPUT); //row 2
digitalWrite(LED_2, LOW);
pinMode(LED_3, INPUT); //row 3
digitalWrite(LED_4, LOW);
pinMode(LED_4, INPUT); //row 4
digitalWrite(LED_4, LOW);
delay(2000);
//turn on LED L7
pinMode(LED_1, OUTPUT); //row 1
digitalWrite(LED_1, HIGH);
pinMode(LED_2, INPUT); //row 2
digitalWrite(LED_2, LOW);
pinMode(LED_3, OUTPUT); //row 3
digitalWrite(LED_3, LOW);
pinMode(LED_4, INPUT); //row 4
digitalWrite(LED_4, LOW);
delay(2000);
//turn on LED L8
pinMode(LED_1, OUTPUT); //row 1
digitalWrite(LED_1, LOW);
pinMode(LED_2, INPUT); //row 2
digitalWrite(LED_2, LOW);
pinMode(LED_3, OUTPUT); //row 3
digitalWrite(LED_3, HIGH);
pinMode(LED_4, INPUT); //row 4
digitalWrite(LED_4, LOW);
delay(2000);
//turn on LED L9
pinMode(LED_1, OUTPUT); //row 1
digitalWrite(LED_1, LOW);
pinMode(LED_2, INPUT); //row 2
digitalWrite(LED_2, LOW);
pinMode(LED_3, INPUT); //row 3
digitalWrite(LED_3, LOW);
pinMode(LED_4, OUTPUT); //row 4
digitalWrite(LED_4, HIGH);
delay(2000);
//turn on LED L10
pinMode(LED_1, OUTPUT); //row 1
digitalWrite(LED_1, HIGH);
pinMode(LED_2, INPUT); //row 2
digitalWrite(LED_2, LOW);
pinMode(LED_3, INPUT); //row 3
digitalWrite(LED_3, LOW);
pinMode(LED_4, OUTPUT); //row 4
digitalWrite(LED_4, LOW);
delay(2000);
//turn on LED L11
pinMode(LED_1, INPUT); //row 1
digitalWrite(LED_1, LOW);
pinMode(LED_2, OUTPUT); //row 2
digitalWrite(LED_2, HIGH);
pinMode(LED_3, INPUT); //row 3
digitalWrite(LED_3, LOW);
pinMode(LED_4, OUTPUT); //row 4
digitalWrite(LED_4, LOW);
delay(2000);
//turn on LED L12
pinMode(LED_1, INPUT); //row 1
digitalWrite(LED_1, LOW);
pinMode(LED_2, OUTPUT); //row 2
digitalWrite(LED_2, LOW);
pinMode(LED_3, INPUT); //row 3
digitalWrite(LED_3, LOW);
pinMode(LED_4, OUTPUT); //row 4
digitalWrite(LED_4, HIGH);
delay(2000);
}
Week13 - Simulation1 from Thomas Feminier on Vimeo.
Week13 - Simulation2 from Thomas Feminier on Vimeo.
const int LED_1 = 13; //LED row 1
const int LED_2 = 12; //LED row 2
const int LED_3 = 11; //LED row 3
const int LED_4 = 10; //LED row 4
const byte pins[4] = {LED_1, LED_2, LED_3, LED_4};
const byte LEDsPinsConnection[12][2] = {
{1, 0}, {2, 1}, {3, 2}, {2, 3}, {1, 2}, {0, 1}, {0, 2}, {2, 0}, {3, 0}, {0, 3}, {1, 3}, {3, 1}
};
bool LEDstates[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
void setup() {
// initialize timer1
cli(); // disable all interrupts
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 65275; // preload timer 65536 - (16000000/1024/60)
bitSet(TCCR1B, CS10); // 1024 prescaler
bitSet(TCCR1B, CS12);
bitSet(TIMSK1, TOIE1); // enable timer overflow interrupt
sei(); // enable all interrupts
}
ISR(TIMER1_OVF_vect) { // interrupt service routine
cli();
TCNT1 = 65275; // preload timer
updateLEDstates();
sei();
}
void loop() {
for (byte i = 0; i < 12; i++) {
LEDstates[i] = 1;
delay(1000);
}
for (byte i = 0; i < 12; i++)
LEDstates[i] = 0;
delay(000);
}
void updateLEDstates() {
for (byte i = 0; i < 12; i++) {
if (LEDstates[i] == 1) {
pinMode(pins[LEDsPinsConnection[i][0]], OUTPUT); //put the LED Anode to OUTPUT
pinMode(pins[LEDsPinsConnection[i][1]], OUTPUT); //put the LED Cathode to OUTPUT
digitalWrite(pins[LEDsPinsConnection[i][0]], HIGH); //put the LED Anode to HIGH
digitalWrite(pins[LEDsPinsConnection[i][1]], LOW); //put the LED Chatode to LOW
//delayMicroseconds(500);
pinMode(pins[LEDsPinsConnection[i][0]], INPUT); //put the LED Anode to INPUT
pinMode(pins[LEDsPinsConnection[i][1]], INPUT); //put the LED Cathode to INPUT
}
}
}
Week13 - Final from Thomas Feminier on Vimeo.
/* Example 2 for Chaplex - a library to control charlieplexed leds
* *** controlling led bar with output via timer2 interrupt ***
*
* using minimal multiplex steps to control all leds
*
* author Stefan Götze
* version 1.0
*
* only tested with Arduino Uno
*/
#include "Chaplex.h"
byte ctrlpins[] = {13,12,11,10}; //Arduino pins controlling charlieplexed leds
#define PINS 4 //number of these pins
#define DELAY 1000 //speed of switching leds in bar on and off
Chaplex myCharlie(ctrlpins, PINS); //control instance
charlieLed myLeds[12] = {
{1, 0}, {2, 1}, {3, 2}, {2, 3}, {1, 2}, {0, 1}, {0, 2}, {2, 0}, {3, 0}, {0, 3}, {1, 3}, {3, 1}
};
byte timer2TCNT2 = 178; //preload timer 256-16MHz/1024/78 = near 5 ms
void setup() {
// initialize timer2
noInterrupts(); //disable all interrupts
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = timer2TCNT2;
TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20); //prescaler 1024 = 64 micro secs
TIMSK2 |= (1 << TOIE2); //enable timer overflow interrupt
interrupts(); //enable all interrupts
}
ISR(TIMER2_OVF_vect) { //timer2 interrupt routine
myCharlie.outRow(); //output for one led row
TCNT2 = timer2TCNT2; //preload timer for next interrupt
}
void loop() {
for (int i=0; i< 12; i++) {
myCharlie.ledWrite(myLeds[i], ON);
delay(DELAY);
}
for (int i=0; i<12; i++) {
myCharlie.ledWrite(myLeds[i], OFF);
delay(DELAY);
}
}