Ho quasi finito il codice di una semplice scheda, che tramite 7 piccoli pulsanti controlla 7 carichi da 10Ampere ciascuno.
Come base sono partito dalla modifica di un semplice sketch per far accendere un led tramite pulsante con debouncing.
Con l'aiuto del forum ho risolto diversi problemi riguardo vari aspetti
http://arduino.cc/forum/index.php/topic,93482.0.html e poi ho aggiunto un buzzer che, solo al variare dello stato, mi avvisa tramite 2 suoni distinti, uno per l'ON e l'altro per l'OFF.
Per brevità vi riporto uno stralcio della parte riguardante il primo pulsante (in realtà è tutto moltiplicato per 7) e senza la parte "void buzz":
#define LED1 2
#define BUTTON1 14
int val1 = 0;
int vecchio_val1 = 0;
int stato1 = 1;
void setup() {
pinMode(LED1, OUTPUT);
pinMode(BUTTON1, INPUT);
pinMode(9, OUTPUT);
}
void loop() {
val1 = digitalRead(BUTTON1);
if ((val1 == HIGH) && (vecchio_val1 == LOW)){
stato1 = 1 - stato1;
if (stato1 == 1) {
buzz(9, 3000, 20);
buzz(9, 3500, 25);
buzz(9, 4000, 5);
}
else {
buzz(9, 3000, 5);
buzz(9, 2500, 25);
buzz(9, 2000, 20);
}
delay(20);
}
vecchio_val1 = val1;
if (stato1 == 1) {
digitalWrite(LED1, HIGH);
delay(20);
}
else {
digitalWrite(LED1, LOW);
delay(20);
}
delay(100);
}
Adesso per evitare che ad ogni spegnimento debba reimpostare ogni pulsante, vorrei aggiungere la funzione EEPROM.write per memorizzare sulla eeprom interna l'ultimo stato di ogni pulsante.
Ho modificato lo sketch così:
#define LED1 2
#define BUTTON1 14
#include <EEPROM.h>
int val1 = 0;
int vecchio_val1 = 0;
int stato1; // ho eliminato lo stato1=1
int addr1 = 1; // ho definito l'indirizzo dell'eeprom
void setup() {
pinMode(LED1, OUTPUT);
pinMode(BUTTON1, INPUT);
pinMode(9, OUTPUT);
}
void loop() {
stato1 = EEPROM.read(addr1); //vorrei che leggesse l'ultimo stato memorizzato
val1 = digitalRead(BUTTON1);
if ((val1 == HIGH) && (vecchio_val1 == LOW)){
stato1 = 1 - stato1;
if (stato1 == 1) {
buzz(9, 3000, 20);
buzz(9, 3500, 25);
buzz(9, 4000, 5);
EEPROM.write(addr1, stato1); // solo in caso di modifica di stato, aggiorna la memorizzazione sull'eeprom
}
else {
buzz(9, 3000, 5);
buzz(9, 2500, 25);
buzz(9, 2000, 20);
EEPROM.write(addr1, stato1); // solo in caso di modifica di stato, aggiorna la memorizzazione sull'eeprom
}
delay(20);
}
vecchio_val1 = val1;
if (stato1 == 1) {
digitalWrite(LED1, HIGH);
delay(20);
}
else {
digitalWrite(LED1, LOW);
delay(20);
}
delay(100);
}
Purtroppo mi funziona esattamente al contrario, ad ogni riaccensione mi ritrovo nello stato inverso a quello lasciato.
Ho provato a modificare diverse volte il codice ma senza risultato...