#include "WateringMachine.h" //include the declaration for this class
#define ST_Czuwanie 0
#define ST_Pomiar 1
#define ST_KoniecPomiaru 2
#define ST_Podlewanie 3
#define ST_CzekanieNaKolejnyPomiar 4
#define ST_Pomin 10
int _pinPWMDC;
int _pinDC1;
int _pinDC2;
int _pinHumPower;
byte _pinHumRead;
int _stanPodlewania = 1;
unsigned long _czasOstatniegoPomiaru;
int _numerOstatniegoPomiaru = -1;
int _pomiaryCzastkowe[10];
bool _pierwszyPomiar = true;
int OkGleba = 400;
int _okGleba = 400;
unsigned long MinutyDoPodlania = 200UL;
unsigned long _lastTime;
String _info;
WateringMachine::WateringMachine() {}
WateringMachine::WateringMachine(int pinPWMDC, int pinDC1, int pinDC2, int pinHumPower, byte pinHumRead)
{
_pinPWMDC = pinPWMDC;
pinMode(_pinPWMDC, OUTPUT); //Sygnał PWM silnika nr 1
digitalWrite(_pinPWMDC, HIGH); //Ustawiamy (na stałe) stan wysoki na pinie 6
_pinDC1 = pinDC1;
_pinDC2 = pinDC2;
pinMode(pinDC1, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
pinMode(pinDC2, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 2
_pinHumPower = pinHumPower;
_pinHumRead = pinHumRead;
pinMode(_pinHumPower, OUTPUT);//Sygnał włączający czujnik wilgotności gleby
pinMode(_pinHumRead, INPUT);//Czytanie pomiaru gleby
}
//<<destructor>>
WateringMachine::~WateringMachine() {/*nothing to destruct*/ }
String WateringMachine::Handle()
{
_info = "";
if (millis() < _czasOstatniegoPomiaru)
{
UstawStan(ST_Pomin);
}
switch (_stanPodlewania)
{
case ST_Pomiar:
PomiarGleby();
break;
case ST_KoniecPomiaru:
SprawdzPomiarGleby();
break;
case ST_Podlewanie:
Podlej();
break;
case ST_CzekanieNaKolejnyPomiar:
CzekajNaPomiar();
break;
case ST_Czuwanie:
Czuwaj();
break;
case ST_Pomin:
UstawStan(ST_Pomiar);
break;
}
return _info;
}
int WateringMachine::UstawStan(int stan)
{
_czasOstatniegoPomiaru = millis();
_stanPodlewania = stan;
_info += OpisDlaStanu(stan) + "\n";
}
String WateringMachine::OpisDlaStanu(int stan)
{
switch (stan)
{
case ST_Czuwanie:
return "Czuwam";
case ST_Pomiar:
return "Pomiar";
case ST_KoniecPomiaru:
return "Koniec pomiaru";
case ST_Podlewanie:
return "Podlewam";
case ST_CzekanieNaKolejnyPomiar:
return "Czekam na kolejny pomiar";
case ST_Pomin:
return "Pomijam przepełnienie millis";
}
}
void WateringMachine::PomiarGleby()
{
digitalWrite(_pinHumPower, HIGH);
if (CzyUplynalCzas(1000UL))
{
ZrobPomiarCzastkowy();
if (_numerOstatniegoPomiaru == 9)
{
UstawStan(ST_KoniecPomiaru);
digitalWrite(_pinHumPower, LOW);
}
}
}
bool WateringMachine::CzyUplynalCzas(unsigned long okresCzasu)
{
unsigned long aktualnyCzas = millis();
unsigned long granicznyCzas = _czasOstatniegoPomiaru + okresCzasu;
if (aktualnyCzas > granicznyCzas)
{
_czasOstatniegoPomiaru = aktualnyCzas;
return true;
}
else
{
**unsigned long granica = _lastTime + (unsigned long)1000;**
** if (aktualnyCzas > granica);**
** {**
** _lastTime = aktualnyCzas;**
** _info += String(aktualnyCzas) + ">" + String(granica) + "\n";**
** }**
return false;
}
}
void WateringMachine::ZrobPomiarCzastkowy()
{
_pomiaryCzastkowe[++_numerOstatniegoPomiaru] = 1023 - analogRead(_pinHumRead);
}
void WateringMachine::SprawdzPomiarGleby()
{
_numerOstatniegoPomiaru = -1;
int stanAkceptowalny = _okGleba + 0;
_info += "OkGleba " + String(_okGleba) + "\n";
int aktualnaGleba = AktualnyPomiar();
//if(!_pierwszyPomiar)
//{
//stanAkceptowalny+=50;
//}
if (aktualnaGleba < stanAkceptowalny)
{
UstawStan(ST_Podlewanie);
}
else
{
_info += String(aktualnaGleba) + " > " + String(stanAkceptowalny) + "\n";
UstawStan(ST_Czuwanie);
_pierwszyPomiar = true;
}
}
void WateringMachine::Podlej()
{
if (CzyUplynalCzas(10000UL))
{
digitalWrite(_pinDC1, LOW);
digitalWrite(_pinDC2, LOW);
UstawStan(ST_CzekanieNaKolejnyPomiar);
}
else
{
digitalWrite(_pinDC1, HIGH);
digitalWrite(_pinDC2, LOW);
}
}
void WateringMachine::CzekajNaPomiar()
{
if (CzyUplynalCzas(20000UL))
{
UstawStan(ST_Pomiar);
}
}
void WateringMachine::Czuwaj()
{
//Trzeba zmianić na minuty a nie sekundy
unsigned long okres = MinutyDoPodlania * 1000UL;
if (CzyUplynalCzas(okres))
{
_info += "poczekalem ";
_info += okres + "\n";
_info += "----------------------\n";
UstawStan(ST_Pomiar);
}
}
int WateringMachine::AktualnyPomiar()
{
int pomiar = 0;
for (int i = 0; i < 10; i++)
{
pomiar += _pomiaryCzastkowe[i];
}
pomiar = pomiar / 10;
_info += "Pomiar gleby = ";
_info += String(pomiar) + "\n";
return pomiar;
}
#include <WateringMachine.h>
WateringMachine _wateringMachine;
void setup() {
// put your setup code here, to run once:
_wateringMachine = WateringMachine(6, 7, 8, 2, A0);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
String info = _wateringMachine.Handle();
if (info != "")
{
Serial.println(info);
}
}