26-07-2016, 21:41
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.
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".
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".