INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(
Witajcie
Przedstawiam wam drugą wersję mojego czujnika zmierzchowego. We wcześniejszym artykule udostępniłem nieskończoną wersję czujnika. Zawierał on sporo błędów oraz troszkę błędne dane. W tym artykule zamieszczam wam 2 betę projektu z poprawionymi błędami oraz czujnikiem temperatury na switch. Więc zabieramy się do roboty :)
Potrzebne:
*5x Rezystor 1K-1,5K (ja takie zastosowałem)
*Czujnik temperatury LM35 lub inne
*Fotorezystor
*Arduino
*Płytka stykowa i kabelki
*Potencjometr 10K(ja taki zastosowałem)
*Button/Switch
A więc najpierw przedstawię projekt podłączenia poszczególnych elementów. Może trochę to chaotyczne, ale program fritzing używam dopiero 2 raz.
Co zostało zmienione?
Otóż wiele zmian kryje się w całym projekcie. Cały kod programu został edytowany i napisany od nowa, dodany został switch oraz termometr cyfrowy LM35. Do programu została dodana pętla histerezy, która eliminuje włączanie i wyłączanie stanu niskiego i wysokiego, więc już nie zaobserwujemy zmieniającego się co chwilę stanu. Całość wygląda i działa banalnie prosto. Co najważniejsze, problem z minusem odprowadzonym do oddzielnego minusa w arduino został naprawiony, co miało miejsce w poprzednim projekcie. Tak więc zmian jest sporo, a prace nad projektem nie przerywam. Ciągle będę coś dodawał nowego. W następnych wersjach postaram się dodać zegar czasu rzeczywistego oraz informator o nowych listach w skrzynce pocztowej.
Trochę się rozpisałem, więc czas na program i jego objaśnienie:
///////////////////////////////////////////////// // Czujnik Zmierzchowy by LorEnzoo wersja BETA2// ///////////////////////////////////////////////// // Pin 5 na LCD podpinamy pod - //pin 4 pod 12 a pin 6 pod 11 // pin kontrastu potecjometr pod pin 3 //switch-rezystor do - a + bezposrednio do płytki, zaś wyście cyfrowe u góry //LM35- oznaczenia z okrągłośći z przodu + SIGN - // int guzik = 8; // switch int pin_pr = A0; // pin fotorezystora int pin_term = A1;// pin analogowy LM35 int pin_dioda = 13;// czerwona int pin_dioda2 = 10;//zielona #include <LiquidCrystal.h>// biblioteka LCD LiquidCrystal lcd(12,11,5,4,3,2);// porty lcd void setup() { lcd.begin(16,2); pinMode(guzik, INPUT); pinMode(pin_pr, INPUT); pinMode(pin_term, INPUT); pinMode(pin_dioda, OUTPUT); pinMode(pin_dioda2, OUTPUT); Serial.begin(19200); } boolean stan=0;//zmienna logiczna ustawiająca stan wyjścia na 0 void loop() { int czujnik = analogRead(pin_pr); int temp = (5.0 analogRead(pin_term) 100.0) / 1024; //Mnożnik do LM35 delay(1000); //Zbiór seriali które można zobaczyć w Serial Monitor // Serial.println("Temp"); // Serial.println(temp)' // Serial.println("Oswietlenie"); // Serial.println(czujnik); if(digitalRead(guzik) == HIGH)// jezeli(wejsciecyfrowe(guzik) == Stan wysoki) { delay(20); stan=!stan;//zmienna stan zmienia wartość na przecwną while(digitalRead(guzik) == HIGH);//pętla bedzie czekac dopoki odczyt 0 pinu bedzie wysoki delay(20); } //////////////////////////////////////////////////////////////////////////////////////////////// if(czujnik>=5) { digitalWrite(pin_dioda, LOW); digitalWrite(pin_dioda2, HIGH); } if((czujnik>=3) && (czujnik<=4)) //Bariera,czyli od pewnego momentu Jest w stanie, potem tak jakby pływa bez zmiay stanu i jeśli zaskoczy to się stan zmienia, tzw pętla histerezy. { digitalWrite(pin_dioda, LOW); digitalWrite(pin_dioda2, HIGH); } if(czujnik<=1) { digitalWrite(pin_dioda, HIGH); digitalWrite(pin_dioda2, LOW); } ////////////////////////////////////////////////////////////////////////////////////////////// if(stan){ if(czujnik>=5) { lcd.setCursor(0,0); lcd.print("Jasnosc: WYSOKA "); lcd.setCursor(0,1); lcd.print("Oswietlenie: OFF"); } if((czujnik>=3) && (czujnik<=4)) //Bariera,czyli od pewnego momentu Jest w stanie, potem tak jakby pływa bez zmiay stanu i jeśli zaskoczy to się stan zmienia tzw pętla histerezy. { lcd.setCursor(0,0); lcd.print("Jasnosc: SREDNIA"); lcd.setCursor(0,1); lcd.print("Oswietlenie: OFF"); } if(czujnik<=1) { lcd.setCursor(0,0); lcd.print("Jasnosc: NISKA "); lcd.setCursor(0,1); lcd.print("Oswietlenie: ON "); } } if(!stan) { lcd.setCursor(0,0); lcd.print(" Termomert "); lcd.setCursor(0,1); lcd.print("Temperatura:"); lcd.setCursor(13,1); lcd.print(temp); lcd.setCursor(15,1); lcd.print("C"); } }
Program wygląda na całkiem ładny. Choć pewnie nie jest idealny, każdy by coś dodał lub przerobił inaczej, program działa bez zarzutu.
Myślę że artykuł wam się spodoba, zachęcam do komentowania i oceniania :)
PS: Bardzo bym prosił, aby ktoś mi powiedział, jak przejść 3 tryby w LCD za pomocą jednego switcha. Tzn 1 to czujnik zmierzchu, 2 to termometr oraz 3 czyli powiedzmy czas.
INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(
Lm35 jest analogowy.
No tak, czujnik jest analogowy więc o co chodzi?
“dodany został switch oraz termometr cyfrowy LM35”
Moje uwagi:
1) Nie za bardzo dowiedziałem się, do czego będzie ten układ służył. Dobrze by było napisać – dopiero po przeanalizowaniu kodu widzę, że będzie włączał jakieś oświetlenie po zmroku.
2) Domyślam się że dopiero rozpoczynasz zabawę z Arduino, bo ten pomiar temperatury to chyba służy tylko do wyświetlenia temperatury :-)
3) Akurat tutaj nie wiem czy mikrokontroler to słuszna droga. Taki układ robi się na jednym tranzystorze :-)
4) Nic nie rozumiem z tego fritzinga. Za dużo kresek.
2) Tak dpoiero zaczynam z arduino więc ten termometr został dodany w formie bajeru ;)
3) Zastosowałem tutaj mikrokontroler uwagi na działanie jak i wyświetlanie danych
4) Jak już wcześniej pisałem, fritzing miałem dopiero 2 raz w rękach :)
Podeślij mi jakiś namiar na siebie.
W jakim celu?
“PS: Bardzo bym prosił, aby ktoś mi powiedział, jak przejść 3 tryby w LCD za pomocą jednego switcha. Tzn 1 to czujnik zmierzchu, 2 to termometr oraz 3 czyli powiedzmy czas.”
Bo mam chwile…
LorEnzoo225@wp.pl proszę ;)
To nie używaj Fritzinga. Zwykły schemat byłby czytelniejszy :)
3) w zupełności wystarczyłby Monitor portu szeregowego :-) A jeżeli chodzi o LCD – w projektach nie wymagających dużych szybkości lepiej stosować LCD na I2C, mniej kabli.
Kod histerezy przełączania jest moim zdaniem mało jasny. Tak naprawdę histereza służy temu by odsunąć od siebie progi przełączenia z Off na On i z On na Off. Czyli potrzebujesz dwa warunki przełączenia i strefę martwą pomiędzy nimi, wewnątrz której nie następuje przełączenie.
Na przykład tak wystarczy:
W komentarzach nie można wrzucać kodu? Bo wycieło mi połowę i sensu to nie ma…
Hmm… nie powinno uciąć. Możesz wkleić cały kod na http://wklej.to/? Zobaczę, co mogło spowodować ucięcie…
http://wklej.to/Oj7VJ
Już powinno być ok. Na przyszłość – kod w komentarzach możesz podawać w znacznikach <code></code> – będzie się wtedy ładnie kolorował.
OK dzięki za podpowiedź ;)
Do czego służy ten rezystor na przycisku?
Jeśli dobrze rozumiem schemat to chyba chodziło ci o ograniczenie prądu płynącego do pinu 8.
Nie lepiej włączyć go szeregowo z przyciskiem?
A co do projektu to brakuje mi dobrego zastosowania. Po co komuś termometr w czujniku zmierzchowym?
Bardziej by się przydał czujnik zmierzchowy z przekaźnikiem 220 V na mikrokontrolerze lub jak kolega Artur powiedział , na jednym tranzystorze, wykonany na płytce pcb i gotowy do zamontowania.
Wszystko będzie, przekaźnik zostanie zamontowany na końcu. Narazie staram się zająć sprawami programistycznymi, a termometr został dodany jako bajer, że po przyciśnieciu guzika zostanie pokazana temperatura bez konieczności wychodzenia na dwór, czy też pójścia do okna specjalnie. Robię ten układ pod siebie więc każdy oże usunąć go jesli mu się nie podoba ;)
Dlaczego wszyscy co programuja na Arduino podlaczaja przyciski do Vcc? I do tego rezystory i kondensatory (masakra). Nie wiem po co to wszystko, wystarczy przycisk podlaczyc do GND i sterowac stanem niskim. A w programie sam pin podciagnac do Vcc.
W programie wystarczy ustawić pin na INPUT_PULLUP i nie trzeba stosować ani rezystorów, ani niczego nigdzie podciągać ;)
Wlasnie o to mi chodzi, tylko pytam dlaczego wszyscy Arduinowcy na sile podlaczaja przyciski do Vcc.
Bo większość początkujących o tym nie wie.