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
- ที่ผ่านมาเคยชินกับmillis()ในarduino เลยทำให้ผมสับสนเรื่อง epoch timeด้วย
ที่ถูกต้องคือ หน่วยของ epoch time เป็น second ไม่ใช่ millisecond ของ millis()
เลยเข้าป่ามาตลอด 555 มิน่าผลออกมาไม่ตรงสักที
มีผลต่อการกำหนดตัวแปรคือ epoch ใช้ unsigned long แต่ epoch ที่ผมทำเป็นหน่วย ms ต้องใช้ unsigned long long
- ยิ่งเข้าไปในเว๊บนี้
มีคำว่า unix time, epoch time ยิ่งหลงทางไปอีกครับ
เว็บที่ถูกต้องสำหรับ epoch time คือ
https://www.epoch101.com/
วิธีสังเกตง่ายๆคือ ตัวเลข 10หลักครับ ถ้านับได้13หลักแสดงว่าไม่ใช่
- ใช้ 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.ตอนนี้ใช้ได้แล้ว ครับ…