plm2052 Napisano Styczeń 22, 2019 Udostępnij Napisano Styczeń 22, 2019 (edytowany) Witam! Chciałbym dzisiaj przedstawić swoją konstrukcję, którą nazwałem "automatyczne poidło". Zacznę od początku o Arduino usłyszałem już ok. 4 lata temu jednak postanowiłem, że naukę rozpocznę od elektroniki a później programowania, nadszedł ten czas. Swoją wiedzę opieram na razie tylko na paru lekcjach z forbot.pl (wszystko bardzo fajnie i przystępnie napisane), ale postanowiłem, że z tą skromną wiedzą mógłbym spróbować coś zaprogramować. Głównym celem oprócz oczywistego, tj. wymiany wody w poidłach dla zwierząt, był cel dydaktyczny, czyli na podstawie paru przykładów z miganiem diody, wykorzystać to jakoś praktyczniej. Dlaczego postanowiłem dodać projekt? Odpowiem szczerze, jako młody człowiek mój budżet nie jest ogromny dlatego każda złotówka się liczy. Części potrzebne do budowy: -Arduino nano -Zegar -Przekaźniki -Czujnik poziomu cieczy -Przetwornica step-down -Diody 3mm -Wtyk DC -Gniazdo DC -Męski goldpin -Źeński goldpin -Wtyk RJ11 Części, których nie udało mi się znaleźć z stronie Botlandu: -Gniazdo RJ11 -Płytka uniwersalna 70x90 -Przyciski -Obudowa Z77 -Zasilacz 12V -Kabelki (na pewno są) -Pompki (nie są drogie na auto złomie zapłaciłem 10zł za 3szt) -Wężyki -I oczywiście dobre chęci (nie na sprzedaż) Tutaj zamieszczę kilka zdjęć: Teraz przejdę do opisu działania dioda czerwona pierwsza z lewej odpowiedzialna jest za sygnalizowanie działania urządzenia (Jest po prostu podpięta do zasilania Arduino), dioda żółta służy do sygnalizowania trybu wypompowywanie, a dioda zielona trybu wpompowywanie. Przyciski służą do "awaryjnego"/manualnego włączania programów. Przycisk jeden służy do włączenia trybu wypompowywanie, przycisk dwa tryb wpompowywanie, przycisk trzy jest połączeniem obydwu tych przycisków. Normalnie konstrukcja o wskazanych w kodzie godzinach uruchamia się. Wypompowywanie jest ustawione na czas tj. obliczony czas na wypompowanie z chwilą zapasu. Wpompowywanie pompuje aż czujnik poziomu cieczy dostanie sygnał. Z powodu trochę mojej nie wiedzy i mojej ostrożność czujnik ten jest włączany tranzystorem tylko przed programem. Ma to zminimalizować ryzyko pokopania zwierzęcia (pomijam, że i tak bez wyłączania jest bardzo małe). Całość zasilana je na 12V (napięcie potrzebne dla pompek), a przetwornica step-down służy obniżeniu napięcia na 5V Na wejście Vin Tutaj zamieszczam schemat połączeń: Tutaj kod: #include "Wire.h" //Biblioteki #include "TimeLib.h" #include "DS1307RTC.h" #define przekaznik_1 2 //przekaźnik 1 #define przekaznik_2 3 //przekaźnik 2 #define przycisk_1 5 //przycisk 1 #define przycisk_2 6 //przycisk 2 #define przycisk_3 7 //przycisk 3 #define led_1 8 //dioda led 1 #define led_2 9 //dioda led 2 #define czujnik 4 //tranzystor włączający czujnik int godzina1 = 6; //Pora pierwszego wymienienia wody int minuta1 = 00; int godzina2 = 8; //Pora drugiego wymienienia wody int minuta2 = 0; int godzina3 = 10; //Pora trzeciego wymienienia wody int minuta3 = 0; int godzina4 = 12; //Pora czwartego wymienienia wody int minuta4 = 0; int godzina5 = 14; //Pora piątego wymienienia wody int minuta5 = 0; int godzina6 = 16; //Pora szustego wymienienia wody int minuta6 = 0; int godzina7 = 18; //Pora siódmego wymienienia wody int minuta7 = 0; int godzina8 = 20; //Pora ósmego wymienienia wody int minuta8 = 0; void funkcja() { digitalWrite(czujnik, HIGH); //Włącz czujnik digitalWrite(led_1, HIGH); //Włącz diodę 1 (dioda sygnalizująca wypompowywanie) digitalWrite(led_2, HIGH); //Włącz diodę 2 (dioda sygnalizująca wpompowywanie) delay(500); //Czekaj 0,5s digitalWrite(led_2, LOW); //Wyłącz diodę 2 delay(500); //Czekaj 0,5s digitalWrite(przekaznik_1, LOW); //Włącz przekaźnik 1 (wypompuj wodę) delay(3000); //Czekaj 3s (czas na wypompowanie, dobierany indywidualnei według potrzeb, ja ustawiłem 3sec, żeby krócej czekać podczas testowania) digitalWrite(przekaznik_2, LOW); //Włącz przekaźnik 2 (po wypompowaniu, chwila na przepłukanie miski, przekaźnik odpowiedzialny za wpompowywanie) digitalWrite(led_2, HIGH); //Włącz diodę 2 (dioda sygnalizująca wpompowywanie) delay(1000); //Czekaj 1s (czas płukania naczynia) digitalWrite(led_1, LOW); //Wyłącz diodę 1 digitalWrite(przekaznik_1, HIGH); //Wyłącz przekaźnik 1 while (analogRead(A0) < 450) { //Jeżeli mały poziom wody (dopóki na czujniku nie będzie wody, wartość ustawiamy również indywidualnie np. za pomocą przykładu AnalogReadSerial) delay(500); //Czekaj (czas na wpompowanie) } digitalWrite(przekaznik_2, HIGH); //Wyłącz przekaźnik 2 (woda wpompowana przekaźnik wyłączony) digitalWrite(led_2, LOW); //Wyłącz diodę 2 digitalWrite(czujnik, LOW); //Wyłącz czujnik delay(500); //Czekaj 0,5s } void setup() { pinMode(przekaznik_1, OUTPUT); //Definiowanie pinów pinMode(przekaznik_2, OUTPUT); pinMode(przycisk_1, INPUT_PULLUP); pinMode(przycisk_2, INPUT_PULLUP); pinMode(przycisk_3, INPUT_PULLUP); pinMode(led_1, OUTPUT); pinMode(led_2, OUTPUT); pinMode(czujnik, OUTPUT); digitalWrite(czujnik, LOW); //Wyłączenie diód, przekaźników i czujnika digitalWrite(led_1, LOW); digitalWrite(led_2, LOW); digitalWrite(przekaznik_1, HIGH); digitalWrite(przekaznik_2, HIGH); } void loop() { tmElements_t tm; if(RTC.read(tm)) { if((tm.Hour == godzina1)&&(tm.Minute == minuta1)) { //Jeżeli godziny się zgadzają funkcja(); } if((tm.Hour == godzina2)&&(tm.Minute == minuta2)) { funkcja(); } if((tm.Hour == godzina3)&&(tm.Minute == minuta3)) { funkcja(); } if((tm.Hour == godzina4)&&(tm.Minute == minuta4)) { funkcja(); } if((tm.Hour == godzina5)&&(tm.Minute == minuta5)) { funkcja(); } if((tm.Hour == godzina6)&&(tm.Minute == minuta6)) { funkcja(); } if((tm.Hour == godzina7)&&(tm.Minute == minuta7)) { funkcja(); } if((tm.Hour == godzina8)&&(tm.Minute == minuta8)) { funkcja(); } } if (digitalRead(przycisk_1) == LOW) { //Jeżeli przycisk 1 wciśnięty digitalWrite(led_1, HIGH); //Włącz diodę 1 digitalWrite(przekaznik_1, LOW); //Włącz przekaźnik 1 delay(3000); //Czekaj 3s digitalWrite(led_1, LOW); //Wyłącz diodę 1 digitalWrite(przekaznik_1, HIGH); //Wyłącz przekaźnik 1 } if (digitalRead(przycisk_2) == LOW) { //Jeżeli przycisk 2 wciśnięty digitalWrite(czujnik, HIGH); //Włącz czujnik digitalWrite(led_2, HIGH); //Włącz diodę 2 digitalWrite(led_1, HIGH); digitalWrite(przekaznik_2, LOW); //Włącz przekaźnik 2 digitalWrite(przekaznik_1, LOW); //Włacz przekaźnik 1 delay(3000); //Czekaj 3sec (czas na przepłukanie) digitalWrite(przekaznik_1, HIGH); //Wyłacz przekaźnik 1 digitalWrite(led_1, LOW); while (analogRead(A0) < 450) { //Jeżeli niski poziom wody delay(500); //Czekaj (czas na wpompowywanie) } } digitalWrite(led_2, LOW); //Wyłącz diodę 2 digitalWrite(przekaznik_2, HIGH); //Wyłącz przekaźnik 2 digitalWrite(czujnik, LOW); //Wyłącz czujnik if (digitalRead(przycisk_3) == LOW) { //Jeżeli przycisk 3 wciśnięty funkcja(); } } Uważam, że dość jasno opisałem program (pomijając to, że jest bardzo prosty). Kończąc nie sądzę, żeby program był bezbłędny, sam fakt jak zrobione jest wypompowywanie nie jest idealne, jednak myślę, że jak na pierwszą moją samodzielną konstrukcję nie jest, aż tak bardzo źle, oczywiście jestem otwarty na krytykę. W przyszłości chciałby rozbudować projekt o podajnik jedzenia i może moduł Ethernet. Proszę o odpowiedź czy moja praca nadaje się do otrzymania kuponu rabatowego (bardzo mi na tym zależy)? Edytowano Styczeń 22, 2019 przez plm2052
Treker (Damian Szymański) Styczeń 23, 2019 Udostępnij Styczeń 23, 2019 Dziękuję za pochwalenie się projektem! Aktualnie na Forbocie trwa akcja, dzięki której za opis tego DIY możesz otrzymać kod rabatowy o wartości 50 zł do sklepu Botland. Niestety, ale przygotowany przez Ciebie opis nie spełnia założeń tej promocji. Oczywiście możesz to jeszcze poprawić! W przypadku tego wpisu: Popraw formatowanie (wykorzystaj opcję tworzenia list wypunktowanych dostępną w edytorze zamiast ręcznego robienia list produktów). Rozbuduj opis, aby osoba postronna mogła zrozumieć czym tak naprawdę jest to urządzenie. Opisz praktyczne wykorzystanie np. jak i gdzie ta woda jest wpompowywana. Na ten moment ciężko zrozumieć o co dokładnie chodzi. Może jakieś zdjęcie z zainstalowanym układem w docelowym miejscu? Jeśli chcesz wziął udział w akcji rabatowej to wprowadź powyższe zmiany w opisie, a następnie zgłoś projekt do akcji publikując odpowiedni link w temacie zgłoszeniowym. Dokładne informacje na temat wyglądu poprawnego opisu znajdziesz w ogłoszeniu zapowiadającym akcję rabatową.
Treker (Damian Szymański) Styczeń 27, 2019 Udostępnij Styczeń 27, 2019 @plm2052, czy masz zamiar aktualizować ten opis, czy mam publikować w obecnej formie?
Treker (Damian Szymański) Luty 1, 2019 Udostępnij Luty 1, 2019 Temat publikuję aktualnie bez akceptacji do akcji rabatowej w związku z brakiem reakcji autora na moje prośby i pytania.
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »