En esta cuarta entrada, y a una para terminar, adjunto el código que usa el sistema de iluminación Led de la estantería y un vídeo de las funcionalidades de dicho sistema.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
/** * Autor: Alberto Gil Tesa * Web: http://giltesa.com * Licencia: CC BY-NC-SA 3.0 * * ATTiny85 pinout: * _____ * |1 8| VCC * |2 7| * Potenciometro -> A2 |3 6| D1 <- Tira de leds * GND |4___5| D0 <- Sensor PIR */ // PINES #define LED 1 // Digital PWM - Tira de leds #define PIR 0 // Digital - Sensor movimiento #define POT A2 // Analogico - Regulador brillo // BRILLO: #define bMinimo 3 // Valor minimo para que el led este encendido. #define bMargen 4 // Diferencia que ha de haber para que se considere que se ha cambiado el brillo. byte bAnterior = 0; byte bActual = 0; byte bAtenuado = 0; // MODO AHORRO: #define tiempoApagado 600000 // Tiempo para entrar en modo ahorro (apagado). #define tiempoAtenuado 18 // Velocidad que se tarda en aumentar o disminuir cada nivel de brillo. unsigned long ultimoUso = 0; // El momento en el que se utilizo por ultima vez el potenciometro o se detecto al usuario. boolean enAhorro = false; // Indica si los Leds se apagaron por inactividad del usuario. boolean cambiandoBrillo = false; // Indica que se esta cambiando el brillo (aumentandolo o decrementandolo gradualmente) /** * Funcion inicial de configuracion. */ void setup() { pinMode(LED, OUTPUT); // Poniendo el programa en ahorro y las variables de brillo con el mismo valor nos aseguramos // de que al reiniciarse el microcontrolador, por un corte de luz, las luces permanezcan apagadas. enAhorro = true; bAnterior = getBrillo(); bActual = bAnterior; } /** * Funcion principal. */ void loop() { bActual = getBrillo(); // Se comprueba si el potenciometro ha sido movido. Segun el estado del programa: if( getDiferenciaBrillo() > bMargen ) { bAnterior = bActual; ultimoUso = millis(); // Comienza la desactivacion del modo ahorro, los leds se endenderan gradualmente: if( enAhorro ) { setBrillo(true); } // Los leds cambiaran el brillo por el nuevo valor, siempre que el nuevo valor supere el minimo para que estos se enciendan: else if( bActual > bMinimo ) { analogWrite( LED, bActual ); } // Si no se supera el minimo los leds se apagan: else { analogWrite( LED, 0 ); } } // Prosigue la desactivacion del modo ahorro: else if( enAhorro && cambiandoBrillo ) { setBrillo(true); } // Registra la ultima vez que se detecto la presencia del usuario: if( digitalRead(PIR) ) { ultimoUso = millis(); // Si se estaba activando el modo ahorro, se desactiva gradualmente: if( !enAhorro && cambiandoBrillo ) setBrillo(true); } // Activa el modo ahorro si el usuario no ha interactuado con los sensores en el tiempoApagado especificado: if( !enAhorro && millis()-ultimoUso > tiempoApagado ) { setBrillo(false); } } /** * Enciende o apaga el LED con efecto gradual. */ void setBrillo( boolean estado ) { if( !cambiandoBrillo ) { bAtenuado = estado ? 0 : bActual; cambiandoBrillo = true; } // Sube el brillo: if( estado ) { if( bAtenuado < bActual) { analogWrite( LED, ++bAtenuado ); delay(tiempoAtenuado); } else { enAhorro = false; cambiandoBrillo = false; bAnterior = bActual; } } // Baja el brillo: else { if( bAtenuado > 0 ) { analogWrite( LED, --bAtenuado ); delay(tiempoAtenuado); } else { enAhorro = true; cambiandoBrillo = false; bAnterior = bActual; } } } /** * Lee el valor del potenciometro y devuelve * el brillo correspondiente para el led. */ byte getBrillo() { return map(analogRead(POT), 0, 1023, 0, 255); } /** * Devuelve la diferencia de brillo entre la medicion * anterior y la actual. */ byte getDiferenciaBrillo() { return bAnterior > bActual ? bAnterior-bActual : bActual-bAnterior; } |
Edit:
Al final he usado una versión mas simple del código y sobre un Arduino ya que el ATtiny se comportaba raro:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
/** * Autor: Alberto Gil Tesa * Web: http://giltesa.com * Licencia: CC BY-NC-SA 3.0 * * Arduino Mini Pro PinOut: * * CONEXIONADO DE LOS COMPONENTES * ____________ * PC |TX0 RAW| * PC |RX1 GND| * PC |RST RST| * |GND VCC| * |2 A7| * TIRA DE LED |3~ A6| * SENSOR MOVIMIENTO |4 A5| * |5~ A4| * |6~ A3| * |7 A2| * |8 A1| POTENCIOMETRO * |9~ A0| * | 13| * | 12| * | ~11| * |_________~10| * */ // PINES #define LED 3 // Digital PWM - Tira de leds #define PIR 4 // Digital - Sensor movimiento #define POT A1 // Analogico - Regulador brillo // BRILLO: #define bMinimo 3 // Valor minimo para que el led este encendido. #define bMargen 4 // Diferencia que ha de haber para que se considere que se ha cambiado el brillo. byte bAnterior = 0; byte bActual = 0; // MODO AHORRO: #define tiempoApagado 600000 // Tiempo para entrar en modo ahorro (apagado). unsigned long ultimoUso = 0; // El momento en el que se utilizo por ultima vez el potenciometro o se detecto al usuario. boolean enAhorro = false; // Indica si los Leds se apagaron por inactividad del usuario. /** * Funcion inicial de configuracion. */ void setup() { pinMode(LED, OUTPUT); // Poniendo el programa en ahorro y las variables de brillo con el mismo valor nos aseguramos // de que al reiniciarse el microcontrolador, por un corte de luz, las luces permanezcan apagadas. enAhorro = true; bAnterior = getBrillo(); bActual = bAnterior; } /** * Funcion principal. */ void loop() { bActual = getBrillo(); // Se comprueba si el potenciometro ha sido movido. Segun el estado del programa: if( getDiferenciaBrillo() > bMargen ) { bAnterior = bActual; ultimoUso = millis(); // Los leds cambiaran el brillo por el nuevo valor, siempre que el nuevo valor supere el minimo para que estos se enciendan: if( bActual > bMinimo || enAhorro ) { enAhorro = false; analogWrite( LED, bActual ); } // Si no se supera el minimo los leds se apagan: else { analogWrite( LED, 0 ); } } // Registra la ultima vez que se detecto la presencia del usuario: if( digitalRead(PIR) ) { ultimoUso = millis(); } // Activa el modo ahorro si el usuario no ha interactuado con los sensores en el tiempoApagado especificado: if( !enAhorro && millis()-ultimoUso > tiempoApagado ) { enAhorro = true; analogWrite( LED, 0 ); } } /** * Lee el valor del potenciometro y devuelve * el brillo correspondiente para el led. */ byte getBrillo() { return map(analogRead(POT), 0, 1023, 0, 255); } /** * Devuelve la diferencia de brillo entre la medicion * anterior y la actual. */ byte getDiferenciaBrillo() { return bAnterior > bActual ? bAnterior-bActual : bActual-bAnterior; } |
Excelente proyecto, felicidades.
Escribo desde chile, a que cuenta puedo transferir algo para ayudarte a mantener la web? saludos!
Gracias Rodolfo,
Puedes hacerlo desde el botón de PayPal que hay en el lado superior derecho de la página.
Saludos!