Skocz do zawartości
mihuu

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.

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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ół

Udostępnij ten post


Link to post
Share on other sites
(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

Udostępnij ten post


Link to post
Share on other sites
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.

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
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...? 🤨

Udostępnij ten post


Link to post
Share on other sites

Do zwiększenia napięcia (i prądu) nie potrzebujesz mikrokontrolera.

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites
37 minut temu, mihuu napisał:

Co robię tu źle?

Nie pokazujesz reszty kodu.

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites
(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

Udostępnij ten post


Link to post
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...