Last active
August 29, 2015 14:20
-
-
Save giltesa/2c39ac29971bf5a531f7 to your computer and use it in GitHub Desktop.
Arduino: Escalones luminosos
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define count(x) sizeof(x)/sizeof(*x) | |
#define pSPEED A0 // Potenciometro para regular el tiempo que se tarda en hacer el traspaso de tiempo entre escalones | |
#define pLIGHTLED A1 // Potenciometro para regular la intensidad de brillo del primer y ultimo escalon. | |
#define pLDR A2 // LDR para que se activen o no las luces. | |
#define pBUTTON A3 // Interruptor para el activado manual de la luz. | |
#define pUP A4 // Ultrasonidos escalon inferior (subes) | |
#define pDOWN A5 // Ultrasonidos escalon superior (bajas) | |
#define vLDR 100 // Si la lectura del LDR es inferior a este valor las luces se encenderan. | |
#define TIMEADD 5000 // Se suman X milisegundos al cruzar los ultrasonidos. | |
unsigned long sleep; | |
byte lightLDR, lightLED; | |
boolean eBTN = false; | |
struct LED{ | |
byte pin; | |
int brightness; | |
unsigned long timeUp; | |
unsigned long timeDown; | |
}; | |
LED led[14]; | |
void setup() | |
{ | |
led[0].pin = 5; // Escalon 1 con ajuste de brillo (PWM) | |
led[1].pin = 0; | |
led[2].pin = 1; | |
led[3].pin = 2; | |
led[4].pin = 3; | |
led[5].pin = 4; | |
led[6].pin = 7; | |
led[7].pin = 8; | |
led[8].pin = 9; | |
led[9].pin = 10; | |
led[10].pin = 11; | |
led[11].pin = 12; | |
led[12].pin = 13; | |
led[13].pin = 6; // Escalon 14 con ajuste de brillo (PWM) | |
for( int i=0 ; i<count(led) ; i++ ) | |
{ | |
led[i].brightness = -1; | |
led[i].timeUp = 0; | |
led[i].timeDown = 0; | |
pinMode( led[i].pin, OUTPUT); | |
} | |
led[0].brightness = 0; | |
led[count(led)-1].brightness = 0; | |
} | |
void loop() | |
{ | |
sleep = map(analogRead(pSPEED), 0, 1023, 0, 1000); | |
lightLDR = map(analogRead(pLDR), 0, 1023, 0, 255 ); | |
lightLED = map(analogRead(pLIGHTLED), 0, 1023, 0, 255 ); | |
// Modo manual, todos los leds encendidos: | |
if( digitalRead(pBUTTON) ) | |
{ | |
eBTN = true; | |
for( int i=0 ; i<count(led) ; i++ ) | |
digitalWrite( led[i].pin, HIGH); | |
} | |
// Apaga el modo manual, todos los leds apagados: | |
else if( eBTN ) | |
{ | |
eBTN = false; | |
for( int i=0 ; i<count(led) ; i++ ) | |
{ | |
led[i].timeUp = 0; | |
led[i].timeDown = 0; | |
digitalWrite( led[i].pin, LOW); | |
} | |
} | |
// Modo automatico (solo con poca luz): | |
else if( lightLDR < vLDR ) | |
{ | |
for( int i=0 ; i<count(led) ; i++ ) | |
{ | |
// Enciende el escalon si tiene tiempo: | |
if( led[i].timeUp == 0 && led[i].timeDown == 0 ) | |
digitalWrite(led[i].pin, LOW); | |
else if( led[i].brightness != -1 ) | |
analogWrite(led[i].pin, lightLED); | |
else | |
digitalWrite(led[i].pin, HIGH); | |
// Desplaza los tiempos entre escalones: | |
if( i == 0 ) | |
{ | |
led[i].timeUp = (led[i].timeUp - sleep > 0 ? led[i].timeUp - sleep : 0); | |
led[i+1].timeUp += sleep; | |
led[i].timeDown = !hasTime(i, 'D') ? 0 : led[i].timeDown; | |
} | |
else if( i == count(led)+1 ) | |
{ | |
led[i].timeDown = (led[i].timeDown - sleep > 0 ? led[i].timeDown - sleep : 0); | |
led[i-1].timeDown += sleep; | |
led[i].timeUp = !hasTime(i, 'U') ? 0 : led[i].timeUp; | |
} | |
else | |
{ | |
led[i].timeUp = (led[i].timeUp - sleep > 0 ? led[i].timeUp - sleep : 0); | |
led[i+1].timeUp += sleep; | |
led[i].timeDown = (led[i].timeDown - sleep > 0 ? led[i].timeDown - sleep : 0); | |
led[i-1].timeDown += sleep; | |
} | |
delay(sleep); | |
} | |
// Al cruzar un sensor, suma tiempo al primer o ultimo escalon: | |
if( digitalRead(pUP) ) | |
{ | |
while(digitalRead(pUP)); | |
delay(200); | |
led[0].timeUp += TIMEADD; | |
} | |
if( digitalRead(pDOWN) ) | |
{ | |
while(digitalRead(pDOWN)); | |
delay(200); | |
led[count(led)-1].timeDown += TIMEADD; | |
} | |
} | |
} | |
boolean hasTime( int index, char direction ) | |
{ | |
boolean result = false; | |
for( int i=0 ; i<count(led) && !result ; i++ ) | |
if( i != index && (direction == 'U' ? led[i].timeUp != 0 : led[i].timeDown != 0) ) | |
result = true; | |
return result; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment