לשמור מידע גם כשהמיקרובקר (NodeMCU – esp8266) כבוי

טכנולוגיה מתקדמת

אז יש לנו בקר, ונניח שהוא מחובר לחיישן טמפרטורה, ואוסף דגימה פעם בחצי שעה, מחובר לספק כוח. ואז… הפסקת חשמל. כשנחבר אותו חזרה, הבקר יחזור לעבוד, אבל כל המידע שנוצר יילך לאיבוד… במדריך זה נדון באפשרות של שימוש בזיכרון הEEPROM על מנת לשמור נתונים חשובים.

אז מה אפשר לעשות במקרה כזה?

  • אפשרות א’: להשאיר את הבקר מחובר למחשב ולהשתמש בפורט הסיריאלי כדי לקרוא את המידע ולהעביר אותו לקובץ
  • אפשרות ב’: במקרה של מיקרובקר שיודע להתחבר לאינטרנט, לשלוח את המידע למסד נתונים מרוחק
  • אפשרות ג’: לשמור את המידע על הבקר עצמו ב”זיכרון הקשיח” שלו – הEEPROM

ספציפית במדריך זה, נדון ביישום של אפשרות ג’.

מהו EEPROM?

ROM הוא סוג של זיכרון שבו משתמשים בקרים ומחשבים. Read Only Memory – מה שרלוונטי לנו הוא שיש לנו סוגים של ROM שניתנים לכתיבה. EEPROM הוא אחד מהם.

למשל, תוכנת הBIOS, התוכנה שקיימת בכל מחשב ומריצה את הפרוצדורות הראשונות, לפני מערכת ההפעלה כתובה על סוג כזה של זיכרון

EEPROM בבקר שלנו – ESP8266 nodeMCU

מי שעוקב אחרי הפרוייקטים בבקרה שאני מתעד כאן באתר יכול לשים לב שאני מאוד אוהב את הNodeMCU. למה? שלוש הסיבות העיקריות הוא בסדר חשיבות עולה: הוא קטן פיזית, יחסית לארדואינו אונו ARDUINO UNO הפופולארי; הוא זול; ויש לו רכיב וויפיי מובנה, שזה קריטי באופן מוחלט לכל פרוייקט IoT שנרצה לבצע.

אז לעבודה

את הספריה הדרושה על מנת לעבוד עם הEEPROM ניתן להוריד כאן – //https://github.com/esp8266/Arduino/blob/master/libraries/EEPROM/EEPROM.h

 

הקוד למחיקה: הפרוצדורה Clear

#include <EEPROM.h>

//Constants
void setup() {
  //Init Serial USB
  Serial.begin(115200);

  delay(1500);
  for (int i=0; i<10 ;i++) {
    Serial.println(".");
    delay(100);  
  }

  EEPROM.begin(512);
  // write a 0 to all 512 bytes of the EEPROM
  for (int i = 0; i < EEPROM.length(); i++) {
    EEPROM.write(i, 0);
  }

  // turn the LED on when we're done
  Serial.println("EEPROM Cleared");
  EEPROM.end();
}

void loop() {
  
  }

 

הקוד לכתיבה, פרוצדורת Write

#include <EEPROM.h>

//Constants
#define EEPROM_SIZE 50

void setup() {
  //Init Serial USB
  Serial.begin(115200);

  delay(1500);
  for (int i=0; i<10 ;i++) {
    Serial.println(".");
    delay(100);  
  }
  
  Serial.println("Initialize System");
  //Init EEPROM
  EEPROM.begin(EEPROM_SIZE);

  //Write data into eeprom
  int address = 0;
  String boardId = "Asaf Asaf";
  EEPROM.put(address, boardId);
  address += sizeof(boardId); //update address value

  float param = 39.2;
  EEPROM.put(address, param);
  address += sizeof(param);
  
  String boardId2 = "Ofra Ofra";
  EEPROM.put(address, boardId2);
  address += sizeof(boardId2);
  
  int teger = 71070;
  EEPROM.put(address, teger);
  
  EEPROM.commit();
  EEPROM.end();
  Serial.println("Commit Ended");
}

void loop() {
  
  }

 

הקוד לקריאה, פרוצדורת Read

#include <EEPROM.h> 
//Constants
#define EEPROM_SIZE 50

void setup() {
  //Init Serial USB
  Serial.begin(115200);
  delay(1500);
  for (int i=0; i<10 ;i++) {
    Serial.println(".");
    delay(100);  
  }
  Serial.println("Initialize System");
  //Init EEPROM
  EEPROM.begin(EEPROM_SIZE);
  int address = 0;
  String readId;
  EEPROM.get(address, readId);
  Serial.print("name = ");
  Serial.println(readId);
  address += sizeof(readId); //update address value
  
  Serial.print("add= ");
  Serial.println(address);
  
  float readParam;
  EEPROM.get(address, readParam);
  Serial.print("Read param = ");
  Serial.println(readParam);
 address += sizeof(readParam); //update address value

    String readId2;
  EEPROM.get(address, readId2);
  Serial.print("name2 = ");
  Serial.println(readId2);
  address += sizeof(readId2); 
  
  int teger = 71070;
  EEPROM.get(address, teger);
  Serial.print("integer = ");
  Serial.println(teger);
  
  EEPROM.end();
  Serial.println("Reading Ended");
}

void loop() {
  
  }

 

לסיכום

אז זהו. נסו בעצמכם. ואם יש שאלות, הגיבו כאן במדריך ואנסה לעזור לכם.

בהצלחה.

לתוכן זה נכתבו 0 תגובות

עליך להתחבר כדי לבצע פעולה זו...

הצטרפות

דילוג לתוכן