Miałem 2 problemy z lcd, jeden rozwiązałem, na drugim utknąłem, mianowicie za żadne skarby nie potrafię skasować poprzedniego napisu na LCD.
Kod:
#include <Keypad.h>
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(13, 12, 11, 10, 1, 0);
int diodaZielona = A0;
int diodaZulta = A1;
int diodaCzerwona = A2;
int buzzer = A3;
int czujnikRuchu = A4;
//miejsce na kontrakton
int syrena = A5;
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'; // PIN DO WŁĄCZENIA CZUWANIA
char aktywacjaCyfra4 = '4'; //
char aktywacjaCyfra5 = 'A'; //
int dezaktywacjaAlarmuPozycja = 1;
char dezaktywacjaCyfra1 = '1'; //
char dezaktywacjaCyfra2 = '2'; // PIN DO WYŁĄCZENIA ALARMU I
char dezaktywacjaCyfra3 = '3'; // STANU CZUWANIA
char dezaktywacjaCyfra4 = '4'; //
char dezaktywacjaCyfra5 = 'D'; //
int czasNaWpisPinu = 0;
void setup() {
lcd.begin(16, 2);
lcd.setCursor(0,0);
pinMode(diodaZielona, OUTPUT);
pinMode(diodaZulta, OUTPUT);
pinMode(diodaCzerwona, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(syrena, OUTPUT);
pinMode(czujnikRuchu, INPUT_PULLUP);
//miejsce na kontrakotn
}
void loop() {
char klawisz = 0;
switch(stanAlarmu) {
case 1: // czuwanie wyłączone
lcd.setCursor(0, 0);
lcd.print("CZUWANIE WYL");
digitalWrite(diodaZielona, HIGH);
digitalWrite(diodaZulta, LOW);
digitalWrite(diodaCzerwona, LOW);
digitalWrite(buzzer, LOW);
digitalWrite(syrena, LOW);
czasNaWpisPinu = 0;
klawisz = klawiatura.getKey();
if (klawisz) {
if (aktywacjaAlarmuPozycja == 1 && klawisz == aktywacjaCyfra1) {
aktywacjaAlarmuPozycja++;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("x");
} else if (aktywacjaAlarmuPozycja == 2 && klawisz == aktywacjaCyfra2) {
aktywacjaAlarmuPozycja++;
lcd.setCursor(0, 0);
lcd.print("x x");
} else if (aktywacjaAlarmuPozycja == 3 && klawisz == aktywacjaCyfra3) {
aktywacjaAlarmuPozycja++;
lcd.setCursor(0, 0);
lcd.print("x x x");
} else if (aktywacjaAlarmuPozycja == 4 && klawisz == aktywacjaCyfra4) {
aktywacjaAlarmuPozycja++;
lcd.setCursor(0, 0);
lcd.print("x x x x");
} else if (aktywacjaAlarmuPozycja == 5 && klawisz == aktywacjaCyfra5) {
lcd.setCursor(0, 0);
lcd.print("x x x x x");
delay(1000);
lcd.setCursor(0, 0);
lcd.print("POPRAWNY KOD");
delay(1000);
lcd.clear();
stanAlarmu = 2;
aktywacjaAlarmuPozycja = 1;
} else {
lcd.setCursor(0, 0);
lcd.print("NIEPOPRAWNY KOD");
delay(1000);
lcd.clear();
stanAlarmu = 1;
aktywacjaAlarmuPozycja = 1;
}
}
break;
case 2://czuwanie włączone
lcd.setCursor(0, 0);
lcd.print("STAN CZUWANIA");
digitalWrite(diodaZielona, LOW);
digitalWrite(diodaZulta, HIGH);
digitalWrite(diodaCzerwona, LOW);
digitalWrite(syrena, LOW);
klawisz = klawiatura.getKey();
if (klawisz) {
if (dezaktywacjaAlarmuPozycja == 1 && klawisz == dezaktywacjaCyfra1) {
dezaktywacjaAlarmuPozycja++;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("x");
} else if (dezaktywacjaAlarmuPozycja == 2 && klawisz == dezaktywacjaCyfra2) {
dezaktywacjaAlarmuPozycja++;
lcd.setCursor(0, 0);
lcd.print("x x");
} else if (dezaktywacjaAlarmuPozycja == 3 && klawisz == dezaktywacjaCyfra3) {
dezaktywacjaAlarmuPozycja++;
lcd.setCursor(0, 0);
lcd.print("x x x");
} else if (dezaktywacjaAlarmuPozycja == 4 && klawisz == dezaktywacjaCyfra4) {
dezaktywacjaAlarmuPozycja++;
lcd.setCursor(0, 0);
lcd.print("x x x x");
} else if (dezaktywacjaAlarmuPozycja == 5 && klawisz == dezaktywacjaCyfra5) {
lcd.setCursor(0, 0);
lcd.print("x x x x x");
delay(1000);
lcd.setCursor(0, 0);
lcd.print("POPRAWNY KOD");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ALARM WYL");
delay(1000);
lcd.clear();
stanAlarmu = 1; //poprawnie wpisany pin, wyłączenie czuwania
dezaktywacjaAlarmuPozycja = 1;
} else {
stanAlarmu = 5; // źle wpisany pin, przeniesienie do stanu 5
dezaktywacjaAlarmuPozycja = 1;
}
}
if (digitalRead(czujnikRuchu) == HIGH) {
stanAlarmu = 3; // wykrycie ruchu, przejscie do stanu 3
}
break;
case 3: // czas na rozbrojenie alarmu po wykryciu ruchu przez PIR
digitalWrite(diodaZielona, LOW);
digitalWrite(diodaZulta, LOW);
digitalWrite(diodaCzerwona, HIGH);
tone(buzzer, 2000);
delay(20);
digitalWrite(diodaCzerwona, LOW);
tone(buzzer, 2000);
delay(20);
noTone(buzzer);
digitalWrite(buzzer, HIGH);
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; // dobrze wpisany pin, przejscie do stanu 1
dezaktywacjaAlarmuPozycja = 1;
} else {
stanAlarmu = 4; // źle wpisany pin przejscie do stanu 4 (druga szansa na wpisanie pinu)
dezaktywacjaAlarmuPozycja = 1;
}
}
delay(100); //
czasNaWpisPinu++; // USTAWIENIE CZASU NA // WPISANIE PINU
if (czasNaWpisPinu >= 50) { // WPISANIE PINU
czasNaWpisPinu = 0; //
stanAlarmu = 6; // czas na wpisanie pinu minął, przejscie do stanu (alarm)
}
break;
case 4: // Druga szansa na rozbrojenie alarmu po wykryciu ruchu przez PIR
digitalWrite(diodaZielona, LOW);
digitalWrite(diodaZulta, HIGH);
digitalWrite(diodaCzerwona, HIGH);
tone(buzzer, 4000);
delay(20);
tone(buzzer, 1000);
delay(20);
noTone(buzzer);
digitalWrite(diodaCzerwona, LOW);
digitalWrite(buzzer, HIGH);
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; // dobrze wpisany pin, przejscie do stanu 1
dezaktywacjaAlarmuPozycja = 1;
} else {
stanAlarmu = 6; // źle wpisany pin przejscie do stanu 6 (alarm)
dezaktywacjaAlarmuPozycja = 1;
}
}
delay(100); //
czasNaWpisPinu++; // USTAWIENIE CZASU NA // WPISANIE PINU
if (czasNaWpisPinu >= 50) { // WPISANIE PINU
czasNaWpisPinu = 0; //
stanAlarmu = 6; // czas na wpisanie pinu minął, przejscie do stanu 6 (alarm)
}
break;
case 5: // rozbrajanie alarmu po nieudanej próbie ze stanu 2. ograniczony czas na rozbrojenie.
digitalWrite(diodaZielona, LOW);
digitalWrite(diodaZulta, HIGH);
tone(buzzer, 4000);
delay(20);
tone(buzzer, 1000);
delay(20);
noTone(buzzer);
digitalWrite(diodaZulta, LOW);
digitalWrite(diodaCzerwona, LOW);
klawisz = klawiatura.getKey();
if (klawisz) {
if (dezaktywacjaAlarmuPozycja == 1 && klawisz == dezaktywacjaCyfra1) {
dezaktywacjaAlarmuPozycja++;
} else if (dezaktywacjaAlarmuPozycja == 2 && klawisz != dezaktywacjaCyfra2) {
dezaktywacjaAlarmuPozycja = 1;
} 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; // dobrze wpisany pin, przejscie do stanu 1
dezaktywacjaAlarmuPozycja = 1;
} else {
stanAlarmu = 6; // źle wpisany pin, przejscie do stanu 6 (alarm)
dezaktywacjaAlarmuPozycja = 1;
}
}
delay(100); //
czasNaWpisPinu++; // USTAWIENIE CZASU NA // WPISANIE PINU
if (czasNaWpisPinu >= 50) { // WPISANIE PINU
czasNaWpisPinu = 0; //
stanAlarmu = 6; // czas na wpisanie pinu minął, przejscie do stanu 6 (alarm)
}
break;
case 6: // ALARM
lcd.setCursor(4, 0);
lcd.print("ALARM !");
digitalWrite(diodaZielona, LOW);
digitalWrite(diodaZulta, LOW);
digitalWrite(diodaCzerwona, HIGH);
digitalWrite(buzzer, LOW);
digitalWrite(syrena, HIGH);
klawisz = klawiatura.getKey();
if (klawisz) {
if (dezaktywacjaAlarmuPozycja == 1 && klawisz == dezaktywacjaCyfra1) {
dezaktywacjaAlarmuPozycja++;
} else if (dezaktywacjaAlarmuPozycja == 2 && klawisz != dezaktywacjaCyfra2) {
dezaktywacjaAlarmuPozycja = 1;
} 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; // Po wpisaniu pinu przejscie do stanu 1
dezaktywacjaAlarmuPozycja = 1;
}else {
stanAlarmu = 6; // ZŁY WPIN, ALARM TRWA NADAL
dezaktywacjaAlarmuPozycja = 1;
}
}
break;
}
}
W case1 wyświetla się napis "CZUWANIE WYL". Dlaczego po wpisaniu prawidłowego znaku pinu, nie kasuje się napis na lcd? Zamiast niego powinien pojawić się "x". Mam na myśli ten fragment kodu. Użyłem lcd.clear(); ale nic to nie daje.