• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Projekt KONEWKA
#1
Projekt KONEWKA
z założenia - jak sama nazwa wskazuje - ma podlewać!
Najbardziej wtedy, kiedy nikogo nie ma na działce - a to jest bardzo często - żeby nie powiedzieć ciągle oprócz weekedów!

Etapy:
KONEWKA 1.0
- do podlania - zbudowana ze starych okien "szklarnia" oraz dwie działki, na których rosną (będą rosły) warzywka itp.
- "szklarnia" jako jeden obwód - działki po minimum dwa obwody na działkę - z możliwością rozbudowy
- zbiornik 1000 litrów (paleciak) taki plastikowy w koszu
- dwie pompy - jedna w studni - druga pod zbiornikiem.
- pierwsza nalewa do zbiornika - druga "wylewa" :-)
- wszystkie połączenia wodne wykonał mój nieodżałowany tata :-( - z tzw. rury PE fi32 (coś więcej niż cal w hydraulice)
- obsługa ręczna - "jakiś Jasiu" jak był to robił podlewanie oraz pilnowanie poziomów i włączał wszystko ręcznie - wtedy kiedy "trza" ale jak wiadomo prawie każdy "Jasiu" lubi piwo i nici z pilnowania poziomów :-)

KONEWKA 1.5
- to co w KONEWKA 1.0
- czujnik pływakowy i mikro wyłącznik gdy zbiornik sie napełnił - "Jasiu" już nie przelał zbiornika

KONEWKA 2.0
- to co w 1.5 + dodatkowo:
- "Jasia" zastąpił sterownik na Arduino UNO (klon) i moduły gotowych przekaźników ze znanego portalu aukcyjnego... oraz RTC1307 z bateryjką i LCD 16x2
- na końcach rury PE pojawiły się elektrozawory (takie z pralki automatycznej na 230V)

KONEWKA 2.5
- to co 2.0 
- dodatkowo potrzebny stał się czujnik "minimum w zbiorniku - bo woda nalewała się wolniej niż wypływała 
i żeby pompa pod zbiornikiem nie kręciła na sucho. Zrobiono go z czujnika napełnienia z... pralki automatycznej. 
Wężyk czujnika do dna zbiornika i w miarę napływu wody czujnik "wyczuł", że nalewa się woda a potem wyczuł, że woda "uciekła" i załączał pompę w studni

Obrazków nie zamieszczam bo ich nie mam ;-)
poza tym nigdy nie umiałem ładnie zbudować układu - wizualna "lipa" - wstyd.
Oto kod - w komentarzach kompendium wiedzy o programie i połączeniach.

Kod:
//**********************   KONEWKA v2.5   **************************************
//Autor - Kolunio72 tu się napocił ale korzystał z wiedzy innych ***************
//Jak Tobie to jest potrzebne to kopiuj bez opamiętania i działaj!!! ***********
//******************************************************************************
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal.h>
//jak nie chodzi zegar to odpalić "STARTZEGAR"
//ale RTC ma podtrzymanie bateryjne
#define pmpStudnia 2        //przekaźnik sterujący pompą w studni
#define pmpObwodowa 3       //przekaźnik sterujący pompą obowdową
#define outOb1 4             //uruchomienie przekaźnika dla obwodu nr..
#define outOb2 5
#define outOb3 6
#define outOb4 7
#define wodaMax A1          //czujnik NO (normalnie otwarty)
#define wodaMin A0          //czujnik z pralki
//***  TU CHYBA SĄ JAKIEŚ ZMIENNNE *****
int czasPodlewania = 15;     //W MINUTACH 
int inoRaz = 0;             // :-)
int nrOb = 1;               // nr obwodu (dla wystartowania)
int konPodObw = 0;          // koniec czasu podlewania
int startPodl = 0;          // zapamiętanie chwili (minuty) podlewania
byte jestZgoda = false;     // żeby nie podlewało byle kiedy
//LCD display pins
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
const char *monthName[12] = {
  "Sty", "Lut", "Mar", "Kwi", "Maj", "Cze",
  "Lip", "Sie", "Wrz", "Paz", "Lis", "Gru"
};

void setup() {

  lcd.begin(16, 2);

  pinMode(pmpStudnia, OUTPUT);
  pinMode(pmpObwodowa, OUTPUT);
  pinMode(outOb4, OUTPUT);
  pinMode(outOb3, OUTPUT);
  pinMode(outOb2, OUTPUT);
  pinMode(outOb1, OUTPUT);
  pinMode(A0, INPUT_PULLUP);
  pinMode(A1, INPUT_PULLUP);
  digitalWrite(pmpStudnia, HIGH);
  digitalWrite(pmpObwodowa, HIGH);
  digitalWrite(outOb4, HIGH);
  digitalWrite(outOb3, HIGH);
  digitalWrite(outOb2, HIGH);
  digitalWrite(outOb1, HIGH);
  //powitanie :-)
  lcd.print("  KONEWKA V2.5");
  delay(1000);
  lcd.clear();
  } 
 void loop() 
 {
 //************************  SPRAWDZENIE CZY JEST WODA W ZBIORNIKU    *******************************
 byte poziomNiski = digitalRead(wodaMin);     //czujnik ciśnieniowy z pralki automatycznej :-)
  if (poziomNiski == LOW) {                   //jeżeli wody w zbiorniku jest za mało
    digitalWrite(pmpStudnia, LOW);            //załączenie przekaźnika pompy w studni
  }
 byte poziomWysoki = digitalRead(wodaMax);   //czujnik NO (normalnie otwarty)
  if (poziomWysoki == LOW) {                 //czy zbiornik jest pełny?
    digitalWrite(pmpStudnia, HIGH);          //wyłączenie pompy w studni
  }
//*************************************************************************************************** 
 
//*********************** WYŚWIETLANIE CZASU   ******************************************************
tmElements_t tm;

 // if (RTC.read(tm)) {   //sprawdzenie czy tyka zegarek - to z internetu :-)
   RTC.read(tm);
    lcd.setCursor (0, 0);
    LCDprint2digits(tm.Hour);
    lcd.print(':');
    LCDprint2digits(tm.Minute);
    lcd.print(':');
    LCDprint2digits(tm.Second);
    lcd.setCursor (0, 1);
    //lcd.print(tm.Day);
    LCDprint2digits(tm.Day);
    lcd.print('-');
    lcd.print(monthName[tm.Month-1]);
    lcd.print('-');
    lcd.print(tmYearToCalendar(tm.Year));

//   //sprawdzenie czy tyka zegarek cd. - to z internetu :-)
//  } else {
//    if (RTC.chipPresent()) {
//      lcd.println("DS1307 stoi. Uruchom Zegar");
//      } 
//       else {
//      lcd.println("DS1307 blad odczytu!");
//      lcd.println("sprawdz polaczenie");
//    }
//    delay(9000);
//  }
//delay(1000);
//**************************************************************************************************

//************************************************* Podlewanie ***************************************
if (tm.Hour == 21) {          //podlewanie zaczyna się o np.: 21
  jestZgoda = true;
 }// koniec if-a
 
if (jestZgoda == true) {
    
    if (inoRaz == 0) {              //zapamiętanie ilości minut przed wejściem do switch'a
    startPodl = tm.Minute;
    inoRaz = 1;                      //tylko raz przy wejściu do switch'a
    }
  
  switch (nrOb){                          //wybór obwodu do podlewania aktualnie 3 obwody - docelowo 5 i więcej
    case 1:                                   //tu akurat szklarnia
    digitalWrite(outOb1, LOW);                //załączenie przekaźnika obwodu
    digitalWrite(pmpObwodowa, LOW);           //załączenie pompy obwodowej
    konPodObw = startPodl + czasPodlewania;   //ustalenie czasu załaczenia tych powyzej
    LCDpokazOBW(nrOb);                        //zobrazowanie na lcd który obwod jest podlewany
    break;                                     //tak samo dla "case 2, 3, 4 itd"
    
    case 2:
    digitalWrite(outOb2, LOW);
    digitalWrite(pmpObwodowa, LOW);
    konPodObw = startPodl + czasPodlewania;
    LCDpokazOBW(nrOb);
    break;
  
    case 3:
    digitalWrite(outOb3, LOW);
    digitalWrite(pmpObwodowa, LOW); 
    konPodObw = startPodl + czasPodlewania;
    LCDpokazOBW(nrOb);
    break;
    
//    case 4:
//    digitalWrite(outOb4, LOW);
//    digitalWrite(pmpObwodowa, LOW);
//    konPodObw = startPodl + czasPodlewania;
//    LCDpokazOBW(nrOb);
//    break;
    
    default:
    wylaczAll();              //wyłącza obwody i pompe obwodową
  }//koniec SWITCH'a
}// koniec if jestZgoda

if (tm.Minute == konPodObw) { //jeżeli upłynął czas podlewania 
      nrOb++;                 //zmiana numeru obwodu
      inoRaz = 0;             //odblokowanie zapamiętywania czasu przed wejściem do switcha
      wylaczAll();            //wyłącza obwody i pompe obwodową
      konPodObw = 0;          //wyzerowanie konca czasu podlewania danego obwodu
      lcd.clear();
    }// koniec if

//**************************************************************************************************
 
//****************** PROCEDURY POMOCNICZE  *********************************************************    
   void LCDprint2digits(int number)         //dodaje "zero" na zegarku 
   {
      if (number >= 0 && number < 10) 
      {
        lcd.write('0');
      }
      lcd.print(number);  
   }

   void wylaczAll()                             //wyłącza obwody i pompe obwodową
   {
    digitalWrite(outOb1, HIGH);
    digitalWrite(outOb2, HIGH);
    digitalWrite(outOb3, HIGH);
    digitalWrite(outOb4, HIGH);
    digitalWrite(pmpObwodowa, HIGH);
   }
   
   void LCDpokazOBW(int nrOb)                   //Pokazuje który obwod jest aktualnie podlewany
   {                  
    lcd.setCursor (10, 0);
    lcd.print("OBW:");
    lcd.setCursor (14, 0);
    lcd.print(nrOb);
   }
//********************************************   koniec tych wypocin   ****************************************


Teraz to, co by się przydało:
1. możliwość ustawiania czasu podlewania obwodu - w szklarni wystarczy 10 minut a na pozostałych po 15 minut teraz czas jest stały
2. procedura podlewania trwa tylko w danej godzinie np.: od 21:00 do 22:00 a dla np: 5 obwodów (10 min + 4 razy po 15 minut to jest 70 minut) już nie podleje obwodu np: nr 5
3. procedura podlewania nie jest jeszcze uzależniona od tego czy nie jest za mało wody w zbiorniku - funkcja zablokowania podlewania gdy jest mało wody
4. możliwość uruchomienia dodatkowego obwodu z przycisku - np: do napełnienia baseniku dla dzieci - czy podlania kwiatków na rabatkach przed domem - obwód wodny już istnieje - tzw. "szybkie natarcie".
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości