15 lutego 2025

Automatyczna konewka

Na skróty

Cel projektu

Wyjazdy na wakacje wiążą się z koniecznością pozostawienia kluczy komuś zaufanemu w celu podlewania domowych kwiatków. Nie zawsze ma się kogo poprosić, albo nie chcemy sprawiać komuś obowiązku. Nadto, czasem nadgorliwość osoby opiekującej się naszymi kwiatowymi podopiecznymi doprowadza do mini-powodzi - przelewającej się wody z doniczek/podstawek itp.

 

Problem pojawia się też w biurze/pracy/szkole, w okresach wakacyjno-urlopowych, gdy nie ma komu zająć się kwiatkiem na parapecie. W efekcie po powrocie z wakacji kwiatek może być już ususzony. 

 

Właśnie po to powstał projekt automatycznej konewki.

 

Automatyczna konewka wg tego projektu posiada możliwość nastawienia okresu między podlewaniami w zakresie 2h - 7dni, oraz ilości wody w zakresie 10ml - 270ml. Konewkę można wykonać w wersji zasilanej jedną baterią 18650 lub 3x AA (popularne paluszki). Czas pracy na baterii o poj. 2600mAh wynosi (wg wyliczeń) około 9 miesięcy (przy podlewaniu 200ml / 24h).

Hardware

Automatyczna konewka jest zbudowana w oparciu o pompkę perystaltyczną 3.7/6V dostępną na allegro lub aliexpress. Sterowanie oparte jest o mały mikroprocesor ATtiny25 (Microchip), który posiada 2kB pamięci programu, może być zasilany napięciem w granicach 1.8V-5.5V i pobiera bardzo mało prądu w trybie power down (max. 10 uA). Jest to ważny aspekt, gdyż sterownik pompki jest zasilany z baterii.

 

Schemat ideowy wraz z płytką PCB oraz gotowym urządzeniem jest widoczny poniżej.

 

 

Ustawianie okresu oraz ilości wody odbywa się poprzez dwa potencjometry 500k osiowe o charakterystyce liniowej (np. takie): pierwszy podłączony jest do wejścia PERIOD, drugi do wejścia WATER. Potencjometry podłączone są do napięcia zasilania, środkowe wyprowadzenia podpięto do dwóch wejść przetwornika ADC: ADC1(PB2) oraz ADC2(PB4). Pin PB3 pełni dwie funkcje: jako wyjście steruje załączaniem pompki poprzez tranzystor Q1, jako wejście służy do pomiaru napięcia baterii (wejście ADC3 przetwornika) poprzez dzielnik napięcia R1||R2 o dużych rezystancjach w celu ograniczenia poboru prądu. Do wyprowadzenia PB1 podłączona jest dioda LED czerwona 3mm poprzez rezystor R4 1k ograniczający prąd diody do 3mA. Dioda D1 zabezpiecza układ przed przepięciami generowanymi przez silnik pompki podłączony do wyprowadzeń M1 (+) i M2 (-). Gniazdo ISP służy do programowania mikroprocesora. 

 

Obudowa została zaprojektowana w programie Fusion 360. Pliki do druku 3D są dostępne na moim koncie Thingiverse. Obudwa wymaga dodatkowej obróbki: wyłamania PLA w miejscu włącznika (dobrze posłużyć się skalpelem lub nożem do tapet), oraz wywiercenia otworów pod wyprowadzenia rurek silikonowych (wiertło o średnicy 5.2) oraz otworów pod potencjometry (wiertło 7)

Software

Program jest napisany w C w środowisku Microchip Studio 7.0. Mikroprocesor pracuje z wewnętrznym oscylatorem na częstotliwości 8MHz, z włączonym podziałem zegara przez 8 (fuse bits: HIGH=0xFF, LOW=0x29), zatem procesor taktowany jest z częstotliwością 1.0MHz, co w zupełności wystarcza do obsługi sterownika. Pętla główna uruchamia się w takt przerwania z licznika watchdog WDT ustawionego w trybie przerwania z maksymalnym okresem ok. 8 sekund.  Na początku cyklu pętli głównej sterownik daje znać, że "żyje" poprzez jedno krótkie mrugnięcie diodą LED. Następnie sprawdzany jest poziom napięcia na baterii. W tym trybie przetwornik ADC skonfigurowany jest do pracy z wewnętrznym napięciem odniesienia Vref=1.1V, dzięki czemu możliwy jest pomiar aktualnego napięcia na baterii. W zależności od napięcia, dioda mrugnie drugi raz przy napięciu < 3.0V, trzeci raz, gdy napięcie jest < 2.85V, oraz czwarty raz przy napięciu < 2.7V. Oznacza to konieczność naładowania bądź wymiany baterii.

 

W następnym kroku odczytywane jest napięcie z potencjometru PERIOD. W tym trybie przetwornik ADC ustawiany jest z napięciem referencyjnym podłączonym do napięcia zasilania (baterii), dzięki czemu odczytane nastawy potencjometru są niezależne od aktualnego napięcia na baterii. Napięcie z potencjometru przeliczane jest na określoną liczbę godzin. Funkcja get_pump_period_in_hour() wylicza okres na podstawie punktów kalibracyjnych zapisanych w pamięci EEPROM mikroprocesora. Wartość wynikowa jest podawana w godzinach, które pomnożone przez 3600 dają wynik w sekundach. Taka wartość jest wpisywana do zmiennej pump_period. Podczas weryfikacji działania sterownika okazało się, że okres był o 12.5% dłuży, co prawdopodobnie wiąże się z niedokładnością licznika WDT odliczającego okresy 8-sekundowe. Dlatego w kolejnym kroku odejmuję 12.5% wynikowej wartości pump_period w celu kompensacji tej niedokładności. 

 

Następnie sprawdzany jest warunek czy licznik WDT przekroczył ustawiony okres, i jeśli tak jest, uruchamiana jest procedura włączenia pompki. Rozpoczyna się ona od zresetowania licznika WDT oraz odczytu nastawionej objętości wody funkcją get_water_volume_in_ml(), która wylicza objętość na podstawie nastawu potencjometru WATER wykorzystując zapisane w pamięci EEPROM punkty kalibracyjne. Następnie dokonywany jest pomiar napięcia baterii (pod obciążeniem diodą LED, które jest znikome, ale lepsze niż żadne). W kolejnym kroku funkcja volume_to_pump_sec() oblicza czas na jaki należy włączyć pompkę, aby przelać odpowiednią ilość wody. Ta funkcja przyjmuje dwie wartości: nastawy z potencjometru, czyli zadane mililitry, oraz napięcie na baterii - gdy napięcie jest niższe, pompka działa mniej wydajnie, wówczas włączana jest na dłużej. Z pomiarów eksperymentalnych przepompowanie 200ml wody przy naładowanej baterii i napięciu 4.2V czas wyniósł 105 s, przy 3.6V czas wyniósł 125 s, a przy napięciu 3.0V zajęło 157 s. Zależność jest więc liniowa, więc łatwo było wyznaczyć odpowiednią funkcję kompensacyjną. Znając czas pracy pompki, w następnym kroku włączana jest pompka i odliczany jest czas włączenia poprzez prostą pętlę for, w której program odczekuje 1000ms w każdym cyklu. Nie jest to zbyt precyzyjny sposób odliczania czasu, ale w zupełności wystarczający na potrzeby sterownika. Na koniec odliczania wyprowadzenie sterujące pompką jest zerowane i pompka jest wyłączana.

 

Wspomniane punkty kalibracyjne są domyślnie wpisywane do pamięci EEPROM przy pierwszym uruchomieniu. Następuje to w funkcji  store_default_calibration_points_to_eeprom(), która najpierw sprawdza, czy pamięć jest pusta. Domyślne punkty kalibracyjne odpowiadają punktom zaprojektowanej etykietki. Przy odrobinie szczęścia być może twoje potencjometry nie będą wymagać kalibracji, jednak jest to mało prawdopodobne. Dlatego bardzo zalecam przeprowadzenie kalibracji opisane poniżej.

 

 

 

 

Program w każdym cyklu WDT przechodzi do trybu power_down po uprzednim wyłączeniu przetwornika ADC w celu oszczędności prądu. W tym trybie układ pobiera ok. 20-30 mikroamper prądu.

 

Program konewki należy skompilować z parametrem CODE_MODE ustawionym na wartość 0.

*******************/
#define CODE_MODE 0
/*****************/

UWAGA!!! Przed rozpoczęciem programowania ustaw potencjometr WATER mniej więcej na środku zakresu. Ponieważ ten potencjometr dzieli sygnał SCK interfejsu SPI, w przypadku ustawienia na zero (potencjometr maksymalnie skręcony w prawo), linia będzie zwierana do GND. Podobnie, gdy potencjometr jest ustawiony na maksymalną pozycję (potencjometr maksymalnie skręcony w lewo), linia SCK będzie podłączona do Vcc. W obu przypadkach programator nie zadziała i programowanie nie będzie możliwe.

 

Przy optymalizacji kompilatora -O2 program zajmuje 1236 B, co stanowy 60% pojemności ATtiny25. 

 

Kalibracja potencjometrów

 

Podczas budowy prototypów okazało się, że potencjometry, chociaż oznaczone jako liniowe, wcale liniowe nie są. W efekcie skala na etykietce nie odpowiadała nastawom potencjometru. Ponadto, obszary martwe (przy skrajnych pozycjach) są różnej wielkości u różnych producentów. Z tego powodu wprowadziłem możliwość kalibracji potencjometrów. 

 

Do przeprowadzenia kalibracji potrzebne będzie przygotowanie przycisku na dwóch kabelkach zakończonych złączką tak, aby możliwe było podłączenie przycisku do dwóch golpinów złącza ISP, jak pokazano na rysunku. Będzie służył do zatwierdzania poszczególnych punktów kalibracji.

 

Aby wykalibrować potencjometr PERIOD, należy skompilować program parametrem CODE_MODE ustawionym na wartość 1.

*******************/
#define CODE_MODE 1
/*****************/

Tuż po załadowaniu programu zaświeci się dioda na 10 sekund. W tym czasie należy odłączyć złącze programatora i podłączyć przycisk. Gdy dioda zgaśnie, można przystąpić do kalibracji punktów skali zaczynając od punktu "Point 0", poprzez "Point 1", aż do "Point 10" - według załączonego rysunku. Każdy punkt kalibracyjny zatwierdzamy podłączonym przyciskiem. Program zapisze dane ustawienie w pamięci nieulotnej EEPROM, co sygnalizowane jest 10-krotnym krótkim mruganiem diody.

 

 

W celu weryfikacji kalibracji potencjometru PERIOD, należy skompilować program parametrem CODE_MODE ustawionym na wartość 2 i wgrać do mikroprocesora.

*******************/
#define CODE_MODE 2
/*****************/

Teraz, kręcąc potencjometrem, sprawdzamy punkty kalibracji - w każdym punkcie kalibracji zaświeci się dioda. Jeśli kalibracja przebiegła pomyślnie, można przejść do kalibracji potencjometru WATER lub powtórzyć proces.

 

Kalibracja potencjometru WATER przebiega podobnie. Do kalibracji tego potencjometru należy skompilować i wgrać do mikroprocesora program z opcją CODE_MODE 3.

*******************/
#define CODE_MODE 3
/*****************/

Podobnie jak wcześniej, kalibrację należy zacząć od "Point 0" i przejść przez wszystkie kolejne punkty aż do "Point 6". Po zakończeniu kalibracji, wgrywamy program z opcją CODE_MODE 4

*******************/
#define CODE_MODE 3
/*****************/

UWAGA!!! Aby przeprowadzić proces weryfikacji punktów kalibracyjnych potencjometru WATER należy odłączyć złącze programatora, gdyż programator zaburza sygnał SCK i odczyty nastawów tego potencjometru będą nieprawidłowe.

 

W ten sposób proces kalibracji jest ukończony, a punkty kalibracyjne są zapisane w pamięci EEPROM.

Efekt końcowy

Sterownik działa, odmierza określoną dawkę wody co określony czas. Zmierzony pobór prądu wynosi 24 uA w trybie uśpienia, 3mA pobiera dioda LED, która zapala się na 25ms raz na 8 sekund, co w trybie czuwania daje średni prąd na poziomie 34 uA. Pompka pobiera około 250mA prądu przy napięciu 4V. Jeśli podlewanie ustawione jest na 200ml co 24h, wówczas średni pobór prądu wyniesie ok. 0.4 mA. Przy baterii 2600mAh daje to czas pracy na poziomie 9 miesięcy. Wystarczy więc podłączyć pompkę pod wiadro wody i wyjechać w podróż dookoła świata, a po powrocie kwiatki będą pięknie rozrośnięte! :-).

(C) TB.

Możliwości zmian

Można dopasować skalę okresu oraz objętości wody do własnych potrzeb. W tym celu wystarczy zmienić wartości w tablicy target_w[]  na własne wartości, które będą odpowiadały określonej objętości wody w mililitrach. Podobnie można zmodyfikować tablicę wartości interwału czasowego w godzinach target_p[] . Oczywiście należy wówczas zaprojektować własną etykietkę.

Pliki do pobrania

1. Kod programu --> dostępny na https://github.com/tobajer/Automatic-Watering-Can

2. Obudowa do druku 3D, płytka PCB (gerber), etykietka, instrukcje fotograficzne --> dostępne na Thingiverse