NodeMcu ทำ smart home project ที่ 1

23กย65
วันนี้มาปรับปรุง เครื่องทำน้ำอุ่นสำหรับทารก
ซึ่งได้ใช้งานจริงมา เกือบ3เดือนแล้ว

1.เพิ่ม ปุ่มใน blynk สำหรับ กำหนด แมนวล หรือ ออโต้
2.ลูกลอยตัวบน มันค้าง ทำให้ระดับน้ำมันแจ้งเต็มตลอด แก้โดยขยับลงมา ก็ได้แล้ว แค่มีโอกาสติดอีกได้
3.ค้นเจอ สายไฟจากลูกลอย ไปเข้า D7 แต่ในโค้ดเขียน D2 เลยย้ายสายเป็น D2
4.ทดสอบใหม่ ก็โอเคครับ

โค้ดครับ

//ขาที่ใช้แล้วได้แก่ D0(led_low_temp-แจ้งอุณหภูมิต่ำกว่าหรือเท่ากับ36),D1(pump),D2(upper_water_level_pin_D2),D3(water_temp_pin),
//D4(heater_D4),D5(inputpullup ใช้ไม่ได้),D6(min_water_level_pin),D7();
//D8(led_mid_temp-แจ้งอุณหภูมิต่ำกว่าหรือเท่ากับ37-38);D9(led_high_temp-แจ้งอุณหภูมิสูงกว่าหรือเท่ากับ39)
//=================
//VIRTUAL PIN BLYNK
//V0 =>HEATERBLYNK_V0(V0),V1 => อุณหภูมิปัจจุบัน, V2=>ssid , V3=>MINWATERLEVELBLYNK(V3), v4=>UPPERWATERLEVELBLYNK(V4)
//v5=>SYSTEMBLYNK(V5), V6=> อุณหภูมิที่กำหนด TempSet_V6,  V7=>HeaterButtonBlynk ,  V8=>PumpLedBlynk,
//V9=>PumpButtonBlynk,V10(button auto_heater_V10)
//=================
//Blynk
#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp8266.h>
char auth[] = "xxx";
BlynkTimer    timer;

//Heating 
#include <DallasTemperature.h>
const int water_temp_pin  = D3;
OneWire oneWire(water_temp_pin);
DallasTemperature sensors(&oneWire);
int water_temp;//ควรมีอุณหภูมิ 38 'C
int TempSet_V6 = 38;
int heater_D4 = D4;
int heater_D4_state =1;//active low
int pump = D1;
int led_low_temp = D0;
int led_mid_temp = D8;
int led_high_temp = D9;
//bool flag_rt;
int upper_water_level;
int min_water_level;
int waterfull;
int waterout;
int upper_water_level_pin_D2 = D2;
int upper_water_level_pin_D2_value=0;
int min_water_level_pin = D6;
int val = 0;
int auto_heater_V10=0;
unsigned long heater_D4_ms_start;        //time from millis()
unsigned long heater_D4_ms_Last;    //last time the LED changed state
boolean heater_State;        //current LED state
WidgetLED HEATERBLYNK_V0(V0);// โยงกับ heater(output)
WidgetLED SYSTEMBLYNK(V5);// โยงกับ PUMP(output,D1) เปิดปั๊มน้ำ
WidgetLED PumpLedBlynk(V8);// 
WidgetLED UPPERWATERLEVELBLYNK(V4);// โยงกับ pump(output) ก้อกน้ำให้เปิด
WidgetLED MINWATERLEVELBLYNK(V3);// โยงกับ valve(output) ก้อกน้ำให้เปิด

//Wifi
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char *ssid     = "xxx";
const char *password = "xxx";
int a=0;
WiFiUDP ntpUDP;
// กำหนดค่า offset time เนื่องจากเวลาของเซิฟเวอร์นี้เป็นเวลา UTC เราต้องทำให้เป็นเวลาของประเทศไทย
// เวลาของประเทศไทย = UTC+7 ชั่วโมง ต้องกำหนด offset time = 7 ชั่วโมง


//Time
typedef unsigned long currentDate;
typedef unsigned long formattedTime;
unsigned long myTime;
#include <NTPClient.h>
#include <time.h>
int timezone = 7 * 3600; //ตั้งค่า TimeZone ตามเวลาประเทศไทย
int dst = 0; //กำหนดค่า Date Swing Time
NTPClient timeClient(ntpUDP, "pool.ntp.org");
//Week Days
String weekDays[7]={"อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์"};

//Month names
String months[12]={"มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"};
const long offsetTime = 25200;       // หน่วยเป็นวินาที จะได้ 7*60*60 = 25200
// กำหนด object ของ WiFiUDP ชื่อว่า ntpUDP


BLYNK_WRITE(V6)
{
  int pinValue = param.asInt(); // assigning incoming value from pin V1 to a variable
  // You can also use:
  // String i = param.asStr();
  // double d = param.asDouble();
  Serial.print("V1 Slider value is: ");
  Serial.println(pinValue);
  TempSet_V6 = pinValue;
}

void setup() {
    Serial.begin(9600);
     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);
      }

  
      Blynk.virtualWrite(V2, ssid);

   Blynk.begin(auth, ssid, password, "oasiskit.com", 8080);  
   //
// Initialize a NTPClient to get time
  timeClient.begin();
  // 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);
  //
   //Dallas
   sensors.begin();
  pinMode(upper_water_level_pin_D2, INPUT_PULLUP);
  pinMode(min_water_level_pin, INPUT_PULLUP);
  pinMode(heater_D4, OUTPUT);
   digitalWrite(heater_D4, HIGH);//low active
  pinMode(led_low_temp, OUTPUT);
   digitalWrite(led_low_temp, 0);//high active
  pinMode(led_mid_temp, OUTPUT);
   digitalWrite(led_mid_temp, 0);//high active
  pinMode(led_high_temp, OUTPUT);
   digitalWrite(led_high_temp, 0);//high active
  pinMode(pump, OUTPUT);
   digitalWrite(pump, 1);//low active
  Blynk.syncVirtual(V10);//
  timer.setInterval(1000L,   ReadTemp);
  timer.setInterval(1000L, timecheck);
  timer.setInterval(1500L, watercheck);
  timer.setInterval(1000L,heatwater);

    //-4.ดึงเวลาจากเน็ตมาใช้เปิดปิดไฟ
     configTime(timezone, dst, "pool.ntp.org", "time.nist.gov"); //ดึงเวลาจาก Server
     Serial.println("\nLoading time");
     while (!time(nullptr)) {
           Serial.print("*");
           delay(100);
          }
      Serial.println("");
      Blynk.virtualWrite(V9, 0);
      Blynk.virtualWrite(V7, 0);
       HEATERBLYNK_V0.off();

//  Blynk.syncAll();      

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

}


void ReadTemp()
  {
    sensors.requestTemperatures();

  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
//  float tempC = sensors.getTempCByIndex(0);
  water_temp = sensors.getTempCByIndex(0);// ภาษาไลบรารี่
  if(water_temp != DEVICE_DISCONNECTED_C) 
    {
    Serial.println("สำเร็จ");
    Serial.print("อุณหภูมิน้ำ : ");
    Serial.println(water_temp);
        Blynk.virtualWrite(V1, water_temp);
    //  D0(led_low_temp-แจ้งอุณหภูมิต่ำกว่าหรือเท่ากับ36)
    //  D8(led_mid_temp-แจ้งอุณหภูมิต่ำกว่าหรือเท่ากับ37-38)
    //  D9(led_high_temp-แจ้งอุณหภูมิสูงกว่าหรือเท่ากับ39)
    }
    if (water_temp <= 36)
     {
     digitalWrite(led_low_temp, 1);//high active
     digitalWrite(led_mid_temp, 0);//high active
     digitalWrite(led_high_temp, 0);//high active
     } 
    if ((water_temp >= 37)&&(water_temp <= 38))
     {
     digitalWrite(led_low_temp, 0);//high active
     digitalWrite(led_mid_temp, 1);//high active
     digitalWrite(led_high_temp, 0);//high active
     } 
    if (water_temp >= 39)
     {
     digitalWrite(led_low_temp, 0);//high active
     digitalWrite(led_mid_temp, 0);//high active
     digitalWrite(led_high_temp, 1);//high active
     } 
  else
   {
   Serial.println(" ไม่สามารถอ่านอุณหภูมิได้");
   }
   Serial.print("TempSet_V6= ");
  Serial.println(TempSet_V6);

 }
///////////////////////////////////////////////////////////////////////
void watercheck()
{
  //D3(water_temp_pin),D5(water_level_pin),D6(min_water_level_pin)
    Serial.println(water_temp);
  upper_water_level_pin_D2_value = digitalRead(upper_water_level_pin_D2);      
  Serial.print("upper_water_level_pin_D2_value=");
  Serial.println(upper_water_level_pin_D2_value);
  min_water_level = digitalRead(min_water_level_pin);      
  if(upper_water_level_pin_D2_value == 1) // 1 คือ น้ำระดับสูงสุด  
 {
   Blynk.setProperty(V4,"color","#2EFE2E");// สีเขียว   V4คือระดับน้ำบน
    UPPERWATERLEVELBLYNK.on();
   Serial.print("upper_water_level_pin_D2_value=");
  Serial.println(upper_water_level_pin_D2_value);
   Serial.println("น้ำระดับสูงสุด");
   Serial.println(" ===========");
   waterfull=1;
      Blynk.virtualWrite(V5, "                              ");

   
 }
 else
 {
     Blynk.setProperty(V4,"color","#FF4000");// สีแดง  V4คือระดับน้ำบน
    UPPERWATERLEVELBLYNK.on();
   Serial.print("upper_water_level_pin_D2_value=");
  Serial.println(upper_water_level_pin_D2_value);
   Serial.println("น้ำระดับไม่สูงสุด");
   Serial.println(" ===========");
   waterfull=0; 
   }
//1
///3
  if(min_water_level == 1)// 1 คือ น้ำยังไม่หมดเกลี้ยง

 {
Blynk.setProperty(V3,"color","#2EFE2E");// สีเขียว   V3คือระดับน้ำล่าง
    MINWATERLEVELBLYNK.on();
   Serial.print("min_water_level=");
  Serial.println(min_water_level);
   Serial.println("น้ำยังไม่หมด");
   Serial.println(" ===========");
   waterout=0; 
   Blynk.virtualWrite(V5, "                              ");

 }
 else
 {
     Blynk.setProperty(V3,"color","#FF4000");// สีแดง V3คือระดับน้ำล่าง
    MINWATERLEVELBLYNK.on();
   Serial.print("min_water_level=");
  Serial.println(min_water_level);
   Serial.println("น้ำหมดแล้ว");
   Serial.println(" ===========");
   waterout=1; 
 }

///3
  Serial.print("Temperature=");
  Serial.print(water_temp);
  Serial.println("'C");
    Serial.print("waterfull= ");
  Serial.println(waterfull);
  Serial.print("waterout= ");
  Serial.println(waterout);

}

///////////////////////////////////////////////////

void timecheck()
{
  timeClient.update();

  time_t epochTime = timeClient.getEpochTime();
  
  String formattedTime = timeClient.getFormattedTime();
  Serial.print("Formatted Time: ");
  Serial.println(formattedTime);  

  int currentHour = timeClient.getHours();
  Serial.print("Hour: ");
  Serial.println(currentHour);  
  int 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); 

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

  int 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);
    // Send time to the App
   Blynk.virtualWrite(V11, formattedTime);
  Blynk.virtualWrite(V12, currentDate);
 
}

/////////////////////////////////////////////
void heatwater()
{//void heatwater()
  if (auto_heater_V10==1)//auto==0
  {//if (auto_heater_V10==1)//auto==0
   if((waterfull == 1)&&(waterout == 0)&&(water_temp<TempSet_V6))
   {//if((waterfull == 1)&&(waterout == 0)&&(water_temp<TempSet_V6))
    if(heater_D4_state==0)//ถ้าอยู่ในstate=0 กำลังทำงาน 
     {//if(heater_D4_state==0)//ถ้าอยู่ในstate=0 กำลังทำงาน 
     if  ((millis()-heater_D4_ms_start)<120000)//เช็คว่าเปิด ถึง120000 ms แล้วยัง,ถ้ายังให้เปิดต่อ 
     {//if  ((millis()-heater_D4_ms_start)<120000)//เช็คว่าเปิด ถึง120000 ms แล้วยัง,ถ้ายังให้เปิดต่อ 
      //เปิดต่อ
      digitalWrite(heater_D4,LOW);//low active
      HEATERBLYNK_V0.on();
      Serial.println("เปิดฮีตเตอร์");
      Blynk.virtualWrite(V7, 1);
     }//if  ((millis()-heater_D4_ms_start)<120000)//เช็คว่าเปิด ถึง120000 ms แล้วยัง,ถ้ายังให้เปิดต่อ 
     else//if  ((millis()-heater_D4_ms_start)<120000)//เช็คว่าเปิด ถึง120000 ms แล้วยัง,ถ้ายังให้เปิดต่อ 
     {//else if  ((millis()-heater_D4_ms_start)<120000)//เช็คว่าเปิด ถึง120000 ms แล้วยัง,ถ้ายังให้เปิดต่อ 
      //ให้ปิด และกำหนด ms_last=millis()
       HEATERBLYNK_V0.off();
       digitalWrite(heater_D4, HIGH);//active low
       Serial.println("ปิดฮีทเตอร์");
       Blynk.virtualWrite(V7, 0);
       Blynk.virtualWrite(V7,"offBackColor");//งงมากๆๆ
      heater_D4_ms_Last=millis();
      heater_D4_state=1;
     }//else if  ((millis()-heater_D4_ms_start)<120000)//เช็คว่าเปิด ถึง120000 ms แล้วยัง,ถ้ายังให้เปิดต่อ 
    }//if(heater_D4_state==0)//ถ้าอยู่ในstate=0 กำลังทำงาน 
    else//if(heater_D4_state==0)//ถ้าอยู่ในstate=0 กำลังทำงาน 
    {//else if(heater_D4_state==0)//ถ้าอยู่ในstate=0 กำลังทำงาน 
     if ((millis()-heater_D4_ms_Last)<10000)//
     {//if ((millis()-heater_D4_ms_Last)<10000)//
        //ให้ปิดต่อ
       HEATERBLYNK_V0.off();
       digitalWrite(heater_D4, HIGH);//active low
       Serial.println("ปิดฮีทเตอร์");
       Blynk.virtualWrite(V7, 0);
       Blynk.virtualWrite(V7,"offBackColor");//งงมากๆๆ
     }//if ((millis()-heater_D4_ms_Last)<10000)//
     else//if ((millis()-heater_D4_ms_Last)<10000)//
     {//else if ((millis()-heater_D4_ms_Last)<10000)//ปิดครบแล้วให้เปิด
      heater_D4_ms_start = millis();
      digitalWrite(heater_D4,LOW);//low active
      HEATERBLYNK_V0.on();
      Serial.println("เปิดฮีตเตอร์");
      Blynk.virtualWrite(V7, 1);
      heater_D4_ms_start=millis();
      heater_D4_state=0;
     }//else if ((millis()-heater_D4_ms_Last)<10000)//
     Blynk.virtualWrite(V5, "                              ");
    }//else if(heater_D4_state==0)//ถ้าอยู่ในstate=0 กำลังทำงาน 
   }//if((waterfull == 1)&&(waterout == 0)&&(water_temp<TempSet_V6))
   else//if((waterfull == 1)&&(waterout == 0)&&(water_temp<TempSet_V6))
   {//else if((waterfull == 1)&&(waterout == 0)&&(water_temp<TempSet_V6))
    HEATERBLYNK_V0.off();
    digitalWrite(heater_D4, HIGH);//active low
    Serial.println("ปิดฮีทเตอร์");
    Blynk.virtualWrite(V7, 0);
    Blynk.virtualWrite(V7,"offBackColor");//งงมากๆๆ
//  heater_D4_ms_Last=millis();
    heater_D4_state=1;
      
   }//else if((waterfull == 1)&&(waterout == 0)&&(water_temp<TempSet_V6))

    
  }//if (auto_heater_V10==1)//auto==0
  else//if (auto_heater_V10==1)//auto==0
  {//else if (auto_heater_V10==1)//auto==0
  //ให้เปลี่ยนเป็นระบบออโต้  
         Blynk.virtualWrite(V5, "ให้เปลี่ยนเป็นระบบออโต้       ");

  }//else if (auto_heater_V10==1)//auto==0
}//void heatwater()  
    
/////////////////////////////////////////////
/////////////////////////////////////////////
void heatwater_V7()
{//void heatwater()
  if (auto_heater_V10==0)//auto==0
  {//if (auto_heater_V10==0)//auto==0
   if((waterfull == 1)&&(waterout == 0)&& (water_temp<=38))
    {//if((waterfull == 1)&&(waterout == 0)&& (water_temp<=38))
     if(heater_D4_state==0)//ถ้าอยู่ในstate=0 กำลังทำงาน 
      {//if(heater_D4_state==0)//ถ้าอยู่ในstate=0 กำลังทำงาน 
       if  ((millis()-heater_D4_ms_start)<120000)//เช็คว่าเปิด ถึง120000 ms แล้วยัง,ถ้ายังให้เปิดต่อ 
        {//if  ((millis()-heater_D4_ms_start)<120000)//เช็คว่าเปิด ถึง120000 ms แล้วยัง,ถ้ายังให้เปิดต่อ 
         //เปิดต่อ
         digitalWrite(heater_D4,LOW);//low active
         HEATERBLYNK_V0.on();
         Serial.println("เปิดฮีตเตอร์");
         Blynk.virtualWrite(V7, 1);
        }//if  ((millis()-heater_D4_ms_start)<120000)//เช็คว่าเปิด ถึง120000 ms แล้วยัง,ถ้ายังให้เปิดต่อ 
        else//if  ((millis()-heater_D4_ms_start)<120000)//เช็คว่าเปิด ถึง120000 ms แล้วยัง,ถ้ายังให้เปิดต่อ 
        {//else if  ((millis()-heater_D4_ms_start)<120000)//เช็คว่าเปิด ถึง120000 ms แล้วยัง,ถ้ายังให้เปิดต่อ 
         //ให้ปิด และกำหนด ms_last=millis()
         HEATERBLYNK_V0.off();
         digitalWrite(heater_D4, HIGH);//active low
         Serial.println("ปิดฮีทเตอร์");
//       Blynk.virtualWrite(V7, 0);
         Blynk.virtualWrite(V7,"offBackColor");//งงมากๆๆ
         heater_D4_ms_Last=millis();
         heater_D4_state=1;
         }//else if  ((millis()-heater_D4_ms_start)<120000)//เช็คว่าเปิด ถึง120000 ms แล้วยัง,ถ้ายังให้เปิดต่อ 
        }//if(heater_D4_state==0)//ถ้าอยู่ในstate=0 กำลังทำงาน 
        else//if(heater_D4_state==0)//ถ้าอยู่ในstate=0 กำลังทำงาน 
         {//else if(heater_D4_state==0)//ถ้าอยู่ในstate=0 กำลังทำงาน 
         if ((millis()-heater_D4_ms_Last)<4000)//
          {//if ((millis()-heater_D4_ms_Last)<10000)//
//          Blynk.virtualWrite(V7,"offBackColor");//งงมากๆๆ
            //ให้ปิดต่อ
            HEATERBLYNK_V0.off();
            digitalWrite(heater_D4, HIGH);//active low
            Serial.println("ปิดฮีทเตอร์");
            Blynk.virtualWrite(V7, 0);
            Blynk.virtualWrite(V7,"offBackColor");//งงมากๆๆ
          }//if ((millis()-heater_D4_ms_Last)<10000)//
          else//if ((millis()-heater_D4_ms_Last)<10000)//
       {//else if ((millis()-heater_D4_ms_Last)<10000)//ปิดครบแล้วให้เปิด
        heater_D4_ms_start = millis();
        digitalWrite(heater_D4,LOW);//low active
        HEATERBLYNK_V0.on();
        Serial.println("เปิดฮีตเตอร์");
        Blynk.virtualWrite(V7, 1);
        heater_D4_ms_start=millis();
        heater_D4_state=0;
       }//else if ((millis()-heater_D4_ms_Last)<10000)//
       Blynk.virtualWrite(V5, " เปิดฮีตเตอร์      ");
      
    }//else if(heater_D4_state==0)//ถ้าอยู่ในstate=0 กำลังทำงาน 
   }//if((waterfull == 1)&&(waterout == 0)&&(water_temp<TempSet_V6))
   else//if((waterfull == 1)&&(waterout == 0)&&(water_temp<TempSet_V6))
   {//else if((waterfull == 1)&&(waterout == 0)&&(water_temp<TempSet_V6))
       Blynk.virtualWrite(V7,"offBackColor");//งงมากๆๆ
       Blynk.virtualWrite(V5, "น้ำมีน้อย ปิดฮีตเตอร์");
       Blynk.virtualWrite(V7, 0);
       HEATERBLYNK_V0.off();
     
   }//else if((waterfull == 1)&&(waterout == 0)&&(water_temp<TempSet_V6))

    
  }//if (auto_heater_V10==0)//auto==0
  else//if (auto_heater_V10==0)//auto==0
  {//else if (auto_heater_V10==0)//auto==0
       Blynk.virtualWrite(V7,"offBackColor");//งงมากๆๆ
       Blynk.virtualWrite(V5, "ให้เปลี่ยนเป็นmanualก่อน");
       Blynk.virtualWrite(V7, 0);
       HEATERBLYNK_V0.off();
       Serial.println(" ปิดฮีตเตอร์");

    
  }//else if (auto_heater_V10==0)//auto==0
}//void heatwater() 
/////////////////////////////////////////////
BLYNK_WRITE(V7) //ควบคุมฮีตเตอร์
     {//BLYNK_WRITE(V7) //ควบคุมฮีตเตอร์
       Blynk.virtualWrite(V5, "         ");
      if (param.asInt()==1)
        {
        heatwater_V7();
        }
        else
        {
       Blynk.virtualWrite(V7,"offBackColor");//งงมากๆๆ
       Blynk.virtualWrite(V5, "ปิดฮีตเตอร์      ");
       Blynk.virtualWrite(V7, 0);
       HEATERBLYNK_V0.off();
       Serial.println(" ปิดฮีตเตอร์");
          
        }
      
     }//BLYNK_WRITE(V7) //ควบคุมฮีตเตอร์
////////////////////////////////////////////////
BLYNK_WRITE(V9) //ควบคุมปั๊มน้ำ
 {
      if (param.asInt()==1)
      {
         digitalWrite(pump,waterout);//low active
         if( waterout==0)
         {
            Blynk.virtualWrite(V5, "    ");

         PumpLedBlynk.on();
         delay (10000);
         digitalWrite(pump,HIGH);//low active
         PumpLedBlynk.off();
         }
         else
         {
         Blynk.virtualWrite(V5, "น้ำเกลี้ยงถังแล้ว");
         Blynk.virtualWrite(V9, 0);
        delay (2000);
         }
       }
       else
       {
         digitalWrite(pump,HIGH);//low active
         PumpLedBlynk.off();
        
       }
    }
       
/////////////////////////////////////////////////       
BLYNK_WRITE(V10) //ควบคุมปั๊มน้ำ ออโต้/แมนวล
{//BLYNK_WRITE(V10) //ควบคุมปั๊มน้ำ ออโต้/แมนวล
  if (param.asInt()==1)//1=ทำงาน
  {//if (param.asInt()==1)//1=ทำงาน
    auto_heater_V10=1;
    if(heater_D4_state==0)//กำลังทำงาน
    {
     Blynk.virtualWrite(V7,0);//งงมากๆๆ
     HEATERBLYNK_V0.off();
     digitalWrite(heater_D4, HIGH);//active low
     Serial.println("ปิดฮีทเตอร์");
     heater_D4_state=1;  
    }

  }//if (param.asInt()==1)//1=ทำงาน
  else//if (param.asInt()==1)//1=ทำงาน
  {//else if (param.asInt()==1)//1=ทำงาน
    auto_heater_V10=0;
    
  }//else if (param.asInt()==1)//1=ทำงาน
}//BLYNK_WRITE(V10) //ควบคุมปั๊มน้ำ ออโต้/แมนวล
///////////////////////////////////

28กย65
วันนึ้ทำไฟสำรองนาฬิกา​เรือนที่3
สำหรับตัวแปลง5vเป็น 1.5vdcนั้น
ผมลองใช้ LM317


ตามคลิปนี้
และR1, R2 ตามเว็บนี้

ผมลอง 450 โอห์มและ 100โอห์ม

ผลปรากฏ​ว่า​ ช่วงแรกวัดขาออก 1.3V
ต่อมา เพิ่มเรื่อยๆ จนเป็น 4V?!
เปลี่ยน​Rใหม่ก็เหมือนเดิม
สรุป​แล้ว​ ว่าการใช้ LM317 ของผมยังไม่สำเร็จ​ครับ
฿฿฿฿฿฿฿฿฿฿฿฿฿฿฿฿฿฿฿฿฿฿฿฿
ผมลองทำตามคลิปที่2


ใช้ BC547 Transistor , R 10k 2ตัว
ไฟเข้า ต่อตรงจาก แบต18650 (ห้ามต่อจากไฟออกของโมดูลชาร์เจอร์)​


1.อแดปเตอร์​ 220vac -​>5vdc
2.module charger 5vdc -​> battery​18650
3.BC547 Transistor
4.battery​18650

ผลที่ได้
สำเร็จครับ


฿฿฿฿
เรือนที่4
ใช้ BC547เช่นกันครับ


2ตค65
เรือนที่3 ดับ แม้ว่าจะเสียบปลั๊ก​ก็ตาม​

พอเปลี่ยน​อแดปเตอร์​220vac->5vdc ก็ทำงานได้
สาเหตุ​ อแดปเตอร์​มันเก่าแล้วครับ
xxxxx
เรือนที่4 พอดึงปลั๊กจะดับ

เพราะแบต18650สีแดงก้อนเก่าไม่เก็บไฟ และร้อน เลยเปลี่ยนก้อนเทาใหม่กว่า ดึงปลั๊กไม่ดับแล้ว

฿฿฿