//********************* BY ATTHAPHON PAMAS *********************//
//***************************** Network ********************************//
#define BLYNK_TEMPLATE_ID "TMPLey3vhLza"
#define BLYNK_TEMPLATE_NAME "Quickstart Template"
#define BLYNK_AUTH_TOKEN "Oi50ny-X5Nytypk-MYs7Q0kFpSij1bK3"
#define BLYNK_PRINT Serial2
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
char ssid[] = "iPhone of sol";
char password[] = "33333333";
/*const char* ssid = "Wokwi-GUEST";
const char* password = "";*/
void connectToWiFi() {
Serial.println("เชื่อมต่อกับ Wi-Fi...");
Blynk.begin(BLYNK_AUTH_TOKEN,ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("กำลังเชื่อมต่อ...");
}
Serial.println("เชื่อมต่อกับ Wi-Fi สำเร็จ");
Serial.print("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void checkingconnectToBlynk_WiFi() {
if (!Blynk.connected() || WiFi.status() != WL_CONNECTED) {
Serial.println("Lost connection, reconnecting...");
connectToWiFi();
}
}
//**************************** Library *********************************//
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#define pump_pin (15)
#define detector_plantpin (14)
/*************** detector_plant ****************/
int pump_status = 0;
int Plant_status;
int detector_plant()
{
int consecutiveOnes = 0;
int loopCount = 0;
while (loopCount < 5)
{
int result = digitalRead(detector_plantpin);
/*Serial.print("result: ");
Serial.println(result );*/
if (result == LOW)
{
consecutiveOnes++;
if (consecutiveOnes == 5)
{
Plant_status = 1;
consecutiveOnes = 0;
}
}
else
{
Plant_status = 0;
pump_status = 0;
consecutiveOnes = 0;
}
delay(100);
loopCount++;
}
return 0;
}
/***************** Water pump ******************/
void Water_pump()
{
if(pump_status == 1 && Plant_status == 1 )
{
digitalWrite(pump_pin, HIGH);
}
else
{
digitalWrite(pump_pin,LOW);
}
}
/************ BLYNK Function **************/
BlynkTimer timer;
int Humidity_Blynk_real;
int Humidity_Blynk_request;
BLYNK_WRITE(V9) {
Humidity_Blynk_real = param.asInt();
/*Serial.print("Humidity_Blynk_real ");
Serial.println(Humidity_Blynk_real);*/
}
BLYNK_WRITE(V5) {
Humidity_Blynk_request = param.asInt();
/*Serial.print("Humidity_Blynk_request ");
Serial.println(Humidity_Blynk_request);*/
}
void sendSensorData() {
Blynk.virtualWrite(V0,Plant_status);
}
void blynk_realtime (){
Blynk.syncVirtual(V9);
Blynk.syncVirtual(V5);
sendSensorData();
}
/****************Humidity_control******************/
void Humidity_control() {
int a = Humidity_Blynk_real;
int b = Humidity_Blynk_request;
if (a < b )
{
pump_status = 1 ;
}
if (a >= b )
{
pump_status = 0 ;
}
}
////////////////////////TASK////////////////////////////
void task1(void *pvParameters) {
for(;;)
{
detector_plant();
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void task2(void *pvParameters) {
for(;;)
{
blynk_realtime ();
vTaskDelay(200 / portTICK_PERIOD_MS);
}
}
void task3(void *pvParameters) {
for(;;)
{
Humidity_control();
Water_pump();
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
void setup() {
Serial.begin(115200);
connectToWiFi();
WiFi.onEvent(WiFiEvent);
pinMode(pump_pin, OUTPUT);
pinMode(detector_plantpin, INPUT);
/////////////////////////// Task setting //////////////////////////////
xTaskCreatePinnedToCore(task1,"Task 1",10000,NULL,1,NULL,0);
xTaskCreatePinnedToCore(task2,"Task 2",10000,NULL,1,NULL,0);
xTaskCreatePinnedToCore(task3,"Task 3",10000,NULL,1,NULL,0);
}
void loop() {
Blynk.run();
timer.run();
Blynk.virtualWrite(V9,20);
Serial.print("Humidity_Blynk_real :");
Serial.println(Humidity_Blynk_real );
Serial.print("Humidity_Blynk_request :");
Serial.println(Humidity_Blynk_request );
Serial.print("Plant_status :");
Serial.println(Plant_status );
Serial.print("pump_status :");
Serial.println(pump_status );
int a = digitalRead(pump_pin);
Serial.print("pump_pin :");
Serial.println(a );
delay(3000);
}