Skocz do zawartości

Program obsługujący czujnik ruchu oraz klawisz


pomier

Pomocna odpowiedź

Witam serdecznie szanownych kolegów i koleżanki.

Jestem nowym użytkownikiem tego forum jak i początkującym programistą AVR. Z elektroniką mam styczność od dawna i nie jest mi obca ale programowanie to coś nowego i zarazem fajnego.

Przejdę do sedna, jako mój pierwszy projekt postanowiłem zbudować sobie zwykły, mały sterownik oświetlenia led w kuchni. Mam ładą 5m taśmę led i teraz zaczyna się zabawa.

Założenia projektu są następujące.

Czujnik ruchu uruchamia ledy i świeci przez 5 min po wyjściu z pomieszczenia czyli po braku wykryciu ruchu, potem gaśnie. Dodatkowo ma być klawisz, którym będziemy mogli zapalić ledy lub inaczej mówiąc przedłużyć czas świecenia na godzinę.

Czyli czujnik wykrywa, odpala led na 5 min w tym czasie klikamy klawisz i program zmienia ten czas z 5 min na godzinę.

Napisałem programik i dużo kombinowałem i albo mam switch albo wykrywanie ruchu. Nie mogę przeskoczyć tego czasu z czujki ruchu. Jak czujka zapali led to klawisz działa mi dopiero jak te 5 min minie. Czyli wychodzi na to że program zatrzymuje się na ten czas 5min i nic w tym momencie nie odbiera by zmienić ten stan.

Przepraszam że się tak rozpisałem ale jako początkujący proszę o małą pomoc lub podpowiedz.

Pozdrawiam serdecznie.

Link do komentarza
Share on other sites

Witam, nie oczekuję gotowca bo bym się sam nie nauczył a nie oto chodzi:) spokojnie. Post napisałem bo miałem chwilę w pracy, wieczorkiem podepnę to co napisałem i zobaczycie co na modziłem.

[ Dodano: 29-09-2016, 20:57 ]

Witam, więc wracając do tematu. Poskładałem wszystko od nowa, nie ma sensu bym umieszczał wszystkie moje kombinacje. Napisałem kodzik na samych IF i jedyne co jeszcze to zamiast typowego czujnika ruchu zastosowałem drugi switch.

int pir = 4;
int switchPin1 = 2;
int LedCzerwona = 8;
int czas1 = 5000;
int czas2 = 20000;

void setup() {
 pinMode(pir, INPUT); // klawisz/ czujnik ruchu
 pinMode(switchPin1, INPUT); // klawisz 
 pinMode(LedCzerwona, OUTPUT); //dioda led wyjscie czerwona
}

void loop() {  

 if(digitalRead(pir) == HIGH)
  {
    digitalWrite(LedCzerwona, HIGH);
    delay(czas1);
  }else{
    digitalWrite(LedCzerwona, LOW);
  }


 if(digitalRead(switchPin1) == HIGH)
  {
    digitalWrite(LedCzerwona, HIGH);
    delay(czas2);
  }else{
    digitalWrite(LedCzerwona, LOW);
  }

}

Czytałem dziś o przerywaniach i z opisu to by było wyjście dla mojego programu, co wy na to ?

Proszę tylko o nie krytykowanie (uczę się tego) tylko o poradę i naprowadzenie.

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

Dzięki za info, dziś pobawię się tym przerywaniem i podeślę kodzik do wglądu.

Czytając ten tutorial zauważyłem taki punkt

...

1) Absolutnie nie umieszczać w nich opóźnień (delay, delayMicroseconds itd).

...

a tak naprawdę ja potrzebuję takiego czasu opóźnienia właśnie dla zapalenia led na 1 godz.

Zacznę to dziś pisać i zobaczę jak to w praktyce wyjdzie.

Jeszcze raz pokrótce mój program.

1) wykrycie ruchu - zapalenie led na 5 min

2) naciśnięcie klawisza w trakcie wykonywania programu z czujki ruchu, czyli przerywamy program i dioda świeci 1 godz.

To na tyle na tym etapie bo docelowo dojdzie jeszcze sterowanie led on off przez PWM oraz wielofunkcyjność jednego klawisza ale to potem 🙂 Najpierw nauczę się jednego.

Link do komentarza
Share on other sites

pomier, samo przerwanie powinieneś wykorzystać do zmiany trybu wykrywanie ruchu/świecenie przez godzinę. Natomiast sam fakt sterowania diodą powinien odbywać się "normalnie" w pętli głównej. Dzięki temu będziesz mógł łatwo zmieniać tryby bez czekania na ich zakończenie itd.

Link do komentarza
Share on other sites

Zrobię jak napisałeś TREKER. Podpowiedziano mi jeszcze taką opcję

    //lepiej użyc #define bo to są stałe i w trakcie działania programu nie będa zmieniane
   #define pir 4
   #define switchPin1 2
   #define LedCzerwona 8
   unsigned char tick;


   void setup() {
     pinMode(pir, INPUT); // klawisz/ czujnik ruchu
     pinMode(switchPin1, INPUT); // klawisz
     pinMode(LedCzerwona, OUTPUT); //dioda led wyjście czerwona
     tick=0;       //nie konieczne, ale lepiej stan początkowy mieć pod kontrolą
   }

   void loop() {  

     if(digitalRead(pir) == HIGH)
      {
        digitalWrite(LedCzerwona, HIGH);
        tick=100;// bo 100*50ms to 5s
      }


     if(digitalRead(switchPin1) == HIGH)
      {
        digitalWrite(LedCzerwona, HIGH);
        tick=400;// bo 400*50ms to 20s;
      }

      delay(50);//czekamy 50ms
      tick--;//zmniejszamy zmienną tick o 1
      if(tick==0)digitalWrite(LedCzerwona,LOW);//jak odliczy czas, to gasimy led

   }

niestety szybko wyczytałem że CHAR przyjmuje max 255 a to dla mojego projektu za mało. Działa pięknie lecz za krótko.

Link do komentarza
Share on other sites

Znasz inne typy zmiennych poza char?

Tak zmieniłem char na int i już jest więcej możliwości.

Panowie mam takie info że do mojego programiku nie powinienem wykorzystywać HIGH LOW a raczej wykrywanie zbocza opadającego i wzrastającego.

Był jakiś tutorial/lekcja na ten temat?

Link do komentarza
Share on other sites

W Twoim programie pojawia się jeszcze jeden problem. Każde zadziałanie czujnika ruchu przywróci krótszy czas, zerując tym samym efekt naciśnięcia przycisku. Dodaj warunek sprawdzający czy nie jest już ustawiony dłuższy czas niż chce ustawić czujnik. Ja bym przy czujniku zostawił wykrywanie stanu wysokiego. Czujnik utrzymuje go przez jakiś czas, prawda? Więc problemu z zadziałaniem być nie powinno. Za to jeśli zaczniesz wyzwalać zboczem narastającym, to chodząc po pomieszczeniu trzymasz czujnik cały czas w stanie wysokim, a więc w pewnej chwili światło się wyłączy, bo np 5 minut nie było zbocza narastającego.

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.