Ciao a tutti sono pinocchio1,sono nuovo e sono alle prese con la realizzazione del mio primo sketch.
L' intento è di digitare un codice e se corretto avere la possibilità di attivare all'interno di un arco temporale (diciamo 30 secondi) ed in modo monostabile, a seconda della necessità una o più uscite che faranno capo ad altrettanti relè.
Ad esempio col tasto 1 si potrebbe volere accendere una luce, con il tasto due aprire il sezionale di un garage e con il tre magari attivare l'antifurto, evitando ogni volta di ridigitare il codice o digitarne uno diverso.
Dopo il tempo impostato il codice si deve resettare così non si dimentica di farlo manualmente.
Fino al riconoscimento del codice non ho avuto problemi, avvalendomi di esempi trovati online.
Da qui in avanti pur avendo tentato in vari modi, combinando istruzioni "if" "millis" e "for" ma forse per errori di sintassi o forse per poca dimestichezza nell uso delle stesse non sono riuscito a trovare una soluzione soddisfacente e soprattutto funzionale.
Posto di seguito il codice e se qualcuno mi da una dritta lo ringrazio fin d'ora.
// Tastira 3X3 per la digitazione di un codice segreto che abilita la selezione di
// 5 comandi abbinati ad altrettante uscite
// dichiarazione delle librerie,variabili,costanti,codici delle routine
// e degli oggetti usati display, servomotori ecc.
#include <Keypad.h>
const byte ROWS = 3; //tre righe
const byte COLS = 3; //tre colonne
char keys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'*', '8', '#'},
};
byte rowPins[ROWS] = {22, 24, 26}; // i Pin a cui sono connesse le righe del KeyPad
byte colPins[COLS] = {23, 25, 27}; // i Pin a cui sono connesse le colonne del KeyPad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
char psw[5] ="1234"; // PASSWORD
char inputCode[5]; // CODICE INSERIMENTO
int inputCode_idx; //CONTATORE PER CODICE INSERITO
int rel1 = 30;
int rel2 = 31;
int rel3 = 32;
int rel4 = 33;
int rel5 = 34;
int buzz = 35;
int led1 = 36;
void routine(void){
Serial.println();
Serial.println(inputCode);
char key = keypad.getKey();
if(key=="1")
{digitalWrite(rel1,HIGH);
Serial.println("ANTIFURTO");
delay(1000);
digitalWrite(rel1,LOW);}
if(key== "2")
{digitalWrite(rel2,HIGH);
Serial.println("BATTENTE SX");
delay(1000);
digitalWrite(rel2,LOW);}
if(key== "3")
{digitalWrite(rel3,HIGH);
Serial.println("BATTENTE DX");
delay(1000);
digitalWrite(rel3,LOW);}
if(key== "4")
{digitalWrite(rel4,HIGH);
Serial.println("BATTENTE DX");
delay(1000);
digitalWrite(rel4,LOW);}
if(key== "5")
{digitalWrite(rel5,HIGH);
Serial.println("LUCE PORTICO");
delay(1000);
digitalWrite(rel5,LOW);}
}
// inizio setup: dichiarazione delle porte in e out
// istruzioni da eseguire all'avvio del programma
void setup() {
Serial.begin(9600);
keypad.setDebounceTime(150);
pinMode(rel1, OUTPUT);
pinMode(rel2, OUTPUT);
pinMode(rel3, OUTPUT);
pinMode(rel4, OUTPUT);
pinMode(rel5, OUTPUT);
pinMode(buzz, OUTPUT);
pinMode(led1, OUTPUT);
inputCode_idx = 0; //RESETTA IL CONTATORE DEL CODICE
Serial.println("inserire password");
}
void loop(){
// esecuzione del codice
char key = keypad.getKey();
//Serial.print("inserire password");
if(key !=NO_KEY){
if(key== '#'){
inputCode_idx = 0; // RESETTA IL CODICE
Serial.println("CODICE RESETTATO");
delay(1000);
}else{
inputCode[inputCode_idx++] = key;
Serial.print(key);
if(inputCode_idx == 4){
inputCode[inputCode_idx] = '\0';
inputCode_idx = 0;
Serial.println();
Serial.println(inputCode);
if(strcmp(inputCode,psw) != 0){
digitalWrite(buzz,HIGH);
delay(1000);
digitalWrite(buzz,LOW);
}
}
}
}
if(strcmp(inputCode,psw) == 0){ // fin qui sembra tutto bene,da qui in aventi mi sono arenato
routine();
//digitalWrite(rel1,HIGH);
//Serial.println("APERTO");
//delay(2000);
//Serial.println("CHIUSO");
for(int i= 0;i<4;i++){
inputCode[i] = '\0';
}
}
//digitalWrite(rel1,LOW);
}