#define BLYNK_PRINT Serial
#include <SPI.h>
#include <Ethernet.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <WidgetRTC.h>
#include <TimeLib.h>
#include <DHT.h>
#define DHTPIN 5 // D1
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#define wifiLed LED_BUILTIN
int wifiFlag = 0;
int dlt = 300; //set delay time
int sensor = 0;
int sensorValue = 0;
int sensorState = 0;
int lastState = 0;
int sensorPin = 16; // D0
int led1 = 4; // D2
int led2 = 0; // D3
int relay = 2; // D4
int button1 = 14; // D5
int button2 = 12; // D6
bool auto_on = false;
WidgetRTC rtc;
WidgetLED ledBlynk_1(V12); // status auto mode
WidgetLED ledBlynk_2(V13); // status manual mode
WidgetLED ledBlynk_3(V14); // status working
WidgetLED ledBlynk_4(V15); // status timer
//set Auto soil Moisture sensor slider in app on pin V10
int SetAutoprogram;
BLYNK_WRITE(V10) {
SetAutoprogram = param.asInt();
}
char auth[] = "xxx";
char ssid[] = "xxx";
char pass[] = "xxx";
SimpleTimer timer;
// Digital clock display of the time
void clockDisplay() {
// You can call hour(), minute(), ... at any time
// Please see Time library examples for details
String currentTime = String(hour()) + ":" + minute() + ":" + second();
String currentDate = String(day()) + " " + month() + " " + year();
Serial.print("Current time: ");
Serial.print(currentTime);
Serial.print(" ");
Serial.print(currentDate);
Serial.println();
// Send time to the App
Blynk.virtualWrite(V6, currentTime);
// Send date to the App
Blynk.virtualWrite(V11, currentDate);
}
BLYNK_CONNECTED() {
Blynk.syncAll();
rtc.begin(); // Synchronize time on connection
}
///mode///
void auto_on_mode() {
digitalWrite(relay, 1);
digitalWrite(led1, 1);
digitalWrite(led2, 0);
ledBlynk_1.on();
ledBlynk_2.off();
ledBlynk_3.on();
delay(dlt);
}
void auto_off_mode() {
digitalWrite(relay, 0);
digitalWrite(led1, 1);
digitalWrite(led2, 0);
ledBlynk_1.on();
ledBlynk_2.off();
ledBlynk_3.off();
delay(dlt);
}
void manual_on_mode() {
digitalWrite(relay, 1);
digitalWrite(led1, 0);
digitalWrite(led2, 1);
ledBlynk_1.off();
ledBlynk_2.on();
ledBlynk_3.on();
delay(dlt);
}
void manual_off_mode() {
digitalWrite(relay, 0);
digitalWrite(led1, 0);
digitalWrite(led2, 1);
ledBlynk_1.off();
ledBlynk_2.on();
ledBlynk_3.off();
ledBlynk_4.off();
delay(dlt);
}
//blynk button auto mode
BLYNK_WRITE(V3) {
if (param.asInt() == 1) {
auto_on = true;
autoprogram();
Blynk.virtualWrite(V4, 0);
}
else {
auto_on = false;
manual_off_mode();
}
}
//blynk button manual mode
BLYNK_WRITE(V4) {
if (param.asInt() == 1) {
auto_on = false;
manual_on_mode();
Blynk.virtualWrite(V3, 0);
}
else {
auto_on = false;
manual_off_mode();
}
}
bool buttonStatus = 0;
bool buttonTemp = 0;
//auto mode buttonwithout1
void checkStatusButton1() {
buttonStatus = digitalRead(button1);
if (buttonStatus != buttonTemp) {
if (buttonStatus == 1) {
auto_on = true;
autoprogram();
Blynk.virtualWrite(V3, 1);
Blynk.virtualWrite(V4, 0);
Serial.print("buttonStatus1_on");
}
else {
auto_on = false;
manual_off_mode();
Blynk.virtualWrite(V3, 0);
Serial.print("buttonStatus1_off");
}
buttonTemp = buttonStatus;
}
}
//manual mode buttonwithout2
void checkStatusButton2() {
buttonStatus = digitalRead(button2);
if (buttonStatus != buttonTemp) {
if (buttonStatus == 1) {
auto_on = false;
manual_on_mode();
Blynk.virtualWrite(V3, 0);
Blynk.virtualWrite(V4, 1);
Serial.print("buttonStatus2_on");
}
else {
auto_on = false;
manual_off_mode();
Blynk.virtualWrite(V4, 0);
Serial.print("buttonStatus2_off");
}
buttonTemp = buttonStatus;
}
}
//timer 1
BLYNK_WRITE(V7) {
if (param.asInt() == 1) {
digitalWrite(relay, 1);
ledBlynk_3.on();
ledBlynk_4.on();
delay(dlt);
}
else {
manual_off_mode();
}
}
//timer 2
BLYNK_WRITE(V8) {
if (param.asInt() == 1) {
digitalWrite(relay, 1);
ledBlynk_3.on();
ledBlynk_4.on();
delay(dlt);
}
else {
manual_off_mode();
}
}
//timer 3
BLYNK_WRITE(V9) {
if (param.asInt() == 1) {
digitalWrite(relay, 1);
ledBlynk_3.on();
ledBlynk_4.on();
delay(dlt);
}
else {
manual_off_mode();
}
}
void sendTemp() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
return;
}
Blynk.virtualWrite(V1, t);
Blynk.virtualWrite(V2, h);
}
void sendSoilValue() {
sensorValue = analogRead(A0);
sensorValue = map(sensorValue, 0, 1023, 100, 0);
Blynk.virtualWrite(V5, sensorValue);
}
// called every 3 seconds by SimpleTimer
void checkBlynkStatus() {
bool isconnected = Blynk.connected();
if (isconnected == false) {
wifiFlag = 1;
digitalWrite(wifiLed, 1); //Turn off WiFi LED
Serial.println("Turn off WiFi LED");
}
if (isconnected == true) {
wifiFlag = 0;
digitalWrite(wifiLed, 0); //Turn on WiFi LED
Serial.println("Turn on WiFi LED");
}
}
void autoprogram() {
//auto pump with soil moisture sensor
if (auto_on == true) {
if (sensorValue <= SetAutoprogram) {
auto_on_mode();
}
else if (sensorValue > SetAutoprogram) {
auto_off_mode();
}
}
}
void setup() {
pinMode(sensorPin, INPUT);
pinMode(DHTPIN, INPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(relay, OUTPUT);
digitalWrite(button1, 0); // button auto
digitalWrite(button2, 0); // button manual
digitalWrite(led1, 0); // mode auto
digitalWrite(led2, 1); // mode manual
digitalWrite(relay, 0); // on/off water
//intro();
Serial.begin(9600);
Blynk.begin(auth, ssid, pass, "oasiskit.com", 8080);
//Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);
setSyncInterval(10 * 60); // Sync interval in seconds (10 minutes)
dht.begin();
delay(800);
timer.setInterval(1000L, sendTemp);
timer.setInterval(1000L, sendSoilValue);
timer.setInterval(1000L, clockDisplay);
timer.setInterval(1000L, autoprogram);
timer.setInterval(1000L, checkStatusButton1);
timer.setInterval(1000L, checkStatusButton2);
}
void loop() {
Blynk.run();
timer.run();
//send LINE.notification
sensorState = digitalRead(sensorPin);
//Serial.println(sensorState);
if (sensorState == 1 && lastState == 0) {
LINE.notify("Water your plants");
lastState = 1;
delay(1000);
}//do nothing, has not been watered yet
else if (sensorState == 1 && lastState == 1) {
delay(1000);
}//st
else {
lastState = 0;
delay(1000);
}
}