Skocz do zawartości
Komentator

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

Pomocna odpowiedź

SpectrumPL, witaj na forum, Twoje pytanie przeniosłem do wątku związanego z tym kursem. \ Schemat zbudowany we Fritzing nie różniłby się od zdjęć. Połączenie klawiatury jest proste i widoczne dokładnie na początkowych zdjęciach. Podłączenie pozostałych elementów było opisywane dokładnie w poprzednich częściach kursu. Można je spokojnie podłączyć bazując na informacjach z programu (definicje wykorzystywanych ponów). Z którymi połączeniami masz konkretnie problem?

Udostępnij ten post


Link to post
Share on other sites

Zastanawiam się jak by rozgryźć temat.

Wyjście alarmowe (akustyczne) podłączone mam pod przekaźnik nr 1 (syrena 12V) i kombinuję jak podczas stanu alarmowego można by rozbroić alarm za pomocą klawiatury, którą mamy użytą w projekcie.

Myślałem aby wykorzystać przerwanie (osobny szyfrator -> cewka przekaźnika nr 2 -> styki robocze tego przekaźnika podłączone pod pin arduino).

W praktyce zadziałałoby to tak samo jak dodatkowy klawisz jednak nie jest to rozwiązanie które mnie zadowala.

Można zawsze zagonić do roboty drugi procesor, ale to też nie jest najlepszym rozwiązaniem.

Da się to ogarnąć programowo, bez zbędnego rozbudowywania układu?

Ucieszyłaby mnie nawet opcja aby rozbroić stan alarmu, po za wpisaniem kodu pin można by nawet przytrzymać wciśnięte 2-3 klawisze przez kilka sekund

Udostępnij ten post


Link to post
Share on other sites

Frodus, oczywiście da się to zrobić bez rozbudowywania układu (a już na pewno dodatkowy procesor jest zbędny). Zacząłbym od sprawdzenia, czy podczas stanu alarmowego nadal działa klawiatura - nie mam teraz układu pod ręką, ale wydaje mi się, że powinna działać (a już na pewno zadziała wykrycie tego, że klawisz jest wciśnięty i trzymany). Jeśli ta opcja zadziała, to wystarczy po wciśnięciu przycisku przejść do odpowiedniego stanu 🙂

Udostępnij ten post


Link to post
Share on other sites

Nie zaglądałem ostatnio na forum. Przy możliwej okazji posiedzę i pomyślę na tym.

Czy tutaj trzeba użyć funkcji millis?

Udostępnij ten post


Link to post
Share on other sites

Frodus, powinno się dać bez (ale to tak na szybko z głowy mówię) 😉

Udostępnij ten post


Link to post
Share on other sites

Mam pewien problem z czujnikiem PIR - mianowicie ustawiłem wszystkie potencjometry tak jak w kursie, żeby od razu wykrywał jakikolwiek ruch, natomiast czujnik reaguje dopiero po jakichś 5 sekundach od uruchomienia systemu - nie tak jak na filmach :/

edit.

Problem rozwiązany, reset Arduino, ponowne podłączenie czujnika i wszystko śmiga 🙂

Udostępnij ten post


Link to post
Share on other sites

SiaQ, ten czujnik "tak ma", nie masz czym się przejmować. Dyskusja na ten temat była prowadzona już w komentarzach do jednej z poprzedniej części kursu (LINK). Więcej szczegółów znajdziesz np. w tej dokumentacji czujnika. Już na wstępie jestem tam mowa opóźnieniu wynoszącym właśnie 5 sekund 😉

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Witam,
próbując samemu coś napisać kierowałem się wytycznymi jakie były podane podczas kursu, lecz kiedy dodaje bibliotekę Keyboard i wpisuje (komendę?!) Keypad (nazwa klawiatury) = Keypad (makeKeymap itd. 

Po zweryfikowaniu wyskakuje błąd "Keypad" does not name a type". Nie mam zielonego pojęcia co tu może być nie tak. Proszę o pomoc, z góry Bardzo Dziękuję!

Edytowano przez Treker
Poprawiłem formatowanie.

Udostępnij ten post


Link to post
Share on other sites

@Maksus, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.
16 godzin temu, Maksus napisał:

Po zweryfikowaniu wyskakuje błąd "Keypad" does not name a type".

Zainstalowałeś najpierw bibliotekę klawiatury z GitHuba tak jak jest to opisane w artykule? Jeśli tak to wstaw swój cały program - zobaczymy gdzie mógł schować się błąd.

Udostępnij ten post


Link to post
Share on other sites

@Treker , we wczejszych etapach kursu można było pobrać bez wchodzenia na GitHuba tylko zarządzania biblioteką, aczkolwiek szkic wygląda w następujący sposób.

image.png

Udostępnij ten post


Link to post
Share on other sites

@Maksus, napisałem o GitHubie, bo myślałem, że może zainstalowałeś złą wersję biblioteki lub zupełnie inną bibliotekę o tej samej nazwie. Jednak chyba zwyczajnie masz błąd w programie. Spójrz na plik, który dołączasz na samym początku kodu. U Ciebie jest Keyboard.h, a w kursie Keypad.h.

Udostępnij ten post


Link to post
Share on other sites
/*
Kurs Arduino II Forbot [5/10]
Alarm złożony z czujnika ruchu (PIR), 
kontaktronu, sygnalizacji świetlnej, dżwiękowej i klawiatury
*/

// Adafruit NeoPixel - Version: Latest 
#include <Adafruit_NeoPixel.h>

// Keypad - Version: Latest 
#include <Key.h>
#include <Keypad.h>


#define kontaktron 12   //czujnik magnetyczny
#define buzzer A2      //sygnalizator dzwiekowy
#define PIR A1       //czujnik ruchu

const byte ROWS = 4;  //deklaracja i przypisanie liczby rzedow
const byte COLS = 4;  //deklaracja i przypisanie liczby kolumn

byte rowPins[ROWS] = {7, 6, 5, 4};  //deklaracja i przypisanie pinow rzedow i kolumn
byte colPins[COLS] = {8, 9, 10, 11};

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

Keypad klawiatura = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);   //Inicjalizacja klawiatury

Adafruit_NeoPixel linijka = Adafruit_NeoPixel(8, A0, NEO_GRB + NEO_KHZ800); //Konfiguracja linijki LED

volatile int stanAlarmu = 1;

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

int ileCzasuMinelo = 0;

void setup() {
    pinMode(kontaktron, INPUT_PULLUP);
    pinMode(buzzer, OUTPUT);
    pinMode(PIR, INPUT);
    
    linijka.begin();   //Inicjalizacja linijki
    linijka.show();
}

void loop() {
  char klawisz = 0;   //zmienna przetrzymujaca znaki z klawiatury
  int i = 0;          //zmienna pomocnicza do petli for
  
  switch (stanAlarmu){   //wykonaj akcje dla danego stanu alarmu
  case 1:
    //czuwanie
    linijka.setPixelColor(0, linijka.Color(0, 15, 0));  //dioda nr 1 swieci na zielono
    linijka.show();
    
    klawisz = klawiatura.getKey();
    if(klawisz == 'A'){  //Czy wlaczyc alarm
      for(i = 1; i < 8; i++){
        linijka.setPixelColor(i, linijka.Color(0, 0, 15));
        linijka.show();
        delay(680);
      }
      for(i = 1; i < 8; i++){
        linijka.setPixelColor(i, linijka.Color(15, 0, 0));
        linijka.show();
        delay(680);
      }
      
      pikpik();        //efekt dźwiękowy
      
      wylaczDiody();
      stanAlarmu = 2;
    }
  break;
    
  case 2:
    //monitorowanie
    linijka.setPixelColor(7, linijka.Color(15, 0, 0));   //dioda nr 7 swieci na czerwono
    linijka.show();
    delay(50);
    linijka.setPixelColor(7, linijka.Color(0, 0, 0));    //dioda nr 7 wylaczona
    linijka.show();
    delay(50);
    
    if(digitalRead(PIR) == HIGH){
      stanAlarmu = 4;   //uruchom alarm
      pikpik();         //efekt dzwiekowy
    }
    else if(digitalRead(kontaktron) == HIGH){
      ileCzasuMinelo = 0;  //wyzeruj czas wpisywania pinu
      stanAlarmu = 3;   //pozwol rozbroic
    }
  break;
    
  case 3:
    //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
          
          tone(buzzer, 4300);    //efekt dźwiękowy podczas wpisywania kodu
          delay(50);
          noTone(buzzer);
          
        } else if (pinAlarmuPozycja == 2 && klawisz == pinCyfra2) { //Jesli sprawdzamy 2 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna 
          
          tone(buzzer, 3500);
          delay(50);
          noTone(buzzer);
          
        } else if (pinAlarmuPozycja == 3 && klawisz == pinCyfra3) { //Jesli sprawdzamy 3 pozycje PINu
          pinAlarmuPozycja++; //Cyfra poprawna, mozna sprawdzic na kolejna 
          
          tone(buzzer, 3500);
          delay(50);
          noTone(buzzer);
          
        } else if (pinAlarmuPozycja == 4 && klawisz == pinCyfra4) { //Jesli sprawdzamy 4 pozycje PINu
            stanAlarmu = 1; //Wszystkie 4 cyfry kodu sa poprawne
            tone(buzzer, 4300);
            delay(50);
            noTone(buzzer);
        } else {
           stanAlarmu = 4; //Blad w kodzie PIN - wlacz alarm
           pikpik();
        }
      }  
        delay(100);
        ileCzasuMinelo++;
        
        if(ileCzasuMinelo >= 50){
          stanAlarmu = 4;
          pikpik();
        }
      
  break;
    
  case 4:
    //alarm
    for(i = 0; i < 8; i++){
      linijka.setPixelColor(i, linijka.Color(0, 0, 255));
    }
    linijka.show();
    tone(buzzer, 4300);
    delay(50);
    for(i = 0; i < 8; i++){
      linijka.setPixelColor(i, linijka.Color(255, 0, 0));
    }
    linijka.show();
    tone(buzzer, 3500);
    delay(50);
    
    klawisz = klawiatura.getKey();
    if(klawisz == 'D'){
      for(i = 0; i < 8; i++){
        linijka.setPixelColor(i, linijka.Color(0, 0, 0));
      }
      stanAlarmu = 1;
      noTone(buzzer);
    }
    
  break;
  }
}

void wylaczDiody(){
  for(int i = 0; i < 8; i++){
    linijka.setPixelColor(i, linijka.Color(0, 0, 0));   //dioda nr i wylaczona
  }
  linijka.show();
}

void pikpik(){       //funkcja dżwiękowa
  tone(buzzer, 4300);
  delay(100);
  noTone(buzzer);
  delay(50);
  tone(buzzer, 4300);
  delay(100);
  noTone(buzzer);
  delay(1000);
}

Dodane:

*efekty dźwiękowe

*pzycisk reset

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@D3binski, super - bardzo ładny program,  aż miło się przegląda 🙂 Powodzenia w dalszych eksperymentach!

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Treker, dziękuję, miło to słyszeć 🙂

Edytowano przez D3binski
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Witam,

W kodzie jest błąd, ponieważ po wpisaniu pinu i ponownym uzbrojeniu ,i próbie wpisania pinu licznik pozycji nie jest przywracany do pozycji początkowej, co powoduje wywołanie alarmu

Pozdrawiam, 

  • Lubię! 1

Udostępnij ten post


Link to post
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ę »

×