Skocz do zawartości

Pomocna odpowiedź

Cześć. Projekt dodaję aby ułatwić projektowanie początkującym oraz aby dowiedzieć się o ewentualnych błędach w kodzie. 

dioda niebieska - czuwanie

dioda zielona - monitoring

dioda żółta - czas na dezaktywacje alarmu po przerwaniu obwodu

dioda czerwona - cichy alarm


 
 

#define KONTAKTRON 10
 
#include <Keypad.h> //biblioteka od klawiatury
 
const byte ROWS = 4; // ile wierszy
const byte COLS = 4; //ile kolumn
 
byte rowPins[ROWS] = {2, 3, 4, 5}; //piny wierszy
byte colPins[COLS] = {6, 7, 8, 9}; //piny kolumn
 
char keys[ROWS][COLS] = { //mapowanie klawiatury
  {'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 pinAlarmuPozycja = 1;
char pinCyfra1 = '1';
char pinCyfra2 = '2';
char pinCyfra3 = '3';
char pinCyfra4 = '4';
 
int ileCzasuMinelo = 0;
 
void setup() {
  pinMode(11, OUTPUT);
  pinMode(KONTAKTRON, INPUT_PULLUP);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(A0, OUTPUT);
 
}
 
void loop() {
  char klawisz = 0; //zmienna do przetrzymywania znakow z klawiatury
  int i = 0; //zmienna pomocnicza do pętli
 
  switch(stanAlarmu) { //Wykonywania akcji odpowiedniej dla danego stanu
    case 1:
      //Czuwanie
digitalWrite (13, HIGH);
digitalWrite(11, LOW);
digitalWrite(A0, LOW);
            klawisz = klawiatura.getKey();
      if (klawisz == 'A') { //Czy zubroic alarm?
        for (i = 1; i < 8; i++) {
         digitalWrite (13, LOW);
          delay(710);
        } // wykonanie tej petli zajmie okolo 5 sekund }
        stanAlarmu = 2;
      }
        
    break;
    
    case 2:
      //Monitorowanie
      digitalWrite(12, HIGH);
      delay(1000);
      digitalWrite(12, LOW);
      delay (1000);

 if (digitalRead(KONTAKTRON) == HIGH) {
        ileCzasuMinelo= 0; //Zerowanie zmiennej
        stanAlarmu = 3; //Szansa na rozbrojenie
      }
      
    break;
    
    case 3:
    digitalWrite(11, HIGH);
      //Rozbrajanie
      klawisz = klawiatura.getKey();
      if (klawisz) {
        //Czy kolejna podana cyfra jest poprawna?
        if (pinAlarmuPozycja == 1 && klawisz == pinCyfra1) { //Jesli sprawdzamy 1 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna
        } else if (pinAlarmuPozycja == 2 && klawisz == pinCyfra2) { //Jesli sprawdzamy 2 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna         
        } else if (pinAlarmuPozycja == 3 && klawisz == pinCyfra3) { //Jesli sprawdzamy 3 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna        
        } else if (pinAlarmuPozycja == 4 && klawisz == pinCyfra4) { //Jesli sprawdzamy 4 pozycje PINu
            stanAlarmu = 1; //Wszystkie 4 cyfry kodu sa poprawne
            pinAlarmuPozycja = 1; //Resetujemy informacje o wpisywanym pinie       
        } else {
           stanAlarmu = 4; //Blad w kodzie PIN - wlacz alarm
           pinAlarmuPozycja = 1; //Resetujemy informacje o wpisywanym pinie 
        }
      }
 
      delay(100);
      ileCzasuMinelo++;
 
      if (ileCzasuMinelo >= 100) {
        stanAlarmu = 4;
      }
    break;
    
    case 4:
      //Sygnalizacja alarmu
      for (i = 0; i < 8; i++) {  
      digitalWrite(A0, HIGH);
      }
      klawisz = klawiatura.getKey();
      if (klawisz) {
        //Czy kolejna podana cyfra jest poprawna?
        if (pinAlarmuPozycja == 1 && klawisz == pinCyfra1) { //Jesli sprawdzamy 1 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna
        } else if (pinAlarmuPozycja == 2 && klawisz == pinCyfra2) { //Jesli sprawdzamy 2 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna         
        } else if (pinAlarmuPozycja == 3 && klawisz == pinCyfra3) { //Jesli sprawdzamy 3 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna        
        } else if (pinAlarmuPozycja == 4 && klawisz == pinCyfra4) { //Jesli sprawdzamy 4 pozycje PINu
            stanAlarmu = 1; //Wszystkie 4 cyfry kodu sa poprawne
            pinAlarmuPozycja = 1; //Resetujemy informacje o wpisywanym pinie       
        } else {
           pinAlarmuPozycja = 1; //Resetujemy informacje o wpisywanym pinie 
        }
        delay(100);
  }    
  
  }  }

 

Pytanie. Jak zaprogramować miganie diody alarmu z możliwością wpisania kodu dezaktywującego "cichy alarm"?

Link to post
Share on other sites
Dnia 6.01.2022 o 21:43, edgariwanow napisał:

Jak zaprogramować miganie diody alarmu z możliwością wpisania kodu dezaktywującego "cichy alarm"?

Możesz skorzystać z maszyny stanów. Wybrać jakąś sekwencję klawiszy, jeżeli w sekwencji któryś nie będzie się zgadzać, to wtedy wracasz na początek wpisywania kodu i aktywujesz alarm. Pomiędzy wciśnięciami poprawnych ustawiasz licznik czasu na zmiennej long korzystając z millis() i sprawdzasz czy upłynął zadany czas. 

Link to post
Share on other sites

Skorzystałem, dzięki twojej pomocy. Wersja alarmu jest już poprawiona. dodałem zasilanie z akumulatora 12v który jest ładowany przez panel fotowoltaiczny, przez stabilizator napięcia 9V L7809CV. Zmiany w programie to miedzy innymi automatyczne uruchomienie stanu  monitorowania po 8 godzinach czuwania, zwiększenie długości trwania stanu uzbrajania oraz dodanie stanu z migającą diodą żółtą jako czas na dojście do urządzenia.

#define KONTAKTRON 10
 
#include <Keypad.h> //biblioteka od klawiatury
 
const byte ROWS = 4; // ile wierszy
const byte COLS = 4; //ile kolumn
 
byte rowPins[ROWS] = {5, 4, 3, 2}; //piny wierszy
byte colPins[COLS] = {9, 8, 7, 6}; //piny kolum
 
char keys[ROWS][COLS] = { //mapowanie klawiatury
  {'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 pinAlarmuPozycja = 1;
 
int ileCzasuMinelo = 0;
 
void setup() {
  pinMode(11, OUTPUT);
  pinMode(KONTAKTRON, INPUT_PULLUP);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(A0, OUTPUT);
 
}
 
void loop() {
  char klawisz = 0; //zmienna do przetrzymywania znakow z klawiatury
  int i = 0; //zmienna pomocnicza do pętli
 
  switch(stanAlarmu) { //Wykonywania akcji odpowiedniej dla danego stanu
    case 1:
      //Czuwanie
digitalWrite (13, HIGH);
digitalWrite(11, LOW);
digitalWrite(A0, LOW);
digitalWrite(12, LOW);
delay(1000);
            klawisz = klawiatura.getKey();
      if (klawisz == 'A') { //Czy zubroic alarm?
        for (i = 1; i < 11; i++) {
         digitalWrite (13, LOW);
         digitalWrite (12, HIGH);
         delay(1000);
         digitalWrite (11, HIGH);
         delay(1000);
         digitalWrite (A0, HIGH);
          delay(1000);
          digitalWrite (11, LOW);
          digitalWrite (A0, LOW);
          digitalWrite(12, LOW);
          delay(1000);
        }
        stanAlarmu = 2;
      }
      ileCzasuMinelo++;
      if (ileCzasuMinelo >= 28800)
      {stanAlarmu = 2;}
      
    break;
    
    case 2:
      //Monitorowanie
      digitalWrite(12, HIGH);
      delay(1000);
      digitalWrite(12, LOW);
      delay (1000);

      klawisz = klawiatura.getKey();{
      if (klawisz == 'D')//dezaktywacja alarmu przyciskiem D
       stanAlarmu = 1;
      }

 if (digitalRead(KONTAKTRON) == HIGH) {
        ileCzasuMinelo= 0; //Zerowanie zmiennej
        stanAlarmu = 3; //Szansa na rozbrojenie
      }
     break;
    
    case 3:
   
     digitalWrite(11, HIGH);
     delay(1000);
     digitalWrite(11, LOW);
     delay(1000);
{
          klawisz = klawiatura.getKey();
      if (klawisz == 'D') 
      {stanAlarmu = 4;}
}
          ileCzasuMinelo++;
      if (ileCzasuMinelo >= 15)
      {stanAlarmu = 4;}

     break;

    case 4://Rozbrajanie 2/2
    digitalWrite(12, HIGH);
    digitalWrite(11, HIGH);
    klawisz = klawiatura.getKey();
      if (klawisz) {
        //Czy kolejna podana cyfra jest poprawna?
        if (pinAlarmuPozycja == 1 && klawisz == '7') { //Jesli sprawdzamy 1 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna
        } else if (pinAlarmuPozycja == 2 && klawisz == '8') { //Jesli sprawdzamy 2 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna         
        } else if (pinAlarmuPozycja == 3 && klawisz == '9') { //Jesli sprawdzamy 3 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna        
        } else if (pinAlarmuPozycja == 4 && klawisz == 'C') { //Jesli sprawdzamy 4 pozycje PINu
            stanAlarmu = 1; //Wszystkie 4 cyfry kodu sa poprawne
            pinAlarmuPozycja = 1; //Resetujemy informacje o wpisywanym pinie       
        } else {
           stanAlarmu = 4; //Blad w kodzie PIN - wlacz alarm
           pinAlarmuPozycja = 1; //Resetujemy informacje o wpisywanym pinie 
        }
      }
 
      delay(100);
      ileCzasuMinelo++;
 
      if (ileCzasuMinelo >= 50) {
        stanAlarmu = 5;
      }
      break;
    
    case 5:
    digitalWrite(12, LOW);
    digitalWrite(11, LOW);
      //Sygnalizacja alarmu
      for (i = 0; i < 8; i++) {  
      digitalWrite(A0, HIGH);
      }
      
      klawisz = klawiatura.getKey();
      if (klawisz) {
        //Czy kolejna podana cyfra jest poprawna?
        if (pinAlarmuPozycja == 1 && klawisz == '7') { //Jesli sprawdzamy 1 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna
        } else if (pinAlarmuPozycja == 2 && klawisz == '8') { //Jesli sprawdzamy 2 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna         
        } else if (pinAlarmuPozycja == 3 && klawisz == '9') { //Jesli sprawdzamy 3 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna        
        } else if (pinAlarmuPozycja == 4 && klawisz == 'C') { //Jesli sprawdzamy 4 pozycje PINu
            stanAlarmu = 1; //Wszystkie 4 cyfry kodu sa poprawne
            pinAlarmuPozycja = 1; //Resetujemy informacje o wpisywanym pinie       
        } else {
           pinAlarmuPozycja = 1; //Resetujemy informacje o wpisywanym pinie 
        
        
        delay(100);
      }   }  
    break;   
  }
  }

66338163_IMG_20220108_200702(1).thumb.jpg.cec68d8676f72834adaf79462ec37649.jpg2037800347_IMG_20220108_203319(1).thumb.jpg.ed4633a80ec4a92aa1441699ccf8679a.jpg

  • Lubię! 1
Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.