Skocz do zawartości

Kurs Arduino II - #4 - przerwania, kontaktron, czujnik PIR


Komentator

Pomocna odpowiedź

@Kurczak92 a sprawdzałeś jak działa kontaktron w układach jak w kursie elektroniki 2? Gdy dasz go w układzie z zasilaniem i jakimś np. LED, chwilowo bez mikrokontrolera.

Możesz też sprawdzić czy magnes nie ściąga listków za słabo, może jakiś inny będzie współgrał lepiej, bo takie zjawisko raczej nie jest poprawne.

Link do komentarza
Share on other sites

Witam 🙂

Co prawda nie dokończyłem jeszcze całego odcinka, jednak chciałbym przedstawić moją małą modyfikację co do zadania domowego dla systemu alarmowego przy otwieraniu okien.

Jedynym, a jednak dość istotnym dodatkiem jest pojedynczy mikroswitch, który pozwala na wygodne zresetowanie systemu po upewnieniu się, że okna są zamknięte, a w środku nie przybyło nam żadnych gości. Stwierdziłem, że przy takim resetowaniu miłym dodatkiem są dwa szybkie bipnięcia buzzera, co daje nam znać że możemy odejść od układu spokojni, że dalej jesteśmy pod jego ochroną.

Co prawda można by użyć do tego celu przycisku RESET na mikrokontrolerze, jednak własny przycisk ma pewną przewagę - możemy go umieścić gdzie tylko sobie życzymy, co pozwala nam zresetować układ wygodnie z naszego biurka/łóżka bez potrzeby żadnego ruchu. Leniuchowanie nigdy nie było tak proste!

Załączam mój kod, jednak komentarze są po angielsku, ponieważ przyzwyczajam się na to, co czeka mnie na studiach.

Wyprowadzenia na Arduino dokładnie tak, jak są opisane w #define

// This programme uses reed switch, RGB LED and a buzzer in simple alarm system

/*
 * System works as follows:
 * 1. When the window is closed (reed switch is connected), LED glows GREEN and the system is silent
 * 2. Once the window is opened, reed switch disconects:
 *    - LED turns RED
 *    - Buzzer starts making noise
 *    Even when the window is immediately closed, once opened alarm goes off
 * 3. Microswitch is used to reset the system:
 *    - When the door is closed, button is pushed
 *    - LED turns GREEN again
 *    - Buzzer makes two short beeps to let us know that the system is succesfully reset
 *    - Additional short delay to prevent disruptions
 *    
 * That way it's a simple alarm system that can be expanded with more reed switches.
 */

#define firstRed 10 // Defines these pins for our convenience
#define firstGreen 11
#define firstBlue 12

#define firstReed 2 
#define buzzerPin 9
#define button 3

void setup() {  
  pinMode(firstRed, OUTPUT); // RGB pins as outputs
  pinMode(firstGreen, OUTPUT);
  pinMode(firstBlue, OUTPUT);

  digitalWrite(firstRed, LOW); // Makes sure the LED is initially turned off
  digitalWrite(firstGreen, LOW);
  digitalWrite(firstBlue, LOW);
  
  pinMode(firstReed, INPUT_PULLUP); // Reed switch as an input

  pinMode(buzzerPin, OUTPUT); // Buzzer as an output
  digitalWrite(buzzerPin, LOW);
  noTone(buzzerPin);

  pinMode(button, INPUT_PULLUP);
}

void loop() {
  tone(buzzerPin, 4000, 100); // Buzzer beeps two times (initially to let you know the system is on, then that the system is reset)
  delay(150);
  tone(buzzerPin, 4000, 100);

  delay(1000); // Additional delay to prevent disruptions
  
  digitalWrite(firstRed, LOW); // Settings to reset the system - LED glows GREEN, buzzer is silent
  digitalWrite(firstGreen, HIGH);
  noTone(buzzerPin);

  while(digitalRead(firstReed) == LOW) {} // Waits for the window to be opened

  digitalWrite(firstRed, HIGH); // LED glows RED
  digitalWrite(firstGreen, LOW);

  while(digitalRead(button) == HIGH) { // Loop that goes on till the button is pressed
    tone(buzzerPin, 4250);
    delay(150);
    tone(buzzerPin, 3750);
    delay(150);
  }

  // Button has been pressed, main loop starts over again
}

Postaram się dołączyć również filmik jak tylko zedytuję wpis na telefonie.

PS - Podczas pracy nad tym układem naszły mnie dwa szybkie pytania:
- Czy jest różnica w tym, który pin używamy jako wyprowadzenie dla buzzera bez generatora przy używaniu funkcji tone()? W kursie podłączyliśmy go do pinu Analog, jednak wygląda na to że działa równie dobrze zarówno na pinach Digital i PWM
- Jaka jest różnica pomiędzy microswitchami 4.3mm a 5mm? Oczywiście, poza tymi oczywistymi. Jedyne logiczne wytłumaczenia jakie przychodzą mi do głowy to albo żeby móc puścić przez nie "większy" prąd, albo dla naszej wygody, gdy musimy umieścić je w otworach o odpowiedniej grubości. Skoro używamy ich do ustawienia logicznego 0/1, przy pracowaniu z większym prądem tak czy siak będziemy musieli użyć tranzystorów, dlatego obstawiam tą drugą opcję.

Miłego dnia, może za chwilę wyląduje kolejny wpis, tym razem o czujniku ruchu lub przerywaniach 😉

Edit - nie mogę zamieścić tutaj pliku mp4, więc dołączam zdjęcie układu. Myślę że każdy poradzi sobie z jego odtworzeniem, swoją drogą polecam wykorzystać naklejki forbota na drewnianej podstawce, etektywny sposób na upewnienie się co do odpowiedniego rezystora

IMG_20200910_101923.jpg

Edytowano przez bujo2001
Dodatkowa zawartość
  • Lubię! 1
Link do komentarza
Share on other sites

@bujo2001 ciekawa modyfikacja, powodzenia w dalszych eksperymentach 🙂

Dnia 10.09.2020 o 10:16, bujo2001 napisał:

Czy jest różnica w tym, który pin używamy jako wyprowadzenie dla buzzera bez generatora przy używaniu funkcji tone()? W kursie podłączyliśmy go do pinu Analog, jednak wygląda na to że działa równie dobrze zarówno na pinach Digital i PWM

W tym przypadku nie ma to większego znaczenia. Wybór pinu, który może pełnić rolę wejścia analogowego nie był kluczowy.

Dnia 10.09.2020 o 10:16, bujo2001 napisał:

- Jaka jest różnica pomiędzy microswitchami 4.3mm a 5mm? Oczywiście, poza tymi oczywistymi. Jedyne logiczne wytłumaczenia jakie przychodzą mi do głowy to albo żeby móc puścić przez nie "większy" prąd, albo dla naszej wygody, gdy musimy umieścić je w otworach o odpowiedniej grubości. Skoro używamy ich do ustawienia logicznego 0/1, przy pracowaniu z większym prądem tak czy siak będziemy musieli użyć tranzystorów, dlatego obstawiam tą drugą opcję.

To tylko rozmiar elementu, który czasami jest też powiązany z innym rozstawem wyprowadzeń. W tym przypadku nie wpływa to bezpośrednio na żadne inne właściwości układu.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

@Antosik Będzie ciężko to odtworzyć, bo sporo czasu minęło odkąd to składałem, ale generalnie jeżeli złożysz układ tak samo jak jest to opisane w kursie, to jedyną nową zmianą jest przycisk, który wsm podłączasz standardowo do jednego z portów cyfrowych i do masy. Wszystko inne to już tylko kwestia kodowania, a to jest zamieszczone w poście 🙂

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

Dnia 8.12.2019 o 21:18, Gieneq napisał:

@Kakol155 miło czytać pozytywny komentarz, zachęca to do dalszej pracy, może właśnie nad 3 częścią kursu. 😉 A miałbyś propozycje tematów? 

Tak do końca nie wiem jaki temat konkretny ale bym zaproponował sterowanie światłem, sterowanie pompą, zrobienie własnego power banka, czujnik temperatury, czujnik zanieczyszczeń  jeszcze bym zaproponował jakieś ciekawostki i ciekawe projekty z solarem. 

  • Lubię! 1
Link do komentarza
Share on other sites

Cześć, dzięki za kurs. 

Wyjaśnienie przerwań bardzo literackie i wyjaśniło dogłębnie.

Miałem trudności z realizacją lekcji wynikające z podpięcia kabelka do pinu 0 i w tym stanie ładowanie programu do płytki.

(Jak się okazało - nie ja pierwszy, ale każdy szczeniak swoje mydło  musi zjeść). 

Zaburzyło to działanie i środowiska IDE ( kompilowanie pustego programu (dwie puste funkcje setup i loop) generowało błąd, a także płytki - komputer nie rozpoznawał co podłączam do USB. Wykonałem kilka chaotycznych ruchów.

Przestawianie deklaracji typu obsługiwanej płytki w ustawieniach IDE, powodowało reset IDE (chyba).

Nie wiem co naprostowało ustawienia płytki, raczej nie przekaz słowny, za którymś razem uruchomiła się prawidłowo. 

Pytanie w związku z tym - czy jest jakiś sposób, by płytkę do ustawień fabrycznych zresetować?

Link do komentarza
Share on other sites

@pawelKO miło słyszeć, że kurs (i sposób tłumaczenia) CI się spodobał 🙂

14 godzin temu, pawelKO napisał:

Pytanie w związku z tym - czy jest jakiś sposób, by płytkę do ustawień fabrycznych zresetować?

Nie ma raczej takiej metody. Jeśli napotykasz problemy z komunikacją i wgrywaniem programu to zawsze warto spróbować wcisnąć przycisk RESET tuż przed próbą wgrania programu. Sytuacja, w której Arduino całkiem nie jest widoczne na PC to już podejrzana sprawa - zacząłbym wtedy standardowo np. od reinstalacji sterowników danego urządzenia.

  • Lubię! 1
Link do komentarza
Share on other sites

Rozwiązanie zadania 4.1, czy ktoś zna lepszy sposób na nie wyłączanie alarmu po ponownym zetknięciu kontaktronu niż while(true)?
 

#define LED_R 10
#define LED_G 11
#define LED_B 12

#define CONTACTOR 2
#define BUZZER A5

void setup() {
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
  pinMode(CONTACTOR, INPUT_PULLUP);
  digitalWrite(LED_G, HIGH);
}

void loop() {
  if (digitalRead(CONTACTOR) == HIGH) {
    digitalWrite(LED_R, HIGH);
    digitalWrite(LED_G, LOW);
    while (true) {
      tone(BUZZER, 3700);
      delay(500);
      tone(BUZZER, 4300);
      delay(500);
    }
  }
}

 

  • Lubię! 1
Link do komentarza
Share on other sites

35 minut temu, farmaceuta napisał:

A jaki masz ten czujnik(model)? W necie napewno znajdziesz opis wyprowadzen...

Teraz zauważyłem , że wyprowadzenia są podpisane na czujniku , tylko że po stronie przykrytej soczewką.😀

  • Lubię! 1
Link do komentarza
Share on other sites

Napisałem taki kod, przerwanie nie działa natychmiastowo. Zanim włączy się czerwona dioda, część programu z 'else' i tak musi najpierw dojść do końca aby została przerwana. Dlaczego tak się dzieje? Gdzie popełniłem błąd?

#define R 9
#define G 10
#define B 11
#define K 2
volatile int zmiana=0; 

void setup() {
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(K, INPUT_PULLUP);  
  digitalWrite(R, HIGH); // LOW to swieci bo jest to dioda ze wspolna anodą
  digitalWrite(G, HIGH);
  digitalWrite(B, HIGH);
  attachInterrupt(digitalPinToInterrupt(K), alarm, RISING);
}

void loop() { 
  if(zmiana==1){
    digitalWrite(R, LOW);
    digitalWrite(G, HIGH);
    delay(5000);
    zmiana=0;  
  }else{
    digitalWrite(R, HIGH);
    digitalWrite(G, LOW);
    delay(1000);
    digitalWrite(G, HIGH);
    delay(1000);
  }
}

void alarm() {
  zmiana=1; 
}
Link do komentarza
Share on other sites

@Macej98 witam na forum 🙂 Przerwanie wykonuje się natychmiastowo - wartość zmiennej ustawiania jest na 1. Jednak efekt tej zmiany zauważysz dopiero, gdy zakończy się poprzedni cykl "migania". Program jest wykonywany, zostaje przerwany, zmienna jest ustawiania na 1, a następnie program wraca do miejsca, w którym został przerwany. Jeśli było to gdzieś wewnątrz "else" to po obsłudze przerwania program tam wróci, aby dokończyć wcześniejsze działanie.

  • Lubię! 1
  • Pomogłeś! 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.