Zapraszam do lektury trzeciej (i tu czuję oddechy ulgi: ostatniej) części mojego marudnika. Pokrótce zaprezentuję finalne efekty wykorzystanie energooszczędnych funkcji mikrokontrolerów Atmega oraz finałową realizację czujnika wilgotności domowym sposobem.
W części pierwszej:
W części drugiej:
- jak prosto przenieść projekt do Atmegi z wykorzystaniem programatora USBasp
- jak najtaniej zbudować moduł ogniwa słonecznego do zasilania mikrokontrolera
W tej części:
- jak zbudować czujnik wilgotności, zbadać i podłączyć go do układu mikrokontrolera
Schodzimy jeszcze głębiej…
Drążąc dalej tematykę zmniejszania poboru prądu przez Atmegę, zamiast domyślnego źródła taktowania – czyli wbudowanego w mikrokontroler oscylatora 8MHz – wybrałem zewnętrzny kwarc 32.768kHz. Czyli najpopularniejszy z kwarców, powszechnie stosowany w zegarkach elektronicznych. Kiedyś kupiłem na Ebayu, ale jak ktoś nie ma to można go wydłubać z jakiegoś starego zegarka.Wygląda to w powiększeniu tak (metalowa rurka ~ø2-3mm, z dwoma drucikami:
Problem z jakim najpewniej się można spotkać przy tego typu konfiguracji, to… zablokowanie Atmegi. Sam tego doświadczyłem i pisałem o tym poprzednio, problemem okazał się programator. Zwyczajnie: większość tanich (i drogich również!) programatorów nie pracuje z zegarem niższym niż 8kHz. Jako że Atmegi nie mogą być programowane zegarem ośmiokrotnie wolniejszym niż zegar mikrokontrolera, więc 4×8=32kHz – jest to granica ich możliwości. Udało mi się dopiero po wgraniu do mojego USBasp najnowszego firmware, co umożliwiło obsługę zegara programującego od 500Hz włącznie.
Pobór prądu przez Atmegę wyglądał następująco:
Rysunek z lewej strony to pobór prądu z baterii (2×1.5V), ale baterie były trochę rozładowane i dawały łącznie ok 2,5V. (1) to prąd podczas wykonywania pętli setup(), miga tam szybko dioda na znak uruchamiania układu – ok. 60-80μA. (2) to prąd pobierany z baterii przy wykonywaniu pętli loop() w przypadku gdy układ jest wyzwolony – kwiatki wymagają podlania! Na czas zapalenia diody pobór wynosi niecałe 60μA. Dioda świeci ledwo-ledwo, ale jeszcze widocznie. Ale gdy kwiatki podlejemy i układ się uśpi, pobór prądu jest…. hmm, niezmierzalny :-) Miernik VA18B którego użyłem pracował na największej czułości i pokazywał od 0,0μA do 0,1μA! Troszkę większe były prądy przy zasilaniu z akumulatorków 3×1,2V – układ ciągnął od 300 do 450 μA z impulsami przy wymuszeniu uśpienia do 600μA (czyli w dalszym ciągu nie przekraczał 0,6mA) ale po uśpieniu Atmega znów zaczęła pobierać 100nA. Teoretycznie więc na akumulatorach pastylkowych powinien wytrzymać ponad prawie 6 dni, na bateriach ponad 1000 dni. Jak nawet praktycznie wyjdzie 3x gorzej, to jest nieźle. A przypominam: główne zasilanie układu to baterie słoneczne!
Czujnik wilgotności
Tu przyznam był największy problem. Wyzwaniem okazało się nalezienie odpowiednich materiałów na elektrody. Na początku wykorzystałem zwykłe gwoździe – wyniki były bardzo obiecujące, tyle tylko że po miesiącu zardzewiały. Nauczony doświadczeniem zrobiłem czujnik z cienkich pasków srebrzanki – teraz z kolei kontakt z glebą był za słaby i wyniki skakały jak szalone. Buszując w pudłach znalazłem stary drut z telewizyjnej anteny pokojowej. No, wiedziałem że kiedyś się do czegoś przyda! Po wyprostowaniu i przycięciu otrzymałem osiem prętów ze stali nierdzewnej o średnicy ok 3 mm i długości 4,5 cm. Nie bawiłem się w większą filozofię: krótka chwila lutowania kabelków i najbardziej trywialny z trywialnych czujnik gotowy:
Pora na testy. Aby zbadać działanie wgrałem na Atmegę program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include <EEPROM.h> #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int sensorPin = A0; int sensorValue = 0; int sensorValueEEPROM = 0; int addr = 0; bool tick=true; int postep=0; int godzin = 0; void setup() { lcd.begin(16, 2); } void loop() { sensorValue = analogRead(sensorPin); sensorValueEEPROM = sensorValue/4; //wyświetlenie na LCD zmierzonej wartości lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(sensorValue); lcd.setCursor(6, 1); lcd.print(sensorValueEEPROM); //"wędrująca" gwiazdka postępu lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(postep % 16, 0); lcd.print("*"); //wyświetlenie ile godzin jest zmierzonych lcd.setCursor(13, 1); lcd.print(" "); lcd.setCursor(13, 1); lcd.print(godzin); //zapis do kolejnej komórki EEPROM zmierzonej wartości EEPROM.write(addr, sensorValueEEPROM); addr++; postep++; godzin++; delay(3600000); //1h } |
Podpiąłem do Atmegi wyświetlacz LCD, do wejścia przetwornika A/C (pin A0) mój czujnik (jedna elektroda do + zasilania, druga do A0, między A0 a masę rezystor 56kΩ) i co godzinę pomiar napięcia z dzielnika czujnik/rezystor zapisywany był w pamięci EEPROM. 1024 bajty EEPROM Atmegi328 wystarczą na 1024/24 = 46.6 czyli ponad 6 tygodni pomiarów. Żadnej filozofii tu nie ma, jedyna sztuczka to konstrukcja:
1 |
sensorValue = analogRead(sensorPin); |
1 |
sensorValueEEPROM = sensorValue/4; |
Wynika to z prostej przyczyny: przetwornik A/C daje wartość z przedziału 0..1023 (4 bajty), a w pamięci EEPROM mieści się tylko 1 bajt (0..254), stąd też przed zapisem dzieli się wartość przez 4. Mamy więc czterokrotnie gorszą rozdzielczość, co w tym przypadku jest niewielkim ograniczeniem, bo jak mawiał lord Farquaad: ” jest to poświecenie, na które nas stać”. Druty w glebę i po tygodniu pomiarów otrzymałem taki przebieg:
W skali 0..1023 z podlanego kwiatka otrzymuję sygnał ~900, po tygodniu spadło do ~770. Po krótkich wyliczeniach z prawa Ohma i dzielnika napięciowego wyliczyłem, że czujnik wilgotności w kwiatku podlanym daje 6,2kΩ, a w suchej ziemi rośnie do 16,7 kΩ. Zmierzyłem poziom napięcia, który moja Atmega widzi jako “0” logiczne na pinie wyzwalającym z uśpienia i otrzymałem wynik 0,43VCC. Znając poziom do którego muszę “ściągnąć” napięcie wyliczyłem, iż jako dzielnik napięciowy muszę użyć rezystora 12,7kΩ.
I tu się zrobił problem :-) Jak podleję kwiatka, to obciążę baterię rezystancją 12,7kΩ (rezystor dzielnika) + 6,2kΩ (rezystancja czujnika) czyli 18,9kΩ. Baaaardzo mało – prąd płynący w takim układzie przy zasilaniu 3V to aż 0,16mA co – nie ukrywam – stawia pod znakiem zapytania ideę usypiania mikrokontrolera. Na upartego to wystarczy (bateria 200mAh pod takim obciążeniem wytrzyma ponad rok), ale nie dawało mi to spokoju.
Poszedłem najkrótszą drogą – oddaliłem elektrody od siebie z początkowych ~1cm na całą szerokość doniczki (~10 cm) . Zmieniłem rezystor bocznikujący na większy (150k), podlałem zieleninkę baaaardzo hojnie i po zaledwie dwóch tygodniach dalszych pomiarów otrzymałem wykresik:I już jest dużo lepiej. Maksymalny prąd pobierany przez czujnik ~160kΩ to ~20 μA (w trybie “suchym”: poniżej 10 μA) więc problem z głowy. Na czerwono zaznaczyłem poziom,napięcia, przy którym moja Atmega się wybudza – tu również parametry czujnika dobrane są doskonale. Po kolejnym podlaniu rezystancja zgodnie z oczekiwaniami spada i cały cykl się powtarza. Zastanawiający jest jedynie wysoki i praktycznie niezmienny poziom wilgotności przez pierwszy tydzień oraz skoki wilgotności wskazywane przez czujnik w drugim tygodni, ale to zapewne specjaliści biochemicy by wytłumaczyli naukowo.
Od trzech tygodni układ marudnika działa w stanie aktywnym na tandemie bateria słoneczna + akumulatorki non-stop i nie widzę żadnych oznak problemów z zasilaniem. Wydaje się więc, że prędzej zmienię kwiatki na inne niż wymienię baterię na nową.
A na koniec i tak się okazało, że poprzednie kwiatki mi nie uschły od braku podlewania, tylko dżdżownice zeżarły korzonki :-)
Uwagi wynikłe podczas realizacji
W zasadzie są dwie. Pierwsza: planuję w przyszłości (jak tylko dotrą elementy z Chin) nieco zmodyfikować system czujnika wilgotności. Otóż planuję dołożyć do układu zegar RTC (układ scalony który liczy czas: sekundy, dni, miesiące, lata – tak jak w zegarku) i Atmegę wybudzać alarmem z RTC, tak jak zwykłym porannym budzikiem. Alarm planuję ustawić na 2-3h. Dzielnik będzie dołączony nie bezpośrednio do zasilania, ale do wyjścia cyfrowego Atmegi, na którym ustalę “1” na czas wybudzenia i “0” podczas uśpienia. Będzie to skutkowało tym, że dzielnik obciąży baterię tylko na czas pomiaru (parę sekund co parę godzin) co jeszcze bardziej wydłuży czas pracy – tym razem do nieskończoności :-) Obecnie jak widać dzielnik obciąża baterię cały czas – co prawda prąd jest malutki, ale czymże byłby świat bez dążenia do doskonałości :-)
Drugi problem – podobne rozwiązania zwracały na problem elektrolizy wody w glebie. Rzecz oczywista – metalowe druty w mokrej ziemi przez który płynie prąd prowadzi do rozkładu H2O na tlen i wodór, elektrody korodują itp. Wydaje mi się, że moje rozwiązanie ze względu na ekstremalnie niskie prądy tego się bać nie powinno – po miesiącu nie widzę na moim czujniku żadnych niekorzystnych zmian.
Bonus
Zapewne nie wszyscy wiedzą, ale firma Atmel (producent m.in. mikrokontrolerów Atmega) udostępnia usługę bezpłatnych próbek. Oznacza to ni mniej ni więcej niż oferta produktów z katalogu zupełnie za darmo. Każde zgłoszenie jest oczywiście indywidualnie rozpatrywane, ale merytoryczne i bez ściemnień uzasadnienie bardzo pomaga. Bardzo również pomaga bycie uczniem/studentem i wykazanie potrzeb wykorzystanie podzespołów Atmela do pracy czy nauki. Ograniczenia w zasadzie są dwa: nie wolno zamawiać dużych ilości (max 10 sztuk, i to nie od razu) ani zbyt często. Za pierwszym podejściem zamówiłem paręnaście elementów i oczywiście rozpatrzono negatywnie. Ale w drugiej próbie zamówiłem sobie dwie Atmegi8 i po dwóch dniach (!) dostarczono mi je kurierem z USA. Po miesiącu poprosiłem o Atmegę32 i Atmegę64 i również po dwóch dniach miałem kuriera pod drzwiami. Oczywiście nie ponosimy kosztów ani elementów, ani transportu. Aby mieć możliwość zamawiania darmowych próbek należy zarejestrować się na stronie: https://secure.atmel.com/forms/secure/verifylogin.aspx?target_url=samplestore
Pingback: Marudnik do kwiatków (część pierwsza) » Majsterkowo.pl
Pingback: Marudnik do kwiatów (część druga) » Majsterkowo.pl
Pingback: Marudnik do kwiatów (część druga) » Majsterkowo.pl
Cały projekt ciekawy i coś czuję że wykorzystam przynajmniej część z Twoich pomysłów ;) aczkolwiek mam jeszcze pytanie czy do zarejestrowania się na stronie Atmel muszę posiadać firmę/ przedsiębiorstwo lub coś w tym stylu? jeśli nie to co powinienem wpisać w miejscu “Company Name” :)
Ja zgodnie z prawdą wpisywałem nazwę firmy. Spróbuj wpisać coś w stylu
“Jakub Electronics Professional” :-) Tak jak pisałem: dobrze mieć
firmę/uczelnię, e-mail w domenie .edu itp. Podałem też telefon, któtki
opis do czego elementy będę wykorzystywał, czy mam prototyp, kiedy
zrealizuję i tym podobne, bez oszukiwania. Zasadniczo
elektronikom-hobbystom firmy nie wysyłają, Raz omyłkowo zarejestrowałem w
Texas Instruments się na adres onet.pl i dostałem informację “This is
notification that one or more of your requested parts was rejected.
[…] Unfortunately, we cannot approve Free Sample Program orders with
private email addresses”, po zmianie adresu na “służbowy” od razu
zostało zaakceptowane. W ten sposób firmy wspierają edukację i
“przyzwyczajają” do swoich produktów.
Zalecam jednak ze wszech
stron uczciwość i wyczucie. Takie akcje to dobra wola firmy i gdy
powstaną nadużycia to pojawi się komunikat że do Polski nie wysyłają i
tyle będzie.
OK nie wiedziałem że to konieczne skoro tak to sobie odpuszczę :)
dziękuję za odpowiedź
A może by tak kolega napisał osobny artykuł o tych atmelowych gratisach. Np. jakiś szablon wniosku, wskazówki co koniecznie powinno w nim być itp. Myślę, że wielu osobom bardzo by się to przydało.
Ale to żadna filozofia jest :-) Wystarczy zgodnie z prawdą wypełnić pola formularza, raptem kilka jest. Najpierw wybiera się elementy z katalogu, albo dostępne są wszystkie albo tylko te oznaczona jako “free samples”. Klik-klik i przy składaniu zamówienia imię, nazwisko, mail, firma/szkoła, telefon, krótki opis realizowanego projektu, przeznaczenie projektu, klik-klik, send – i już.
Jak to dobrze, że pracuje. Już zamawiam części. Ważne jest by e-mail nie był z popularnej domeny (np gmail).
Ludzie, nie róbcie cebulactwa z tymi próbkami. ATmel to kilka złotych. A już i tak większość firm nie wysyła próbek do Polski przez takie kombinowanie.
Większość udostępnia, za wyjątkiem grupy docelowej hobbystów. Podobnie czyni Microsoft, Autodesk i wiele innych. Oprogramowanie na licencji studenckiej, do celów edukacyjnych – za free. Buduję ostatnio nieduży projekt i otrzymałem zarówno części elektroniczne (mikrokontrolery, układy scalone) jaki i mechaniczne – z obudowami włącznie – od wielu firm. Przeważnie po wypełnieniu formularza on-line takie zgłoszenie trafia do lokalnego dystrybutora w PL, ten dzwoni na podany numer i przesyła paczuszkę. Nie jest to rzecz jasna sposób na jakieś wzbogacenie się, po prostu firmy inwestują w potencjalnego klienta. Przecież jak później będę szukał fajnej obudowy to do kogo się zgłoszę? Będę szukał rozwiązania czy sięgnę po katalog który dostałem wcześniej i wybiorę podzespół, który miałem już w ręku i się wcześniej sprawdził?
Jak myślę “mikrokontroler” to oczywiście nie STM tylko ATmega, i zamiast kupować na ebayu element za 3zł to sięgnę do szuflady po otrzymany wcześniej. proste i uczciwe.
Bardzo dobrze napisałeś – za wyjątkiem grupy docelowej hobbystów. Sample są kierowane do firm, o czym wszyscy pamiętajmy. Do Polski masa producentów już w ogóle nie wysyła, bo ludzie masowo zamawiali wpisując lewe nazwy firm, a często te sample zaraz lądowały na Allegro. Nie róbmy obciachu, pojedyncze elementy nie są drogie.
Podejrzewam że tacy kombinatorzy to znikomy odsetek. Mi by się nie chciało klikać, żeby potem coś sprzedać za 5zł :-) A gdyby nawet – firmy zabezpieczają się, limitując zarówno ilość, jak i częstotliwość zamówień. Część film daje za darmo, ale trzeba opłacić transport. No i nie ukrywajmy – jak ktoś jest uczniem, studentem czy czytelnikiem Majsterkowa to reprezentuje sobą pewien poziom, który nie pozwala na szukanie interesu w zarobieniu paru złotych.
Dobrze powiedziane. Czytelnicy nie szanują się wzajemnie, dobrze, że chociaż Autor ich ceni :)
Podsumowując: jeśli ktoś się kwalifiuje to śmiało, ale czytajcie ‘terms and contitions’, i bez ściemniania :)
“Jak podleję kwiatka, to obciążę baterię rezystancją 12,7kΩ (rezystor
dzielnika) + 6,2kΩ (rezystancja czujnika) czyli 18,9kΩ. Baaaardzo mało –
prąd płynący w takim układzie przy zasilaniu 3V to aż 0,16mA…”
Prostszym sposobem pewnie by było na + jednej z elektron zrobić tranzystor i załączanie go tylko przy pomiarze ;)
A jeszcze lepiej tak jak opisałem – uruchamiać pomiar z zegara RTC :-)
Bardzo ciekawy pomysł, ale to już wyższa szkoła jazdy w majsterkowaniu.
Sprawa dyskusyjna :-) Wbrew pozorom to są trywialne rzeczy, raptem dzielnik napięciowy plus ATmega. Jak już się ugryzie programowanie pod Arduino to reszta przychodzi sama.
Witam. Jak to zaadoptować na ATmega8 TQFP. Nic mi nie wychodzi, nawet jak wrzucam miganie diodą to nie działa.
Witam.
Odnośnie zasilenia dzielnika, podpiął bym go pod wyjście procesora i zasilał na czas pomiaru.