Ich war schon lange auf der Suche einer Möglichkeit, Daten zu sammeln und platzsparend speichern zu können, wollte jedoch auf den Einsatz von SD-Karten verzichten.
Im Rahmen eines anderen Projektes, bin ich auf serielle EEPROMS gestoßen für die ich aktuell mein Herz erwärmen kann - im speziellen das AT24C256.
Der Speicher ist zwar nicht sehr groß, eher lachhaft klein, bietet mir aber die Möglichkeit, den Speicher auf dem PCB mit zu verlöten und endlich mal mein Wissen im Bereich I2C aufzubauen, denn das EEPROM benötigt einen I2C Zugriff.
Der Code weist eine kleine Besonderheit auf, der Zugriff auf die 16Bit-Adresse muss in ein MSB und LSB aufgeteilt werden, da das Vollwort nicht funktioniert.
#--------------------------------------------------------------------
# Das Programm schreibt einen Wert in das AT24C256 EEPROM und liest
# ihn zur Kontrolle zurück.
#
# Autor: Oliver Lohse
# Datum: 06.06.2026
#--------------------------------------------------------------------
from machine import Pin, I2C
import time
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=100000) # 100 kHz für Stabilität
EEPROM_ADDR = 0x50 # I2C-Adresse des AT24C256
MEM_ADDR = 0x0010 # Speicheradresse (16 Bit)
value_to_write = 33
#--------------------------------------------------------------------
# 16-Bit-Adresse in MSB und LSB aufteilen
# Schreibvorgang: [Device Address, MSB, LSB, Data]
#--------------------------------------------------------------------
def write_to_eeprom(i2c, addr, mem_addr, data):
mem_addr_msb = (mem_addr >> 8) & 0xFF
mem_addr_lsb = mem_addr & 0xFF
i2c.writeto(addr, bytes([mem_addr_msb, mem_addr_lsb, data]))
time.sleep_ms(50) # Wartezeit für Schreibvorgang
#--------------------------------------------------------------------
# 16-Bit-Adresse in MSB und LSB aufteilen
# Lesevorgang: Zuerst Adresse senden, dann 1 Byte lesen
#--------------------------------------------------------------------
def read_from_eeprom(i2c, addr, mem_addr):
mem_addr_msb = (mem_addr >> 8) & 0xFF
mem_addr_lsb = mem_addr & 0xFF
i2c.writeto(addr, bytes([mem_addr_msb, mem_addr_lsb]))
return i2c.readfrom(addr, 1)[0]
# --- Test: Wert schreiben ---
write_to_eeprom(i2c, EEPROM_ADDR, MEM_ADDR, value_to_write)
print(f"Wert {value_to_write} an {hex(MEM_ADDR)} geschrieben.")
# --- Test: Wert aus Speicher lesen ---
read_value = read_from_eeprom(i2c, EEPROM_ADDR, MEM_ADDR)
print(f"Gelesener Wert (Dezimal): {read_value}")
print(f"Gelesener Wert (Binär)..: {read_value:08b}")
print(f"Gelesener Wert (Hex)....: {read_value:02x}")