//********************* 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 "esp_camera.h"
#include <unordered_map>
#include <HardwareSerial.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#define pump_pin (15)
#define detector_plantpin (14)
/********************** camera ************************/
const int size = 30;
int luminance_data[size];
int total_frame = 30;
int luminance_color = 0;
void camera ()
{
for ( int loop_frame = 0; loop_frame < total_frame; loop_frame++)
{
camera_fb_t *fb = esp_camera_fb_get(); // Capture a frame
if (fb)
{
int total_color = 0;
for (int i = 0; i < fb->len; i++)
{
total_color += fb->buf[i];
}
luminance_color = total_color / (fb->len);
luminance_data[loop_frame] = luminance_color;
}
else
{
Serial.println("Camera capture failed");
}
esp_camera_fb_return(fb);
delay(10);
}
if (luminance_color > 0 ){
// นับจำนวนครั้งที่แต่ละค่าปรากฎใน luminance_data
std::unordered_map<int, int> countMap;
for (int i = 0; i < size; ++i)
{
countMap[luminance_data[i]]++;
}
int maxCount = 0;
int maxRepeatedValue = 0;
for (const auto &entry : countMap)// หาค่าที่ปรากฎมากที่สุด
{
if (entry.second > maxCount)
{
maxCount = entry.second;
maxRepeatedValue = entry.first;
}
}
// ย้ายค่าที่ซ้ำกันมากที่สุดใน luminance_data ไปยังตัวแปร average_color
int average_color = maxRepeatedValue;
// แสดงค่าในตัวแปร average_color
/*Serial.print("average_color: ");
Serial.println( average_color );*/
if (average_color >= 120)
{
Serial.println("4");
}
else if ( average_color < 120 && average_color > 105)
{
Serial.println("3");
}
else
{
Serial.println("2");
}
Serial.println("Reply");
}
}
/*************** 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 > 0 && a < b )
{
pump_status = 1 ;
}
if (a >= b )
{
pump_status = 0 ;
}
}
////////////////////////TASK////////////////////////////
void task1(void *pvParameters) {
for(;;)
{
detector_plant();
Humidity_control();
Water_pump();
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void task2(void *pvParameters) {
for(;;)
{
checkingconnectToBlynk_WiFi()
blynk_realtime ();
vTaskDelay(200 / portTICK_PERIOD_MS);
}
}
void setup() {
Serial.begin(9600);
connectToWiFi();
pinMode(pump_pin, OUTPUT);
pinMode(detector_plantpin, INPUT);
/***************** camera_config ******************/
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = 5;
config.pin_d1 = 18;
config.pin_d2 = 19;
config.pin_d3 = 21;
config.pin_d4 = 36;
config.pin_d5 = 39;
config.pin_d6 = 34;
config.pin_d7 = 35;
config.pin_xclk = 0;
config.pin_pclk = 22;
config.pin_vsync = 25;
config.pin_href = 23;
config.pin_sscb_sda = 26;
config.pin_sscb_scl = 27;
config.pin_pwdn = 32;
config.pin_reset = -1;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 10;
config.fb_count = 1;
// เริ่มต้นกล้อง
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
/////////////////////////// Task setting //////////////////////////////
xTaskCreatePinnedToCore(task1,"Task 1",20000,NULL,1,NULL,0);
xTaskCreatePinnedToCore(task2,"Task 2",20000,NULL,1,NULL,0);
}
void loop() {
Blynk.run();
timer.run();
/*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 );*/
if (Serial.available())
{
char number = Serial.read();
Serial.println("อ่านคำถาม");
if (number == '9')
{
camera ();
}
}
}