pomier Napisano Wrzesień 29, 2016 Udostępnij Napisano Wrzesień 29, 2016 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. Cytuj Link do komentarza Share on other sites More sharing options...
Lukaszm Wrzesień 29, 2016 Udostępnij Wrzesień 29, 2016 To może wstaw napisany program? Czy raczej oczekujesz że ktoś da Ci gotowe rozwiązanie? Cytuj Link do komentarza Share on other sites More sharing options...
pomier Wrzesień 29, 2016 Autor tematu Udostępnij Wrzesień 29, 2016 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. Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Wrzesień 29, 2016 Udostępnij Wrzesień 29, 2016 pomier, dobrze wydedukowałeś - w Twoim przypadku przydadzą się przerwania. Czyli polecam lekturę odpowiedniego odcinka kursu Arduino: Kurs Arduino II – #4 – przerwania, kontaktron, czujnik PIR Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
pomier Wrzesień 30, 2016 Autor tematu Udostępnij Wrzesień 30, 2016 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. Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Wrzesień 30, 2016 Udostępnij Wrzesień 30, 2016 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. Cytuj Link do komentarza Share on other sites More sharing options...
pomier Wrzesień 30, 2016 Autor tematu Udostępnij Wrzesień 30, 2016 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. Cytuj Link do komentarza Share on other sites More sharing options...
Lukaszm Wrzesień 30, 2016 Udostępnij Wrzesień 30, 2016 Działa pięknie lecz za krótko. Znasz inne typy zmiennych poza char? Polecam: https://en.wikipedia.org/wiki/C_data_types Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Wrzesień 30, 2016 Udostępnij Wrzesień 30, 2016 pomier, w kursie Arduino (poziom 1) znajdziesz informacje na temat "pojemności" poszczególnych zmiennych,odsyłam do konkretnego artykułu: Kurs Arduino – #3 – UART (komunikacja z PC), zmienne Cytuj Link do komentarza Share on other sites More sharing options...
pomier Październik 1, 2016 Autor tematu Udostępnij Październik 1, 2016 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? Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Październik 1, 2016 Udostępnij Październik 1, 2016 pomier, pewnie, że był 🙂 Artykuł, w którym poruszono wyzwalanie zboczem linkowałem już kilka postów wcześniej. Dla przypomnienia: Kurs Arduino II – #4 – przerwania, kontaktron, czujnik PIR. Wszystko tam znajdziesz 😉 Cytuj Link do komentarza Share on other sites More sharing options...
Jamik Październik 2, 2016 Udostępnij Październik 2, 2016 pomier, radziłbym Ci pozbyć się delay() i zastosować millis() do odliczania czasu. Przykład takiego rozwiązania masz tutaj: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay Rozwiązanie proste i nie blokuje przycisków czy też innych ewentualnych funkcji które możesz zechcieć wprowadzić. Cytuj Link do komentarza Share on other sites More sharing options...
pomier Październik 3, 2016 Autor tematu Udostępnij Październik 3, 2016 Dzięki Jamik, faktycznie spotkałem się z tym "millis" w projektach innych ludzików ale nie zastanawiałem się jeszcze nad tym. Teraz po twojej uwadze zapoznam się z tym bliżej. Cytuj Link do komentarza Share on other sites More sharing options...
Jamik Październik 3, 2016 Udostępnij Październik 3, 2016 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. Cytuj Link do komentarza Share on other sites More sharing options...
pomier Październik 3, 2016 Autor tematu Udostępnij Październik 3, 2016 A widzisz, dziękuję Ci Jamik za zobrazowanie mojego problemu. Po sprawdzam wszystkie te uwagi jak tylko usiądę do biurka 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!