Nodemcu-เลี้ยงไก่-ปลูกผักกินเอง(ตอน3)

ไอการที่จะเซฟข้อมูลยาวๆ ผมใช้วิธีทำให้มันเป็น String ก่อน แล้วกำหนดให้มีการเลือกตำแหน่งที่ผมจะ เซฟ ไว้ก่อนเลือกไว้เลย ถ้า 13 ก็เลือก 20 - 23 เป็นต้น จากนนั้นนำ ค่าไปวนเก็บใน 13 ตำแหน่งนี้ ก็จบ เวลาจะอ่านก็เลือกตำแหน่งที่จะอ่าน วนอ่านให้ครบ แล้วนำมาร่วมกันเป็น String เหมือนเดิม จะยาว 100 ตัวก็ไม่ได้มีปัญหาอะไรทำได้

ตัวอย่างจริงที่ผมใช้เขียน

void Save_State_TmaxTminSEtime(String TmaxTminSEtime, int dataAdr_TTS, int dataAdr_TTE){

              Serial.println(String("###### Mode Save_State_TmaxTminSEtime ######"));
              dataStart = dataAdr_TTS;
              dataEnd = dataAdr_TTE;
               n = 0;          
    Serial.println(String("writing eeprom ssid:")+ dataStart + String(" - ") + dataEnd);
          for (int i = dataStart; i <= dataEnd; ++i)
            {
              EEPROM.write(i, TmaxTminSEtime[n]);
              EEPROM.commit();
              Serial.print(String("EEPROM Addess[")+ i +String("] "));
              Serial.println(TmaxTminSEtime[n]); 
              n++;
            }
              Serial.println(String("###### Mode Save_State_TmaxTminSEtime End.. ######"));
            
}

วิธีใช้

Save_State_TmaxTminSEtime(String(Coun_Reset),1090,1093);

วิธีอ่าน

//String TmaxTminSEtime = "";
  for (int j = 1024; j <= 1026; ++j)
  {
    Max_t[0] += char(EEPROM.read(j));
  }
  Serial.print(String("Max_t[0] => "));
  Serial.println(Max_t[0]);

อีกตัวที่สามารถทำได้และอาจจะง่ายกว่าคืออันนี้

https://www.modulemore.com/article/53/วิธีบันทึกค่า-config-ลง-esp32-โดยใช้-littlefs-ไฟดับข้อมูลก็ไม่หาย

4กย65
ขอบคุณครับ
เป็นโค้ดที่กะทัดรัดมากครับ ชอบมากครับ
ผมพยายามแกะโค้ดที่ adminแนะนำ เพิ่อปรับมาใช้ กับโค้ดยาวๆๆของผม ปรากฎว่าตัวอย่างที่ให้มามีตัวแปรหลายตัวที่ผมยังไม่เข้าใจ
เลยขออนุญาตใช้แบบยาวๆไปก่อนนะครับ
ตอนนี้ที่ผมลองทำโค้ดแบบยาว ( เกิน 80บรรทัดแนะ)

long long  epoch = 1662194441807;
int num1,num2,num3,num4,num5,num6,num7,num8,num9,num10,num11,num12,num13;
int back_num1,back_num2,back_num3,back_num4,back_num5,back_num6,back_num7,back_num8;
void setup () {
  Serial.begin (9600);
}

void loop () { 
    Serial.begin(9600);

num13 = epoch  % 10;
Serial.print("num13=");
Serial.println(num13);
num12 = (epoch / 10)  % 10;
Serial.print("num12=");
Serial.println(num12);
num11 = (epoch / 100)  % 10;
Serial.print("num11=");
Serial.println(num11);
num10 = (epoch / 1000)  % 10;
Serial.print("num10=");
Serial.println(num10);
num9 = (epoch / 10000)  % 10;
Serial.print("num9=");
Serial.println(num9);
num8 = (epoch / 100000)  % 10;
Serial.print("num8=");
Serial.println(num8);
num7 = (epoch / 1000000)  % 10;
Serial.print("num7=");
Serial.println(num7);
num6 = (epoch / 10000000) % 10;
Serial.print("num6=");
Serial.println(num6);
num5 = (epoch / 100000000) % 10;
Serial.print("num5=");
Serial.println(num5);
num4 = (epoch / 1000000000) % 10;
Serial.print("num4=");
Serial.println(num4);
num3 = (epoch / 10000000000) % 10;
Serial.print("num3=");
Serial.println(num3);
num2 = (epoch / 100000000000) % 10;
Serial.print("num2=");
Serial.println(num2);
num1 = (epoch / 1000000000000 ) % 10;
Serial.print("num1=");
Serial.println(num1);
delay(1000);
//int back_num1,back_num2,back_num3,back_num4,back_num5,back_num6,back_num7,back_num8;
Serial.print("back_num13=");
Serial.println(num13);
Serial.print("back_num12=");
Serial.println(num12*10);
Serial.print("back_num11=");
Serial.println(num11*100);
Serial.print("back_num10=");
Serial.println(num10*1000);
Serial.print("back_num9=");
Serial.println(num9*10000);
Serial.print("back_num8=");
Serial.println(num8*100000);
Serial.print("back_num7=");
Serial.println(num7*1000000);
Serial.print("back_num6=");
Serial.println(num6*10000000);
Serial.print("back_num5=");
Serial.println(num5*100000000);
Serial.print("back_num4=");
Serial.println(num4*1000000000);
Serial.print("back_num3=");
Serial.println(num3*10000000000);
Serial.print("back_num2=");
Serial.println(num2*100000000000);
Serial.print("back_num1=");
Serial.println(num1*1000000000000);
Serial.println("==================================");
Serial.println("Total=");
Serial.println((num1*1000000000000)+(num2*100000000000)+(num3*10000000000)+(num4*1000000000)+(num5*100000000)+(num6*10000000)+(num7*1000000)+(num8*100000)+(num9*10000)+(num10*1000)+(num11*100)+(num12*10)+(num13));
delay(1000);

}

ผลลัพธ์

6:23:15.869 -> num13=7
06:23:15.869 -> num12=0
06:23:15.869 -> num11=8
06:23:15.869 -> num10=1
06:23:15.904 -> num9=4
06:23:15.904 -> num8=4
06:23:15.904 -> num7=4
06:23:15.904 -> num6=9
06:23:15.949 -> num5=1
06:23:15.949 -> num4=2
06:23:15.949 -> num3=6
06:23:15.949 -> num2=6
06:23:15.949 -> num1=1
06:23:16.846 -> back_num13=7
06:23:16.846 -> back_num12=0
06:23:16.846 -> back_num11=800
06:23:16.895 -> back_num10=1000
06:23:16.895 -> back_num9=40000
06:23:16.941 -> back_num8=400000
06:23:16.941 -> back_num7=4000000
06:23:16.941 -> back_num6=90000000
06:23:16.978 -> back_num5=100000000
06:23:16.978 -> back_num4=2000000000
06:23:17.021 -> back_num3=60000000000
06:23:17.064 -> back_num2=600000000000
06:23:17.109 -> back_num1=1000000000000
06:23:17.109 -> ==================================
06:23:17.109 -> Total=
06:23:17.150 -> 1662194441807

หลังจากทำโค้ดแจกแจง แยก และรวมกลับ ได้ตัวเลขเหมือนเดิม ถูกต้อง
ขั้นตอนต่อไป เป็นโค้ด แจกแจง แล้วเขียน ลงใน eeprom ใน setup และให้อ่านค่าจาก eeprom แล้วมารวมกลับอีกที



long long  epoch = 1662194441807;
#include <EEPROM.h>
int num1,num2,num3,num4,num5,num6,num7,num8,num9,num10,num11,num12,num13;
int back_num1,back_num2,back_num3,back_num4,back_num5,back_num6,back_num7,back_num8,back_num9,back_num10,back_num11,back_num12,back_num13;
void setup () {
  Serial.begin (9600);

num13 = epoch  % 10;
Serial.print("num13=");
Serial.println(num13);
  EEPROM.begin(512);
  EEPROM.write(113, num13);
  EEPROM.commit();
num12 = (epoch / 10)  % 10;
Serial.print("num12=");
Serial.println(num12);
  EEPROM.begin(512);
  EEPROM.write(112, num12);
  EEPROM.commit();
num11 = (epoch / 100)  % 10;
Serial.print("num11=");
Serial.println(num11);
  EEPROM.begin(512);
  EEPROM.write(111, num11);
  EEPROM.commit();
num10 = (epoch / 1000)  % 10;
Serial.print("num10=");
Serial.println(num10);
  EEPROM.begin(512);
  EEPROM.write(110, num10);
  EEPROM.commit();
num9 = (epoch / 10000)  % 10;
Serial.print("num9=");
Serial.println(num9);
  EEPROM.begin(512);
  EEPROM.write(109, num9);
  EEPROM.commit();
num8 = (epoch / 100000)  % 10;
Serial.print("num8=");
Serial.println(num8);
  EEPROM.begin(512);
  EEPROM.write(108, num8);
  EEPROM.commit();
num7 = (epoch / 1000000)  % 10;
Serial.print("num7=");
Serial.println(num7);
  EEPROM.begin(512);
  EEPROM.write(107, num7);
  EEPROM.commit();
num6 = (epoch / 10000000) % 10;
Serial.print("num6=");
Serial.println(num6);
  EEPROM.begin(512);
  EEPROM.write(106, num6);
  EEPROM.commit();
num5 = (epoch / 100000000) % 10;
Serial.print("num5=");
Serial.println(num5);
  EEPROM.begin(512);
  EEPROM.write(105, num5);
  EEPROM.commit();
num4 = (epoch / 1000000000) % 10;
Serial.print("num4=");
Serial.println(num4);
  EEPROM.begin(512);
  EEPROM.write(104, num4);
  EEPROM.commit();
num3 = (epoch / 10000000000) % 10;
Serial.print("num3=");
Serial.println(num3);
  EEPROM.begin(512);
  EEPROM.write(103, num3);
  EEPROM.commit();
num2 = (epoch / 100000000000) % 10;
Serial.print("num2=");
Serial.println(num2);
  EEPROM.begin(512);
  EEPROM.write(102, num2);
  EEPROM.commit();
num1 = (epoch / 1000000000000 ) % 10;
Serial.print("num1=");
Serial.println(num1);
  EEPROM.begin(512);
  EEPROM.write(101, num1);
  EEPROM.commit();
delay(1000);
}

void loop () { 
//int back_num1,back_num2,back_num3,back_num4,back_num5,back_num6,back_num7,back_num8;
back_num13 = EEPROM.read(113);
Serial.print("back_num13=");
Serial.println(back_num13);
back_num12 = EEPROM.read(112);
Serial.print("back_num12=");
Serial.println(back_num12*10);
Serial.print("back_num11=");
back_num11 = EEPROM.read(111);
Serial.println(back_num11*100);
Serial.print("back_num10=");
back_num10 = EEPROM.read(110);
Serial.println(back_num10*1000);
Serial.print("back_num9=");
back_num9 = EEPROM.read(109);
Serial.println(back_num9*10000);
Serial.print("back_num8=");
back_num8 = EEPROM.read(108);
Serial.println(back_num8*100000);
Serial.print("back_num7=");
back_num7 = EEPROM.read(107);
Serial.println(back_num7*1000000);
Serial.print("back_num6=");
back_num6 = EEPROM.read(106);
Serial.println(back_num6*10000000);
Serial.print("back_num5=");
back_num5 = EEPROM.read(105);
Serial.println(back_num5*100000000);
Serial.print("back_num4=");
back_num4 = EEPROM.read(104);
Serial.println(back_num4*1000000000);
Serial.print("back_num3=");
back_num3 = EEPROM.read(103);
Serial.println(back_num3*10000000000);
Serial.print("back_num2=");
back_num2 = EEPROM.read(102);
Serial.println(back_num2*100000000000);
Serial.print("back_num1=");
back_num1 = EEPROM.read(101);
Serial.println(back_num1*1000000000000);
Serial.println("==================================");
Serial.println("Total=");
Serial.println((back_num1*1000000000000)+(back_num2*100000000000)+(back_num3*10000000000)+(back_num4*1000000000)+(back_num5*100000000)+(back_num6*10000000)+(back_num7*1000000)+(back_num8*100000)+(back_num9*10000)+(back_num10*1000)+(back_num11*100)+(back_num12*10)+(back_num13));
delay(1000);
}

ผลที่ได้

11:06:48.302 -> back_num13=7
11:06:48.302 -> back_num12=0
11:06:48.302 -> back_num11=800
11:06:48.345 -> back_num10=1000
11:06:48.345 -> back_num9=40000
11:06:48.345 -> back_num8=400000
11:06:48.392 -> back_num7=4000000
11:06:48.392 -> back_num6=90000000
11:06:48.439 -> back_num5=100000000
11:06:48.439 -> back_num4=2000000000
11:06:48.439 -> back_num3=60000000000
11:06:48.483 -> back_num2=600000000000
11:06:48.516 -> back_num1=1000000000000
11:06:48.516 -> ==================================
11:06:48.559 -> Total=
11:06:48.596 -> 1662194441807

สรุปแล้ว เขียน และอ่าน จาก eeprom ได้แล้ว
ขั้นตอนต่อไปเขียนโค้ด ให้สื่อสารกับ blynkครับ
ตอนแรกเคยชินกับ param.asint()​
พอรันทีไร ได้ค่าไม่ตรง


… epoch time ต้องใช้ param.asLongLong!!
เดี๋ยว​จะลองทำดู
5-6กย65

  1. ที่ผ่านมาเคยชินกับmillis()ในarduino เลยทำให้ผมสับสนเรื่อง epoch timeด้วย
    ที่ถูกต้องคือ หน่วยของ epoch time เป็น second ไม่ใช่ millisecond ของ millis()
    เลยเข้าป่ามาตลอด 555 มิน่าผลออกมาไม่ตรงสักที
    มีผลต่อการกำหนดตัวแปรคือ epoch ใช้ unsigned long แต่ epoch ที่ผมทำเป็นหน่วย ms ต้องใช้ unsigned long long
  2. ยิ่งเข้าไปในเว๊บนี้


มีคำว่า unix time, epoch time ยิ่งหลงทางไปอีกครับ
เว็บที่ถูกต้องสำหรับ epoch time คือ https://www.epoch101.com/

วิธีสังเกตง่ายๆคือ ตัวเลข 10หลักครับ ถ้านับได้13หลักแสดงว่าไม่ใช่

  1. ใช้ function time_t ในการแปลงตัวแปรเป็น epoch time
    4.ใช้ Blink.virtualSync(V1) มีประโยชน์มากในการปรับตัวเลข และอัปเดตเฉพาะส่วนไป
    5.ในแต่ละ virtual pin ถ้าใช้ global variable เดียวกัน มันไม่ยอมอัปเดต คือเป็น 0 เลยต้องสร้างตัวแปรใหม่ต่างหาก เป็น global เหมือนกัน
    ถึงจะใช้ได้ งง
    6.การเขียน eeprom โดยผ่าน blynk เป็นเรื่องที่ต้องใช้เวลามากกกก สำหรับผม ถ้าใครเก่งเรื่อง array,byte,C++ จะสบายมากเลยครับ
    ไม่งั้นผมต้องแจกแจงเป็นตัวๆ และเขียนeepromระบุaddressทีละอัน จุดนี้คือความแตกต่างของมืออาชีพกับมือสมัครเล่น 555
    7.ตอนนี้ใช้ได้แล้ว ครับ…

โค้ดล่าสุดครับ สำหรับ node2(esp8266)
โค้ดยาวมาก 1500 บรรทัด
ส่วนที่ 1 (บรรทัด1-700)

//V0(ความชื้นฟักไข่-stepH),V1เวลาเปิดไฟไก่เล็ก-stepH),V2(ค่าความแห้งของดิน),V3(ความแห้งของดิน-booline),
//V4(หมุนรางไข่MoveLed_V4),V5(เปิดพัดลมระบายอากาศ-ฟักไข่VenLed_V5),V6(พัดลมลดความเย็น ฟักไข่ CoolingLed_hatching_V6),V7(เพิ่มความร้อน ฟักไข่ HeatingLed_V7),
//V8(ฟักไข่Humid_hatching_Led_V8),V9(step H ตั้งอุณหภูมิเครื่องฟักไข่),V10(lamp_chick_led),V11(periodMinmorning_watering_V11),
//V12(currentDate),V13(formattedTime),V14(สวิทช์หลอดไฟไก่เล็ก่),
//V15(stepH รดน้ำตอนเย็น),V16(not_within_min_V16),V17(start_am),V18(end_am),V19(start_pm),
//V20(end_pm),V21(solenoid_vegetable_led_blynk_v21),V22(solenoid_vegetable_button_blynk_v22),
//V23(min soil moisture),V24(max soil moisture),V25(stepHกำหนดความแห้งของดิน)
//V26(Day_hatch_hatching_V26),V27(move_ON_hatching-stepH),V28(temperature_hatching-gauge)
//V29(humidity_hatching-gauge),V30(ปุ่มเลือก พลิกไข่แบบ ออโต้/แมนวล),V31(ปุ่มพลิกไข่แบบแมนวล),
//V32(log เปิดรดน้ำฝัก),V33(log ปิดรดน้ำฝัก),V34(move_OFF_hatching-stepH),V35(terminal -เวลาที่เหลือหลอดไฟลูกไก่)
//V36(terminal -เวลาที่เหลือหลอดปั๋มน้ำให้เล้าเย็น),V37(logหยุดพลิกไข่),V38(logทำการพลิกไข่),V39(ปุ่มเลือก โซลินอยด์ผักแบบ ออโต้/แมนวล)
//V40(terminal -เวลาที่เหลือจะปิด/เปิดรดน้ำ),v41(พัดลม-ven_fan_for_breathing_ON-stepH),v42(พัดลม-ven_fan_for_breathing_OFF_V42-stepH)
//V43(เลือกแบบแมนวลหรือออโต้ พัดลม),V44(สวิทช์เปิดปิดพัดลมแบบแมนวล),V45(log เหลือเวลาที่จะเปิดพัดลม),V46(log เวลาหยุดพัดลม),V47(log เวลาเปิดพัดลม)
//V48(day1_hatching_V48วันแรกที่ฟักไข่-value display),V49(date time ผลจากV54value display )
//V50(เช็ควันที่ในeeprom),V51(epoch timeในeeprom),V52(date,timeจากV51),V53(เพิ่มลดเวลา1ชั่วโมงของV49),V54(กำหนดวันแรกที่ฟักไข่ แบบ epoch time stepH step ละ86400000ms หรือ 24ขั่วโมง)
//V55(epoch time ของเวลาปัจจุบัน),(V56)//ปุ่มอนุญาติเขียนลงในeeprom1,(V57)////ปุ่มอนุญาติเขียนลงในeeprom2,V58(log การเขียนใน eeprom-terminal) 

//ทั่วไป
#include <DHT.h>
float maxtemp = -9999; // init with absurdly low value
float mintemp = 9999; // init with absurdly high value
#include <Wire.h>
//0.ดึงเวลาจากเน็ตมาใช้
#include <NTPClient.h>
#include <time.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
//1 ขึ้น Blynk
#include <BlynkSimpleEsp8266.h>
#define BLYNK_PRINT Serial;
 String formattedTime;
 String currentDate;
 int monthDay;
 int currentMonth;
WiFiUDP ntpUDP;
const long offsetTime = 25200;       // หน่วยเป็นวินาที จะได้ 7*60*60 = 25200
NTPClient timeClient(ntpUDP, "pool.ntp.org");
int timezone = 7 * 3600; //ตั้งค่า TimeZone ตามเวลาประเทศไทย
int dst = 0; //กำหนดค่า Date Swing Time
int currentHour = 0;
int currentMinute=0 ;
// กำหนดค่า offset time เนื่องจากเวลาของเซิฟเวอร์นี้เป็นเวลา UTC เราต้องทำให้เป็นเวลาของประเทศไทย
// เวลาของประเทศไทย = UTC+7 ชั่วโมง ต้องกำหนด offset time = 7 ชั่วโมง

//Week Days
String weekDays[7]={"อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์"};

//Month names
String months[12]={"มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"};


char auth[]="xxxxx";//หัวข้ออีเมล์ blynk token ไก่-ผัก

const char *ssid     = "xxxxx";
const char *password = "xxxxx";
int a=0;
 String string_close;
 String string_open;
//const long offsetTime = 25200;       // หน่วยเป็นวินาที จะได้ 7*60*60 = 25200
//long currentMillisMove=millis(); 
BlynkTimer timer;

//-ทั่วไป



///ฟักไข่ ทั่วไป
//2022/08/28 05:01=hatching_day1 = 1661637660000
//1วัน = 86400000
unsigned long hatching_day1 = 1661637660000;
const unsigned long may_23_2022 = 1653311980856;//23 พค. 65
#include <EEPROM.h>
//ฟักไข่
#define dht_hatching_D6 D6     // Digital pin connected to the DHT sensor
#define DHTTYPE11 DHT11   // DHT 11
DHT dht_hatching(dht_hatching_D6, DHTTYPE11);;
float temperature_hatching;
 float humidity_hatching;
//D1(dht)
int TempSet_hatching_V9 = 37;
int HumidSet_hatching_V0 = 70;
int Day_hatch_hatching_V26 ;
String ttt;
int Length_String; 
unsigned long epoch1,epoch2,epoch3,epoch4,epoch5;//epoch1เก็บตัวแปรจากV54เพื่อใช้ในV53,epoch2ที่เก็บในeepromใช้ในV51,V52,epoch3ใช้ในV56,epoch4เป็นเวลาปัจจุบัน ใช้ใน V55,epoch5เป็นเวลาสำหรับการเขียนลงในeeprom V48,
int back_num1,back_num2,back_num3,back_num4,back_num5,back_num6,back_num7,back_num8,back_num9,back_num10;
int num1,num2,num3,num4,num5,num6,num7,num8,num9,num10;
bool write_eeprom_permission_V56_state=0;

//-ฟักไข่  ทั่วไป

//พลิกไข่
int move_motor_hatching_D1 = D1;//มอเตอร์พลิกไข่
int move_ON_hatching_seconds_V27=2 ;      //milliseconds  2นาที= 60*2*1000 = 120000
int move_OFF_hatching_min_V34=58 ;  //milliseconds  58นาที= 60*58*1000 = 3480000
unsigned long move_hatching_ms;        //time from millis()
unsigned long startMillisMove=0; 
unsigned long move_hatching_msLast;    //last time the LED changed state
boolean  move_motor_hatching_D1_state=0;
boolean hatching_move_auto_manual_v30_State;;
WidgetLED  MoveLed_hatching_V4(V4);
//-พลิกไข่

//พัดลมระบายอากาศ  ให้ควบพร้อมกับ การพลิกไข่  ทุก 1ชั่วโมง
int ven_fan_hatching_D3 = D3;//พัดลมระบายอากาศ
int ven_fan_for_breathing_second_ON_V41 = 10;       //milliseconds
int ven_fan_for_breathing_min_OFF_V42= 30;//ven_fan_hatching_OFF
unsigned long startMillisven_fan_for_breathing=0; 
unsigned long ven_fan_for_breathing_msLast;    //last time the LED changed state
boolean ven_fan_for_breathing_State;        //current LED state
boolean  ven_fan_hatching_D3_state=1;
boolean ven_fan_hatching_auto_manual_v43_State;
WidgetLED VenLed_hatching_V5(V5);
WidgetLED CoolingLed_hatching_V6(V6);

//lamp hatching
int heater_lamp_hatching_D2 = D2;//หัลอดไฟฮีตเตอร์
WidgetLED HeatingLed_hatching_V7(V7);//เดิม v8
//WidgetLED HeatingLed(V8);
//-lamp hatching

//พ่นหมอก
int humidifier_hatching_D5 = D5;// พ่นหมอก
WidgetLED Humid_hatching_Led_V8(V8);
//WidgetLED HumidLed(V10);
//-พ่นหมอก

///lamp_chicken
int lamp_chick = D4;// 24มิย65
bool lamp_chicken_blynkV14=0;//1คือ เปิด  0คือปิด
WidgetLED lamp_chick_button_V14(V14);
WidgetLED lamp_chick_led_v10(V10);
int open_chicken_lamp_period=2;//2hrs
unsigned long  start_chicken_lamp=millis();
///-lamp_chicken

//ผัก
float min_soil_moisture = 9999; // init with absurdly high value
float max_soil_moisture =-9999; // init with absurdly low value
unsigned long start_millis_soil_check;
int vegetable_soil_dryness = 0;
float vegetable_soil_dryness_blynk_V25=910;
int soil_dryness_analog_A0 = A0; 
bool soil_dryness_state = 0;//ดินเปียกlow active module  0คือแห้ง  1คือเปียก
unsigned long startMillismorning_watering=0;                    
unsigned long lastMillismorning_watering; 
int periodMinmorning_watering_V11=3;//min
unsigned long startMillisevening_watering=0;                    
unsigned long lastMillisevening_watering; 
int periodMinevening_watering_V15=3; //min
int not_within_min_V16=3; //min
int start_am=6; //oclock
int end_am=7; //oclock
int start_pm=16; //oclock
int end_pm=18; //oclock
int solenoid_vegetable_D7=D7;
WidgetLED solenoid_vegetable_led_blynk_v21(V21);
WidgetLED solenoid_vegetable_button_blynk_v22(V22);
bool solenoid_vegetable_auto_manual_V39_state=1;
bool solenoid_vegetable_D7_state=1;//active low,1=stop
//-ผัก

BLYNK_WRITE(V0)
{
  int pinValue = param.asInt(); // assigning incoming value from pin V6 to a variable
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("ความชื้นของการฟักไข่: ");
  Serial.println(pinValue);
  HumidSet_hatching_V0 = pinValue;
}



BLYNK_WRITE(V1)
{
  delay(500);
  open_chicken_lamp_period = param.asInt(); // assigning incoming value from pin V1 to a variable
  delay(500);
  Serial.print("open_chicken_lamp_period: ");
  Serial.print(open_chicken_lamp_period);
  Serial.println("นาที");
//  periodMinevening_watering_V15 = open_hen_lamp_period;
}



 BLYNK_WRITE(V9)//ตั้งอุณหภูมิเครื่องฟักไข่
{
  int pinValue = param.asInt(); // assigning incoming value from pin V6 to a variable
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("อุณหภูมิฟักไข่: ");
  Serial.println(pinValue);
  TempSet_hatching_V9 = pinValue;
}


BLYNK_WRITE(V11)
{
  delay(500);
  int pinValue = param.asInt(); // assigning incoming value from pin V1 to a variable
  delay(500);
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("รดน้ำตอนเช้า: ");
  Serial.print(pinValue);
  Serial.println("นาที");
  periodMinmorning_watering_V11 = pinValue;
}


BLYNK_WRITE(V14) //หลอดไฟไก่เล็ก
{
  delay(500);
if (param.asInt()==1)
   
  {
    if (lamp_chicken_blynkV14=0)
    {
        start_chicken_lamp=millis() ;
      
    }  
    if ((millis()-start_chicken_lamp) <(open_chicken_lamp_period*60*1000))  //900000=15min//60000=1min
         {
         digitalWrite(lamp_chick, 0);//เปิด active low}
         lamp_chick_led_v10.on();
          if ((millis()-start_chicken_lamp) <(open_chicken_lamp_period*60*1000))  //900000=15min//60000=1min 
          {
            Blynk.virtualWrite(V35,"*****เหลือเวลาอีก=");
            Blynk.virtualWrite(V35,String((start_chicken_lamp +(open_chicken_lamp_period*60*1000)-millis())/(1000) )+"วินาที---------------");
          }
         lamp_chicken_blynkV14=1;//bool
         }
    else
       {  
         digitalWrite(lamp_chick, 1);
         Blynk.virtualWrite(V10,0);
//         lamp_chick_led_v10.off();
        Blynk.virtualWrite(V14,0);//ใส่//เพื่อให้สามารถรับงานครั้งต่อไปได้อีก
         Blynk.setProperty(V14,"offLabel","OFF");
         lamp_chicken_blynkV14=0;//bool
        start_chicken_lamp=millis() ;
        }
  }
  else
    {
     digitalWrite(lamp_chick, 1);
      Blynk.virtualWrite(V10,0);
    lamp_chick_led_v10.off();
     Blynk.virtualWrite(V14,0);//ใส่//เพื่อให้สามารถรับงานครั้งต่อไปได้อีก
     lamp_chicken_blynkV14=0;//bool
     start_chicken_lamp=millis() ;
      
    }
}


BLYNK_WRITE(V15)
{
  delay(500);
  int pin2Value = param.asInt(); // assigning incoming value from pin V1 to a variable
  delay(500);
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("กำหนดให้รดน้ำตอนเย็นนาน: ");
  Serial.print(pin2Value);
  Serial.println("นาที");
  periodMinevening_watering_V15 = pin2Value;
}
BLYNK_WRITE(V16)
{
  delay(500);
  int pin3Value = param.asInt(); // assigning incoming value from pin V1 to a variable
  delay(500);
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("ห่างกัน: ");
  Serial.print(pin3Value);
  Serial.println("นาที");
  not_within_min_V16 = pin3Value;
}

BLYNK_WRITE(V17)
{
  delay(500);
  int pin4Value = param.asInt(); // assigning incoming value from pin V1 to a variable
  delay(500);
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("เริ่มเวลาตอนเช้า: ");
  Serial.print(pin4Value);
  Serial.println("น.");
  start_am = pin4Value;
}
BLYNK_WRITE(V18)
{
  delay(500);
  int pin5Value = param.asInt(); // assigning incoming value from pin V1 to a variable
  delay(500);
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("เสร็จตอนเช้า: ");
  Serial.print(pin5Value);
  Serial.println("น.");
  end_am = pin5Value;
}

BLYNK_WRITE(V19)
{
  delay(500);
  int pin6Value = param.asInt(); // assigning incoming value from pin V1 to a variable
  delay(500);
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("เริ่มเวลารดน้ำตอนเย็น: ");
  Serial.print(pin6Value);
  Serial.println("น.");
  start_pm = pin6Value;
}

BLYNK_WRITE(V20)
{
  delay(500);
  int pin7Value = param.asInt(); // assigning incoming value from pin V1 to a variable
  delay(500);
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("เสร็จเวลารดน้ำตอนเย็น: ");
  Serial.print(pin7Value);
  Serial.println("น.");
  end_pm = pin7Value;
}


BLYNK_WRITE(V22)  //เปิดโซลินอยด์ผักแบบแมนวล
{
if (param.asInt()==1)//1=ทำงาน
 {//if (param.asInt()==1)//1=ทำงาน

   if (solenoid_vegetable_auto_manual_V39_state==0 )//0=manual
     {//if (solenoid_vegetable_auto_manual_V39_state==0 )//0=manual
      digitalWrite(solenoid_vegetable_D7, 0);//active low 24 มิย. 65
      solenoid_vegetable_led_blynk_v21.on();
      Blynk.virtualWrite(V32,"=เวลา"+String(currentHour)+":"+String(currentMinute)+","+String(monthDay) + "/" + String(currentMonth));//V32(log เปิดรดน้ำฝัก)
     }//if (solenoid_vegetable_auto_manual_V39_state==0 )//0=manual
 
   else//if (solenoid_vegetable_auto_manual_V39_state==0 )//0=manual
    {//else if (solenoid_vegetable_auto_manual_V39_state==0 )//0=manual
             Serial.println("ไม่สามารถเปิดโซลินอยด์ได้เพราะ ใช้ในmanual เท่านั้น ");

    }//else if (solenoid_vegetable_auto_manual_V39_state==0 )//0=manual
   
  }//if (param.asInt()==1)//1=ทำงาน
else//if (param.asInt()==1)//1=ทำงาน
  {//elseif (param.asInt()==1)//1=ทำงาน
   if (solenoid_vegetable_auto_manual_V39_state==0 )//0=manual
     {//if (solenoid_vegetable_auto_manual_V39_state==0 )//0=manual
      digitalWrite(solenoid_vegetable_D7, 1);//active low 24 มิย. 65
      solenoid_vegetable_led_blynk_v21.off();
      Blynk.virtualWrite(V33,"=เวลา"+String(currentHour)+":"+String(currentMinute)+","+String(monthDay) + "/" + String(currentMonth));//V32(log ปิดรดน้ำฝัก)
     }//if (solenoid_vegetable_auto_manual_V39_state==0 )//0=manual
 
   else//if (solenoid_vegetable_auto_manual_V39_state==0 )//0=manual
    {//else if (solenoid_vegetable_auto_manual_V39_state==0 )//0=manual
             Serial.println("ไม่สามารถเปิดโซลินอยด์ได้เพราะ ใช้ในmanual เท่านั้น ");

    }//else if (solenoid_vegetable_auto_manual_V39_state==0 )//0=manual
  
  }//elseif (param.asInt()==1)//1=ทำงาน
}



BLYNK_WRITE(V25)
{
  delay(500);
  vegetable_soil_dryness_blynk_V25 = param.asInt(); // assigning incoming value from pin V1 to a variable
  delay(500);
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("กำหนดความแห้งของดินที่ต้องรดน้ำ: ");
  Serial.println(vegetable_soil_dryness_blynk_V25);
//  periodMinevening_watering_V15 = pin2Value;
}


BLYNK_WRITE(V27)//กำหนดระยะเวลาที่พลืกไข่
{
  int pinValue = param.asInt(); // assigning incoming value from pin V6 to a variable
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("ระยะเวลาที่พลืกไข่(วินาที): ");
  Serial.println(pinValue);
  move_ON_hatching_seconds_V27 = pinValue;
}


BLYNK_WRITE(V30) //พลิกไข่ ออโต้หรือแมนวล
{
if (param.asInt()==1)
 {
   hatching_move_auto_manual_v30_State=1;//1=ออโต้
 }
else
{
   hatching_move_auto_manual_v30_State=0;

}
}

BLYNK_WRITE(V31) //พลิกไข่แบบแมนวล
{//BLYNK_WRITE(V31) //พลิกไข่แบบแมนวล
 if (hatching_move_auto_manual_v30_State==0 )//0=manual
  {// if (hatching_move_auto_manual_v30_State==0 )//0=manual
   if (param.asInt()==1)//1=ทำงาน
     {//if (param.asInt()==1)//1=ทำงาน
       digitalWrite(move_motor_hatching_D1, 0); 
   delay(500);
       MoveLed_hatching_V4.on();
       Blynk.virtualWrite(V38,"||"+string_open);
   delay(500);
 

     }//if (param.asInt()==1)//1=ทำงาน
  else//if (param.asInt()==1)//1=ทำงาน
    {//else if (param.asInt()==1)//1=ทำงาน
       digitalWrite(move_motor_hatching_D1, 1); 
   delay(500);
       MoveLed_hatching_V4.off();
       Blynk.virtualWrite(V37,"||"+string_close);
   delay(500);
    }//else if (param.asInt()==1)//1=ทำงาน
  } //if (hatching_move_auto_manual_v30_State==0 )//0=manual
  else //if (hatching_move_auto_manual_v30_State==0 )//0=manual
   { //else if (hatching_move_auto_manual_v30_State==0 )//0=manual
      Serial.println("ไม่สามารถหยุดพลิกไข่ได้เพราะ ใช้ในmanual เท่านั้น ");
       Blynk.virtualWrite(V38,"||ไม่สามารถพลิกไข่ได้เพราะ ใช้ในmanual เท่านั้น");
   delay(500);
       Blynk.virtualWrite(V37,"||ไม่สามารถหยุดพลิกไข่ได้เพราะ ใช้ในmanual เท่านั้น");
   delay(500);
   }
}//BLYNK_WRITE(V31) //พลิกไข่แบบแมนวล

BLYNK_WRITE(V34)//กำหนดระยะเวลาหยุดพลืกไข่:
{
  int pinValue = param.asInt(); // assigning incoming value from pin V6 to a variable
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("ระยะเวลาหยุดพลืกไข่( นาที): ");
  Serial.println(pinValue);
  move_OFF_hatching_min_V34 = pinValue;
}


BLYNK_WRITE(V39) //พลิกแบบออโต้หรือแมนวล
{
if (param.asInt()==1)//1=auto
 {
   hatching_move_auto_manual_v30_State=1;//1=ออโต้
 }
else
{
   hatching_move_auto_manual_v30_State=0;//0=manual

}
}

BLYNK_WRITE(V41)//กำหนดระยะเวลา เปิดพัดลมฟักไข่
{
  int pinValue = param.asInt(); // assigning incoming value from pin V6 to a variable
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("ระยะเวลาเปิดพัดลมฟักไข่(วินาที): ");
  Serial.println(pinValue);
  ven_fan_for_breathing_second_ON_V41 = pinValue;
  
}

BLYNK_WRITE(V42)//กำหนดระยะเวลา ปิดพัดลมฟักไข่
{
  int pinValue = param.asInt(); // assigning incoming value from pin V6 to a variable
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("ระยะเวลาปิดพัดลมฟักไข่(นาที): ");
  Serial.println(pinValue);
  ven_fan_for_breathing_min_OFF_V42 = pinValue;
  
}

BLYNK_WRITE(V43) //พัดลม ออโต้หรือแมนวล
{
if (param.asInt()==1)
 {
   ven_fan_hatching_auto_manual_v43_State=1;//1=ออโต้
 }
else
{
   ven_fan_hatching_auto_manual_v43_State=0;

}
}


BLYNK_WRITE(V44) //เปิดพัดลมแบบแมนวล
{//BLYNK_WRITE(V44) //เปิดพัดลมแบบแมนวล
   if (ven_fan_hatching_auto_manual_v43_State==0 )//0=manual
     {
       if (param.asInt()==1)//1=ทำงาน
        {//if (param.asInt()==1)//1=ทำงาน
       digitalWrite(ven_fan_hatching_D3, 0); 
       Blynk.virtualWrite(V47,"||"+string_open);
   delay(500);
       CoolingLed_hatching_V6.on();
       VenLed_hatching_V5.on();
 //            Serial.println("ไม่สามารถเปิดพัดลมได้เพราะ ใช้ในmanual เท่านั้น ");
         }//if (param.asInt()==1)//1=ทำงาน
       else//if (param.asInt()==1)//1=ทำงาน
         {//else if (param.asInt()==1)//1=ทำงาน
       digitalWrite(ven_fan_hatching_D3, 1); 
       Blynk.virtualWrite(V46,"||"+string_close);
   delay(500);
       CoolingLed_hatching_V6.off();
       VenLed_hatching_V5.off();
//             Serial.println("ไม่สามารถเปิดพัดลมได้เพราะ ใช้ในmanual เท่านั้น ");
       }//else if (param.asInt()==1)//1=ทำงาน
      }
 }//BLYNK_WRITE(V44) //เปิดพัดลมแบบแมนวล

void read_hatching_day1_eeprom()
{
   EEPROM.begin(512);
   Serial.print("back_num10=");
   back_num10 = EEPROM.read(110);
   delay(500);
   Serial.println(back_num10*1);
   Serial.print("back_num9=");
   back_num9 = EEPROM.read(109);
   delay(500);
   Serial.println(back_num9*10);
   Serial.print("back_num8=");
   back_num8 = EEPROM.read(108);
   delay(500);
   Serial.println(back_num8*100);
   Serial.print("back_num7=");
   back_num7 = EEPROM.read(107);
   delay(500);
   Serial.println(back_num7*1000);
   Serial.print("back_num6=");
   back_num6 = EEPROM.read(106);
   delay(500);
   Serial.println(back_num6*10000);
   Serial.print("back_num5=");
   back_num5 = EEPROM.read(105);
   delay(500);
   Serial.println(back_num5*100000);
   Serial.print("back_num4=");
   back_num4 = EEPROM.read(104);
   delay(500);
   Serial.println(back_num4*1000000);
   Serial.print("back_num3=");
   back_num3 = EEPROM.read(103);
   delay(500);
   Serial.println(back_num3*10000000);
   Serial.print("back_num2=");
   back_num2 = EEPROM.read(102);
   delay(500);
   Serial.println(back_num2*100000000);
   Serial.print("back_num1=");
   back_num1 = EEPROM.read(101);
   delay(500);
   Serial.println(back_num1*1000000000);
   Serial.println("==================================");
   Serial.println("Total=");
   epoch2=(back_num1*1000000000)+(back_num2*100000000)+(back_num3*10000000)+(back_num4*1000000)+(back_num5*100000)+(back_num6*10000)+(back_num7*1000)+(back_num8*100)+(back_num9*10)+(back_num10*1);
   Serial.println(epoch2);
   delay(1000);
   //  epoch3 = (epoch2) ;
   Blynk.virtualWrite(V51,epoch2);
   delay(500);
   time_t t = epoch2;//(pinValue) + 25200;
   Serial.println(ctime(&t));
   ttt = ctime(&t);//String ttt
   //Serial.print("Length_String = ");
   //Length_String = ttt.length();
   //Serial.println(Length_String);  // แสดงผลออกทาง Serial Monitor
   Blynk.virtualWrite(V52,ttt);
   delay(500);
  
}

BLYNK_WRITE(V50)  //เช็ควันที่ในeeprom push button
{
 if (param.asInt()==1)//1=เช็ค 0=หยุดเช็ค
  {//if (param.asInt()==1)//1=เช็ค 0=หยุดเช็ค
   read_hatching_day1_eeprom();
   delay(2000);
  }//if (param.asInt()==1)//1=เช็ค 0=หยุดเช็ค
}
BLYNK_WRITE(V53)//กำหนดวันแรกที่ฟักไข่ แบบ epoch time stepH step ละ0.5ขั่วโมง หรือ 1800ms
{
  int pinValue = param.asInt(); // assigning incoming value from pin V6 to a variable
  Serial.print(" ");
  Serial.println(pinValue);
  
      time_t epoch5 = epoch1+(pinValue*3600) ;
    epoch3=epoch5; 
 // epoch5=epoch;
   // epoch = epoch5;//String ttt
   ttt = ctime(&epoch5);//String ttt
    Serial.println(ttt);
//  Serial.print("Length_String = ");
 // Length_String = ttt.length();
 // Serial.println(Length_String);  // แสดงผลออกทาง Serial Monitor
  Blynk.virtualWrite(V49,epoch5);
   delay(500);
  Blynk.virtualWrite(V59,epoch5);
   delay(500);
  Blynk.virtualWrite(V48,ttt);
   delay(500);
  Blynk.syncVirtual(V49,V56,V59);
  delay(500);
}


BLYNK_WRITE(V54)//กำหนดวันแรกที่ฟักไข่ แบบ epoch time stepH step ละ86400s หรือ 24ขั่วโมง
{
  int  pinValue = param.asInt(); // assigning incoming value from pin V6 to a variable
  Serial.print("กำหนดวันแรกที่ฟักไข่ แบบ epoch time: ");
  Serial.println(pinValue);
      time_t epoch5 = epoch4+(pinValue*86400);
   delay(500);
 //   epoch5=epoch;
//  Serial.println(ctime(&epoch5));
//    ttt = ctime(&epoch5);//String ttt
//   t = epoch5;//String ttt
  epoch1=epoch5;
  epoch3=epoch5; 
   ttt = ctime(&epoch5);//String ttt
 Serial.println(ttt);
 // Serial.print("Length_String = ");
//  Length_String = ttt.length();
//  Serial.println(Length_String);  // แสดงผลออกทาง Serial Monitor
  Blynk.virtualWrite(V49,epoch5);
   delay(500);
  Blynk.virtualWrite(V59,epoch5);
  delay(300);
  Blynk.virtualWrite(V48,ttt);
  delay(300);
  Blynk.syncVirtual(V49,V56,V59);
  delay(500);
  
  
}



BLYNK_WRITE(V56)//ปุ่มอนุญาติเขียนลงในeeprom1
{//BLYNK_WRITE(V56)//ปุ่มอนุญาติเขียนลงในeeprom1
  int button1=param.asInt();
  if (button1 == 1)//1=ไม่ล๊อค,0=ล๊อก
  {//if button1 == 1;
    //ให้ปุ่ม2(v57) ทำงานได้
    //แจ้งในV58 ว่าปลดล๊อกแล้ว
    Blynk.virtualWrite(V58,"||"+String(currentDate)+","+String(formattedTime));
   delay(500);
    Blynk.virtualWrite(V58,"=>ได้ปลดล๊อกแล้ว");
   delay(500);
    //เปลี่ยนstate write_eeprom_permission_V56_state=1;
    //แจ้งในV58 ค่าepoch5 ที่ต้องการเขียน
    Blynk.virtualWrite(V58,"||epoch3="+String(epoch3));
   delay(500);
    Blynk.virtualWrite(V58,"||รอการเขียน");
   delay(500);
 //     time_t epoch5 = epoch5 ;
    Blynk.virtualWrite(V59,epoch3);
    delay (500);
    write_eeprom_permission_V56_state=1;
    Blynk.setProperty(V57,"offLabel","ไม่เขียน");
   delay(500);
//    Blynk.setProperty(V57,"label","ไม่เขียน");
    Blynk.virtualWrite(V57,LOW);
   delay(500);
    Blynk.setProperty(V57, "isDisabled", false);
   delay(500);
    Blynk.syncVirtual(V56,V57,V58,V59);

มีต่อ(บรรทัดที่ 701-1500)อีกครับ ในกระทู้ถัดไป

1 Likes

ส่วนที่ 2 (บรรทัดที่ 701-1400)

    delay(300);
}//if button1 == 1;
  else//if button1 == 1;
  {//else if button1 == 1;
    //ให้ปุ่ม2(v57) ทำงานไม่ได้
    //เปลี่ยนstate button1_V56_state=0;
    Blynk.virtualWrite(V58,"||"+currentDate+","+formattedTime);
   delay(500);
    Blynk.virtualWrite(V58,"=>ได้ล๊อกแล้ว");
   delay(500);
    //เปลี่ยนstate write_eeprom_permission_V56_state=0;
    write_eeprom_permission_V56_state=0;
    Blynk.setProperty(V57,"offLabel","ไม่เขียน");
   delay(500);
    Blynk.virtualWrite(V57,LOW);
   delay(500);
    Blynk.setProperty(V57, "isDisabled", true);
   delay(500);
    Blynk.syncVirtual(V56,V57,V58);
    delay(300);
  }//else if button1 == 1;
}//BLYNK_WRITE(V56)//ปุ่มอนุญาติเขียนลงในeeprom1
 
BLYNK_WRITE(V57)////ปุ่มอนุญาติเขียนลงในeeprom2
{//BLYNK_WRITE(V57)////ปุ่มอนุญาติเขียนลงในeeprom2,0=ไม่เขียน,1=เขียน
  int button2=param.asInt();  
  if (write_eeprom_permission_V56_state=1)
    {//if write_eeprom_permission_V56_state=1
      if( button2 == 1)//,0=ไม่เขียน,1=เขียน
      {//if button2 == 1;//,0=ไม่เขียน,1=เขียน
       //เขียนได้
       //      unsigned long  epoch = 1662194441;
       Blynk.setProperty(V57, "isDisabled", false);
   delay(500);
       num10 = (epoch3 / 1)  % 10;
       Serial.print("num10=");
       Serial.println(num10);
       EEPROM.begin(512);
       EEPROM.write(110, num10);
       EEPROM.commit();
   delay(500);
       num9 = (epoch3 / 10)  % 10;
       Serial.print("num9=");
       Serial.println(num9);
       EEPROM.begin(512);
       EEPROM.write(109, num9);
       EEPROM.commit();
   delay(500);
       num8 = (epoch3 / 100)  % 10;
       Serial.print("num8=");
       Serial.println(num8);
       EEPROM.begin(512);
       EEPROM.write(108, num8);
       EEPROM.commit();
   delay(500);
       num7 = (epoch3 / 1000)  % 10;
       Serial.print("num7=");
       Serial.println(num7);
       EEPROM.begin(512);
       EEPROM.write(107, num7);
       EEPROM.commit();
   delay(500);
       num6 = (epoch3 / 10000) % 10;
       Serial.print("num6=");
       Serial.println(num6);
       EEPROM.begin(512);
       EEPROM.write(106, num6);
       EEPROM.commit();
   delay(500);
       num5 = (epoch3 / 100000) % 10;
       Serial.print("num5=");
       Serial.println(num5);
       EEPROM.begin(512);
       EEPROM.write(105, num5);
       EEPROM.commit();
   delay(500);
       num4 = (epoch3 / 1000000) % 10;
       Serial.print("num4=");
       Serial.println(num4);
       EEPROM.begin(512);
       EEPROM.write(104, num4);
       EEPROM.commit();
   delay(500);
       num3 = (epoch3 / 10000000) % 10;
       Serial.print("num3=");
       Serial.println(num3);
       EEPROM.begin(512);
       EEPROM.write(103, num3);
       EEPROM.commit();
   delay(500);
       num2 = (epoch3 / 100000000) % 10;
       Serial.print("num2=");
       Serial.println(num2);
       EEPROM.begin(512);
       EEPROM.write(102, num2);
       EEPROM.commit();
   delay(500);
       num1 = (epoch3 / 1000000000 ) % 10 ;
       Serial.print("num1=");
       Serial.println(num1);
       EEPROM.begin(512);
       EEPROM.write(101, num1);
       EEPROM.commit();
       delay(1000);
       Blynk.virtualWrite(V58,"||"+currentDate+","+formattedTime);
   delay(500);
       Blynk.virtualWrite(V58,"=>เขียนสำเร็จแล้ว");
   delay(500);
       Blynk.virtualWrite(V58,"=>โปรดตรวจสอบความถูกต้องอีกครั้ง");
   delay(500);
       write_eeprom_permission_V56_state=0;
       Blynk.setProperty(V57,"label","ไม่เขียน");
   delay(500);
       Blynk.virtualWrite(V57,LOW);
   delay(500);
       Blynk.setProperty(V56,"offLabel","ล๊อคอยู่");
   delay(500);
       Blynk.virtualWrite(V56,LOW);
   delay(500);
       Blynk.syncVirtual(V56,V57,V58);
      }//if button2 == 1;//,0=ไม่เขียน,1=เขียน
      else//if button2 == 1;//,0=ไม่เขียน,1=เขียน
      {//else if button2 == 1;//,0=ไม่เขียน,1=เขียน
      //ไม่เขียน

      }//else if button2 == 1;//,0=ไม่เขียน,1=เขียน
     }//if write_eeprom_permission_V56_state=1
    else//if write_eeprom_permission_V56_state=1
     {//else if write_eeprom_permission_V56_state=1
            //เขียนไม่ได้เพราะยังไม่มีอนุญาติ 
      //แจ้งลงใน terminal V58      
      Blynk.virtualWrite(V58,"||"+currentDate+","+formattedTime);
   delay(500);
      Blynk.virtualWrite(V58,"=>เขียนไม่ได้เพราะยังไม่มีอนุญาติ");
   delay(500);

      Blynk.virtualWrite(V58,"||"+currentDate+","+formattedTime);
   delay(500);
      Blynk.virtualWrite(V58,"=>ยกเลิกการเขียน");
   delay(500);
      Blynk.setProperty(V57,"offLabel","ไม่เขียน");
   delay(500);
      Blynk.virtualWrite(V57,LOW);
   delay(500);
      Blynk.setProperty(V57, "isDisabled", true);
   delay(500);
      Blynk.syncVirtual(V57,V58);
   delay(500);
    }//else if write_eeprom_permission_V56_state=1
 }//BLYNK_WRITE(V57)////ปุ่มอนุญาติเขียนลงในeeprom2,0=ไม่เขียน,1=เขียน  
////////////////////////////////////////////////////////////////////////////////
void setup()
{
         Serial.begin(9600);
      dht_hatching.begin(); // initialize the DHT sensor

     pinMode(lamp_chick, OUTPUT);//D4(lamp_chick)  24 มิย. 65
     digitalWrite(lamp_chick, 1);//active low 24 มิย. 65
     pinMode(solenoid_vegetable_D7, OUTPUT);
     digitalWrite(solenoid_vegetable_D7, 1);//active low 24 มิย. 65
//ฟักไข่
    pinMode(heater_lamp_hatching_D2, OUTPUT);
    pinMode(move_motor_hatching_D1, OUTPUT);
    pinMode(ven_fan_hatching_D3, OUTPUT);
    pinMode(humidifier_hatching_D5, OUTPUT);
//-ฟักไข่
//-1·แจ้งทางไลน์
     Serial.println();
//     Serial.println(LINE.getVersion());
     //0.ดึงเวลาจากเน็ตมาใช้
     Serial.setDebugOutput(true);
     WiFi.mode(WIFI_STA); //เชื่อมต่อ Wifi
     WiFi.begin(ssid, password);
   delay(500);
     Serial.println("\nConnecting to WiFi");
     while ((WiFi.status() != WL_CONNECTED)&&(a<10)) {
           Serial.print("*");
           a=a+1;
           delay(500);
      }
     //-1·แจ้งทางไลน์
     // กำหนด Line Token
//     LINE.setToken(LINE_TOKEN);
// Initialize a NTPClient to get time
  timeClient.begin();
   delay(500);
  // Set offset time in seconds to adjust for your timezone, for example:
  // GMT +1 = 3600
  // GMT +7 = 25200
  // GMT -1 = -3600
  // GMT 0 = 0
  timeClient.setTimeOffset(25200);
  //
     configTime(timezone, dst, "pool.ntp.org", "time.nist.gov"); //ดึงเวลาจาก Server
     Serial.println("\nLoading time");
     while (!time(nullptr)) {
           Serial.print("!time(nullptr)");
           
           delay(500);
     }
     Serial.println("");
    Blynk.begin(auth, ssid, password, "oasiskit.com", 8080);  
    delay(500);
read_hatching_day1_eeprom();
check_time();
      
     ///ผัก///
    solenoid_vegetable_button_blynk_v22.off();
     solenoid_vegetable_led_blynk_v21.off();
//   solenoid_vegetable_led_blynk_v21.on();
   Blynk.virtualWrite(V25,vegetable_soil_dryness_blynk_V25);
  timer.setInterval(2500L, hatching_temp_humid_task);
  timer.setInterval(1750L, check_soil_dryness);
  timer.setInterval(1000L, check_time);
  timer.setInterval(2250L, check_time_for_watering);
  timer.setInterval(2500L, hatching_task);
  timer.setInterval(2750L,hatching_moving_task);
  timer.setInterval(1750L,ventilation_task);

  //Blynk.syncAll();      
   delay(500);
}

void ventilation_task()
{
  if (( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<7))
    {//if (( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<7))
        if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
         {//if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
            Serial.print("เวลาที่หมุนพัดลมเพื่อหายใจ(วินาที)=");
            int cc_second=((millis()-startMillisven_fan_for_breathing)/1000);
            Serial.println(cc_second);
            Serial.print("เวลาที่กำหนดไม่เกิน(วินาที)=");
            Serial.println(ven_fan_for_breathing_second_ON_V41);//หน่วยวินาที
            Serial.print("เหลือเวลาอีก(วินาที)=");
            Serial.println((ven_fan_for_breathing_second_ON_V41)-cc_second);
            Blynk.virtualWrite(V45,"||เหลือเวลาที่หมุนพัดลมเพื่อหายใจอีก(วินาที)="+String((ven_fan_for_breathing_second_ON_V41)-cc_second));
   delay(500);
               if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                  {// if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                               Serial.print("กำลังหมุนพัดลมเพื่อหายใจอยู่");
                  }// if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                  else// if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                  {//else  if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                              Serial.print("ครบเวลา  หยุดหมุนพัดลมอากาศหายใจ");
                              digitalWrite(ven_fan_hatching_D3, 1); 
                              Blynk.virtualWrite(V46,"||"+string_close);
   delay(500);
                              VenLed_hatching_V5.off();
                              ven_fan_for_breathing_msLast=millis();
                              ven_fan_hatching_D3_state=1;
                  }//else  if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
         }//if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
         else//if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
         {//else if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
            Serial.println("ven_fan_hatching_D3_state==0");
            Serial.print("เวลาที่หยุดหมุนพัดลมเพื่อหายใจถึงตอนนี้(วินาที)=");
            int dd_seconds=((millis()-ven_fan_for_breathing_msLast)/1000);
            Serial.println(dd_seconds);
            Serial.print("กำหนดเวลาที่หยุดหมุนพัดลมเพื่อหายใจ(นาที)=");
            Serial.println(ven_fan_for_breathing_min_OFF_V42);
            Serial.print("เหลือเวลาที่จะหมุนพัดลมเพื่อหายใจอีก(วินาที)=");
            Serial.println((ven_fan_for_breathing_min_OFF_V42*60)-dd_seconds);
            Blynk.virtualWrite(V45,"||เหลือเวลาที่จะทำการหมุนพัดลมเพื่อหายใจอีก(วินาที)="+String((ven_fan_for_breathing_min_OFF_V42*60)-dd_seconds));
   delay(500);
            if (((ven_fan_for_breathing_min_OFF_V42*60)-dd_seconds)<=0)
             {
                        Serial.print("ถึงเวลา หมุนพัดลมเพื่อหายใจอีก");
                        digitalWrite(ven_fan_hatching_D3, 0); 
                        VenLed_hatching_V5.on();
                        Blynk.virtualWrite(V47,"||"+string_open);
   delay(500);
                        startMillisven_fan_for_breathing=millis();
                        ven_fan_hatching_D3_state=0;
             }
             else//if (((ven_fan_for_breathing_min_OFF_V42*60)-dd_seconds)<=0)
             {//else if (((ven_fan_for_breathing_min_OFF_V42*60)-dd_seconds)<=0)
                        Serial.print("ยังไม่ถึงเวลา หมุนพัดลมเพื่อหายใจ");
             }//else if (((ven_fan_for_breathing_min_OFF_V42*60)-dd_seconds)<=0)
         
         }//if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
    }//if (( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<7))
  if (( Day_hatch_hatching_V26>=8) &&( Day_hatch_hatching_V26<14))
    {//if (( Day_hatch_hatching_V26>=8) &&( Day_hatch_hatching_V26<14))
        if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
         {//if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
            Serial.print("เวลาที่หมุนพัดลมเพื่อหายใจ(วินาที)=");
            int cc_second=((millis()-startMillisven_fan_for_breathing)/1000);
            Serial.println(cc_second);
            Serial.print("เวลาที่กำหนดไม่เกิน(วินาที)=");
            Serial.println(ven_fan_for_breathing_second_ON_V41);//หน่วยวินาที
            Serial.print("เหลือเวลาอีก(วินาที)=");
            Serial.println((ven_fan_for_breathing_second_ON_V41)-cc_second);
            Blynk.virtualWrite(V45,"||เหลือเวลาที่หมุนพัดลมเพื่อหายใจอีก(วินาที)="+String((ven_fan_for_breathing_second_ON_V41)-cc_second));
   delay(500);
               if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                  {// if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                               Serial.print("กำลังหมุนพัดลมเพื่อหายใจอยู่");
                  }// if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                  else// if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                  {//else  if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                              Serial.print("ครบเวลา  หยุดหมุนพัดลมอากาศหายใจ");
                              digitalWrite(ven_fan_hatching_D3, 1); 
                              Blynk.virtualWrite(V46,"||"+string_close);
   delay(500);
                              VenLed_hatching_V5.off();
                              ven_fan_for_breathing_msLast=millis();
                              ven_fan_hatching_D3_state=1;
                  }//else  if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
         }//if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
         else//if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
         {//else if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
            Serial.println("ven_fan_hatching_D3_state==0");
            Serial.print("เวลาที่หยุดหมุนพัดลมเพื่อหายใจถึงตอนนี้(วินาที)=");
            int dd_seconds=((millis()-ven_fan_for_breathing_msLast)/1000);
            Serial.println(dd_seconds);
            Serial.print("กำหนดเวลาที่หยุดหมุนพัดลมเพื่อหายใจ(วินาที)=");
            Serial.println((ven_fan_for_breathing_min_OFF_V42*60)*0.75);
            Serial.print("เหลือเวลาที่จะหมุนพัดลมเพื่อหายใจอีก(วินาที)=");
            Serial.println(((ven_fan_for_breathing_min_OFF_V42*60)*0.75)-dd_seconds);
            Blynk.virtualWrite(V45,"||เหลือเวลาที่จะทำการหมุนพัดลมเพื่อหายใจอีก(วินาที)="+String(((ven_fan_for_breathing_min_OFF_V42*60)*0.75)-dd_seconds));
   delay(500);
            if ((((ven_fan_for_breathing_min_OFF_V42*60)*0.75)-dd_seconds)<=0)
             {
                        Serial.print("ถึงเวลา หมุนพัดลมเพื่อหายใจอีก");
                        digitalWrite(ven_fan_hatching_D3, 0); 
   delay(500);
                        VenLed_hatching_V5.on();
                        Blynk.virtualWrite(V47,"||"+string_open);
   delay(500);
                        startMillisven_fan_for_breathing=millis();
                        ven_fan_hatching_D3_state=0;
             }
             else//if (((ven_fan_for_breathing_min_OFF_V42*60)-dd_seconds)<=0)
             {//else if (((ven_fan_for_breathing_min_OFF_V42*60)-dd_seconds)<=0)
                        Serial.print("ยังไม่ถึงเวลา หมุนพัดลมเพื่อหายใจ");
             }//else if (((ven_fan_for_breathing_min_OFF_V42*60)-dd_seconds)<=0)
         
         }//if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
         
    }//if (( Day_hatch_hatching_V26>=8) &&( Day_hatch_hatching_V26<14))
  if ( Day_hatch_hatching_V26>=14)
    {//if (( Day_hatch_hatching_V26>=14)
        if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
         {//if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
            Serial.print("เวลาที่หมุนพัดลมเพื่อหายใจ(วินาที)=");
            int cc_second=((millis()-startMillisven_fan_for_breathing)/1000);
            Serial.println(cc_second);
            Serial.print("เวลาที่กำหนดไม่เกิน(วินาที)=");
            Serial.println(ven_fan_for_breathing_second_ON_V41);//หน่วยวินาที
            Serial.print("เหลือเวลาอีก(วินาที)=");
            Serial.println((ven_fan_for_breathing_second_ON_V41)-cc_second);
            Blynk.virtualWrite(V45,"||เหลือเวลาที่หมุนพัดลมเพื่อหายใจอีก(วินาที)="+String((ven_fan_for_breathing_second_ON_V41)-cc_second));
   delay(500);
               if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                  {// if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                               Serial.print("กำลังหมุนพัดลมเพื่อหายใจอยู่");
                  }// if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                  else// if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                  {//else  if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
                              Serial.print("ครบเวลา  หยุดหมุนพัดลมอากาศหายใจ");
                              digitalWrite(ven_fan_hatching_D3, 1); 
                              Blynk.virtualWrite(V46,"||"+string_close);
   delay(500);
                              VenLed_hatching_V5.off();
                              ven_fan_for_breathing_msLast=millis();
                              ven_fan_hatching_D3_state=1;
                  }//else  if (((ven_fan_for_breathing_second_ON_V41)-cc_second)>0)
         }//if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
         else//if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
         {//else if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
            Serial.println("ven_fan_hatching_D3_state==0");
            Serial.print("เวลาที่หยุดหมุนพัดลมเพื่อหายใจถึงตอนนี้(วินาที)=");
            int dd_seconds=((millis()-ven_fan_for_breathing_msLast)/1000);
            Serial.println(dd_seconds);
            Serial.print("กำหนดเวลาที่หยุดหมุนพัดลมเพื่อหายใจ(วินาที)=");
            Serial.println((ven_fan_for_breathing_min_OFF_V42*60)*0.5);
            Serial.print("เหลือเวลาที่จะหมุนพัดลมเพื่อหายใจอีก(วินาที)=");
            Serial.println(((ven_fan_for_breathing_min_OFF_V42*60)*0.5)-dd_seconds);
            Blynk.virtualWrite(V45,"||เหลือเวลาที่จะทำการหมุนพัดลมเพื่อหายใจอีก(วินาที)="+String(((ven_fan_for_breathing_min_OFF_V42*60)*0.5)-dd_seconds));
            if ((((ven_fan_for_breathing_min_OFF_V42*60)*0.5)-dd_seconds)<=0)
             {
                        Serial.print("ถึงเวลา หมุนพัดลมเพื่อหายใจอีก");
                        digitalWrite(ven_fan_hatching_D3, 0); 
                        VenLed_hatching_V5.on();
                        Blynk.virtualWrite(V47,"||"+string_open);
                        startMillisven_fan_for_breathing=millis();
                        ven_fan_hatching_D3_state=0;
             }
             else//if (((ven_fan_for_breathing_min_OFF_V42*60)-dd_seconds)<=0)
             {//else if (((ven_fan_for_breathing_min_OFF_V42*60)-dd_seconds)<=0)
                        Serial.print("ยังไม่ถึงเวลา หมุนพัดลมเพื่อหายใจ");
             }//else if (((ven_fan_for_breathing_min_OFF_V42*60)-dd_seconds)<=0)
         
         }//if (ven_fan_hatching_D3_state==0)//กำลังทำงาน
    }//if (( Day_hatch_hatching_V26>=14)
}//void ventilation_task()

  
  void check_time()
  {
    Serial.print("ESP8266_03  macAddress=");
    Serial.println(WiFi.macAddress());
  
  timeClient.update();

  time_t epochTime = timeClient.getEpochTime();
   epoch4 = timeClient.getEpochTime()-25200;
  Blynk.virtualWrite(V55, epoch4);//เวลาปัจจุบัน
   delay(500);
  
delay(500);
String formattedTime = timeClient.getFormattedTime();
  Serial.print("Formatted Time: ");
  Serial.println(formattedTime);  

  currentHour = timeClient.getHours();// int currentHour อยู่ด้านบนแล้ว เพื่อประกาศเป็น global var
  Serial.print("Hour: ");
  Serial.println(currentHour);  
  currentMinute = timeClient.getMinutes();
  Serial.print("Minutes: ");
  Serial.println(currentMinute); 
   
  int currentSecond = timeClient.getSeconds();
  Serial.print("Seconds: ");
  Serial.println(currentSecond);  

  String weekDay = weekDays[timeClient.getDay()];
  Serial.print("Week Day: ");
  Serial.println(weekDay);    

  //Get a time structure
  struct tm *ptm = gmtime ((time_t *)&epochTime); 

  monthDay = ptm->tm_mday;
  Serial.print("Month day: ");
  Serial.println(monthDay);

  currentMonth = ptm->tm_mon+1;
  Serial.print("Month: ");
  Serial.println(currentMonth);

  String currentMonthName = months[currentMonth-1];
  Serial.print("Month name: ");
  Serial.println(currentMonthName);

  int currentYear = ptm->tm_year+1900;
  Serial.print("Year: ");
  Serial.println(currentYear);

  //Print complete date:
  String currentDate = String(weekDay) + "-" +String(monthDay) + "-" + String(currentMonth) + "-" + String(currentYear) ;
  Serial.print("Current date: ");
  Serial.println(currentDate);
     Serial.print("current Time=");
     Serial.println(formattedTime);
  Blynk.virtualWrite(V12, currentDate);
   delay(500);
    Blynk.virtualWrite(V13, formattedTime);
   delay(500);
     string_close="|| ปิดเวลา"+String(currentHour)+":"+String(currentMinute)+","+String(monthDay) + "/" + String(currentMonth);
     string_open= "|| เปิดเวลา"+String(currentHour)+":"+String(currentMinute)+","+String(monthDay) + "/" + String(currentMonth);

     Serial.print("current Time=");
     Serial.println(formattedTime);
  Serial.print("Current date: ");
  Serial.println(currentDate);
  Serial.println("epoch2=");
  Serial.println(epoch2);
  Serial.println("////////");
  ////epoch1เก็บตัวแปรจากV54เพื่อใช้ในV53,epoch2ที่เก็บในeepromใช้ในV51,V52,epoch3ใช้ในV56,epoch4เป็นเวลาปัจจุบัน ใช้ใน V55,epoch5เป็นเวลาสำหรับการเขียนลงในeeprom V48,
    if (((epoch4-epoch2)%86400) == 0)
      {
        Day_hatch_hatching_V26=int((epoch4-epoch2)/86400);
      }
    else
     {
      Day_hatch_hatching_V26=int((epoch4-epoch2)/86400)+1;
     }

  Blynk.virtualWrite(V26, Day_hatch_hatching_V26);
  delay(500);
}



void loop() 
{  
     Blynk.run();
     timer.run();
}

void hatching_temp_humid_task()
{ //void hatching_temp_humid_task()
   
   humidity_hatching  = dht_hatching.readHumidity();
   delay(500);
  // read temperature in Celsius
 temperature_hatching = dht_hatching.readTemperature();
 // delay(2000);
   delay(500);
  if (temperature_hatching < 10.00)
  {
           Blynk.virtualWrite(V28, "DHT ทำงานพลาด");
            Serial.println("DHT ทำงานพลาด");
  }
  Serial.print("ความชื้นในตู้ฟักไข่");
  Serial.print("\t");
  Serial.print(humidity_hatching, 1);
  Serial.print("\t");
  Serial.print("อุณหภูมในตู้ฟักไข่ิ");
  Serial.println(temperature_hatching, 2);
     Serial.print("current Time=");
  Blynk.virtualWrite(V28, temperature_hatching);
   delay(500);
  Blynk.virtualWrite(V29, humidity_hatching);
   delay(500);
  
}//void hatching_temp_humid_task()


void hatching_task()
{
if ((temperature_hatching > 38.00) &&( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<18))//1
   {
      Serial.print("เปิดพัดลม 2");
      CoolingLed_hatching_V6.on();
      HeatingLed_hatching_V7.off();
      digitalWrite(heater_lamp_hatching_D2, 1);// ปิดหลอดไฟฮีตเตอร์    
      digitalWrite(ven_fan_hatching_D3, 0);// เปิดพัดลม
      Blynk.virtualWrite(V47,"||"+string_open);
   delay(500);
    }
if ((temperature_hatching >= 37.50) && (temperature_hatching <= 38.0)&&( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<18))//2
   {
      Serial.print("ปิดพัดลม 2");
      CoolingLed_hatching_V6.off();
      HeatingLed_hatching_V7.off();
      digitalWrite(ven_fan_hatching_D3, 1);// ปิดพัดลม    
       Blynk.virtualWrite(V46,"||"+string_close);
   delay(500);
      digitalWrite(heater_lamp_hatching_D2, 1);// ปิดหลอดไฟฮีตเตอร์    
    }
    ///

    ///-
if ((temperature_hatching < 37.50) &&( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<18))//3
   {
      Serial.print("เปิดไฟ 2ดวง");
      HeatingLed_hatching_V7.on();
      CoolingLed_hatching_V6.off();
      digitalWrite(ven_fan_hatching_D3, 1);// ปิดพัดลม
       Blynk.virtualWrite(V46,"||"+string_close);
   delay(500);
      digitalWrite(heater_lamp_hatching_D2, 0);// เปิดหลอดไฟฮีตเตอร์
    }


 //-   
if ((HumidSet_hatching_V0 > 65.00) &&( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<18))//4 2
   {
      Serial.print("ปิดทำความชื้น");
      Humid_hatching_Led_V8.off();
    }


if ((HumidSet_hatching_V0 < 60.00 ) &&( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<18))//5  2
   {
      Serial.print("เปิดทำความชื้น");
      Humid_hatching_Led_V8.on();
      digitalWrite(humidifier_hatching_D5, 0);// เปิดพ่นหมอก
    }

///
if ((temperature_hatching > 37.20) &&( Day_hatch_hatching_V26>=18) &&( Day_hatch_hatching_V26<=21))//6 1
   {
      Serial.print("เปิดพัดลม 2");
      CoolingLed_hatching_V6.on();
      HeatingLed_hatching_V7.off();
      digitalWrite(heater_lamp_hatching_D2, 1);// ปิดหลอดไฟฮีตเตอร์
      digitalWrite(ven_fan_hatching_D3, 0);// เปิดพัดลม
       Blynk.virtualWrite(V47,"||"+string_open);
   delay(500);
    
    }


if ((temperature_hatching >= 36.10) && (temperature_hatching <= 37.20)&&( Day_hatch_hatching_V26>=18) &&( Day_hatch_hatching_V26<=21))//7 1
   {
      Serial.print("ปิดพัดลม 2");
      CoolingLed_hatching_V6.off();
      HeatingLed_hatching_V7.off();
      digitalWrite(ven_fan_hatching_D3, 1);// ปิดพัดลม    
       Blynk.virtualWrite(V46,"||"+string_close);
   delay(500);
      digitalWrite(heater_lamp_hatching_D2, 1);// ปิดหลอดไฟฮีตเตอร์    
    
    }
if ((temperature_hatching < 36.10) &&( Day_hatch_hatching_V26>=18) &&( Day_hatch_hatching_V26<=21))//8  1
   {
      Serial.print("เปิดไฟ 2ดวง");
      HeatingLed_hatching_V7.on();
      CoolingLed_hatching_V6.off();
      digitalWrite(ven_fan_hatching_D3, 1);// ปิดพัดลม
       Blynk.virtualWrite(V46,"||"+string_close);
   delay(500);
      digitalWrite(heater_lamp_hatching_D2, 0);// เปิดหลอดไฟฮีตเตอร์
    }
if ((HumidSet_hatching_V0 > 75.00) &&( Day_hatch_hatching_V26>=18) &&( Day_hatch_hatching_V26<=21))//9 2
   {
      Serial.print("ปิดทำความชื้น");
      Humid_hatching_Led_V8.off();
      digitalWrite(humidifier_hatching_D5, 1);// เปิดพ่นหมอก
    }
if ((HumidSet_hatching_V0 < 70.00 ) &&( Day_hatch_hatching_V26>=18) &&( Day_hatch_hatching_V26<=21))//10 2
   {
      Serial.print("เปิดทำความชื้น");
      Humid_hatching_Led_V8.on();
      digitalWrite(humidifier_hatching_D5, 0);// เปิดพ่นหมอก
    }


}



void check_soil_dryness()
{
    vegetable_soil_dryness = analogRead(soil_dryness_analog_A0);
delay(500);
Blynk.virtualWrite(V2,vegetable_soil_dryness);
  if (vegetable_soil_dryness > vegetable_soil_dryness_blynk_V25) 
      {
       soil_dryness_state = 1;//1=ดินแห้ง low active module
       Blynk.virtualWrite(V3,"แห้ง");//low active module
   delay(500);
      }
  else
  {
       soil_dryness_state = 0;//ดินเปียก low active module
       Blynk.virtualWrite(V3,"เปียก");//low active module
   delay(500);
      }

  if ((millis()-start_millis_soil_check)<86400000)// ในวันเดียวกัน 86400000=1d;
    { 
    if (max_soil_moisture<vegetable_soil_dryness)   
      {
        max_soil_moisture=vegetable_soil_dryness;
      Blynk.virtualWrite(V24, String(max_soil_moisture)+",เวลา("+String(currentHour)+":"+String(currentMinute)+","+String(monthDay) + "/" + String(currentMonth)+")");
   delay(500);
      }
    if (min_soil_moisture>vegetable_soil_dryness) 
        { 
        min_soil_moisture=vegetable_soil_dryness;
      Blynk.virtualWrite(V23, String(min_soil_moisture)+",เวลา("+String(currentHour)+":"+String(currentMinute)+","+String(monthDay) + "/" + String(currentMonth)+")");
   delay(500);
        } // record new min value

      }
  else // วันใหม่
      {
        max_soil_moisture = -9999;
        min_soil_moisture = 9999;
      
       start_millis_soil_check = millis();
       }
}

void check_time_for_watering()
{
 if (solenoid_vegetable_auto_manual_V39_state==1)//1=auto
    {  //if (solenoid_vegetable_auto_manual_V39_state==1)//1=auto
        if ((currentHour >start_am) && (currentHour<end_am))
        {//if ((currentHour >start_am) && (currentHour<end_am))
        if (solenoid_vegetable_D7_state==0)//กำลังทำงาน
        {//if (solenoid_vegetable_D7_state==0)//กำลังทำงาน
            Serial.println("solenoid_vegetable_D7_state==0");
            Serial.print("เวลาที่ปล่อยน้ำตอนนี้(วินาที)=");
            int cc=((millis()-startMillismorning_watering)/1000);
            Serial.println(cc);
            Serial.print("เวลาที่กำหนดไม่เกิน(วินาที)=");
            Serial.println(periodMinmorning_watering_V11*60);
            Serial.print("เหลือเวลาอีก(วินาที)=");
            Serial.println((periodMinmorning_watering_V11*60)-cc);
            Blynk.virtualWrite(V40,"||เหลือเวลาที่รดน้ำอีก(วินาที)="+String((not_within_min_V16*60)-cc));
               if((millis()-startMillismorning_watering)<=(not_within_min_V16*60*60*1000))
                  {
                               Serial.print("กำลังรดน้ำ");
                  }
                  else//if((millis()-startMillismorning_watering)<=(not_within_min_V16*60*60*1000))
                  {
                              Serial.print("ครบเวลา  หยุดรดน้ำ");
                              digitalWrite(solenoid_vegetable_D7, 1); 
                              Blynk.virtualWrite(V33,string_close);//V33 log ปิดรดน้ำฝัก)
   delay(500);
                              solenoid_vegetable_led_blynk_v21.off();
                              lastMillismorning_watering=millis();
                              solenoid_vegetable_D7_state=1;
                    }

มีต่อ(บรรทัดที่ 1401-1500)อีกครับ ในกระทู้ถัดไป

ส่วนที่ 3 (บรรทัด1401-1500)

        }//if (solenoid_vegetable_D7_state==0)//กำลังทำงาน
       else// (solenoid_vegetable_D7_state==0)//กำลังทำงาน
       {//else if (solenoid_vegetable_D7_state==0)//0=ทำงาน
             Serial.println("solenoid_vegetable_D7_state==0");
            Serial.print("เวลาที่หยุดรดน้ำตอนนี้(วินาที)=");
            int dd=((millis()-lastMillismorning_watering)/1000);
            Serial.println(dd);
            Serial.print("เวลากำหนดหยุดรดน้ำ(วินาที)=");
            Serial.println(not_within_min_V16*60);
            Serial.print("เหลือเวลาที่จะรดน้ำอีก(วินาที)=");
            Serial.println((not_within_min_V16*60)-dd);
            Blynk.virtualWrite(V40,"||เหลือเวลาที่จะทำการรดน้ำอีก(วินาที)="+String((not_within_min_V16*60)-dd));
   delay(500);
           if ((millis()-lastMillismorning_watering)>=(not_within_min_V16*60*1000))
           {//if ((millis()-lastMillismorning_watering)>=(not_within_min_V16*60*1000))
                        Serial.print("ถึงเวลา  รดน้ำต้นไม้");
                       check_soil_dryness();
                       delay(200);
                      if  (soil_dryness_state = 1)//ดินเปียก  1คือแห้ง  0คือเปียก
                      {
                         Serial.print("ดินแห้งแล้ว");
                       digitalWrite(solenoid_vegetable_D7, 0); 
                        MoveLed_hatching_V4.on();
                        Blynk.virtualWrite(V32,string_open);
   delay(500);
                      startMillismorning_watering=millis();
                      solenoid_vegetable_D7_state=0;//0=ทำงาน
                      }
                      else
                      {
                         Serial.print("ดินยังเปียก");
                        
                      }

           }//if ((millis()-lastMillismorning_watering)>=(not_within_min_V16*60*1000))
           else//if ((millis()-lastMillismorning_watering)>=(not_within_min_V16*60*1000))
           {//else if ((millis()-lastMillismorning_watering)>=(not_within_min_V16*60*1000))
                        Serial.print("ยังไม่ถึงเวลา  รดน้ำผัก");
           }//else if ((millis()-lastMillismorning_watering)>=(not_within_min_V16*60*1000))
       }//else if (solenoid_vegetable_D7_state==0)//กำลังทำงาน
        }// if ((currentHour >start_am) && (currentHour<end_am))
    if ((currentHour >=start_pm) && (currentHour<=end_pm))
     {//if ((currentHour >=start_pm) && (currentHour<=end_pm)
        if (solenoid_vegetable_D7_state==0)//กำลังทำงาน
        {//if (solenoid_vegetable_D7_state==0)//กำลังทำงาน
            Serial.println("solenoid_vegetable_D7_state==0");
            Serial.print("เวลาที่ปล่อยน้ำตอนนี้(วินาที)=");
            int cc=((millis()-startMillisevening_watering)/1000);
            Serial.println(cc);
            Serial.print("เวลาที่กำหนดไม่เกิน(วินาที)=");
            Serial.println(periodMinevening_watering_V15*60);
            Serial.print("เหลือเวลาอีก(วินาที)=");
            Serial.println((periodMinevening_watering_V15*60)-cc);
            Blynk.virtualWrite(V40,"||เหลือเวลาที่รดน้ำอีก(วินาที)="+String((not_within_min_V16*60)-cc));
               if((millis()-startMillisevening_watering)<=(not_within_min_V16*60*60*1000))
                  {
                               Serial.print("กำลังรดน้ำ");
                  }
                  else//if((millis()-startMillisevening_watering)<=(not_within_min_V16*60*60*1000))
                  {
                              Serial.print("ครบเวลา  หยุดรดน้ำ");
                              digitalWrite(solenoid_vegetable_D7, 1); 
                              Blynk.virtualWrite(V33,string_close);//V33 log ปิดรดน้ำฝัก)
   delay(500);
                              solenoid_vegetable_led_blynk_v21.off();
                              periodMinevening_watering_V15=millis();
                              solenoid_vegetable_D7_state=1;
                    }
        }//if (solenoid_vegetable_D7_state==0)//กำลังทำงาน
       else// (solenoid_vegetable_D7_state==0)//กำลังทำงาน
       {//else if (solenoid_vegetable_D7_state==0)//0=ทำงาน
             Serial.println("solenoid_vegetable_D7_state==0");
            Serial.print("เวลาที่หยุดรดน้ำตอนนี้(วินาที)=");
            int dd=((millis()-periodMinevening_watering_V15)/1000);
            Serial.println(dd);
            Serial.print("เวลากำหนดหยุดรดน้ำ(วินาที)=");
            Serial.println(not_within_min_V16*60);
            Serial.print("เหลือเวลาที่จะรดน้ำอีก(วินาที)=");
            Serial.println((not_within_min_V16*60)-dd);
            Blynk.virtualWrite(V40,"||เหลือเวลาที่จะทำการรดน้ำอีก(วินาที)="+String((not_within_min_V16*60)-dd));
   delay(500);
           if ((millis()-periodMinevening_watering_V15)>=(not_within_min_V16*60*1000))
           {
                        Serial.print("ถึงเวลา  รดน้ำต้นไม้");
                        digitalWrite(solenoid_vegetable_D7, 0); 
                        MoveLed_hatching_V4.on();
                        Blynk.virtualWrite(V32,string_open);
   delay(500);
                        startMillisevening_watering=millis();
                        solenoid_vegetable_D7_state=0;//0=ทำงาน
           }
           else//if ((millis()-periodMinevening_watering_V15)>=(not_within_min_V16*60*1000))
           {
                        Serial.print("ยังไม่ถึงเวลา  รดน้ำผัก");
           }
       }//else if (solenoid_vegetable_D7_state==0)//กำลังทำงาน
      
     }//if ((currentHour >=start_pm) && (currentHour<=end_pm)
     }//if (solenoid_vegetable_auto_manual_V39_state==1)//1=auto
 else//(solenoid_vegetable_auto_manual_V39_state==1)//1=auto
     {
                        Serial.print("ในระบบแมนวล การรดน้ำออโต้ไม่ทำงาน");
     }
}//void check_time_for_watering()
 
 
void hatching_moving_task()
{
 if (hatching_move_auto_manual_v30_State==1)//1=auto
    {  //if (hatching_move_auto_manual_v30_State==1)//1=auto
        if (move_motor_hatching_D1_state==0)//กำลังทำงาน
        {//if (move_motor_hatching_D1_state==0)//กำลังทำงาน
            Serial.println("move_motor_hatching_D1_state==0");
            Serial.print("เวลาที่พลิกรางไช่ตอนนี้(วินาที)=");
            int cc=((millis()-startMillisMove)/1000);
            Serial.println(cc);
            Serial.print("เวลาที่กำหนดไม่เกิน(วินาที)=");
            Serial.println(move_ON_hatching_seconds_V27);
            Serial.print("เหลือเวลาอีก(วินาที)=");
            Serial.println((move_ON_hatching_seconds_V27)-cc);
            Blynk.virtualWrite(V36,"||เหลือเวลาที่พลิกอีก(วินาที)="+String((move_OFF_hatching_min_V34*60)-cc));
   delay(500);
               if (((move_ON_hatching_seconds_V27)-cc)>0)
                  {//if (((move_ON_hatching_seconds_V27)-cc)>0)
                               Serial.print("กำลังพลิกรางไข่");
                  }//if (((move_ON_hatching_seconds_V27)-cc)>0)
                  else//if (((move_ON_hatching_seconds_V27)-cc)>0)
                  {//else if (((move_ON_hatching_seconds_V27)-cc)>0)
                              Serial.print("ครบเวลา  หยุดพลิกรางไข่");
                              digitalWrite(move_motor_hatching_D1, 1); 
                              Blynk.virtualWrite(V37,"||"+string_close);
   delay(500);
                              MoveLed_hatching_V4.off();
                              move_hatching_msLast=millis();
                              move_motor_hatching_D1_state=1;
                    }//else if (((move_ON_hatching_seconds_V27)-cc)>0)
        }//if (move_motor_hatching_D1_state==0)//กำลังทำงาน
       else// (move_motor_hatching_D1_state==0)//กำลังทำงาน
       {//else if (move_motor_hatching_D1_state==0)//กำลังทำงาน
       if (( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<18))
          {//if (( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<18))
             Serial.println("move_motor_hatching_D1_state==0");
            Serial.print("เวลาที่หยุดพลิกรางไช่ตอนนี้(วินาที)=");
            int dd=((millis()-move_hatching_msLast)/1000);
            Serial.println(dd);
            Serial.print("เวลาที่หยุดพลิก(วินาที)=");
            Serial.println(move_OFF_hatching_min_V34*60);
            Serial.print("เหลือเวลาที่จะพลิกอีก(วินาที)=");
            Serial.println((move_OFF_hatching_min_V34*60)-dd);
            Blynk.virtualWrite(V36,"||เหลือเวลาที่จะทำการพลิกอีก(วินาที)="+String((move_OFF_hatching_min_V34*60)-dd));
   delay(500);
           if (((move_OFF_hatching_min_V34*60)-dd)<=0)
           {
                        Serial.print("ถึงเวลา  พลิกรางไข่");
                        digitalWrite(move_motor_hatching_D1, 0); 
                        MoveLed_hatching_V4.on();
                        Blynk.virtualWrite(V38,"||"+string_open);
   delay(500);
                        startMillisMove=millis();
                        move_motor_hatching_D1_state=0;
           }
           else// if (((move_OFF_hatching_min_V34*60)-dd)<=0)
           {//else if (((move_OFF_hatching_min_V34*60)-dd)<=0)
                        Serial.print("ยังไม่ถึงเวลา  พลิกรางไข่");
           }//else if (((move_OFF_hatching_min_V34*60)-dd)<=0)
         }//if (( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<18))   
         else//if (( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<18))
         {//else if (( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<18))   
           Serial.println("||เกินวันที่18 ไม่ต้องพลิกรางไข|| วันนี้ฟักไข่วันที่ "+String(Day_hatch_hatching_V26));
           Blynk.virtualWrite(V36,"||เกินวันที่18 ไม่ต้องพลิกรางไข|| วันนี้ฟักไข่วันที่ "+String(Day_hatch_hatching_V26));
   delay(500);
         }//else if (( Day_hatch_hatching_V26>=1) &&( Day_hatch_hatching_V26<18))   
       }//else if (move_motor_hatching_D1_state==0)//กำลังทำงาน
     }//if (hatching_move_auto_manual_v30_State==1)//1=auto
 else//(hatching_move_auto_manual_v30_State==1)//1=auto
     {
                        Serial.print("ในระบบแมนวล การพลิกรางไข่ออโต้ไม่ทำงาน");
     }
}

ครบแล้วครับ
ถ้าใครสนใจ จะเอาไปปรับปรุงแก้ไข ใช้งาน
เชิญได้เลยครับ
และถ้าปรับปรุงแล้วอย่าลิมช่วยบอกผมด้วย ผมจะได้ใช้ด้วย
***ขออภัย เดี๋ยวจะทำ link ให้ d/l โค้ดในภายหลังครับ

1 Likes

หน้าตาใน blynk ประมาณนี้ครับ







**โปรเจ็คนี้เต็มที่ได้ 6 หน้า ครับ ไม่สามารถเพิ่ม terminal widget ได้อีก ** แจ้งว่า not enough space,

แต่ widget ที่ใช้เนื้อที่เล็กๆยังใส่ได้อีกครับ

8 กย.2565
สิ่งที่ผมเจอ
1.ถ้าใช้ widget blynk ประมาณ 30 ตัว สามารถ ใช้ blynk.syncall ได้ไม่มีปัญหา
แต่ถ้าwidget blynk ประมาณ 60 ตัว ไม่สามารถ ใช้ blynk.syncall เพราะมันใช้เวลาติดต่อกับ blynk server นานมาก หลายนาที ถึงจะอัพเดต
จนผมต้องเอาออก และ blynk.virtualsync(Vx) เลือกwidget Vx เป็นอันๆไป ถึงจะติดต่อเซอร์เวอร์blynk ได้
2.เสียเวลาโดยไม่จำเป็นอย่างมาก เพราะพอผลที่ได้ไม่เป็นไปตามที่เขียนไว้
เพราะ การใช้เงื่อนไข ตรวจสอบ state นั้น ถ้าหากในลูป มีโค้ดจะเปลี่ยน state ของif ปัจจุบัน ให้บรรทัดนี้อยู่ล่างสุดของลูป ให้โค้ดอื่นที่สั่งงานอยู่บรรทัดบนกว่า ที่จะเปลี่ยน state เพราะเมื่อไหร่ arduino เจอการเปลี่ยนstate มันจะกระโดดออกจากลูปทันที โดยไม่สนใจบรรทัดที่อยู่ล่างกว่า(แม้ว่าอยู่ในloopเดียวกันก็ตาม)

เช่น
สมมติเราเช็คพัดลมทำงานหรือไม่ ถ้าทำงาน ให้ ปิดพัดลม และแจ้งสถานะเป็นพัดลมปิดด้วย
มีโค้ด 1

bool  fan_state=0;
int fan=D3;  

void setup()
{digitalWrite(fan, 0);//active low
}
void loop
{
  if  fan_state==0
  {
     fan_state=1;
    digitalWrite(fan, 1);//active low
  }
}

[u]โค้ด 2[/u]
bool  fan_state=0;
int fan=D3;  

void setup()
{digitalWrite(fan, 0);//active low
}
void loop
{
  if  fan_state==0
  {
    digitalWrite(fan, 1);//active low
     fan_state=1;
  }
}

จะเห็นว่า 2 โค้ดเขียนเหมือนกันหมด
ยกเว้น ลำดับตำแหน่งสลับกัน
ผลออกมาต่างกันโดยสิ้นเชิง
กล่าวคือ โค้ด 1 พออ่านบรรทัดแรก มันจะกระโดดออกทันที โดยยังไมปิดพัดลม
ขณะโค้ด2 จะปิดพัดลมก่อน แล้ว ออกจากลูปครับ
**ตัวอย่างข้างบนไม่ค่อยพลาดเท่าไหร่ เพราะในลูปมีแค่ 2 บรรทัด แต่ถ้า มี10 บรรทัด ผมพลาดเลยครับ

15กย65
ผมได้เพิ่ม โค้ด ใน node ที่ 1 เกี่ยวกับ การอนุบาลลูกไก่
ทีนี้มันซับซ้อนขึ้น เพราะของเดิมก็เยอะแล้ว และเราอยากให้มีลูกเล่น คือการเปิดปิดระบบ ในแต่ละระบบ โดยให้บันทึกลงใน eeprom ผ่าน blynk
ผม เลยคิดถึง flow chart และลองดูในเน็ต มันก็มีด้วย แบบออนไลน์ ฟรีด้วย เราสามารถใส่โค้ดในแต่ละตอนของ flow chart เพื่อความ
เข้าใจในการทำงานของโค้ด เป็นระบบขึ้น สามารถ export เป็นรูปได้ด้วย
ต่อไปนี้เป็นรูปที่ผมได้ลองทำดู


ทำให้เราป้องกันโค้ดจะตีกันได้ระดับหนึ่ง
17กย65
หลังจากใช้ flowchart online(miro.com) รู้สึกติดใจในการเขียน โค้ด arduino +blynk+nodemcu แต่การเขียนบนออนไลน์
ถ้าเน็ตไม่ดี มันจะเสียเวลา มากในการเขียนโค้ด เพราะรอการเชื่อมต่อที่ช้าครับ
ผมลองค้นดูแบบออฟไลน์ เจอโปรแกรม EDRAW MAX สามารถเขียนแบบออฟไลน์ได้ และลูกเล่นเยอะมาก

หลังจากใช้เวลาเรียนรู้วิธีการใช้ ก็สบายเลย และเขียนโค้ดแบบสบายใจด้วย
ปล. เวลาก๊อปโค้ดจาก arduino ide ต้องไปวางใน notepadก่อน แล้วค่อยก๊อปจากnotepad มาวางในEDRAW MAX อีกที
ถ้าไม่ผ่าน notepad EDRAW MAXจะไม่รับข้อความที่วางไว้ ใครมีวิธีแก้ปัญหานี้บ้าง

1 Likes

18กย65
ผมได้มาปรับปรุง โปรเจค แรกที่สุดคือ เรื่อง รดน้ำต้นทุเรียน ตั้งแต่มค65 พอทำโปรเจคเลี้ยงไก่ ทำให้โปรเจคนี้หยุดการดูแลไป
ต้นทุเรียน ตอนแรก2 ต้น พอไม่ได้ดูแล เหลือต้นเดียว
โปรเจตนี้ มี nodemcu8266 1 อัน ควบคุม วาล์วเปิดน้ำ 1 อัน โดยมี เซ็นเซอร์วัดความชื้นในดิน 1 ตัว เพื่อเช็คดินที่ต้นทุเรียน
และ ผมต้องการขยาย ปลูกผักด้วย ซึ่งจะมี ระบบต่างหากคือ วาล์วรดน้ำผัก เซ็นเซอร์วัดความชื้นในดิน 1 ตัว ใช้กับnode เดียวกัน

1 Likes

ลองโค้ตนี้ดูครับ

#include <WiFi.h>
#include <esp_now.h>
#include <BlynkSimpleEsp32.h>

// WiFi credentials
const char* ssid = "your-ssid";
const char* password = "your-password";

// Blynk credentials
char auth[] = "your-blynk-auth-token";

// ESP-NOW data
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

void setup() {
  Serial.begin(115200);

  // Connect to WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }

  // Initialize Blynk
  Blynk.begin(auth, ssid, password);

  // Initialize ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("ESP-NOW initialization failed");
    return;
  }

  // Register peer
  esp_now_peer_info_t peerInfo;
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  esp_now_add_peer(&peerInfo);
}

void loop() {
  // Run Blynk
  Blynk.run();

  // Your ESP-NOW communication logic here

  delay(1000);
}