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

ขอถามคุณ Sarawutว่าใช้กับblynk legacy ได้ไหมครับ

16สค65
วันนี้ผมเริ่มใช้แบบเดิมๆ คือ ใช้ pin IO เท่าที่มีให้ใน nodemcu ถ้าไม่พอก็เพิ่มบอร์ดใหม่ และเพิ่ม blynk auth. ใหม่
เรื่อง ขยายขา IO ด้วย mcp23017 หรือ ใช้ ESP.now ผมยังยำโค้ดไม่เป็น เลยขอหยุดก่อนเรื่องขยายขา IO
ผมดูๆแล้ว ควรใช้ ESP32 ที่มี 38 pin ดีที่สุดครับ จะได้ไม่เปลือง blynk auth.

ใช่ครับ คนละprotocol
แต่ถ้าใช้ esp.now จะต้อง wifi disconnect() ก่อน หรือว่ามันใช้ตัว protocolที่ต้องอาศัย wifi ของมันเฉพาะ…
และตัวส่งสัญญาณมันน่าจะใช้ตัวเดียวกันกับwifi ที่ใช้ต่อเน็ต เลยต้องแก้โดยใช้ ส่งข้อมูลอีกตัวทาง rx,tx(ทางสาย) ให้ตัวgateway (ตัวที่3)

แล้วเวลาเขียนโค้ด 1 task ต้อง เขียนลงใน 3 nodemcu อืม มันซับซ้อน มากน่าดู
แค่ nodemcu 2ตัว ก็ใช้เวลาเป็นวันแล้ว 555
คงใช้ 2 ตัวนั้นดีที่สุดแล้ว แต่แค่รอว่า มีhardware หรือ nodemcu ที่มีรองรับ การใช้ esp.now และ wifi ไปพร้อมๆกันในตัวเดียว อาจเป็นรุ่น nodeMCU ESPX64 ในอนาคตก็ได้ 555

17สค65
วันก่อนเรื่อง ไฟเลี้ยง nodemcu ESP32 สงสัยต่ำไป และได้ใช้ step up ขึ้น 5.5 v ก็ไม่สามารถรันตัว esp32ได้
น่าจะเป็นจากกระแสไม่พอ ดังที่ admin บอก
สาเหตุน่าจาก ถ่าน 18650 มันเสื่อมหรือเปล่า เลยได้สั่ง ถ่านตัวใหม่ ความจุ 3400mAh ก้อนละ99บาทจากลาซาด้า

แทนของเก่า

และมาบัดกรีติดใหม่ ผมใช้2ก้อน ต่อขนานกัน


และต่อกับ มูดูลชาร์เจอร์ และมูดูลชาร์เจอร์1ตัว บอร์ดมันร้อนมากที่ ic ถัดมาจากพอร์ต usb น่าจะเสีย
ตัวอื่นปกติ (ผมใช้มูดูล 3อันต่อขนาน เพื่อชาร์จแบต 2 ก้อนที่ขนานกัน )

  • ในชั่วโมงแรก ที่ใช้ระบบสำรองไฟใหม่นี้ nodemcu8266 รันได้ แต่ s32 ยังไม่ได้ ต้องอาศัย wall charger หรือโน้ตบุ้คถึงจะรันได้
  • สงสัย ไฟในแบต กำลังชาร์จ หรือมีไฟน้อย คงต้องรอดูพรุ่งนี้ว่า s32 พรุ่งนี้สามารถรันด้วยไฟจากแบต 18650หรือไม่
1 Likes

เยี่ยมครับรอติดตามผล

18สค65
ต่อจากเมื่อวาน
เรื่องแบตสำรอง18650
มีnodemcu8266 1ตัว,esp32 1ตัว ต่อเชื่อม แบตชุดนี้อยู่
ผลปรากฏ​ว่า​ 8266ทำงาน แต่esp32ไม่ทำงาน เหมือนกับไฟไม่พอ

ต้องมีไฟจากusb ช่วยesp32ด้วย จึงจะทำงาน
เมื่อวานคิดว่า แบตยังไม่เต็ม รอ24ชั่วโมง​ คือวันนี้​แบตชาร์จเต็มแล้ว (3400mAh x2)​ต่อขนานกัน และต่อเข้า8266, esp32 โดยesp32มีสายusbที่ต่อwall charge ตั้งแต่เมื่อวานแล้ว
และทั้ง2กำลังทำงาน และonlineกับblynkทั้งคู่
ทีนี้ผมลองถอดสายusbจากesp32 เพื่อให้รับไฟจากแหล่งเดียวคือแบต 18650 (ต่อเข้าVin, G) ผลปรากฏ​ว่า​ esp32จะ offline และหยุดการทำงานด้วย ส่วน8266ยังทำงานปกติ แสดงว่าesp32ได้กระแสไฟไม่พอ(วัดโวลต์ได้4.0โวลต์)​
เจอสาเหตุแล้ว
ผมลองเอา**สายไฟขนาด2.5ตร.มม.**แทนที่สายเดิมขนาด1ตร.มม. ที่ออกจากแบตไปยัง esp32 ผลปรากฏ​ว่า​ esp32ทำงานได้แล้ว โดยไม่ต้องใช้ไฟจากusbช่วยเลย


ท่องไว้ 2.5ๆๆๆๆๆๆ
และต้องเอาแบต18650เก่ามาลองใช้กับ สายไฟ2.5ตร.ใหม่ดู
฿฿฿
1กย65
วันนี้​มาอัพเกรด​ระบบไฟสำรอง


ใช้เคสจากช้อปปี้ ราคา120บาท
ใช้กับถ่าน18650 8ก้อน ขนาด1700mAh มือ2 ราคา20บาท รวมค่าส่ง200บาทจากช้อปปี้เหมือนกัน
฿฿฿

ผมแกะบอร์ดออก มีน้อตเล็กๆ2ตัว
เพื่อจะบัดกรีต่อสายไฟ out +/- จากแผงวงจร เพื่อจะได้งานสะดวกยิ่งขึ้น
฿฿฿

หลังใส่แบต วัดโวลท์​ได้ 4vกว่าครับ


หลังต่อเข้าสาย + /- เข้า vcc, gnd ของระบบทั้ง2ตู้(esp32, nodemcu8266)
ลองดึงสายชาร์จเข้าแบตออก ปรากฏ​ว่า​ทั้ง2ระบบไม่ดับครับ
฿฿฿


ใช้ wall charger แบบfast charge ครับ
18กย65
เกิดปัญหา ระบบทั้ง2 ไม่ต่อ Blynk server เมื่อ 2ทุ่ม (3ชั่วโมงที่แล้ว) พอไปดู ปรากฎว่า ไฟฟ้าบ้านไม่ดับ แต่ ไฟในเพาเวอร์แบงค์หมดเกลี้ยง
สาเหตุ เพราะเมื่อวาน(24ชั่วโมงที่ผ่านมา) ผมดึงสายusb ที่ชาร์จเพาเวอร์แบงค์ออก และลืมเส่ียบกลับ
วิธีแก้คือ
1.ใช้สาย usb จาก wall charge เสียบที่ nodemcu เพื่อให้ระบบทำงานพลางๆ
2.ใช้สาย usb จาก wall charge เส้นที่ 2 เสียบชาร์จเพาเวอร์แบงค์
ถ้าไม่ทำข้อ 1 ระบบยังไม่ทำงานทันที เพราะเพาเวอร์แบงค์ไม่มีไฟ ต้องรอชาร์จ ก่อน
3.ไฟ ในเพาเวอร์แบงค์ โชว์ 100% ค่อยดึงสายข้อ 1 ออก ให้เหลือ สายข้อ 2
แสดงว่า เพเวอร์แบงค์นี้สามารภสำรองไฟได้ ประมาณ 25 ชั่วโมงครับ

19/8/65
ตั้งแต่เมื่อวาน ได้ทำโค้ดควบคุมปั๊มน้ำ เพื่อลดความร้อนของโรงเรือน
จริงๆทำให้ง่ายก็ได้ เช่นใช้เงื่อนไขอุณหภูมิอย่างเดียว ปั๊มปิดเปิดได้แล้ว
แต่ผมว่า แบบนั้น ปั๊มจะทำงานนานเกินไป บางที น้ำแห้ง ปั๊มน้ำพังเร็ว จึงให้เปิดตามอุณหภูมิเหมือนกัน
แต่ให้ทำบ้าง หยุดบ้าง ให้เว้นห่างกับคราวก่อนบ้าง เป็นต้น
ผมต้องเพิ่มในblynk button v36 เพื่อ กำหนด auto/manual

BLYNK_WRITE(V36)
{
if (param.asInt()==1)
{
pump_auto_manual_button_v36_state=1;
}
else
{
pump_auto_manual_button_v36_state=0;

}
}

BLYNK_WRITE(V20)
{
if (param.asInt()==1)
{
if (pump_auto_manual_button_v36_state==0 )
{
digitalWrite(hen_water_cooling_pump_pin21, 0);
}
}
else
{
if (pump_auto_manual_button_v36_state==0)
{
digitalWrite(hen_water_cooling_pump_pin21, 1);
}

}
}

มิฉะนั้น จะตีกัน ระหว่าง void blynk กับ void เช็คอุณหภูมิ จำทำให้ ปั๊มทำบ้างหยุดบ้าง
ทำให้มีเงื่อนไข ซ้อนๆ จนเวียนหัว 555
ผมใช้บางพารามิเตอร์จากblynkร่วมด้วย
bool hen_water_cooling_pump_pin21_state
bool pump_auto_manual_button_v36_state (ใช้ blynk เปลี่ยน);
temp_start_hen_pump คือ อุณหภูมิที่ให้เริ่มปั๊มทำงาน(blynk)
open_hen_pump_period คือ ระยะเวลาที่ปั๊มทำงานแต่ละครั้ง(blynk)
pump_not_within_min คือ ระยะห่างจากที่ปั๊มทำงานครั้งสุดท้าย(blynk)
last_hen_pump คือ ค่าmillis()สุดท้ายที่ปั๊มทำงาน
temp_start_hen_pump คือ ค่าmillis()แรกที่ปั๊มทำงาน

ลองผิดลองถูกตั้งนาน กว่าจะได้(มือใหม่ด้วย)

void pump_cooling()

{//hen_water_cooling_pump_pin21_state;temp_start_hen_pump;(pump_not_within_min*60*1000);last_hen_pump
if (pump_auto_manual_button_v36_state==1)
 {
  if (hen_water_cooling_pump_pin21_state==0)
      {
            Serial.println("hen_water_cooling_pump_pin21_state==0");
            Serial.print("เวลาที่พ่นน้ำตอนนี้(วินาที)=");
            int aa=((millis()-temp_start_hen_pump)/1000);
            Serial.println(aa);
            Serial.print("เวลาที่กำหนดไม่เกิน(วินาที)=");
            Serial.println(pump_not_within_min*60);
            Serial.print("เหลือเวลาอีก(วินาที)=");
            Serial.println((pump_not_within_min*60)-aa);
            
         if((millis()-start_hen_pump)<=(open_hen_pump_period*60*1000))
         {
            Serial.print("เปิดปั๊มน้ำ");
          
         }
         else
         {
            Serial.print("ครบเวลา  ปิดปั๊มน้ำ");
            digitalWrite(hen_water_cooling_pump_pin21, 1); 
            last_hen_pump=millis();
            hen_water_cooling_pump_pin21_state=1;
         }
       
      }
  else 
     {
            Serial.println("hen_water_cooling_pump_pin21_state==1");

         if (temperature_hen > temp_start_hen_pump) 
         {
         Serial.print("อุณหภูมิเล้าไก่โต");
         Serial.println(temperature_hen, 1);
         Serial.print("อุณหภูมิที่กำหนดเริ่มเปิดปั๊มน้ำ");
         Serial.println(temp_start_hen_pump, 1);
         Serial.print("เวลาที่ห่างจากพ่นครั้งสุดท้าย(วินาที)=");
         int bb=((millis()-last_hen_pump)/1000);
         Serial.println(bb);
         Serial.print("เวลาที่กำหนดควรห่างอย่างน้อย(วินาที)=");
         Serial.println(pump_not_within_min*60);
         Serial.print("เหลือเวลาอีก(วินาที)=");
         Serial.println((pump_not_within_min*60)-bb);

          if ((millis()-last_hen_pump)>=(pump_not_within_min*60*1000))
          {
            Serial.print("ถึงเวลา  เปิดปั๊มน้ำ");
            digitalWrite(hen_water_cooling_pump_pin21, 0); 
            temp_start_hen_pump=millis();
            hen_water_cooling_pump_pin21_state=0;
            
          }
         }
     }
}    
}

ขนาดของสายไฟ และคุณภาพการนำกระแส เกียวข้องกับเรื่องนี้สินะครับ เยี่ยมเลย

26สค65
ผมได้เก็บเรื่องนี้ค้างไว้คราวก่อน

ผมขออนุญาต​บันทึกไว้เพื่อ​ศึกษา​ในภายหลัง​

ซึ่งต้องมีพื้นฐาน​เกี่ยวกับ​ json
มีหลายแหล่งที่พอจะศึกษา​
1.เป็นภาษาอังกฤษ กล่าวละเอียดมาก แต่เสียดาย​ เราอ่อนภาษาอังกฤษ

พื้นฐาน​การใช้ serial communication
1.eleceasy-เว็บนี้เลยครับ :+1::+1:
2. ภาษาอังกฤษ​
3.ภาษาไทย
4.ภาษาไทย
ที่ผมเข้าใจ ณ ตอนนี้ ผมว่า jsonไม่จำเป็นต้องใช้
เพราะ
ตย. esp32A->esp-now->esp32B->rxtx->esp32C->wifi->Blynk
จะได้การติดต่อแบบเรียลไทม์แล้ว
ผิดถูกขออภัยครับ รอเพื่อนคอมเม้นท์​อีกที

1 Likes

26สค65
ทำสวิงจับไก่ครับ


เป็นไก่บ้านวัยรุ่นตัวผู้อายุ5เดือน หนัก1.9กก.


ให้แม่บ้านทำซุปกิน อร่อยมากครับ
฿฿฿฿฿฿

ภูมิใจ​ได้อาหารคลีนๆครับ

27สค65
โน้ตบุ๊ก​ใหม่มือ2 nec ที่ได้คราวก่อน ใช้ๆได้2สัปดาห์​ เครื่องดับ (น่าจะเสียที่เมนบอร์ด)​ ผมแกะssdเพราะ​ต้องใช้ข้อมูล
แล้วส่งเคลม เพราะ​อยู่​ในประกัน
วันนี้​ได้รับกลับแล้ว
ถอดฝาเพื่อใส่ssdกลับครับ


฿฿฿฿

฿฿฿฿

ssd 120 gb
฿฿฿
ทางร้านไม่บอกว่าเสียอะไร เปลี่ยน​อะไรบ้าง…
฿฿฿

฿฿฿

ใช้ได้แล้วครับ

1 Likes

ดีที่อยู่ในประกันครับ หึหึ

30สค65

esp32 ทำงานค้างครับ
ปกติ ledสีฟ้า ผมกำหนดให้กะพริบครับ
ไม่รู้จากสาเหตุ​ใด?
ต้องมากดรีเซ็ต ก็ทำงานปกติ
หรือว่า ต้องกำหนดเวลาให้รีเซ็ตเอง จะได้ป้องกันการทำงานค้าง?

ใช่ครับ
ประกัน3เดือน

28-29สค65


ได้ทำตู้ฟักไข่ใหม่ แทนลังกระดาษเดิม
โดยมีตาข่ายล้อมรอบ เพราะ​หนูชุมมาก
และปรับปรุงโค้ดใหม่ แก้จุดผิดพลาดของคราวก่อน
วันนี้จะwiringสายและเทสต์ดูครับ

มีทั้ง 5v,12v,24v,220vacครบทุกย่านเลย
฿฿฿฿


ลองเดินเครื่องดู
฿฿฿฿

฿฿฿

฿฿฿
31สค65
ตำแหน่งของ dht11

แบบนี้จะได้ค่าต่ำกว่า​เป็นจริง
฿฿฿


ตั้งตรงนี้จะดีกว่าครับ
฿฿฿฿
เรื่องอากาศหนาวในบางเวลา
บางทีเปิดหลอดไฟ60w 2ดวงแล้ว อุณหภูมิ​ก็ยังไม่ถึง
เพราะ

ช่องระบายอากาศสำหรับพัดลมขนาด4นิ้ว มีทั้ง2ด้าน อาจทำให้มีลมถ่ายเทมากเกินไป
ผมเลยทำเป็นผ้าบางๆ ห้อยหน้าพัดลมไว้

เวลาพัดลมหมุน สามาถที่จะดันผ้าขึ้น และลมไหลผ่านได้

ทำไว้ด้านเดียวครับ
฿฿฿
ปัญหา​ค่าจากdht ไม่ละเอียด
เนื่องจากค่า อุณหภูมิ ที่ต้องเปรียบเทียบ มีทศนิยม 1 ตำแหน่งด้วย ดังโค้ดข้างล่าง

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);// เปิดพัดลม

////

////


    
    }
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);// ปิดพัดลม    
      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);// ปิดพัดลม
      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);// เปิดพัดลม
    
    }


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);// ปิดพัดลม    
      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);// ปิดพัดลม
      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);// เปิดพ่นหมอก
    }


}


ปกติ จะแสดงอุณหภูมิ​และความชื้น​ ตัวเลขหลังจุดทศนิยม ควรมี เช่นxx.1x,
จะสุ่มกันไป แต่จากเครื่องฟักไข่นี้
หลังจุดทศนิยม​เป็น xx.000 เสมอ
มันผิดไป​จาก​ความเป็นจริง

  1. ผม ลองสลับ ตัวdht ที่แสดงค่าปกติ
    มาแทนที่ในเครื่องฟักไข่ สุดท้ายผลออกมาเหมือน​เดิม​
    2.ผมเพิ่มค่า delay(2000);ผลก็เหมือนเดิม
    3.ผม ใช้ void ทั้งหลาย เอาไปอยู่ใน setinterval.timer ผลก็เหมือนเดิม
  2. ตัวแปรอุณหภูมิ​ เป็น floatแล้ว
    5.เพิ่ม pullup 10k ระหว่าง​ data กับ vcc


ผลเหมือนเดิมครับ

ใครพอมีคำแนะนำบ้างครับ

@@@@@@@
18กย65 ตอน5 ทุ่ม
ระบบฟักไข่ ตอนนี้เข้าวันที่ 22 แล้ว แต่ดูในBlynk ทำไมอุณหภูมิ ไข่ที่ฟัก เหลือ 24 องศา ซ. ซึ่งเป็นอันตรายกับการฟักไข่มาก อาจทำให้ลูกไก่ที่กำลังจะฟัก ตายได้ ( ที่ผ่านมาอยู่ที่ 37-38 องศา ซ .ปกติ ตลอด)
สาเหตุ จากผมเขียนโค้ดควบคุมอุณหภูมิ ของระบบฟักไข่ ระบุ วันที่ 1 ถึง 21 ดังนั้น พอเกินจากนั้น ก็ไม่อยู่ในเงื่อนไข เลยไม่มีการควบคุมอุณหภูมิ
วิธีแก้ไข (ไปแก้ที่ฟาร์มตอน5ทุ่ม)แก้ไขโค้ดเป็น ระบบฟักไข่ ระบุ วันที่ 1 ถึง 30 ถ้าเกินจากนี้ถ้าไม่ฟักอีกก็ ถือว่าไข่ใบนั้นเสียครับ
ผล ระบบเริ่มทำงานต่ออีก 8 วัน
และ**คอยลุ้นว่า จะมีลูกไก่ฟักจากระบบนี้หรือไม่**

วิธีแปลง json ให้ เป็นแบบนี้ เพื่อให้ดูเข้าใจง่ายขึ้น

ขอบคุณ​ครับ​ เห็นท่าจะยากเหมือนกัน รอเวลาว่างๆ จะได้ศึกษาจริงจัง​ต่อไปครับ

2กย65
เรื่อง โปรเจ็คฟักไข่ มีเรื่องที่ผมอยากเพิ่มคือ
1.กำหนดวันแรกที่เริ่มฟักไข่ ซึ่งผมทำได้แค่ กำหนด เป็น epoch time เป็น millisecond ซึ่งผมกำหนดเป็น global variation ใน โค้ด
เป็นค่าที่คงที่ และต้องใช้ในการอ้างอิงตลอดการฟักไข่
2. ซึ่ง ถ้าจะแก้วันที่ ต้องแก้ในโค้ดและอัพโหลดใหม่ เท่านั้เน
ถ้าจะแก้ใน blynk ให้เป็นวันอื่น แต่เวลา ไฟดับ และ restart ใหม่ มันจะเรียกวันที่ในข้อ 1. ใหม่
แต่มีวิธีแก้ คือ ให้บันทึก ใน eeprom คือข้อ 4
3.การบันทึก ใน eeprom ผ่าน blynk ต้องสร้างโค้ด ให้สร้างครั้งเดียว แล้วหยุด มิฉะนั้น มันจะสร้างซ้ำๆ อาจทำให้จำนวนครั้งที่จะเขียนeepromหมดเร็ว และเขียนไม่ได้อีก
4.ผมใส่ widget numeric input เป็น epoch time ซึ่ง มันจะสามารถ กดเพิ่มเป็น step ได้ ผมเพิ่ม step ละ 1วัน หรือ 86400000 ms
5.หลังจาก เพิ่มในข้อ 4 ผมอยากให้มันแสดง date time โชว์ widget display value ใน blynk จะได้รู้ว่า เป็นวันที่เราต้องการใหม
ตอนนี้ โค้ด ข้อ 3 ยังไม่เริ่ม อีกครับ เพราะยังไม่เคยทำ
ข้อ 4 ทำแล้ว
ข้อ 5 ก่อน ตอนนี้กำลังค้นหาอยู่ ถ้าเพื่อนมีโค้ดนี้ ช่วยแชร์ด้วยครับ ขอบคุณครับ
อัพเดต
ข้อ 5 ได้แล้วครับ


โค้ด(แก้ไข)

#include <time.h>

const uint64_t epoch = 1662278370136;
unsigned long UNIX_OFFSET ;//= 3;    // 3 days
//unsigned long t_unix_date1, t_unix_date2;
int Length_String; 

void setup() {

}

void loop(){
      time_t t = epoch/1000 + 25200;
    Serial.begin(9600);
    Serial.println(ctime(&t));
    String ttt = ctime(&t);
//    Length_String = Ex_String.length();  // ทำการวัดขนาดของ Ex_String โดยใช้คำสั่ง .length() จากนั้นเก็บไว้ใน Length_String
  Serial.print("Length_String = ");
  Length_String = ttt.length();
  Serial.println(Length_String);  // แสดงผลออกทาง Serial Monitor
delay(500);
}

+25200 คือ โซนประเทศไทย (76060)

2กย.65

เป็นเรื่องใหม่สำหรับผม ได้ศึกษาจากเพื่อนๆ และจากเว๊บไซต์ ได้ความว่า
1.esp8266/esp32 จะใช้ eepromแบบเสมือน คือ อาศัย เนื้อที่บางส่วนของ flash memory ทำให้อายุการใช้งานได้แค่ 1หมื่นครั้ง จะน้อยกว่าบอร์ด arduino ใช้ eeprom จริงๆ ใช้ได้ 1 แสนครั้ง
2.esp8266/esp32 ใช้คำสั่ง EEPROM.begin(n) , n คือความจำที่ต้องการใช้ แต่บอร์ด arduino ไม่ต้องระบุ ต้ว n
3.esp8266/esp32 ใช้คำสั่ง EEPROM.commit() ทุกครั้ง ที่ write แต่ แต่บอร์ด arduino ไม่ต้อง
4.หลัง write , commit ให้ มีคำสั่ง delay ด้วย เพื่อจะได้ทัน

ผมได้ลองโค้ด สำหรับเขียนข้อมูล เล็ก ขนาด 1 byte ทำได้สำเร็จครับ

/*
   EEPROM Write

   Stores values read from analog input 0 into the EEPROM.
   These values will stay in the EEPROM when the board is
   turned off and may be retrieved later by another sketch.
*/

#include <EEPROM.h>

// the current address in the EEPROM (i.e. which byte
// we're going to write to next)
int addr = 0;
byte value;

void setup() {
  Serial.begin(9600);
  EEPROM.begin(512);
  // need to divide by 4 because analog inputs range from
  // 0 to 1023 and each byte of the EEPROM can only hold a
  // value from 0 to 255.
  int val = 100;

  // write the value to the appropriate byte of the EEPROM.
  // these values will remain there when the board is
  // turned off.
  EEPROM.write(300, 299);

  // advance to the next address.  there are 512 bytes in
  // the EEPROM, so go back to 0 when we hit 512.
  // save all changes to the flash.
//  addr = addr + 1;
//  if (addr == 512) {
//    addr = 0;
    if (EEPROM.commit()) {
      Serial.println("EEPROM successfully committed");
    } else {
      Serial.println("ERROR! EEPROM commit failed");
    }
   
    
  delay(100);
}
void loop() {

  

 // read a byte from the current address of the EEPROM
  value = EEPROM.read(300);

  Serial.print(300);
  Serial.print("\t");
  Serial.print(value, DEC);
  Serial.println();

  // advance to the next address of the EEPROM
  addr = addr + 1;

  // there are only 512 bytes of EEPROM, from 0 to 511, so if we're
  // on address 512, wrap around to address 0
  if (addr == 512) { addr = 0; }

  delay(500);
}

คิดว่าใครๆทำได้ไม่ยากครับ

แต่ที่ผมต้องการใช้จริงๆ คือ epoch time ณ เวลานี้ คือ 1662179635157 จำนวน13หลัก ผมลองเทียบเป็นเลข binary

จะได้ 41 บิต หรือ 6 bytes
ซึ่งผมพยายามแกะโค้ดจากหลายแหล่ง มาเขียนeepromแต่ก็ไม่สำเร็จครับ
อยากทราบคำแนะนำจากเพิ่อนๆด้วยครับ

1 Likes

สรุปได้ดีและเป็นจริงทุกข้อครับ หากใครจะเล่น EEPROM จะค้นพบความจริง 4 ข้อนี้ และถ้าใครผ่านมาให้ 4 ข้อนี้ที่นี้ จะลดเวลาเรียนรู้ ลองผิดลองถูกไปอย่างน้อยๆ 2 เดือน