A modo de practica os dejo el esquema de conexión donde conectaremos 3 pulsadores a la placa Arduino y 2 luces. El funcionamiento sera el siguiente: los 2 primeros pulsadores encenderán o apagarán la primera luz, el tercer pulsador encenderá o apagara la segunda luz, pero con la particularidad que si éste se aprieta mas de 2 segundos apagara cualquier luz que este encendida.
ESQUEMA DE CONEXIÓN:
Recordemos que las resistencias de los pulsadores serán de un valor de 10 kilo-ohmios, y la de los leds de 220 ohmios.
CÓDIGO DE PROGRAMACIÓN:
const int pulsadores[] = {2, 3, 4};
const int nPulsadores = 3;
const int Luz[] = {11, 12};
const int nLuces = 2;
int estadoLuz[] = {LOW, LOW};
int estadoBoton[] = {HIGH, HIGH, HIGH};
int estadoBotonAnterior[] = {HIGH, HIGH, HIGH};
long lastDebounceTime = 0;
long debounceDelay = 50;
long tempPulsacionIni = 0;
long tempPulsacionFin = 0;
long intervalo = 0;
int apagarLuces = LOW;
void setup() {
for(int i = 0; i < nPulsadores; i++){
pinMode(pulsadores[i], INPUT);
}
for(int i = 0; i < nLuces; i++){
pinMode(Luz[i], OUTPUT);
}
for(int i = 0; i < nLuces; i++){
digitalWrite(Luz[i], LOW);
}
}
void loop() {
for(int i = 0; i < nPulsadores; i++){
leerPulsador(i);
}
}
void leerPulsador(int pulsador){
int lecturaPulsador = digitalRead(pulsadores[pulsador]);
if (lecturaPulsador != estadoBotonAnterior[pulsador]) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (lecturaPulsador != estadoBoton[pulsador]) {
estadoBoton[pulsador] = lecturaPulsador;
if(estadoBoton[0] == LOW || estadoBoton[1] == LOW){
estadoLuz[0]= !estadoLuz[0];
}
if(estadoBoton[2] == LOW){
tempPulsacionIni = millis();
}
if(estadoBoton[2] == HIGH && tempPulsacionIni > 50){
tempPulsacionFin = millis();
intervalo = tempPulsacionFin - tempPulsacionIni;
if(intervalo > 50 && intervalo < 2000){
estadoLuz[1] = !estadoLuz[1];
tempPulsacionIni = 0;
}else if(intervalo >= 2000){
apagarLuces = HIGH;
tempPulsacionIni = 0;
}
}
}
}
if(apagarLuces == HIGH){
estadoLuz[0] = LOW;
estadoLuz[1] = LOW;
apagarLuces = LOW;
}
for(int i = 0; i < nLuces; i++){
digitalWrite(Luz[i], estadoLuz[i]);
}
estadoBotonAnterior[pulsador] = lecturaPulsador;
}
Si bien el programa funciona, me di cuenta de que a la hora de apagar todas las luces se apagan de golpe, con lo que por ejemplo si es de noche y tienes el pulsador al fondo del pasillo te obliga a ir a oscuras hasta la puerta de la calle. No creéis que seria mejor darle un tiempo prudencial, que una vez apretado el pulsador para que nos apague todas las luces las mantenga encendidas 5 segundos y nos de tiempo a salir de casa? Luego se apagan solas. Como siempre para conseguir eso hay que modificar el código de programación. A continuación os dejo el código modificado por si alguien quiere ver la diferencia entre los dos programas. Hasta pronto!!
const int pulsadores[] = {2, 3, 4};
const int nPulsadores = 3;
const int Luz[] = {11, 12};
const int nLuces = 2;
int estadoLuz[] = {LOW, LOW};
int estadoBoton[] = {HIGH, HIGH, HIGH};
int estadoBotonAnterior[] = {HIGH, HIGH, HIGH};
long lastDebounceTime = 0;
long debounceDelay = 50;
long tempPulsacionIni = 0;
long tempPulsacionFin = 0;
long intervalo = 0;
int apagarLuces = LOW;
long previousMillis = 0;
long crono = 5000;
void setup() {
for(int i = 0; i < nPulsadores; i++){
pinMode(pulsadores[i], INPUT);
}
for(int i = 0; i < nLuces; i++){
pinMode(Luz[i], OUTPUT);
}
for(int i = 0; i < nLuces; i++){
digitalWrite(Luz[i], LOW);
}
}
void loop() {
for(int i = 0; i < nPulsadores; i++){
leerPulsador(i);
}
}
void leerPulsador(int pulsador){
int lecturaPulsador = digitalRead(pulsadores[pulsador]);
if (lecturaPulsador != estadoBotonAnterior[pulsador]) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (lecturaPulsador != estadoBoton[pulsador]) {
estadoBoton[pulsador] = lecturaPulsador;
if(estadoBoton[0] == LOW || estadoBoton[1] == LOW){
estadoLuz[0]= !estadoLuz[0];
}
if(estadoBoton[2] == LOW){
tempPulsacionIni = millis();
}
if(estadoBoton[2] == HIGH && tempPulsacionIni > 50){
tempPulsacionFin = millis();
intervalo = tempPulsacionFin - tempPulsacionIni;
if(intervalo > 50 && intervalo < 2000){
estadoLuz[1] = !estadoLuz[1];
tempPulsacionIni = 0;
}else if(intervalo >= 2000){
previousMillis = millis();
apagarLuces = HIGH;
tempPulsacionIni = 0;
}
}
}
}
if(apagarLuces == HIGH){
long currentMillis = millis();
if(currentMillis - previousMillis > crono){
previousMillis = currentMillis;
estadoLuz[0] = LOW;
estadoLuz[1] = LOW;
apagarLuces = LOW;
}
}
for(int i = 0; i < nLuces; i++){
digitalWrite(Luz[i], estadoLuz[i]);
}
estadoBotonAnterior[pulsador] = lecturaPulsador;
}