Skocz do zawartości

Czy można wybudzić Arduino czujnikiem ruchu PIR?


mihuu

Pomocna odpowiedź

Skoro ktoś przechodzi przez korytarz w czasie rzędu milisekund to ok. W  każdym razie rozwiązanie z odcinaniem zasilania mikrokontrolera jest całkiem ciekawe i potrafi ograniczyć pobór pradu do mikroamper. Ale są też inne rozwiązania, każde ma swoje plusy i minusy.

Link do komentarza
Share on other sites

(edytowany)

Była mowa o kilku sekundach...

 

"Arduino działa od razu, tyle że na początku uruchamia bootloadera, a twój program po paru sekundach."

 

Chyba, że wkradł się błąd i faktycznie chodzi o milisekundy więc wtedy OK 🙂 Czyli wracając do tranzystora - jaki by się nadał? Bo oczywiście byłoby to rozwiązanie najlepsze, pobór byłby tylko na czuwającym czujniku ruchu.

Edytowano przez mihuu
Link do komentarza
Share on other sites

Nie wiem ile czasu startuje bootloader arduino i nie wiem jak dokładnie działa - ale nie jest dużym wyzwaniem napisać program, przetestować, a na koniec wywalić bootloader. To można zrobić nawet nie mając programatora ISP. W każdym razie da się tak uruchamiać program w czasie rzędu setek milisekund (program wcale nie uruchamia się od razu), jeśli to jest za mało, budzenie procesora może działać szybciej. Zaproponowałem takie rozwiązanie, bo znam je z modułu działającego z czujnikiem PIR i pracującego latami na baterii cr2032. Więc na pewno się da i na pewno będzie działać - a jak to zrobić to już szczegół

Link do komentarza
Share on other sites

Edit: tak dla wyjaśnienia o co mi chodziło podsyłam linka https://electronics.stackexchange.com/questions/367456/arduino-self-power-circuit - nawet jeśli w tym przypadku się nie przyda, to chyba ogólnie warto pamiętać, że tak można "obejść" problem z zasilaniem. Użycie tranzystora mos daje pobór prądu rzędu kilku mikroamper, zamiast włącznika można dać czujnik PIR, kontraktron, czy co tam potrzebujemy.

Edytowano przez Elvis
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

14 godzin temu, Elvis napisał:

Nie wiem ile czasu startuje bootloader arduino i nie wiem jak dokładnie działa

Chodziło mi tylko o to, aby wziąć to pod uwagę; czujka ma z reguły opóźnienie przy wyłączaniu sygnału i wystarczy, że będzie ono dłuższe niż czas startu Arduino.

Link do komentarza
Share on other sites

Opóźnienie to nie problem, kondensator załatwi sprawę. Myślałem że problemem jest opóźnienie reakcji - tutaj w ekstremalnym przypadku konieczna może być modyfikacja lub pozbycie się bootloadera.

Chciałem tylko podpowiedzieć że takie rozwiązanie istnieje, działa całkiem dobrze i czasem może być łatwiejsze do użycia niż usypianie mikrokontrolera.

Link do komentarza
Share on other sites

8 godzin temu, ethanak napisał:

No to ja przewrotnie dodam, że w tym przypadku nie jest potrzebny żaden mikrokontroler 😉

Tzn. co masz kolego na myśli? Żeby wyjście czujki dać bezpośrednio na przekaźnik SSR? Ale nie będzie przypadkiem za niskie napięcie? Z czujki wychodzi chyba niecałe 4V, a SSR'a przełącza 5v...? 🤨

Link do komentarza
Share on other sites

(edytowany)

Takie szybkie pytanie, bo nie chce zakladac nowego tematu. Mam zadeklarowaną zmienną czas, która początkowo ma wartość 100 - czyli 100ms. Chciałbym teraz za pomocą przycisków zwiększać lub zmniejszać tę wartość o 50ms.

Mój fragment kodu obsługi przycisków:

 

 if (digitalRead(przyciskdod) == HIGH) {
    czas = czas + 50;
    lcd.clear();
    lcd.print("Czas zgrzewania:");
    lcd.setCursor(5, 1);
    lcd.print(czas);
  }
  if (digitalRead(przyciskode) == HIGH) {
    czas = czas - 50;
    lcd.clear();
    lcd.print("Czas zgrzewania:");
    lcd.setCursor(5, 1);
    lcd.print(czas);
  }

Przyciski działają, ale zamiast zmiany o 50ms są dodawane lub odejmowane jakieś przypadkowe liczby... Co robię tu źle?

Edytowano przez Gieneq
Zachęcam do używania bloku kodu
Link do komentarza
Share on other sites

(edytowany)
#include <Wire.h>   
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

const int przycisk = 3;
const int przyciskdod = 8;  
const int przyciskode = 9;  
const int dioda =  10;  
const int diodawb =  13;
const int LED = 11;     
int buttonState = 0;     
int czas = 100;       

void setup() {
  pinMode(dioda, OUTPUT);      
  pinMode(przycisk, INPUT);     
  pinMode(przyciskode, INPUT);     
  pinMode(przyciskdod, INPUT);      
  pinMode(diodawb, OUTPUT);     
  pinMode(LED, OUTPUT);         
  digitalWrite(diodawb, LOW);    
  digitalWrite(LED, HIGH);       

  lcd.init();
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Czas");
  lcd.setCursor(10, 0);
  lcd.print(czas);
  lcd.setCursor(0, 1);
  lcd.print("zgrzewania (ms):");
}

void loop() {
  if (digitalRead(przycisk) == HIGH) {   
    digitalWrite(LED, LOW);
    digitalWrite(dioda, HIGH);
    delay(czas);
    digitalWrite(dioda, LOW);
    delay(3000);
    digitalWrite(LED, HIGH);
  }
  else {
    digitalWrite(dioda, LOW);           
  }
  if (digitalRead(przyciskdod) == HIGH) {
    czas += 50;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Czas");
    lcd.setCursor(10, 0);
    lcd.print(czas);
    lcd.setCursor(0, 1);
    lcd.print("zgrzewania (ms):");
  }
  if (digitalRead(przyciskode) == HIGH) {
    czas -= 50;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Czas");
    lcd.setCursor(10, 0);
    lcd.print(czas);
    lcd.setCursor(0, 1);
    lcd.print("zgrzewania (ms):");
  }
}

 

Edytowano przez Gieneq
Zachęcam do używania bloku kodu
Link do komentarza
Share on other sites

No to teraz pomyśl co się stanie jak naciśniesz przycisk np. dodawania. Będzie dodawał 50 cały czas dopóki nie puścisz przycisku, i to dość szybko.

Zainteresuj się biblioteką Bounce2.

A poza tym w takich przypadkach zakładaj nowy temat, bo robisz bałagan we własnym wątku.

Edytowano przez ethanak
  • 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.