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

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 เดือน

ไอการที่จะเซฟข้อมูลยาวๆ ผมใช้วิธีทำให้มันเป็น 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.ตอนนี้ใช้ได้แล้ว ครับ…