Skocz do zawartości

Problem z kodem (Arduino: LCD, PIR, Keypad, Kontaktron, LED)


Pabelelo

Pomocna odpowiedź

Cześć,

mam pewien problem z kodem. Zbudowałem i zaprogramowałem rozszerzoną wersję alarmu z II części kursu Arduino.

Konstrukcja: Zbudowałem układ na Arduino, pod który podłączyłem ekran LCD (16x2), czujnik ruchu PIR, kontaktron, dwie diody LED oraz klawiaturę 4x4. Z pozoru program który napisałem działa i sprawuje się jak powinien. Jednak po wnikliwym sprawdzeniu wartości za pomocą UART okazało się, że w CASE4, gdzie mam zapisane rozbrajanie, program w ogóle nie rozpoznaje symbolu klawisza, który jest używany, do rozbrojenia alarmu.

Program "widzi" wartości pinCyfra1-4 i rozpoznaje je jako wartości zatwierdzone w CASE1. W przypadku zastosowania formuły:

if (pinAlarmu ==  1 && klawisz  !=  pinCyfra1) ... Program przechodzi płynnie między zmienną "pinAlarmuPozycja" (od 1 do 4) i prowadzi do rozbrojenia alarmu. Dzieje się to niestety przy wciśnięciu jakichkolwiek klawiszy na klawiaturze. Gdy zamiast "!=" zastosuję "==" program od razu przechodzi do CASE5 i rozpoczyna sygnalizację alarmu. W obu przypadkach, po zastosowaniu komunikacji UART zmienna klawisz nie daje żadnego pożądanego znaku w konsoli. Zamiast tego dostaję informację: ,,🙂".  W przypadku wpisania komendy Serial.println(klawisz) w CASE2 otrzymuję w konsoli portu szeregowego informację zwrotną o wciśnięciu klawisza A lub C.

Proszę o pomoc w rozwiązaniu problemu.
Z góry dziękuję

 

#include <Keypad.h>
#include <LiquidCrystal.h>
#define Red A1
#define Green A0
#define PIR A3  //Czujnik ruchu
#define Kontaktron A2
LiquidCrystal lcd(5, 4, 3, 2, A4, A5);


const byte ROWS = 4;
const byte COLS = 4;
byte rowPins[ROWS] = { 9, 8, 7, 6 };
byte colPins[COLS] = { 10, 11, 12, 13 };

//Mapowanie klawiatury
char keys[ROWS][COLS] = {
  { 'D', '#', '0', '*' },
  { 'C', '9', '8', '7' },
  { 'B', '6', '5', '4' },
  { 'A', '3', '2', '1' },
};
Keypad klawa = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

volatile int stanAlarmu = 1;
int pinAlarmuPozycja = 1;
int pinPINU = 1;
int pinCyfra1;
int pinCyfra2;
int pinCyfra3;
int pinCyfra4;
// int ileCzasuMinelo = 0;

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
unsigned long roznicaCzasu = 0;

//== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==
void setup() {
  Serial.begin(9600);

  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Test programu");
  lcd.setCursor(0, 1);
  lcd.print("ALARMU");
  lcd.blink();
  delay(200);
  lcd.clear();

  pinMode(Red, OUTPUT);
  pinMode(Green, OUTPUT);
  pinMode(PIR, INPUT);
  pinMode(Kontaktron, INPUT_PULLUP);

  digitalWrite(Red, LOW);
  digitalWrite(Green, LOW);
}
//== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==
void loop() {
  char klawisz;

  switch (stanAlarmu) {  // Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod;

    case 1:  //Programowanie PINU

      klawisz = klawa.getKey();
      Wyswietl1();  // Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod; Nowy Kod;

      if (pinPINU == 1) {

        UstawianiePinu();
        lcd.setCursor(8, 1);
        lcd.print("PIN: 1");
        lcd.setCursor(0, 1);
        int value1 = readNumber1();
        pinCyfra1 = value1;
        ZamigajGreen();
        pinPINU++;
        return pinCyfra1;

      } else if (pinPINU == 2) {

        UstawianiePinu();
        lcd.setCursor(8, 1);
        lcd.print("PIN: 2");
        lcd.setCursor(0, 1);
        int value2 = readNumber2();
        pinCyfra2 = value2;
        ZamigajGreen();
        pinPINU++;
        return pinCyfra2;

      } else if (pinPINU == 3) {
        UstawianiePinu();
        lcd.setCursor(8, 1);
        lcd.print("PIN: 3");
        lcd.setCursor(0, 1);
        int value3 = readNumber3();
        pinCyfra3 = value3;
        ZamigajGreen();
        pinPINU++;
        return pinCyfra3;

      } else if (pinPINU == 4) {
        lcd.setCursor(0, 1);
        lcd.setCursor(8, 1);
        lcd.print("PIN: 4");
        lcd.setCursor(0, 1);
        int value4 = readNumber4();
        pinCyfra4 = value4;
        ZamigajGreen();
        PinUstawiony();
        stanAlarmu = 2;
        return pinCyfra4;
      }

      break;
    case 2:                      //Czuwanie
      klawisz = klawa.getKey();  // Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod; Stary Kod;
      Wyswietl2();
      if (klawisz == 'A') {
        Wyswietl3();
        stanAlarmu = 3;
      } else if (klawisz == 'C') {
        klawisz = klawa.getKey();
        pinCyfra1 = 0;
        pinCyfra2 = 0;
        pinCyfra3 = 0;
        pinCyfra4 = 0;
        int value1 = 0;
        int value2 = 0;
        int value3 = 0;
        int value4 = 0;
        pinAlarmuPozycja = 1;
        pinPINU = 1;
        PinSkasowany();
        stanAlarmu = 1;
      }
      break;

    case 3:  // Monitorowanie
      if (digitalRead(PIR) == HIGH) {
        Wyswietl5();
        stanAlarmu = 5;
      } else {
        if (digitalRead(Kontaktron) == LOW) {
          // ileCzasuMinelo = 0;
          Wyswietl4();
          stanAlarmu = 4;
        }
      }
      break;

    case 4:  //Rozbrajanie
      Wyswietl4();
      klawisz = klawa.getKey();

      if (klawisz) {

        if (pinAlarmuPozycja == 1 && klawisz == pinCyfra1) {
          Serial.println(klawisz);
          pinAlarmuPozycja++;
          ZamigajGreen();
        } else if (pinAlarmuPozycja == 2 && klawisz == pinCyfra2) {
          Serial.println(klawisz);
          pinAlarmuPozycja++;
          ZamigajGreen();
        } else if (pinAlarmuPozycja == 3 && klawisz == pinCyfra3) {
          Serial.println(klawisz);
          pinAlarmuPozycja++;
          ZamigajGreen();
        } else if (pinAlarmuPozycja == 4 && klawisz == pinCyfra4) {
          Serial.println(klawisz);
          ZamigajGreen();
          ZamigajGreen();
          ZamigajGreen();
          stanAlarmu = 2;
          lcd.clear();
          pinAlarmuPozycja = 1;
        } else {
          Wyswietl5();
          stanAlarmu = 5;
          pinAlarmuPozycja = 1;
        }
      }
      // delay(1000);
      // ileCzasuMinelo++;

      // if (ileCzasuMinelo >= 50) {
      //   stanAlarmu = 4;
      // }
      break;

    case 5:  //Sygnalizacja alarmu
      Wyswietl5();
      int i;
      for (i = 0; i < 5; i++) {
        digitalWrite(Red, HIGH);
        delay(250);
        digitalWrite(Red, LOW);
        delay(250);
      }
      if (digitalRead(Kontaktron) == LOW) {
        // ileCzasuMinelo = 0;
        lcd.clear();
        Wyswietl4();
        stanAlarmu = 4;
      }
      break;
  }
}

void TEST() {
  char klawisz;
  Serial.print(pinCyfra1);
  Serial.print(" [PIN1]\t");
  Serial.print(pinCyfra2);
  Serial.print(" [PIN2]\t");
  Serial.print(pinCyfra3);
  Serial.print(" [PIN3]\t");
  Serial.print(pinCyfra4);
  Serial.print(" [PIN4]\t");
  Serial.print(klawisz);
  Serial.print(" [klawisz]\n");
}


void Wyswietl1() {
  lcd.setCursor(0, 0);
  lcd.print("Ustawianie PINU");
}
void Wyswietl2() {
  lcd.setCursor(0, 0);
  lcd.print("Stan Alarmu:");
  lcd.setCursor(0, 1);
  lcd.print("Czuwanie");
}
void Wyswietl3() {
  lcd.setCursor(0, 0);
  lcd.print("Stan Alarmu:");
  lcd.setCursor(0, 1);
  lcd.print("Monitorowanie");
}
void Wyswietl4() {
  lcd.setCursor(0, 0);
  lcd.print("Stan Alarmu:");
  lcd.setCursor(0, 1);
  lcd.print("Rozbrajanie ");
  lcd.print(pinAlarmuPozycja);
}
void Wyswietl5() {
  lcd.setCursor(0, 0);
  lcd.print("Stan Alarmu:");
  lcd.setCursor(0, 1);
  lcd.print("Jest wlaczony");
}

void ZamigajGreen() {
  int j;
  for (j = 0; j < 1; j++) {
    digitalWrite(Green, HIGH);
    delay(250);
    digitalWrite(Green, LOW);
    delay(250);
  }
}

void UstawianiePinu() {
  lcd.setCursor(0, 0);
  lcd.print("Ustawianie PINU");
  lcd.setCursor(0, 1);
}

void PinUstawiony() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Pin ustawiony");
  lcd.setCursor(0, 1);
  lcd.print(pinCyfra1);
  lcd.print(pinCyfra2);
  lcd.print(pinCyfra3);
  lcd.print(pinCyfra4);
  delay(2000);
  lcd.clear();
}

void PinSkasowany() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Pin Skasowany");
  lcd.setCursor(0, 1);
  lcd.print(pinCyfra1);
  lcd.print(pinCyfra2);
  lcd.print(pinCyfra3);
  lcd.print(pinCyfra4);
  delay(2000);
  lcd.clear();
}

int readNumber1() {                    //Funkcja read number umożliwiająca odczytywanie liczb wprowadzonych na klawiaturze i zwraca ich wartość w postaci zmiennej typu long
  int num1 = 0;                        // Inicjalizacja zmiennej `num` jako 0.
  char key = klawa.getKey();           // Odczyt pierwszego przycisku naciśniętego na klawiaturze.
  while (key != 'D') {                 // Wykonuj pętlę, dopóki naciśnięty przycisk nie jest symbolem "D".
    if (key >= '0' && key <= '9') {    // Jeśli naciśnięty przycisk to cyfra 0-9.
      num1 = num1 * 10 + (key - '0');  // Dodaj naciśniętą cyfrę do zmiennej `num`.
      lcd.setCursor(0, 1);             // Ustaw kursor LCD na pozycji (0,1).
      lcd.print(key);                  // Wyświetl aktualną wartość zmiennej `num` na LCD.
      delay(200);
      lcd.setCursor(0, 1);
      lcd.print("*");
    }
    key = klawa.getKey();  // Odczytaj kolejny przycisk naciśnięty na klawiaturze.
    delay(10);             // Poczekaj 10 milisekund.
  }
  return num1;  // Zwróć wartość zmiennej `num`.
}

int readNumber2() {                    //Funkcja read number umożliwiająca odczytywanie liczb wprowadzonych na klawiaturze i zwraca ich wartość w postaci zmiennej typu long
  int num2 = 0;                        // Inicjalizacja zmiennej `num` jako 0.
  char key = klawa.getKey();           // Odczyt pierwszego przycisku naciśniętego na klawiaturze.
  while (key != 'D') {                 // Wykonuj pętlę, dopóki naciśnięty przycisk nie jest symbolem "D".
    if (key >= '0' && key <= '9') {    // Jeśli naciśnięty przycisk to cyfra 0-9.
      num2 = num2 * 10 + (key - '0');  // Dodaj naciśniętą cyfrę do zmiennej `num`.
      lcd.setCursor(0, 1);             // Ustaw kursor LCD na pozycji (0,1).
      lcd.print(key);                  // Wyświetl aktualną wartość zmiennej `num` na LCD.
      delay(200);
      lcd.setCursor(0, 1);
      lcd.print("*");
    }
    key = klawa.getKey();  // Odczytaj kolejny przycisk naciśnięty na klawiaturze.
    delay(10);             // Poczekaj 10 milisekund.
  }
  return num2;  // Zwróć wartość zmiennej `num`.
}

int readNumber3() {                    //Funkcja read number umożliwiająca odczytywanie liczb wprowadzonych na klawiaturze i zwraca ich wartość w postaci zmiennej typu long
  int num3 = 0;                        // Inicjalizacja zmiennej `num` jako 0.
  char key = klawa.getKey();           // Odczyt pierwszego przycisku naciśniętego na klawiaturze.
  while (key != 'D') {                 // Wykonuj pętlę, dopóki naciśnięty przycisk nie jest symbolem "D".
    if (key >= '0' && key <= '9') {    // Jeśli naciśnięty przycisk to cyfra 0-9.
      num3 = num3 * 10 + (key - '0');  // Dodaj naciśniętą cyfrę do zmiennej `num`.
      lcd.setCursor(0, 1);             // Ustaw kursor LCD na pozycji (0,1).
      lcd.print(key);                  // Wyświetl aktualną wartość zmiennej `num` na LCD.
      delay(200);
      lcd.setCursor(0, 1);
      lcd.print("*");
    }
    key = klawa.getKey();  // Odczytaj kolejny przycisk naciśnięty na klawiaturze.
    delay(10);             // Poczekaj 10 milisekund.
  }
  return num3;  // Zwróć wartość zmiennej `num`.
}

int readNumber4() {                    //Funkcja read number umożliwiająca odczytywanie liczb wprowadzonych na klawiaturze i zwraca ich wartość w postaci zmiennej typu long
  int num4 = 0;                        // Inicjalizacja zmiennej `num` jako 0.
  char key = klawa.getKey();           // Odczyt pierwszego przycisku naciśniętego na klawiaturze.
  while (key != 'D') {                 // Wykonuj pętlę, dopóki naciśnięty przycisk nie jest symbolem "D".
    if (key >= '0' && key <= '9') {    // Jeśli naciśnięty przycisk to cyfra 0-9.
      num4 = num4 * 10 + (key - '0');  // Dodaj naciśniętą cyfrę do zmiennej `num`.
      lcd.setCursor(0, 1);             // Ustaw kursor LCD na pozycji (0,1).
      lcd.print(key);                  // Wyświetl aktualną wartość zmiennej `num` na LCD.
      delay(200);
      lcd.setCursor(0, 1);
      lcd.print("*");
    }
    key = klawa.getKey();  // Odczytaj kolejny przycisk naciśnięty na klawiaturze.
    delay(10);             // Poczekaj 10 milisekund.
  }
  return num4;  // Zwróć wartość zmiennej `num`.
}

 

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.