Skocz do zawartości

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


Komentator

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?

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

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

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

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 🙂

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

Link do komentarza
Share on other sites

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

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

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