Skocz do zawartości

Czy można wybudzić Arduino czujnikiem ruchu PIR?


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.

(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

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ół

(edytowany)

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
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.

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.

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...? 🤨

(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
(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
(edytowany)

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

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ę »
×
×
  • Utwórz nowe...