Coś nie działa mi ta funkcja, liczbę naciśnięć klawiatury zlicza poprawnie, ale wartość ta nie jest przypisywana do lcd.setCursor(0, x);
Dlaczego tak, się dzieje? Szczerze przyznam się, że nie mam pojęcia.
Kod:
#include <Keypad.h>
#include <Password.h>
#include <Wire.h> // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie pobranej biblioteki I2C dla LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
String newPasswordString; //hold the new password
char newPassword[5]; //charater string of newPasswordString
//initialize password to 1234
//you can use password.set(newPassword) to overwrite it
Password password = Password( (char*)"1234" );
byte maxPasswordLength = 6;
byte currentPasswordLength = 0;
const byte ROWS = 4;
const byte COLS = 4;
//Define the keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
//// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = {12,11,10,9}; //connect to row pinouts
// Connect keypad COL0, COL1, COL2 and COL3 to these Arduino pins.
byte colPins[COLS] = {8,7,6,5}; //connect to column pinouts
// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int diodaZielona = 2;
int diodaZulta = 3;
int diodaCzerwona = 4;
int czujnikRuchu = A0;
int buzzer = 13;
int KONTAKTRON = A1;
volatile int stanAlarmu = 0;
int czasNaWpisPinu = 0;
int odliczanie = 100; // długość przyrwy przy odliczaniu czuwania
int czasPin = 100; // czas na wpisanie pinu
int czasPinPowykryciuRuchu = 100; // czas na wpisanie pinu po wykryciu ruchu
int czasTrwaniaAlarmu = 100; //czas trwania alarmu
int x = 1; // zmienna do LCD
int zmianaHaslaPozycja = 1;
char zmianaHaslaCyfra1 = '0'; //
char zmianaHaslaCyfra2 = '0'; //
char zmianaHaslaCyfra3 = '0'; //
char zmianaHaslaCyfra4 = '0'; //
char zmianaHaslaCyfra5 = 'D'; //
int aktywacjaAlarmuPozycja = 1;
char aktywacjaCyfra1 = '1'; //
char aktywacjaCyfra2 = '2'; //
char aktywacjaCyfra3 = '3'; // PIN DO WŁĄCZENIA CZUWANIA
char aktywacjaCyfra4 = '4'; //
char aktywacjaCyfra5 = 'A'; //
void setup(){
lcd.begin();
Serial.begin(9600);
pinMode(diodaZielona, OUTPUT);
pinMode(diodaZulta, OUTPUT);
pinMode(diodaCzerwona, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(czujnikRuchu, INPUT_PULLUP);
pinMode(KONTAKTRON, INPUT_PULLUP);
}
void loop() {
char key = keypad.getKey();
if (key != NO_KEY){
delay(60);
switch (key){
case '0': break;
case 'B': break;
case 'C': break;
case 'D': break;
case '#': checkPassword(); break;
case '*': resetPassword(); lcd.clear(); break;
default: processNumberKey(key);
}
}
switch (stanAlarmu) {
case 0: //czuwanie wyłączone
lcd.home();
lcd.print("ALARM WYLACZONY ");
digitalWrite(diodaZielona, HIGH);
digitalWrite(diodaZulta, LOW);
digitalWrite(diodaCzerwona, LOW);
digitalWrite(buzzer, LOW);
break;
case 1: //czuwanie włączone
lcd.home();
lcd.print("ALARM WLACZONY");
digitalWrite(diodaZielona, LOW);
digitalWrite(diodaZulta, HIGH);
digitalWrite(diodaCzerwona, LOW);
digitalWrite(buzzer, LOW);
if (digitalRead(czujnikRuchu) == HIGH) {
stanAlarmu = 2;
lcd.clear();
lcd.home();
lcd.print("WYKRYTO RUCH");
}
if (digitalRead(KONTAKTRON) == HIGH) {
stanAlarmu = 2;
lcd.clear();
lcd.home();
lcd.print("WYKRYTO RUCH");
}
break;
case 2: // czas na rozbrojenie alarmu po wykryciu ruchu przez PIR
lcd.home();
lcd.print("WYKRYTO RUCH");
digitalWrite(diodaZielona, LOW);
digitalWrite(diodaZulta, LOW);
digitalWrite(diodaCzerwona, HIGH);
tone(buzzer, 2000);
delay(50);
tone(buzzer, 2000);
delay(50);
noTone(buzzer);
delay(czasPinPowykryciuRuchu); //
czasNaWpisPinu++; // USTAWIENIE trwania alarmu
if (czasNaWpisPinu >= 100) { // WPISANIE PINU
czasNaWpisPinu = 0;
stanAlarmu = 3; // czas na wpisanie pinu minął, przejscie do stanu (alarm) 6
lcd.clear();
}
break;
case 3: // ALARM
lcd.setCursor(4, 0);
lcd.print("ALARM !");
digitalWrite(diodaZielona, LOW);
digitalWrite(diodaZulta, LOW);
digitalWrite(diodaCzerwona, HIGH);
tone(buzzer, 4000);
delay(50);
tone(buzzer, 3000);
delay(50);
tone(buzzer, 2000);
delay(50);
tone(buzzer, 1000);
delay(50);
noTone(buzzer);
break;
}
if (key) {
if (zmianaHaslaPozycja == 1 && key == zmianaHaslaCyfra1) {
zmianaHaslaPozycja++;
} else if (zmianaHaslaPozycja == 2 && key == zmianaHaslaCyfra2) {
zmianaHaslaPozycja++;
} else if (zmianaHaslaPozycja == 3 && key == zmianaHaslaCyfra3) {
zmianaHaslaPozycja++;
} else if (zmianaHaslaPozycja == 4 && key == zmianaHaslaCyfra4) {
zmianaHaslaPozycja++;
} else if (zmianaHaslaPozycja == 5 && key == zmianaHaslaCyfra5) {
zmianaHaslaPozycja++;
changePassword();
zmianaHaslaPozycja = 1;
resetPassword();
}
}
if (key) {
if (aktywacjaAlarmuPozycja == 1 && key == aktywacjaCyfra1) {
aktywacjaAlarmuPozycja++;
} else if (aktywacjaAlarmuPozycja == 2 && key == aktywacjaCyfra2) {
aktywacjaAlarmuPozycja++;
} else if (aktywacjaAlarmuPozycja == 3 && key == aktywacjaCyfra3) {
aktywacjaAlarmuPozycja++;
} else if (aktywacjaAlarmuPozycja == 4 && key == aktywacjaCyfra4) {
aktywacjaAlarmuPozycja++;
} else if (aktywacjaAlarmuPozycja == 5 && key == aktywacjaCyfra5) {
stanAlarmu = 1;
aktywacjaAlarmuPozycja = 1;
resetPassword();
lcd.clear();
}
}
if (key) { // przesunięcie kursora
x++;
Serial.println(x);
if (x == maxPasswordLength) {
x = 0;
}
}
}
void processNumberKey(char key) {
lcd.setCursor(0, x);
lcd.print(key);
currentPasswordLength++;
password.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
}
}
void checkPassword() {
if (password.evaluate()){
lcd.clear();
delay(100);
alarmWyl();
stanAlarmu = 0;
} else {
lcd.clear();
lcd.print("BLEDNY PIN");
delay(2000);
lcd.clear();
}
resetPassword();
}
void resetPassword() {
password.reset();
currentPasswordLength = 0;
}
void changePassword() {
lcd.clear();
lcd.print("ZMIANA PINU");
newPasswordString = Password();
newPasswordString.toCharArray(newPassword, newPasswordString.length()+1); //convert string to char array
password.set(newPassword);
resetPassword();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PIN ZMIENIONY NA:");
lcd.setCursor(0, 1);
lcd.print(newPasswordString);
delay(2000);
lcd.clear();
}
String Password()
{
String password = "";
while (1){
char key = keypad.getKey();
if (key){
if ((key=='0') || (key=='1') || (key=='2') ||
(key=='3') || (key=='4') || (key=='5') ||
(key=='6') || (key=='7') || (key=='8') ||
(key=='9')) // jesli wcisnąłem klawisze 0 - 9
{
lcd.setCursor(0, 1);
lcd.print(key);
password = password + key; // taka konkatenacja, to tylko w Adruino zadziała
}
if (key=='#') break;// zatwierdzamy wybór
}
}
return password;
}
void alarmWyl(){
lcd.setCursor(0, 0);
lcd.print("ALARM WYLACZONY");
delay(1000);
lcd.clear();
}