Skocz do zawartości

Kurs Arduino II - #5 - klawiatura, własny system alarmowy


Pomocna odpowiedź

Racja, bo tak: jak wchodzisz w case 3 to jedyna możliwość żeby zostać w jakimś stabilnym stanie to mieć już wciśnięty przycisk na klawiaturze, ale jak będziesz go trzymał to wyskoczy przy kolejnym obrocie pętli. Twoje ify wewnątrz case 3 muszą mieć jakąś pamięć.

Czyli nie możesz sprawdzać przycisku wewnątrz ifa tylko gdzieś na zewnątrz - nawet w głównej pętli i przy wykryciu zbocza zapisywać że:

aha przycisk X był w HIGH (nie wciśnięty, masz to zapisane w zmiennej pomocniczej ostatni stan przycisku) ale w kolejnym obrocie pętli (czyli teraz) przycisk jest w LOW, to ustaw zmienną przycisk_x na true. Jeżeli inny będzie wciśnięty to poprzedni kasujesz:

przycisk_x = false, przycisk_y = true. itd.

W Arduino reakcja na stan przycisku zazwyczaj jest nieprzydatna, tylko reakcja na zmianę stanu i zapamiętanie tej zmiany.

Edytowano przez Gieneq
Link to post
Share on other sites

Witam.

Mam problem z dodatkowym zadaniem. Przerwanie mi nie działa. Dopisałem przerwanie w kodzie programu. Po wgraniu programu, arduino w ogóle nie reaguje na przycisk. Czy się go wciśnie, czy się go puści, brak reakcji. Wstawiam linijki z kodu związane z przerwaniem. 

#define PRZYCISK 12 //pin do którego podlączony jest przycisk

volatile int stanAlarmu = 1;

void setup(){
  pinMode(PRZYCISK, INPUT_PULLUP); //przycisk jako INPUT_PULLUP
  attachInterrupt(digitalPinToInterrupt(PRZYCISK), reset, FALLING); //przerwanie
}

void reset() {
  wylaczDiody(); //funkcja która wylącza diody
  noTone(BUZZER); //wycisz buzzer
  stanAlarmu = 1; //wartość zmiennej stanAlarmu ustaw na 1 Przy wartości 1 alarm powiniem przejść w stan czuwania
}

W programie działa wszystko oprócz przerwania.

Link to post
Share on other sites

Witam,

mam pytanie w kwestii resetowania centralki. Zauważyłem (o ile nie przeoczyłem jakiegoś posta), że przeplatają się 2 sposoby: z wykorzystaniem przerwania realizowanego na dodatkowym przycisku albo dodania sprawdzenia wciśnięcia jakiegoś przycisku z matrycy w  stanie 4, kiedy alarm się już włączy (przy czym to rozwiązanie powoduje, że nie zawsze pierwsze wciśnięcie zadziała, bo możemy trafić w moment realizacji pętli for).

I tu pojawia się moje pytanie, czy można zrobić przerwanie, ale z użyciem jednego z przycisków matrycy. Moje próby na razie nie przyniosły efektu.

Link to post
Share on other sites

@szeryf takie rozwiązanie będzie ciężkie w realizacji, bo działanie matrycy jest zgoła innego od tego jak działają normalnie podłączone przyciski. Raczej nie szedłbym w tę stronę.

Link to post
Share on other sites

@Norbert7630 możliwe że masz 2 biblioteki o tej samej nazwie, albo biblioteka jest lokalnie wrzucana w projekt i trzeba odwołać się do niej przy pomocy cudzysłowów, tj:

#include "Keypad.h"

chyba że w ogóle nie pobrałeś tej biblioteki 😞 

Link to post
Share on other sites
#include <Key.h>
#include <Keypad.h>
#include <Adafruit_NeoPixel.h>
#define buzer 4
#define pir 2
#define kontaktron 5

int pinAlarmuPozycja = 1;
char pinCyfra1 = '1';
char pinCyfra2 = '2';
char pinCyfra3 = '3';
char pinCyfra4 = '4';

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

char keys[ROWS][COLS] = {  {'1', '2', '3', 'A'},
                           {'4', '5', '6', 'B'},
                           {'7', '8', '9', 'C'},
                           {'*', '0', '#', 'D'}
};





Keypad klawiatura = Keypad(makeKeymap(keys) , rowsPins, colsPins, ROWS, COLS);
Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, A0, NEO_GRB + NEO_KHZ800);


volatile int stanAlarmu = 1;
int ileCzasuMinelo = 0;
void setup() {



  Serial.begin(9600);
  pinMode(pir, INPUT_PULLUP);
  pinMode(kontaktron, INPUT_PULLUP);
  pinMode(buzer, OUTPUT);
  

  linijka.begin();
  linijka.show();

}

void loop() {

  char klawisz = 0;
  int i = 0;


  switch (stanAlarmu) {

    case 1:
     linijka.setPixelColor(0, linijka.Color(0, 15, 0));
      linijka.show();
      klawisz = klawiatura.getKey();
      if (klawisz == 'A') {
dzwiek(1000);
        for (i = 1; i < 8; i++) {
          linijka.setPixelColor(i, linijka.Color(0, 0, 15));
          linijka.show();
          delay(710);
        }
        for (i = 1; i < 8; i++) {
          linijka.setPixelColor(i, linijka.Color(15, 0, 0));
          linijka.show();
          delay(710);
        }
        wylaczDiody();
        stanAlarmu = 2;
      }

      break;


    case 2:

      linijka.setPixelColor(7, linijka.Color(15, 0, 0));
      linijka.show();
            
      delay(50);
      linijka.setPixelColor(7, linijka.Color(0, 0, 0));
      linijka.show();
       
      delay(50);

      if(digitalRead(pir) == HIGH){
        
        stanAlarmu = 4;
      }else if (digitalRead(kontaktron) == HIGH){
        stanAlarmu = 3;
      }
      break;


    case 3:


    klawisz = klawiatura.getKey();
    if(klawisz){
    if(pinAlarmuPozycja == 1 && klawisz == pinCyfra1){
      dzwiek(350);
pinAlarmuPozycja++;

     }  else if (pinAlarmuPozycja == 2 && klawisz == pinCyfra2){
      dzwiek(400);
      pinAlarmuPozycja++;    
    } else if (pinAlarmuPozycja == 3 && klawisz == pinCyfra3){
      dzwiek(450);
      pinAlarmuPozycja++; 
    }else if (pinAlarmuPozycja == 4 && klawisz == pinCyfra4){
      dzwiek(500);
      stanAlarmu =1 ;
      pinAlarmuPozycja = 1;
      noTone(buzer);
    }else {
      stanAlarmu = 4;
      pinAlarmuPozycja =1;
    }    }
    delay(100);
    ileCzasuMinelo++;
    if (ileCzasuMinelo>= 50){
      stanAlarmu = 4;
    }

    
      break;
  
    
    case 4:

for(i = 0 ; i <8; i++){
  linijka.setPixelColor(i, linijka.Color(255,0,0));
}linijka.show();


      tone(buzer, 4300);
      delay(100);


    for(i = 0 ; i <8; i++){
  linijka.setPixelColor(i, linijka.Color(0,0,255));
}linijka.show();
 tone(buzer, 3500);
delay(100);
klawisz = klawiatura.getKey();
if(klawisz == '0'){
  stanAlarmu = 5;
}
      break;

case 5: 
stanAlarmu = 1;
linijka.clear();
noTone(buzer);
break;

  }









}

void wylaczDiody() {
  for (int i = 0; i < 8; i++) {
    linijka.setPixelColor(i, linijka.Color(0, 0, 0));


  }
  linijka.show();
}


int dzwiek(int ton){
  tone(buzer,ton);
delay(50);
noTone(buzer);
}

Cześć . A oto moje wypociny . Dzięki za wspaniały kurs. :). Tak trzymać.

  • Lubię! 1
Link to post
Share on other sites
Przed chwilą, pawelkucz napisał:

#include <Key.h>
#include <Keypad.h>
#include <Adafruit_NeoPixel.h>
#define buzer 4
#define pir 2
#define kontaktron 5

int pinAlarmuPozycja = 1;
char pinCyfra1 = '1';
char pinCyfra2 = '2';
char pinCyfra3 = '3';
char pinCyfra4 = '4';

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

char keys[ROWS][COLS] = {  {'1', '2', '3', 'A'},
                           {'4', '5', '6', 'B'},
                           {'7', '8', '9', 'C'},
                           {'*', '0', '#', 'D'}
};





Keypad klawiatura = Keypad(makeKeymap(keys) , rowsPins, colsPins, ROWS, COLS);
Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, A0, NEO_GRB + NEO_KHZ800);


volatile int stanAlarmu = 1;
int ileCzasuMinelo = 0;
void setup() {



  Serial.begin(9600);
  pinMode(pir, INPUT_PULLUP);
  pinMode(kontaktron, INPUT_PULLUP);
  pinMode(buzer, OUTPUT);
  

  linijka.begin();
  linijka.show();

}

void loop() {

  char klawisz = 0;
  int i = 0;


  switch (stanAlarmu) {

    case 1:
     linijka.setPixelColor(0, linijka.Color(0, 15, 0));
      linijka.show();
      klawisz = klawiatura.getKey();
      if (klawisz == 'A') {
dzwiek(1000);
        for (i = 1; i < 8; i++) {
          linijka.setPixelColor(i, linijka.Color(0, 0, 15));
          linijka.show();
          delay(710);
        }
        for (i = 1; i < 8; i++) {
          linijka.setPixelColor(i, linijka.Color(15, 0, 0));
          linijka.show();
          delay(710);
        }
        wylaczDiody();
        stanAlarmu = 2;
      }

      break;


    case 2:

      linijka.setPixelColor(7, linijka.Color(15, 0, 0));
      linijka.show();
            
      delay(50);
      linijka.setPixelColor(7, linijka.Color(0, 0, 0));
      linijka.show();
       
      delay(50);

      if(digitalRead(pir) == HIGH){
        
        stanAlarmu = 4;
      }else if (digitalRead(kontaktron) == HIGH){
        stanAlarmu = 3;
      }
      break;


    case 3:


    klawisz = klawiatura.getKey();
    if(klawisz){
    if(pinAlarmuPozycja == 1 && klawisz == pinCyfra1){
      dzwiek(350);
pinAlarmuPozycja++;

     }  else if (pinAlarmuPozycja == 2 && klawisz == pinCyfra2){
      dzwiek(400);
      pinAlarmuPozycja++;    
    } else if (pinAlarmuPozycja == 3 && klawisz == pinCyfra3){
      dzwiek(450);
      pinAlarmuPozycja++; 
    }else if (pinAlarmuPozycja == 4 && klawisz == pinCyfra4){
      dzwiek(500);
      stanAlarmu =1 ;
      pinAlarmuPozycja = 1;
      noTone(buzer);
    }else {
      stanAlarmu = 4;
      pinAlarmuPozycja =1;
    }    }
    delay(100);
    ileCzasuMinelo++;
    if (ileCzasuMinelo>= 50){
      stanAlarmu = 4;
    }

    
      break;
  
    
    case 4:

for(i = 0 ; i <8; i++){
  linijka.setPixelColor(i, linijka.Color(255,0,0));
}linijka.show();


      tone(buzer, 4300);
      delay(100);


    for(i = 0 ; i <8; i++){
  linijka.setPixelColor(i, linijka.Color(0,0,255));
}linijka.show();
 tone(buzer, 3500);
delay(100);
klawisz = klawiatura.getKey();
if(klawisz == '0'){
  stanAlarmu = 5;
}
      break;

case 5: 
stanAlarmu = 1;
linijka.clear();
noTone(buzer);
break;

  }









}

void wylaczDiody() {
  for (int i = 0; i < 8; i++) {
    linijka.setPixelColor(i, linijka.Color(0, 0, 0));


  }
  linijka.show();
}


int dzwiek(int ton){
  tone(buzer,ton);
delay(50);
noTone(buzer);
}

Cześć . A oto moje wypociny . Dzięki za wspaniały kurs. :). Tak trzymać.

Zwykły reset na ZERO.

Link to post
Share on other sites
Dnia 27.01.2021 o 08:10, Gieneq napisał:

@Norbert7630 możliwe że masz 2 biblioteki o tej samej nazwie, albo biblioteka jest lokalnie wrzucana w projekt i trzeba odwołać się do niej przy pomocy cudzysłowów, tj:


#include "Keypad.h"

chyba że w ogóle nie pobrałeś tej biblioteki 😞 

Spróbuj #include <key.h> lub <Keypad.h>. 

Link to post
Share on other sites
9 godzin temu, pawelkucz napisał:

Cześć . A oto moje wypociny . Dzięki za wspaniały kurs. :). Tak trzymać.

@pawelkucz fajnie że robisz coś więcej, tak trzymaj i dziękujemy za pozytywny komentarz 🙂 

Co do kodu to tylko sugestia, żebyś trochę bardziej je porządkował - w ArduinoIDE jest do tego skrót klawiszowy, albo w menu autoformat 😉 

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.