Arduino Polska Forum
próba budowy systemu alarmowego - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: próba budowy systemu alarmowego (/watek-pr%C3%B3ba-budowy-systemu-alarmowego)

Strony: 1 2 3 4


próba budowy systemu alarmowego - Lucek20 - 05-01-2020

Witam. O arduino dowiedziałem się 3 tygodnie temu i od tamtego momentu uczę się programować. Do tamtego momentu nie miałem styczności z jakimkolwiek językiem programowania. Małymi kroczkami postanowiłem zbudować system alarmowy. Wzorując się na tym poradniku https://forbot.pl/blog/kurs-arduino-ii-klawiatura-wlasny-system-alarmowy-id18341. Pojawił się pierwszy problem.

kod:

#include <Keypad.h>

int diodaZielona = 13;
int diodaZulta = 12;
int diodaCzerwona = 11;

 
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

int stanAlarmu = 1;

void setup() {
  pinMode(diodaZielona, OUTPUT);
  pinMode(diodaZulta, OUTPUT);
  pinMode(diodaCzerwona, OUTPUT);

}
void loop() {
 
  char klawisz = 0;
 
  switch(stanAlarmu) { //Wykonywanie akcji odpowiedniej dla danego stanu
    case 1: 
    digitalWrite(diodaZielona, HIGH);
    digitalWrite(diodaZulta, LOW);
    digitalWrite(diodaCzerwona, LOW);
   
    klawisz = klawiatura.getKey();
   
    if (klawisz == 'A') { // aktywacja alarmu
        stanAlarmu = 2; // przechodzi do case 2
    }

    break;
   
    case 2: 
    digitalWrite(diodaZielona, LOW);
    digitalWrite(diodaZulta, HIGH);
    digitalWrite(diodaCzerwona, LOW);
   
    if (klawisz == 'B') { // dezaktywacja alarmu
        stanAlarmu = 1; // przechodzi do case 1
    }
 
    break;
  }
 
}


Naciskając przycisk A alarm przechodzi do case2. Dodając funkcję if (klawisz == 'B') {  stanAlarmu = 1; }  w case2 chciałem aby po naciśnięciu przycisku B alarm się dezaktywował i przeszedł do case1, niestety tak się nie dzieje.
O ile po naciśnięciu przycisku A alarm rzeczywiście przechodzi do case2 ( świeci żółta dioda), tak po naciśnięciu B nic się nie dzieje. Żółta dioda nadal się świeci, a powinna świecić się zielona.
Proszę o pomoc w rozwiązaniu tego problemu.


RE: próba budowy systemu alarmowego - elvis - 05-01-2020

W case 2 brakuje odczytu stanu klawiatury

Kod:
klawisz = klawiatura.getKey();

Ale i tak miło widzieć, że kursy z Forbota cieszą się popularnością Smile


RE: próba budowy systemu alarmowego - Lucek20 - 05-01-2020

Dzięki. Nie będę kłamał, że nie zauważyłem tego błędu... po prostu nie wiedziałem, że tak powinno być Smile Będę już wiedział, że potrzeba odczytu stanu klawiatury. Projekt alarmu będę chciał zmodyfikować. Planuję dołożyć do niego moduł GSM i  ekran LCD. Może się uda, a jak nie to trudno. Jeśli spadać, to z wysokiego konia  Smile


RE: próba budowy systemu alarmowego - Lucek20 - 05-01-2020

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.


RE: próba budowy systemu alarmowego - Agregacik - 05-01-2020

Trzeba ustawić na 1 zmienne aktywacjaAlarmuPozycja i dezaktywacjaAlarmuPozycja po lub przed zmienną stanAlarmu.
Dodam, że tylko trzeba coś zrobić aby się ustawiały na 1 po każdym niewłaściwym naciśnięciu przycisku oraz po jakimś czasie od ostatniego naciśnięcia jakiegokolwiek przycisku.


RE: próba budowy systemu alarmowego - Lucek20 - 05-01-2020

Właśnie to zauważyłem. Błędnie podany znak w środku pinu nie przeszkadza w aktywacji i wyłączeniu alarmu. W obecnym momencie ważna jest tylko kolejność znaków. Jutro będę nad tym myślał.


RE: próba budowy systemu alarmowego - Lucek20 - 10-01-2020

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.

Kod:
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");

Dlaczego tak się dzieje?


RE: próba budowy systemu alarmowego - Robson Kerman - 10-01-2020

Ponieważ w case1 masz:

Kod:
lcd.setCursor(0, 0);
lcd.print("CZUWANIE WYL");

Po wciśnięciu prawidłowego przycisku kasowany jest lcd i wpisywany jest 'x', ale zaraz masz znowu

Kod:
lcd.setCursor(0, 0);
lcd.print("CZUWANIE WYL");

A dzieje się to tak szybko, że nie zauważasz.

Druga sprawa, to nie musisz po każdym wciśnięciu klawisza pisać:
Kod:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("x");
.........................
lcd.setCursor(0, 0);
lcd.print("xx");
.........................
lcd.setCursor(0, 0);
lcd.print("xxx");

ponieważ po wysłaniu znaku na lcd, kursor jest przesuwany o jeden znak w prawo, więc wystarczy:

Kod:
lcd.print("x");

Trzecia sprawa, to w case2 gdy wcisnę jakikolwiek inny klawisz niż któryś z dezaktywacjaCyfra1-5, to od razu stanAlarmu = 5;
a powinno to wyglądać inaczej. Niezależnie czy wpisuję prawidłowe znaki czy złe, to na ekranie powinny pojawiać się iksy. Po zakończeniu wpisywania należy porównać wprowadzony ciąg z kodem alarmu i na tej podstawie zmieniać stanAlarmu.
Te Twoje wypociny można uprościć, zredukować ilość linii i przy okazji stworzyć bardziej niezawodną aplikację.


RE: próba budowy systemu alarmowego - Lucek20 - 10-01-2020

Doszedłem gdzie był błąd dziś w nocy. Kod Będę chciał w wersji ostatecznej znacznie uprościć. Wiedza obecna na to mi nie pozwala, więc wygląda to jak wygląda, ale mam nadzieję, że się to zmieni.


RE: próba budowy systemu alarmowego - Lucek20 - 13-02-2020

Ostatnio miałem troszkę czasu i zmieniłem kod.  Wydaje mi się że wygląda to znacznie lepiej. 
Mam problem z wyświetlaniem wpisywanych znaków , mianowicie podczas wpisywania znaki nie wpisują się jeden obok drugiego , tylko  nakładają się na siebie. Morduję  się z tym cały dzień i nie daję rady ogarnąć tego. Wiem, że naciśnięcie klawisza wywołuje za każdym razem funkcję 
processNumberKey,  która wyświetla  znak ciągle w tym samym miejscu. Jak to ogarnąć? Proszę o pomoc.



Kod:
#include <Keypad.h>
#include <Password.h>
#include <Wire.h>   
#include <LiquidCrystal_I2C.h> /

LiquidCrystal_I2C lcd(0x27, 16, 2);

String newPasswordString;
char newPassword[5];

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'}
};

byte rowPins[ROWS] = {12,11,10,9};

byte colPins[COLS] = {8,7,6,5};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int diodaZielona = 2;
int diodaZulta = 3;
int diodaCzerwona = 4;
int czujnikRuchu = A0;
int buzzer = 13;

volatile int stanAlarmu = 0;
int czasNaWpisPinu = 0;
int czasPin = 100;                // czas na wpisanie pinu
int czasPinPowykryciuRuchu = 100; // czas na wpisanie pinu po wykryciu ruchu


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'; // 
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);

}


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");
    }
    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++;                //   
    if (czasNaWpisPinu >= 100) {     // 
        czasNaWpisPinu = 0;
        stanAlarmu = 3;              // czas na wpisanie pinu minął, przejscie do stanu 3
        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();   
      }
     
  }
  }

void processNumberKey(char key) {
   lcd.setCursor(0, 1);
   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);
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;          
                    }
                    if (key=='#') break;          
        }
    }
    return password;
}

void alarmWyl(){
  lcd.setCursor(0, 0);
  lcd.print("ALARM WYLACZONY");
  delay(1000);
  lcd.clear();
}