Prometeuszanin Napisano 26 stycznia Udostępnij Napisano 26 stycznia (edytowany) Program i sprzęt do zdalnej opieki nad roślinami. Mam zamiar rozbudowywać ten system, dodać łączność internetową, wifi lub coś innego. Wymienić czujniki na lepsze, dodać więcej czujników, modyfikować program. Działanie pokazuję i opisuję na filmie. Dodaję też program z opisami. Jeśli widzicie błędy w programie lub jego opisach to chętnie przyjmę wskazówki. Mam nadzieję że opisy przydadzą się osobą które będą chciały skopiować pewne funkcje z programu, powinny ułatwić im tworzenie. Przy okazji będą się powoli uczyli i lepiej rozumieli co robią. Link do filmu: https://www.youtube.com/watch?v=4OGIwDkDweA Program: String odebraneDane = ""; //Ta linijka jest potrzebna do odbierania wiadomości #define przekaznik1 2 // Przypisanie pinu numer 2 do nazwy przekaznik1, odpowiada za połączenie z przekaźnikiem nr 1 #define przekaznik2 3 // Przypisanie pinu numer 3 do nazwy przekaznik2, odpowiada za połączenie z przekaźnikiem nr 2 #define przekaznik3 4 // Przypisanie pinu numer 4 do nazwy przekaznik3, odpowiada za połączenie z przekaźnikiem nr 3 #define przekaznik4 5 // Przypisanie pinu numer 5 do nazwy przekaznik4, odpowiada za połączenie z przekaźnikiem nr 4 #define LED_C 8 // przypisanie pinu dla diody czerwonej #define LED_N 12 // przypisanie pinu dla diody niebieskiej #define brzeczyk 9 // przypisanie pinu dla brzęczyka #define plywak 10 // przypisanie pinu dla pływaka #define podstawka 11 // Przypisanie czujnika do wody w podstawce doniczki void setup() { //Początkowe ustawienia dla programu pinMode(A0, INPUT); // Pomiar wilgotności gleby pinMode(A1, INPUT); // Pomiar wilgotności gleby pinMode(A2, INPUT); // Pomiar wilgotności gleby pinMode(A3, INPUT); // Pomiar wilgotności gleby pinMode(A4, INPUT); // Pomiar wilgotności gleby Serial.begin(9600); // Uruchomienie komunikacji pinMode(przekaznik1, OUTPUT); // Konfiguracja wyjść OUTPUT - wyjście - pin do wysyłania sygnału, można włączyć przepływ prądu lub wyłączyć pinMode(przekaznik2, OUTPUT); // Drugi przekaźnik też OUTPUT pinMode(przekaznik3, OUTPUT); // I trzeci pinMode(przekaznik4, OUTPUT); // I czwarty digitalWrite(przekaznik1, HIGH); //Ustawienie stanu pinów po uruchomieniu programu (HIGH - wysoki - dodatni - jest prąd) digitalWrite(przekaznik2, HIGH); //Drugi przekaźnik to samo, i tak do czwartego digitalWrite(przekaznik3, HIGH); digitalWrite(przekaznik4, HIGH); Serial.println("Program włączony"); // Wysłanie wiadomości do portu szeregowego, napisów z między nawiasów pinMode(LED_C, OUTPUT); //ustawienie pinu jako wyjście do sterowania diodą czerwoną pinMode(LED_N, OUTPUT); //ustawienie pinu jako wyjście do sterowania diodą niebieską pinMode(brzeczyk, OUTPUT); //ustawienie pinu jako wyjście do sterowania brzęczykiem pinMode(plywak, INPUT); //ustawienie pinu jako wejście, sprawdza czy do pinu dochodzi prąd. Powiadamia o stanie pływaka pinMode(podstawka, INPUT); //ustawienie pinu jako wejście, sprawdza czy do pinu dochodzi prąd. Powiadamia o stanie pływaka digitalWrite(LED_C, LOW); //Ustawienie stanu początkowego diody czerwonej digitalWrite(LED_N, LOW); //Ustawienie stanu początkowego diody niebieskiej digitalWrite(brzeczyk, LOW); //Ustawienie stanu początkowego brzęczyka } void loop() { // Program pętli (loop), czyta od góry do dołu, gdy skończy robi to jeszcze raz, i jeszcze raz, i tak w kółko jeśli ma zasilanie if(Serial.available() > 0) { //Czy Arduino odebrało dane odebraneDane = Serial.readStringUntil('\n'); if (odebraneDane == "ps") { //Jeśli odebrano wiadomość: ps (Skrót od podlej Szeflere) digitalWrite(przekaznik1, LOW); //uruchomienie silnika w pompce przez przełączenie przekaźnika zmianą napięcia w pinie Arduino delay(5000); // Czas w którym silnik ma być włączony (przez 3000 milisekund czyli 3 sekundy) digitalWrite(przekaznik1, HIGH); //wyłączenie silnika w pompce przez powrót przekaźnika do stanu początkowego } if (odebraneDane == "pa") { //Jeśli odebrano wiadomość: pa (Skrót od podlej Areke) digitalWrite(przekaznik2, LOW); delay(5000); digitalWrite(przekaznik2, HIGH); } if (odebraneDane == "pb") { //Jeśli odebrano wiadomość: pb (Skrót od podlej Benjamina) digitalWrite(przekaznik3, LOW); delay(5000); digitalWrite(przekaznik3, HIGH); } if (odebraneDane == "pg") { //Jeśli odebrano wiadomość: pg (Skrót od podlej Ginsenga) digitalWrite(przekaznik4, LOW); delay(5000); digitalWrite(przekaznik4, HIGH); } if (odebraneDane == "swg") { //If znaczy jeśli, informacje za nawiasem mówią co się dzieje jeśli- //dostaje się wiadomość, w tym przypadku są nią 3 litery: swg int sensorValue = analogRead(A0); // Odczyt wartości z portu analogowego float percentage = 100.0 - ((float)sensorValue / 1023.0 * 100.0); // Przeliczenie odwrotne Serial.print(percentage); //nazwa z konkretnego czujnika przeliczona na procenty Serial.println("% Wilgotnosc Gleby Szeflera Pin A0, 1 z 5 roślin"); // Informacje do wyświetlenia. Słowo "Serial" na początku oznacza że // informacja ma być wyświetlona w porcie szeregowym delay(3000); // Opóźnienie czasowe int sensorValueA1 = analogRead(A1); // Odczyt wartości z portu analogowego float percentageA1 = 100.0 - ((float)sensorValueA1 / 1023.0 * 100.0); // Przeliczenie odwrotne Serial.print(percentageA1); Serial.println("% Wilgotnosc Gleby Palma Areka Pin A1, 2 z 5 roślin"); delay(3000); int sensorValueA2 = analogRead(A2); // Odczyt wartości z portu analogowego float percentageA2 = 100.0 - ((float)sensorValueA2 / 1023.0 * 100.0); // Przeliczenie odwrotne Serial.print(percentageA2); Serial.println("% Wilgotnosc Gleby Paproć Nefrolepis Pin A2, 3 z 5 roślin"); delay(3000); int sensorValueA3 = analogRead(A3); // Odczyt wartości z portu analogowego float percentageA3 = 100.0 - ((float)sensorValueA3 / 1023.0 * 100.0); // Przeliczenie odwrotne Serial.print(percentageA3); Serial.println("% Wilgotnosc Gleby Ficus Benjamina Pin A3, 4 z 5 roślin"); delay(3000); int sensorValueA4 = analogRead(A4); // Odczyt wartości z portu analogowego float percentageA4 = 100.0 - ((float)sensorValueA4 / 1023.0 * 100.0); // Przeliczenie odwrotne Serial.print(percentageA4); Serial.println("% Wilgotnosc Gleby Fikus Ginseng Pin A4, 5 z 5 roślin"); delay(3000); } } { if (digitalRead(plywak) == LOW) { //(warunek - "if". To co jest między nawiasami "{" i "}" za warunkiem jest jego pętlą) Serial.println("Alarm !!! Niski poziom wody w zbiorniku numer 1 !!! Alarm !!!"); //wiadomość wyświetlana w porcie szeregowym za każdym razem //po wykonaniu pętli warunku programu //Niżej w pętli są wiersze do mrugania diody digitalWrite(LED_C, HIGH); // Włączenie diody czerwonej digitalWrite(brzeczyk, HIGH); // Włączenie brzęczyka delay(500); // Pól sekundy oczekiwania digitalWrite(LED_C, LOW); // Wyłączenie diody czerwonej digitalWrite(brzeczyk, LOW); // Wyłączenie brzęczyka delay(500); // Znów Pół sekundy oczekiwania digitalWrite(LED_C, HIGH); // Znów włączenie diody czerwonej, i tak dalej (już bez brzęczyka) delay(500); digitalWrite(LED_C, LOW); delay(500); digitalWrite(LED_C, HIGH); delay(500); digitalWrite(LED_C, LOW); delay(500); digitalWrite(LED_C, HIGH); delay(500); digitalWrite(LED_C, LOW); delay(500); digitalWrite(LED_C, HIGH); //Pozostawienie diody włączonej podczas sprawdzania kolejnych pętli, jeśli sygnał wciąż dociera do arduino // (Jeśli w zbiorniku nadal nie ma wody [No chyba że jest jakaś awaria sprzętu, też trzeba czasem sprawdzić]) } else { digitalWrite(LED_C, LOW); digitalWrite(brzeczyk, LOW); } if (digitalRead(podstawka) == LOW) { //Jeśli w podstawce jest woda, sygnał dociera do przypisanego pinu w arduino to: Serial.println("Alarm !!! W podstawce doniczki Palmy Areki jest woda !!! Alarm !!!"); //wiadomość wyświetlana w porcie szeregowym za każdym razem //po wykonaniu pętli warunku programu (warunek - "if". To co jest w nawiasie za warunkiem jest jego pętlą) digitalWrite(LED_N, HIGH); // Tu program do diody niebieskiej, podobny do programu diody czerwonej digitalWrite(brzeczyk, HIGH); delay(500); digitalWrite(LED_N, LOW); digitalWrite(brzeczyk, LOW); delay(500); digitalWrite(LED_N, HIGH); delay(500); digitalWrite(LED_N, LOW); delay(500); digitalWrite(LED_N, HIGH); delay(500); digitalWrite(LED_N, LOW); delay(500); digitalWrite(LED_N, HIGH); delay(500); digitalWrite(LED_N, LOW); delay(50); digitalWrite(LED_N, HIGH); } else { // Jeśli w podstawce nie ma wody, sygnał nie dociera do przypisanego pinu w arduino to: digitalWrite(LED_N, LOW); // Dioda niebieska jest wyłączona digitalWrite(brzeczyk, LOW); // brzęczyk jest wyłączony } } } // Jeśli zauważyłeś błąd to mnie poinformuj, koniec programu, zamknięcie nawiasu pętli (loop) Dzięki temu tematowi nie będę musiał tak często pytać ludzi na czacie. Nie tracąc czasu pytam: Ile czujników mogę bezpiecznie zasilać z Arduino Uno? Kable 10-11 metrów w jedna stronę? Jak bezpiecznie podłączyć zasilanie zewnętrzne do czujników tak aby pomiary były prawidłowe i nie uszkodzić płytki Arduino? Edytowano 26 stycznia przez Prometeuszanin Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta 26 stycznia Udostępnij 26 stycznia Najlepiej zasilić czujniki z innego źródła niż ardu...to znaczy może być z jednego zasilacza ale dla czujników osobna przetwornica, a dla Ardu osobne zasilanie...ile ma być tych czujników i jakie? Poczytaj o ich komunikacji na odległość bo jeśli chcesz dać 10 metrów to może okazać się za daleko dla niektórych typów komunikacji...z drugiej strony można się pokusić o czujniki bezprzewodowe, jakieś najtańsze ESP,stabilizator,protokół esp-now i do tego jakiś tryb uśpienia i dane wysyłane powiedzmy co 1-2min. Wtedy jeden Aku 18650 starczy na długo, no ale to zależy czy chciałbyś się w to bawić Cytuj Link do komentarza Share on other sites More sharing options...
Prometeuszanin 26 stycznia Autor tematu Udostępnij 26 stycznia 1 godzinę temu, farmaceuta napisał: Najlepiej zasilić czujniki z innego źródła niż ardu...to znaczy może być z jednego zasilacza ale dla czujników osobna przetwornica, a dla Ardu osobne zasilanie...ile ma być tych czujników i jakie? Poczytaj o ich komunikacji na odległość bo jeśli chcesz dać 10 metrów to może okazać się za daleko dla niektórych typów komunikacji...z drugiej strony można się pokusić o czujniki bezprzewodowe, jakieś najtańsze ESP,stabilizator,protokół esp-now i do tego jakiś tryb uśpienia i dane wysyłane powiedzmy co 1-2min. Wtedy jeden Aku 18650 starczy na długo, no ale to zależy czy chciałbyś się w to bawić Czujniki będę zmieniał na różne. Problem w tym że nie wiem jak odpowiednio zabezpieczyć Arduino przed spaleniem z powodu zbyt dużego napięcia lub zwarcia. Czujniki bezprzewodowe mogą być zbyt drogie z powodu ich ilości, myślę że taniej będzie gdy użyję 2 urządzenia do łączności z kablami np. 5 metrów (lub nawet 2 metry) do czujników z jednym zasilaniem i płytką z wifi wysyłającą dane z np. 15 czujników bez wifi, niż mieć 15 czujników z wifi. Też oszczędność na energii pobieranej przez nadawanie sygnału przez wifi. Dane z czujników chcę pobierać o różnych godzinach więc jeszcze rzadziej niż co parę minut. Przewiduję zasilanie z akumulatorów AGM o dużej pojemności, energię z nich chcę wykorzystać do różnych rzeczy więc przyda się pojemny akumulator. O komunikacji na odległość poczytam, dzięki za podpowiedź. Pytania: Jak najtaniej, bezpiecznie połączyć wspólnie masę akumulatora 12V i GND w Arduino? Czy połączenie z Arduino do przekaźnika trzeba zabezpieczyć diodą krzemową aby impuls elektromagnetyczny z przekaźnika nie uszkodził Arduino? Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta 26 stycznia Udostępnij 26 stycznia 1 godzinę temu, Prometeuszanin napisał: Jak najtaniej, bezpiecznie połączyć wspólnie masę akumulatora 12V i GND w Arduino? Normalnie...łączysz bez żadnych czarów i działa...do Ardu zakup sobie jakąś przetwornice np. lm2596 i drugą dla czujników...koszt koło 15zl plus ewentualną przesylka... 1 godzinę temu, Prometeuszanin napisał: Czy połączenie z Arduino do przekaźnika trzeba zabezpieczyć diodą krzemową aby impuls elektromagnetyczny z przekaźnika nie uszkodził Arduino? To zależy czy pytasz o sam przekaźnik czy moduł z przekaźnikiem...jeśli to pierwsze to tak trzeba zabezpieczyć diodą i dorzucić tranzystor do sterowania...kup sobie odrazu moduł coś jak poniżej...masz tu odrazu optoizolacje (czyli odseparowanie "stopnia" mocy od logiki) tu akurat podwojny moduł... Jeżeli planujesz użycie Wi-Fi to odrazu zapomnij o Uno a zainteresuj się esp32...masz odrazu Wi-Fi Bluetooth i o wiele więcej niż Ci potrzeba na dzień dzisiejszy a cena podobna, i programujesz praktycznie tak samo jak Arduina w IDE...a co do komunikacji to poczytaj o czymś takim jak "Telegram" (aplikacja na Androida) możesz się komunikować z ESP na zasadzie czatu...jak Messenger czy Whatsapp 1 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
Prometeuszanin 26 stycznia Autor tematu Udostępnij 26 stycznia 58 minut temu, farmaceuta napisał: Normalnie...łączysz bez żadnych czarów i działa...do Ardu zakup sobie jakąś przetwornice np. lm2596 i drugą dla czujników...koszt koło 15zl plus ewentualną przesylka... Cieszę się że obejdzie się bez czarów. Zamiast przetwornicy używam stabilizatorów napięcia z kondensatorami. Pytałem aby wiedzieć czy zasilanie np. 12 v 3 Ampery połączone z GND Arduino nie uszkodzi płytki. nie zamierzam w chwili obecnej podłączać tak wysokiego napięcia do GND ale chcę to wiedzieć, też po to by wiedzieć czy 5 V 3 A wysłane do GND nie uszkodzi płytki, chcę znać limity jeśli takowe są. 1 godzinę temu, farmaceuta napisał: To zależy czy pytasz o sam przekaźnik czy moduł z przekaźnikiem...jeśli to pierwsze to tak trzeba zabezpieczyć diodą i dorzucić tranzystor do sterowania...kup sobie odrazu moduł coś jak poniżej...masz tu odrazu optoizolacje (czyli odseparowanie "stopnia" mocy od logiki) tu akurat Używam takich modułów, ale teraz wiem aby zwrócić uwagę na optoizolacje przy montażu przekaźników. 1 godzinę temu, farmaceuta napisał: Jeżeli planujesz użycie Wi-Fi to odrazu zapomnij o Uno a zainteresuj się esp32...masz odrazu Wi-Fi Bluetooth i o wiele więcej niż Ci potrzeba na dzień dzisiejszy a cena podobna, i programujesz praktycznie tak samo jak Arduina w IDE...a co do komunikacji to poczytaj o czymś takim jak "Telegram" (aplikacja na Androida) możesz się komunikować z ESP na zasadzie czatu...jak Messenger czy Whatsapp Pomysł użycia takiej aplikacji podoba się mi ale w modułach ESP32 które sprawdzałem jest mało wejść i pamięci w urządzeniu. Myślę że lepiej będzie użyć Arduino Mega 2560 i dołączyć do niego moduł wifi do komunikacji, to też pozwoli mi zmieniać rodzaj łączności inną radiową lub np. Ethernet Cytuj Link do komentarza Share on other sites More sharing options...
ethanak 26 stycznia Udostępnij 26 stycznia 10 minut temu, Prometeuszanin napisał: w modułach ESP32 które sprawdzałem jest mało wejść i pamięci w urządzeniu. Myślę że lepiej będzie użyć Arduino Mega 2560 Ekhm... ESP32 w takiej normalnej wersji ma 512 kB RAM i 4 MB flasha. Myślisz, że Mega 2560 ma więcej? A do dodatkowych pinów są ekspandery. Cytuj Link do komentarza Share on other sites More sharing options...
Prometeuszanin 26 stycznia Autor tematu Udostępnij 26 stycznia 2 minuty temu, ethanak napisał: Ekhm... ESP32 w takiej normalnej wersji ma 512 kB RAM i 4 MB flasha. Myślisz, że Mega 2560 ma więcej? A do dodatkowych pinów są ekspandery. Teraz widzę, źle sprawdziłem. W takim razie z użyciem ekspanderów to może być lepsze rozwiązanie, dzięki Cytuj Link do komentarza Share on other sites More sharing options...
SOYER 26 stycznia Udostępnij 26 stycznia Polecam aplikację Supla, sam używam, nada się idealnie. Oglądnij kilka moich filmów to pewnie Ci się spodoba. Supla ma też już zaimplementowane powiadomienia na telefon, będą u Ciebie przydatne. Cytuj Link do komentarza Share on other sites More sharing options...
Prometeuszanin 26 stycznia Autor tematu Udostępnij 26 stycznia (edytowany) Myślę że mogę dodać bezpiecznik 0,5 A przy masie płytki dla zabezpieczenia. Po podłączeni wspólnej masy pływak działa poprawnie, przekaźniki też już podłączyłem do osobnego zasilania. 1 godzinę temu, SOYER napisał: Polecam aplikację Supla, sam używam, nada się idealnie. Oglądnij kilka moich filmów to pewnie Ci się spodoba. Supla ma też już zaimplementowane powiadomienia na telefon, będą u Ciebie przydatne. Gdzie znajdę twoje filmy? Edytowano 26 stycznia przez Prometeuszanin Cytuj Link do komentarza Share on other sites More sharing options...
SOYER 26 stycznia Udostępnij 26 stycznia 1 godzinę temu, Prometeuszanin napisał: Myślę że mogę dodać bezpiecznik 0,5 A przy masie płytki dla zabezpieczenia. Po podłączeni wspólnej masy pływak działa poprawnie, przekaźniki też już podłączyłem do osobnego zasilania. Gdzie znajdę twoje filmy? Na forum Supla ma taki sam nick jak tutaj. Tutaj krótki filmik, tak trafisz do innych Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta 26 stycznia Udostępnij 26 stycznia 3 godziny temu, Prometeuszanin napisał: Pytałem aby wiedzieć czy zasilanie np. 12 v 3 Ampery połączone z GND Arduino nie uszkodzi płytki. nie zamierzam w chwili obecnej podłączać tak wysokiego napięcia do GND ale chcę to wiedzieć, też po to by wiedzieć czy 5 V 3 A wysłane do GND nie uszkodzi płytki, chcę znać limity jeśli takowe są. Napięcie jest nie istotne...jedno urządzenie może być na 5v a drugie na 20v, bez różnicy...ty masz połączyć wszystkie masy (Arduino, czujniki etc) bo inaczej czujniki nie będą działać poprawnie Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta 26 stycznia Udostępnij 26 stycznia 3 godziny temu, Prometeuszanin napisał: Pomysł użycia takiej aplikacji podoba się mi ale w modułach ESP32 które sprawdzałem jest mało wejść i pamięci w urządzeniu. Nie powiedziałeś dalej jakich czujników będziesz używał....to że będzie ich 10 np. nie znaczy że każdy potrzebuje osobnych wejść...napisz jakie to czujniki Cytuj Link do komentarza Share on other sites More sharing options...
Prometeuszanin 26 stycznia Autor tematu Udostępnij 26 stycznia 9 minut temu, farmaceuta napisał: Nie powiedziałeś dalej jakich czujników będziesz używał....to że będzie ich 10 np. nie znaczy że każdy potrzebuje osobnych wejść...napisz jakie to czujniki Czujnik wilgotności gleby M143 na złączu analogowym "Czujnik Poziomu Wody Deszczu Opadów Arduino" mam na pinie cyfrowym. Już brakuje mi wejścia analowego do termometru Czujniki będę zmieniał, chcę przetestować różne. W jednym z artykułów na Forbocie czytałem że najlepiej będzie wykorzystać droższe profesjonalne czujniki, może uda się zrobić podobne samodzielnie. Na chwilę obecną mam M143 i powinny wystarczyć aby nie dopuścić do przesuszenia i przelania rośliny. 14 minut temu, farmaceuta napisał: Napięcie jest nie istotne...jedno urządzenie może być na 5v a drugie na 20v, bez różnicy...ty masz połączyć wszystkie masy (Arduino, czujniki etc) bo inaczej czujniki nie będą działać poprawnie Podłączyłem i wszystko działa. Teraz zajmę się nauką obsługi wifi, znacie dobre poradniki? Cytuj Link do komentarza Share on other sites More sharing options...
ethanak 26 stycznia Udostępnij 26 stycznia Piszesz o ESP32 a na zdjęciu widzę ESP8266... zdecyduj się. Cytuj Link do komentarza Share on other sites More sharing options...
Prometeuszanin 27 stycznia Autor tematu Udostępnij 27 stycznia Tak, znów pomyłka. ESP32 CAM zajmę się później, wpierw komunikacja przez esp8266 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!