Napotkałem nowy problem którego nie mogę rozgryźć. Kod:
#include <LiquidCrystal.h>
#include <Keypad.h>
int diodaZielona = 13;
int diodaZulta = 12;
int diodaCzerwona = 11;
int buzzer = 10;
int czujnikRuchu = 1;
const byte ROWS = 4;
const byte COLS = 4;
byte rowPins[ROWS] = {9, 8, 7 ,6 };
byte colPins[COLS] = {5, 4, 3, 2};
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
Keypad klawiatura = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //inicjalizacja klawiatury
volatile int stanAlarmu = 1;
int aktywacjaAlarmuPozycja = 1;
char aktywacjaCyfra1 = '1';
char aktywacjaCyfra2 = '2';
char aktywacjaCyfra3 = '3';
char aktywacjaCyfra4 = '4';
char aktywacjaCyfra5 = 'A';
int dezaktywacjaAlarmuPozycja = 1;
char dezaktywacjaCyfra1 = '1';
char dezaktywacjaCyfra2 = '2';
char dezaktywacjaCyfra3 = '3';
char dezaktywacjaCyfra4 = '4';
char dezaktywacjaCyfra5 = 'D';
void setup() {
pinMode(diodaZielona, OUTPUT);
pinMode(diodaZulta, OUTPUT);
pinMode(diodaCzerwona, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(czujnikRuchu, INPUT_PULLUP);
}
void loop() {
char klawisz = 0;
switch(stanAlarmu) {
case 1:
//Czuwanie
digitalWrite(diodaZielona, HIGH);
digitalWrite(diodaZulta, LOW);
digitalWrite(diodaCzerwona, LOW);
klawisz = klawiatura.getKey();
if (klawisz) {
if (aktywacjaAlarmuPozycja == 1 && klawisz == aktywacjaCyfra1) {
aktywacjaAlarmuPozycja++;
} else if (aktywacjaAlarmuPozycja == 2 && klawisz == aktywacjaCyfra2) {
aktywacjaAlarmuPozycja++;
} else if (aktywacjaAlarmuPozycja == 3 && klawisz == aktywacjaCyfra3) {
aktywacjaAlarmuPozycja++;
} else if (aktywacjaAlarmuPozycja == 4 && klawisz == aktywacjaCyfra4) {
aktywacjaAlarmuPozycja++;
} else if (aktywacjaAlarmuPozycja == 5 && klawisz == aktywacjaCyfra5) {
stanAlarmu = 2;
}
}
break;
case 2://Monitorowanie
digitalWrite(diodaZielona, LOW);
digitalWrite(diodaZulta, HIGH);
digitalWrite(diodaCzerwona, LOW);
klawisz = klawiatura.getKey();
if (klawisz) {
if (dezaktywacjaAlarmuPozycja == 1 && klawisz == dezaktywacjaCyfra1) {
dezaktywacjaAlarmuPozycja++;
} else if (dezaktywacjaAlarmuPozycja == 2 && klawisz == dezaktywacjaCyfra2) {
dezaktywacjaAlarmuPozycja++;
} else if (dezaktywacjaAlarmuPozycja == 3 && klawisz == dezaktywacjaCyfra3) {
dezaktywacjaAlarmuPozycja++;
} else if (dezaktywacjaAlarmuPozycja == 4 && klawisz == dezaktywacjaCyfra4) {
dezaktywacjaAlarmuPozycja++;
} else if (dezaktywacjaAlarmuPozycja == 5 && klawisz == dezaktywacjaCyfra5) {
stanAlarmu = 1;
}
}
break;
}
}
W celu aktywacji wpisuje pin "1 2 3 4 A" , następnie dezaktywuje alarm wpisując pin "1 2 3 4 D" i rzeczywiście alarm jest dezaktywowany. Przy ponownej próbie aktywacji wystarczy nacisnąć na klawiaturze ostatni znak pinu "A" , a przy dezaktywacji tylko "D". Oczywiście takiego efektu nie oczekiwałem. Chcę aby wymagany był cały pin, a nie tylko ostatnie znaki. Analizując kod nie mogę zrozumieć dlaczego tak się dzieje.
#include <LiquidCrystal.h>
#include <Keypad.h>
int diodaZielona = 13;
int diodaZulta = 12;
int diodaCzerwona = 11;
int buzzer = 10;
int czujnikRuchu = 1;
const byte ROWS = 4;
const byte COLS = 4;
byte rowPins[ROWS] = {9, 8, 7 ,6 };
byte colPins[COLS] = {5, 4, 3, 2};
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
Keypad klawiatura = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //inicjalizacja klawiatury
volatile int stanAlarmu = 1;
int aktywacjaAlarmuPozycja = 1;
char aktywacjaCyfra1 = '1';
char aktywacjaCyfra2 = '2';
char aktywacjaCyfra3 = '3';
char aktywacjaCyfra4 = '4';
char aktywacjaCyfra5 = 'A';
int dezaktywacjaAlarmuPozycja = 1;
char dezaktywacjaCyfra1 = '1';
char dezaktywacjaCyfra2 = '2';
char dezaktywacjaCyfra3 = '3';
char dezaktywacjaCyfra4 = '4';
char dezaktywacjaCyfra5 = 'D';
void setup() {
pinMode(diodaZielona, OUTPUT);
pinMode(diodaZulta, OUTPUT);
pinMode(diodaCzerwona, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(czujnikRuchu, INPUT_PULLUP);
}
void loop() {
char klawisz = 0;
switch(stanAlarmu) {
case 1:
//Czuwanie
digitalWrite(diodaZielona, HIGH);
digitalWrite(diodaZulta, LOW);
digitalWrite(diodaCzerwona, LOW);
klawisz = klawiatura.getKey();
if (klawisz) {
if (aktywacjaAlarmuPozycja == 1 && klawisz == aktywacjaCyfra1) {
aktywacjaAlarmuPozycja++;
} else if (aktywacjaAlarmuPozycja == 2 && klawisz == aktywacjaCyfra2) {
aktywacjaAlarmuPozycja++;
} else if (aktywacjaAlarmuPozycja == 3 && klawisz == aktywacjaCyfra3) {
aktywacjaAlarmuPozycja++;
} else if (aktywacjaAlarmuPozycja == 4 && klawisz == aktywacjaCyfra4) {
aktywacjaAlarmuPozycja++;
} else if (aktywacjaAlarmuPozycja == 5 && klawisz == aktywacjaCyfra5) {
stanAlarmu = 2;
}
}
break;
case 2://Monitorowanie
digitalWrite(diodaZielona, LOW);
digitalWrite(diodaZulta, HIGH);
digitalWrite(diodaCzerwona, LOW);
klawisz = klawiatura.getKey();
if (klawisz) {
if (dezaktywacjaAlarmuPozycja == 1 && klawisz == dezaktywacjaCyfra1) {
dezaktywacjaAlarmuPozycja++;
} else if (dezaktywacjaAlarmuPozycja == 2 && klawisz == dezaktywacjaCyfra2) {
dezaktywacjaAlarmuPozycja++;
} else if (dezaktywacjaAlarmuPozycja == 3 && klawisz == dezaktywacjaCyfra3) {
dezaktywacjaAlarmuPozycja++;
} else if (dezaktywacjaAlarmuPozycja == 4 && klawisz == dezaktywacjaCyfra4) {
dezaktywacjaAlarmuPozycja++;
} else if (dezaktywacjaAlarmuPozycja == 5 && klawisz == dezaktywacjaCyfra5) {
stanAlarmu = 1;
}
}
break;
}
}
W celu aktywacji wpisuje pin "1 2 3 4 A" , następnie dezaktywuje alarm wpisując pin "1 2 3 4 D" i rzeczywiście alarm jest dezaktywowany. Przy ponownej próbie aktywacji wystarczy nacisnąć na klawiaturze ostatni znak pinu "A" , a przy dezaktywacji tylko "D". Oczywiście takiego efektu nie oczekiwałem. Chcę aby wymagany był cały pin, a nie tylko ostatnie znaki. Analizując kod nie mogę zrozumieć dlaczego tak się dzieje.