ค่าใน eeprom ไม่ตรงทำไงดีครับ

ค่าใน eeprom ไม่ตรงทำไงดีครับ

image

EEPROM เก็บค่า Sensor

EEPROM ESP8266 การบันทึกค่าให้เกิน 255

ช่วยแนะนำวิธีเขียน กำหนดค่าการทำงาน ตวามชื้น+อุณหภูมิ ผ่าน slider blynk

Arduino การบันทึกข้อมูล เพื่มนำมาใช้

ตัวแปลใน arduino ide

PZEM-004T V3.0 สอบถามการอ่านค่าตัว kWh ให้สามารถเก็บค่าได้เกิน 9999 ครับ

Atthaphon September 15, 2020, 6:52am #2

#include <EEPROM.h>
int temp_fan[10]     = {98, 29, 16, 17, 26, 35, 42, 49, 56, 63};
int a = 0;

void setup() {

  Serial.begin(9600);
  
  for (int i = 0; i < 10; i++)
  {
    EEPROM.put(i, temp_fan[i]);
  }
  Serial.println("Written float data type!");
}

void loop() {
  /* Empty loop */
}

ส่วนของ การเขียนเข้าไป

Atthaphon September 15, 2020, 6:53am #3

#include <EEPROM.h>
int temp_fan[10]     = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int a = 0;

void setup() {

  Serial.begin(9600);

  for (int i = 0; i < 10; i++)
  {
    EEPROM.get(i, temp_fan[i]);
    Serial.println(temp_fan[i]);
  }
}

void loop() {
  /* Empty loop */
}

การ อ่านออกมา

PUYIOT September 15, 2020, 9:27am #4

ก็ปกตินะครับ หรือผมไม่เข้าใจคำถาม อิ…อิ

#include <EEPROM.h>
int temp_fan[10]     = {98, 29, 16, 17, 26, 35, 42, 49, 56, 63};
int a = 0;

void setup() {

  Serial.begin(9600);





  for (int i = 0; i < 10; i++)
  {
    EEPROM.put(i, temp_fan[i]);
    delay(50);
    EEPROM.get(i, temp_fan[i]);
    Serial.println(temp_fan[i]);
    delay(50);
  }
  Serial.println("Written float data type!");





}

void loop() {
  /* Empty loop */
}

1

Atthaphon September 15, 2020, 10:00am #5

ใส่ delay ไว้ทำไรหรอครับ

Atthaphon September 15, 2020, 10:26am #6

put ถ้าเราเก็บ ทศนิยม เก็บยังไงหรอครับ

PUYIOT September 15, 2020, 2:00pm #7

Delay สำหรับผมใส่เพื่อให้มันมีเวลาเก็บค่าลงในeeprom.แค่นั่นเองครับ​ กันพลาด​ อีกอย่าง​ ลองตั้งค่าตัวแปรจาก​ int เป็น​ float. แล้วใส่ค่าตัวเลขเป็นจุดทศนิยม​ 2 ตำแหน่งดูครับ

#include <EEPROM.h>
float temp_fan[10]     = {98.12, 2.90, 16.56, 1.7, 26.9, 3.45, 4.02, 49.16, 56.36, 6.56};


void setup() {

  Serial.begin(9600);





  for (int i = 0; i < 10; i++)
  {
    EEPROM.put(i, temp_fan[i]);
    delay(50);
    EEPROM.get(i, temp_fan[i]);
    Serial.println(temp_fan[i]);
    delay(50);
  }
  Serial.println("Written float data type!");





}

void loop() {
  /* Empty loop */
}

1

Atthaphon September 16, 2020, 2:14am #8

image

มันไม่ตรงอะครับ งง เลย 55

Remy_Martin (Permpol Thanapunnamas) September 16, 2020, 2:57am #9

@Atthaphon ทำไมไม่ใช้โค้ตที่พี่ @PUYIOT ลงไว้ให้ละครับ โค้ตไม่เหมือนกันเอา ผลลัพธ์มาเปรียบเทียบกันไม่ได้นะครับ Confirm Code ใหม่ครับ

1 Like

PUYIOT September 16, 2020, 3:03am #10

ถ้างั้นลอง เคลียร์ค่าดูมั๊ยครับ อาจจะเป็นไปได้ว่า Esp8266 ตัวอาจโดนใช้แล้ว และยังมีค่าเก่าค้างอยู่

1

Up load เสร็จแล้ว จากนั้นก็เลือกกลับไปเหมือนเดิมครับ

2

Atthaphon September 16, 2020, 3:23am #11

ผมใช้ board UNO อะครับ ตามที่พี่ส่ง code มาให้ค่ามันตรงครับ แต่ ผมอยากลองแยกคนละ for loop แล้วทีนี้พอผมแยกเสร็จมันก็ขึ้นค่าไม่ตรงมันเกิดจากสาเหตุอะไรหรอครับ

Atthaphon September 16, 2020, 3:23am #12

#include <EEPROM.h>
int Day_stage[10]     = {450, 500, 16, 17, 26, 35, 42, 49, 56, 63};
int a = 0;

void setup() {

  Serial.begin(9600);





  for (int i = 0; i < 10; i++)
  {
    EEPROM.put(i, Day_stage[i]);
  }
  for (int a = 0; a < 10; a++)
  {
    EEPROM.get(a, Day_stage[a]);
    Serial.println(Day_stage[a]); 
  }
  Serial.println("Written float data type!");





}

void loop() {
  /* Empty loop */
}

PUYIOT September 16, 2020, 3:29am #13

ลอง Code ที่ให้มา ใน Esp8266 นะครับ ค่าออกมา มัน OK อยู่ครับ ส่วน board UNO ยังไม่เคยลองครับ

1

Atthaphon September 16, 2020, 3:29am #14

ผมไม่มี Esp8266 อะครับ

PUYIOT September 16, 2020, 3:31am #15

ลองดูแบบง่ายๆ ก่อน มั๊ยครับ ว่ามันเก็บค่าตรงหรือปล่าว

#include <EEPROM.h>
byte data1;
byte data2;
void setup() {
  Serial.begin(9600);
  Serial.println("Writing...");
  EEPROM.write(0, 5);
  EEPROM.write(1, 10);

  data1 = EEPROM.read(0);
  data2 = EEPROM.read(1);
  Serial.println(data1);
  Serial.println(data2);
}
void loop() {
}

Atthaphon September 16, 2020, 3:32am #16

image

ตรงครับผม

Remy_Martin (Permpol Thanapunnamas) September 16, 2020, 3:34am #17

มันอาจจะต้อง write ก่อนมา put, get รึป่าวนะ

Atthaphon September 16, 2020, 3:36am #18

image

ตอนแรกผมกะจะใช้ write แต่ผมลืมว่าค่าที่ผมจะเอามาใช้มันเกิน 300 กว่า เลยเก็บไม่ได้

PUYIOT September 16, 2020, 3:43am #19

ลองเปลี่ยนค่าดูครับ 253,254,255,256,257,258,259,600,601,602

ถ้า 1 Address อาจจะรับค่าได้ แค่ 0-255

Atthaphon September 16, 2020, 3:45am #20

image

PUYIOT September 16, 2020, 3:46am #21

ครับตามนั้นเลย

Atthaphon September 16, 2020, 3:46am #22

ควรทำไงให้เก็บได้มากกว่านั้นหรอครับ

PUYIOT September 16, 2020, 3:49am #23

1 Address เก็บค่าได้ 1Byte = 2ยกกำลัง8 =256 ครับ

Remy_Martin (Permpol Thanapunnamas) September 16, 2020, 3:54am #24

ถ้าอยากได้เกินนั้นควรเก็บทีละ Byte ครับ

เขียน

String text_In;

n = 0;
 n = text_In.length(); 
 
  
  Serial.println("writing eeprom text_In:");
          for (int i = 0; i < n; ++i)
            {
              EEPROM.write(i, text_In[i]);
              EEPROM.commit();
              Serial.print("text_In: ");
              Serial.println(text_In[i]); 
            }

โค้ตอ่าน


   Serial.println("Reading EEPROM text_In");
  for (int i = 0; i < 4; ++i) //ระบุต่ำแหน่ง EEPROM ที่เก็บ
    {
      text_In += char(EEPROM.read(i)); // นำค่ามารวมกัน
    }

  Serial.print("text_In: ");
  Serial.println(text_In);

1 Like

PUYIOT September 16, 2020, 4:06am #25

อยากให้ลองดูอีกรอบนะครับ

#include <EEPROM.h>
int data1   = 600;
int data2   = 256;


void setup() {

  Serial.begin(9600);


  EEPROM.put(0, data1);
  EEPROM.put(1, data2);

  EEPROM.get(0, data1);
  Serial.println(data1);
  EEPROM.get(1, data2);
  Serial.println(data2);

Serial.println("Written int data type!");


}

void loop() {
  /* Empty loop */
}

Remy_Martin (Permpol Thanapunnamas) September 16, 2020, 4:12am #26

ภาพ

256 - 256 => 0
257 - 256 => 1
258 - 256 => 2
259 - 256 => 3

600 - 256 = 344 --Step1
344 - 256 = 88 --End

601 - 256 = 345 --Step1
345 - 256 = 89 --End

602 - 256 = 346 --Step1
346 - 256 = 90 --End

Atthaphon September 16, 2020, 4:12am #27

image

PUYIOT September 16, 2020, 4:19am #28

คือมันทำให้ผมสงสัยเรื่อง EEPROM ของ Arduino uno กับ Esp8266 น่ะครับ ว่ามันต่างกันยังไง ค่าใน ESP8266 มันแสดงค่าได้ครับ

1

Atthaphon September 16, 2020, 4:21am #29

อันนี้ผมก็ไม่รู้ครับ 555

PUYIOT September 16, 2020, 4:24am #30

http://fitrox.lnwshop.com/article/61/tutorial-การใช้งาน-eeprom-internal

PUYIOT September 16, 2020, 4:36am #31

ลองดูครับ

#include <EEPROM.h>
int data1   = 600;



void setup() {

  Serial.begin(9600);
  int addrEEPROM = 1;//// จะเริ่มต้นอ่าน/เขียนที่ Address ที่ 1

  EEPROM.put(addrEEPROM, data1);
  addrEEPROM += sizeof(data1);// เลื่อน Address ไปตามขนาดของ data1 กลายเป็น Address ใหม่

   EEPROM.get(addrEEPROM, data1);
  Serial.println(data1);


  Serial.println("Written int data type!");


}

void loop() {
  /* Empty loop */
}

Atthaphon September 16, 2020, 4:42am #32

image

PUYIOT September 16, 2020, 4:53am #33

https://www.google.com/search?q=ค่าใน+eeprom+ไม่ตรงทำไงดีครับ&tbm=isch&ved=2ahUKEwi_o8TjyuXxAhXc4HMBHU3UC7IQ2-cCegQIABAA&oq=ค่าใน+eeprom+ไม่ตรงทำไงดีครับ&gs_lcp=CgNpbWcQDFDinhZY4p4WYO-oFmgAcAB4AIABdYgBdZIBAzAuMZgBAKABAaoBC2d3cy13aXotaW1nwAEB&sclient=img&ei=IW7wYP-OCNzBz7sPzaivkAs&bih=927&biw=1920

elecScreenshot 2022-09-02 113514
โค้ด

#include <EEPROM.h>
byte data1;
byte data2;
void setup() {
  Serial.begin(9600);
  Serial.println("Writing...");
  EEPROM.write(0, 5);
  EEPROM.write(1, 10);

  data1 = EEPROM.read(0);
  data2 = EEPROM.read(1);
  Serial.println(data1);
  Serial.println(data2);
}
void loop() {
  data1 = EEPROM.read(0);
  data2 = EEPROM.read(1);
  Serial.println(data1);
  Serial.println(data2);
}

ทำไมผมได้ค่า 0 เท่านั้น ไม่มีเลยที่เป็น 5 หรือ 10 ครับ

อัพเดต
ผมลองหา library EEPROM.h


ก็มีอยู่ครับ
ไม่ทราบผิดพลาดตรงไหนครับ

มีการประกาศไว้แต่ไม่ได้เรียกใช้ครับ

EEPROM.begin(512);