|

Pamięć Eeprom z Arduino

Wbudowana pamięć Eeprom

Wbudowana pamięć EEPROM wynosi 1024 Bajty.

Przykład: Zapisywanie i odczytywanie danych z wbudowanej pamięci EEPROM

#include <EEPROM.h>
int addr = 0;
byte val = 12;

void setup() {
  Serial.begin(9600);
  EEPROM.write(addr, val);
  delay(5);
  int readVal = EEPROM.read(addr);
  Serial.print("Value read from EEPROM: ");
  Serial.println(readVal);
}
void loop() {
}

Przykład: Zapisywanie i odczytywanie danych większych od 1B

#include <EEPROM.h>
const int EEPROM_ADDRESS = 0;

void setup() {
  Serial.begin(9600);
}
void loop() {
  if (Serial.available()) {
    //int dataToWrite = Serial.parseInt();
    String dataToWrite = Serial.readString();
    EEPROM.put(EEPROM_ADDRESS, dataToWrite);
    delay(10);
    //int valueRead;
    String valueRead;
    EEPROM.get(EEPROM_ADDRESS, valueRead);
    Serial.print("Odczytana wartość: ");
    Serial.println(valueRead);
  }
}

Zewnętrzna pamięć Eeprom FM24C256

Zewnętrzna pamięć Eeprom FM24C256 z Arduino
Zewnętrzna pamięć Eeprom FM24C256 z Arduino

Pamięć eeprom posiada domyślny adres I2C: 1010000, który można modyfikować za pomocą pinów A0, A1 i A2.

1010A2A1A0R/W

Ilość komórek pamięci jest znacznie większa od 255, dlatego ich adresowanie odbywa się za pomocą 16bitowego adresu. Dane zapisywane w buforze mogą zajmować maksymalnie 1B, dlatego adres komórek należy rozdzielić na 2 składowe 8 bitowe.

Pamięć FM24C256 jest podzielona na 64 Bajtowe strony, co umożliwia szybsze i łatwiejsze zapisywanie / odczytywanie danych w kolejnych komórkach.

Mając na uwadze maksymalny rozmiar bufora Arduino, tj. 32 Bajty, w jednej operacji można przesłać maksymalnie 2 Bajty adresu i 30 Bajtów danych.

Adresowanie pamięci eeprom Arduino
Adresowanie pamięci eeprom Arduino

Zapisywanie 1 Bajta danych do Eeprom

#include <Wire.h>
#define EEPROM_I2C_ADDRESS 0x50
unsigned int eepromAddress = 0;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  int readData = readEEPROM(eepromAddress);
  Serial.println(readData);
}
void loop() {
  if (Serial.available()) {
    int dataToWrite = Serial.parseInt();
    writeEEPROM(eepromAddress, dataToWrite);
    delay(10);

    int readData = readEEPROM(eepromAddress);
    Serial.print("Odczytana wartość: ");
    Serial.println(readData);
  }
}

void writeEEPROM(unsigned int address, byte data) {
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((int)(address >> 8));    // Wyślij wyższy bajt adresu
  Wire.write((int)(address & 0xFF));  // Wyślij niższy bajt adresu
  Wire.write(data);
  Wire.endTransmission();
  delay(5);
}

byte readEEPROM(unsigned int address) {
  byte rData = 0xFF;
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((int)(address >> 8));    // Wyślij wyższy bajt adresu
  Wire.write((int)(address & 0xFF));  // Wyślij niższy bajt adresu
  Wire.endTransmission();
  // Wire.requestFrom(address, quantity, stop);
  Wire.requestFrom(EEPROM_I2C_ADDRESS, 1);
  if (Wire.available()) rData = Wire.read();
  return rData;
}

Zapisywanie wartości tekstowych do Eeprom

#include <Wire.h>
#define EEPROM_ADDR 0x50   // Adres I2C pamięci EEPROM (7-bitowy adres)
#define BUFFER_SIZE 32     // Maksymalny rozmiar bufora dla I2C

void setup() {
  Wire.begin();
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    String sentence = Serial.readStringUntil('\n');  
    sentence.trim();  
    writeStringToEEPROM(0x0000, sentence.c_str());
    char buffer[BUFFER_SIZE];
    readStringFromEEPROM(0x0000, buffer, BUFFER_SIZE);
    Serial.println(buffer);
  }
}

void writeStringToEEPROM(uint16_t address, const char* str) {
  uint16_t length = strlen(str);
  uint16_t offset = 0;
  while (offset < length) {
    Wire.beginTransmission(EEPROM_ADDR);
    Wire.write((uint8_t)(address >> 8));  // Wysłanie starszego bajtu adresu
    Wire.write((uint8_t)(address & 0xFF));  // Wysłanie młodszego bajtu adresu
    //uint8_t bytesToWrite = min(BUFFER_SIZE - 2, length - offset); 
    uint8_t bytesToWrite = BUFFER_SIZE - 2;  // Odejmujemy 2 bajty dla adresu
    for (uint8_t i = 0; i < bytesToWrite; i++) {
      Wire.write(str[offset + i]);
    }
    Wire.endTransmission();
    delay(5);
    address += bytesToWrite;
    offset += bytesToWrite;
  }
}

void readStringFromEEPROM(uint16_t address, char* buffer, uint16_t bufferLength) {
  uint16_t offset = 0;
  while (offset < bufferLength - 1) {
    Wire.beginTransmission(EEPROM_ADDR);
    Wire.write((uint8_t)(address >> 8));  // Wysłanie starszego bajtu adresu
    Wire.write((uint8_t)(address & 0xFF));  // Wysłanie młodszego bajtu adresu
    Wire.endTransmission();
    uint8_t bytesToRead = min(BUFFER_SIZE, bufferLength - 1 - offset);
    Wire.requestFrom(EEPROM_ADDR, bytesToRead);
    while (Wire.available()) {
      buffer[offset] = Wire.read();
      offset++;
      if (offset >= bufferLength - 1) {
        break;  // Zabezpieczenie przed przepełnieniem bufora
      }
    }
    address += bytesToRead;
  }
  buffer[offset] = '\0';  // Dodanie null terminatora na końcu odczytanego ciągu
}

Podobne wpisy

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *