Skocz do zawartości

plm2052

Użytkownicy
  • Zawartość

    1
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O plm2052

  • Ranga
    1/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. 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)?
×
×
  • Utwórz nowe...