/* Định nghĩa các thông số điều khiển tự động */
#define DRY_SOIL 66
#define WET_SOIL 85
#define COLD_TEMP 12
#define HOT_TEMP 22
#define TIME_PUMP_ON 15
#define TIME_LAMP_ON 15
/* Hẹn giờ */
#define READ_BUTTONS_TM 1L // definitions in seconds
#define READ_SOIL_TEMP_TM 2L
#define READ_SOIL_HUM_TM 10L
#define READ_AIR_DATA_TM 2L
#define SEND_UP_DATA_TM 10L
#define AUTO_CTRL_TM 60L
/* Định nghĩa cảm biế nhiệt độ dô ẩm DHT22*/
#define DHTPIN D3
#define DHTTYPE DHT22
float airHum = 0;
float airTemp = 0;
/* Định nghĩa và gán chân cảm biến độ ẩm đất Soil Moister */
#define soilMoisterPin A0 // chân data output của cảm biến
#define soilMoisterVcc D8 // điều khiển vcc cấp nguồn cho cảm biến
int soilMoister = 0;
/* Định nghĩa và gán chân cảm biến nhiệt độ đất DS18B20 Temperature Sensor */
#define ONE_WIRE_BUS 14 // DS18B20 trên chân NodeMCU D5 tương ứng với GPIO 014 trên Arduino
float soilTemp;
/* Định nghĩa và gán chân Relays */
#define PUMP_PIN D6 //bơm (Red LED)
#define LAMP_PIN D7 //LAMP (Green LED)
boolean pumpStatus = 0;
boolean lampStatus = 0;
/* ESP & Blynk */
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
WidgetLED PUMPs(V0); // tín hiệu đến Tab cảm biến tại Ứng dụng Blynk
WidgetLED PUMPa(V5); // tín hiệu đến Tab Bộ truyền động tại Ứng dụng Blynk
WidgetLED LAMPs(V1); // tín hiệu đến Tab cảm biến tại Ứng dụng Blynk
WidgetLED LAMPa(V6); // tín hiệu đến Tab Bộ truyền động tại Ứng dụng Blynk
char auth[] = “I2lkEwBazFAJOhTS9dMxvEiFqb6FjJI0”; // Blynk project: “IoT Auto Plant Care”
char ssid[] = “120/43/10 THD”;
char pass[] = “hoil@mgi”;
/* TIMER */
#include <SimpleTimer.h>
SimpleTimer timer;
/Khai báo thư viện DHT22/
#include “DHT.h”
DHT dht(DHTPIN, DHTTYPE);
/* Khai báo thư viện DS18B20 Temperature Sensor */
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
void setup()
{
Serial.begin(115200);
delay(10);
pinMode(PUMP_PIN, OUTPUT);
pinMode(LAMP_PIN, OUTPUT);
pinMode(soilMoisterVcc, OUTPUT);
Blynk.begin(auth, ssid, pass, [URL of un-approved server deleted by moderator], 8080);
dht.
DS18B20.begin();begin();
PUMPs.off();
LAMPs.off();
PUMPa.off();
LAMPa.off();
digitalWrite(PUMP_PIN, HIGH); // Được sử dụng với mô-đun Relay (thường là CAO)
digitalWrite(LAMP_PIN, HIGH); // Được sử dụng với mô-đun Relay (thường là CAO)
digitalWrite (soilMoisterVcc, LOW);
startTimers();
}
void loop()
{
timer.run(); //Khởi tạo SimpleTimer
Blynk.run();
}
/****************************************************************
- Đọc lệnh từ xa
****************************************************************/
BLYNK_WRITE(3) // điều khiển máy bơm
{
int i=param.asInt();
if (i==1)
{
pumpStatus = !pumpStatus;
aplyCmd();
}
}
BLYNK_WRITE(4) // diều khiền đèn
{
int i=param.asInt();
if (i==1)
{
lampStatus = !lampStatus;
aplyCmd();
}
}
- Receive Commands and act on RELAYs - Logic LOW
****************************************************/
void aplyCmd()
{
if (pumpStatus == 1)
{
Blynk.notify(“IoT Auto Plant Care: Warning ==>> Pump ON”);
digitalWrite(PUMP_PIN, LOW); // To be used with Relay module (inverted logic: activate with LOW)
if (!turnOffOLED) displayData();
PUMPs.on();
PUMPa.on();
}
else
{
digitalWrite(PUMP_PIN, HIGH); // To be used with Relay module (inverted logic: normally HIGH)
if (!turnOffOLED) displayData();
PUMPs.off();
PUMPa.off();
}
if (lampStatus == 1)
{
Blynk.notify(“IoT Auto Plant Care: Warning ==>> Lamp ON”);
digitalWrite(LAMP_PIN, LOW); // To be used with Relay module (inverted logic: activate with LOW)
if (!turnOffOLED) displayData();
LAMPs.on();
LAMPa.on();
}
else
{
digitalWrite(LAMP_PIN, HIGH); // To be used with Relay module (inverted logic: normally HIGH)
if (!turnOffOLED) displayData();
LAMPs.off();
LAMPa.off();
}
}
/***************************************************
-
Tự động điều khiển đồn điền dựa trên cảm biến đọc
****************************************************/
void autoControlPlantation(void)
{
if (soilMoister < DRY_SOIL)
{
turnPumpOn();
}if (airTemp < COLD_TEMP)
{
turnLampOn();
}
}
/***************************************************
*Bật Bơm trong một khoảng thời gian nhất định
***************************************************/
void turnPumpOn()
{
pumpStatus = 1;
aplyCmd();
delay (TIME_PUMP_ON1000);
pumpStatus = 0;
aplyCmd();
}
/***************************************************
- Bật đèn trong một khoảng thời gian nhất định
***************************************************/
void turnLampOn()
{
lampStatus = 1;
aplyCmd();
delay (TIME_LAMP_ON1000);
lampStatus = 0;
aplyCmd();
}
/***************************************************
- Gửi data đến Blynk
**************************************************/
void sendUptime()
{
Blynk.virtualWrite(10, airTemp); //virtual pin V10
Blynk.virtualWrite(11, airHum); // virtual pin V11
Blynk.virtualWrite(12, soilMoister); // virtual pin V12
Blynk.virtualWrite(13, soilTemp); //virtual pin V13
}
/***************************************************
- Bộ hẹn giờ khởi động
*********************************************/
void startTimers(void)
{
timer.setInterval(READ_BUTTONS_TM1000, readLocalCmd);
timer.setInterval(READ_SOIL_TEMP_TM1000, getSoilTempData);
timer.setInterval(READ_AIR_DATA_TM1000, getDhtData);
timer.setInterval(READ_SOIL_HUM_TM1000, getSoilMoisterData);
timer.setInterval(SEND_UP_DATA_TM1000, sendUptime);
timer.setInterval(AUTO_CTRL_TM1000, autoControlPlantation);
//timer.setInterval(DISPLAY_DATA_TM1000, displayData);
}
/***************************************************
- Get DHT data
**************************************************/
void getDhtData(void)
{
float tempIni = airTemp;
float humIni = airHum;
airTemp = dht.readTemperature();
airHum = dht.readHumidity();
if (isnan(airHum) || isnan(airTemp)) // Check if any reads failed and exit early (to try again).
{
Serial.println(“Failed to read from DHT sensor!”);
airTemp = tempIni;
airHum = humIni;
return;
}
}
/***************************************************
- Get Soil Moister Sensor data
**************************************************/
void getSoilMoisterData(void)
{
soilMoister = 0;
digitalWrite (soilMoisterVcc, HIGH);
delay (500);
int N = 3;
for(int i = 0; i < N; i++) // read sensor “N” times and get the average
{
soilMoister += analogRead(soilMoisterPin);
delay(150);
}
digitalWrite (soilMoisterVcc, LOW);
soilMoister = soilMoister/N;
soilMoister = map(soilMoister, 600, 0, 0, 100); //LM393 on 5V (+Vin)
}
/***************************************************
- Get SoilTemp sensor data
**************************************************/
void getSoilTempData()
{
DS18B20.requestTemperatures();
soilTemp = DS18B20.getTempCByIndex(0);
int newData = ((soilTemp + 0.05) * 10); //fix soilTemp value to 1 decimal place.
soilTemp = (newData / 10.0);
}