/********************* Library ************************/
#include "esp_camera.h"
#include <unordered_map>
#include <HardwareSerial.h>
#include <TaskScheduler.h>
/******************* Set GPIO pin ********************/
#define Pump_pin 4
/******************* TaskScheduler ********************/
void task1();
void task2();
Task t1(1000, TASK_FOREVER, &task1); // Task 1 ทุก 1 วินาที
Task t2(1000, TASK_FOREVER, &task2); // Task 2 ทุก 1 วินาที
Scheduler runner;
/********************** camera ************************/
const int size = 10;
int luminance_data[size];
int total_frame = 10;
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);
}
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
if (average_color > 125)
{
Serial.println("1");
}
else
{
Serial.println("0");
}
Serial.println("Reply");
}
}
/********************** Task main ************************/
void task1() {
if (Serial.available())
{
char number = Serial.read();
Serial.println("อ่านคำถาม");
if (number == '9')
{
camera ();
}
}
}
void task2() {
if (Serial.available())
{
char number = Serial.read();
Serial.println("อ่านคำถาม");
if (number == '8')
{
digitalWrite(Pump_pin, HIGH);
Serial.println("Pump Running");
}
else if (number == '7')
{
digitalWrite(Pump_pin, LOW);
Serial.println("Pump Stop");
}
}
}
/************************ main **************************/
void setup() {
Serial.begin(9600);
/***************** 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;
}
runner.init();
runner.addTask(t1);
runner.addTask(t2);
t1.enable();
t2.enable();
pinMode(Pump_pin, OUTPUT);
}
void loop() {
runner.execute();
}