Skocz do zawartości

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


Komentator

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 do komentarza
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 do komentarza
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

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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
Share on other sites

Z tym przyciskiem do restartowania to powinno być tak, że:

obraz.thumb.png.71a0f5d2d8b3f19dde670fc610b9b1ca.png

?  Wtedy używam typu RISING na przerwaniu i działa. Da się to jakoś inaczej zrobić? Udało mi się fajnie wymodulować głos w alarmie, żeby brzmiało jak alarm samochodu🙂. Fajny projekt, tylko to jest bardziej zabawa niż nauka.(Jak np. kurs elektroniki)

Edytowano przez Gieneq
Link do komentarza
Share on other sites

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.