Skip to content

Instantly share code, notes, and snippets.

@giltesa
Last active August 29, 2015 14:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save giltesa/2c39ac29971bf5a531f7 to your computer and use it in GitHub Desktop.
Save giltesa/2c39ac29971bf5a531f7 to your computer and use it in GitHub Desktop.
Arduino: Escalones luminosos
#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