Gieneq Kwiecień 3, 2020 Udostępnij Kwiecień 3, 2020 (edytowany) 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 Kwiecień 3, 2020 przez Gieneq
amisztal0 Lipiec 18, 2020 Udostępnij Lipiec 18, 2020 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.
Gieneq Lipiec 18, 2020 Udostępnij Lipiec 18, 2020 @amisztal0 witam serdecznie na forum przerwania w UNO można podpiąć tylko do 2 i 3 pinu. 2
szeryf Listopad 8, 2020 Udostępnij Listopad 8, 2020 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.
Treker (Damian Szymański) Listopad 9, 2020 Udostępnij Listopad 9, 2020 @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ę.
Gieneq Styczeń 27, 2021 Udostępnij Styczeń 27, 2021 @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
pawelkucz Kwiecień 19, 2021 Udostępnij Kwiecień 19, 2021 #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ć. 1
pawelkucz Kwiecień 19, 2021 Udostępnij Kwiecień 19, 2021 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.
pawelkucz Kwiecień 19, 2021 Udostępnij Kwiecień 19, 2021 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>.
Gieneq Kwiecień 20, 2021 Udostępnij Kwiecień 20, 2021 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
planszowki Kwiecień 25, 2021 Udostępnij Kwiecień 25, 2021 (edytowany) Z tym przyciskiem do restartowania to powinno być tak, że: ? 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 Kwiecień 26, 2021 przez Gieneq
Gieneq Kwiecień 26, 2021 Udostępnij Kwiecień 26, 2021 @planszowki na tym rysunku, jak zewrzesz przycisk to masz gwarantowane zwarcie - tak lepiej nie rób. Jak chcesz dodać osobny przycisk to robisz to tak jak w innych projektach, przerwania możesz dodać ale niekoniecznie.
Pomocna odpowiedź
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ę »