Beispiel-Code: Interoperatibilität DS18B20 & 24C32

Dieses Beispiel gehört zur Baugruppe: Tiny RTC I2C Module und dient der Veranschaulichung der Interoperatibilität zwischen dem DS18B20 Temperatursensor und dem 24C32 EEPROM. Die Daten des OneWire Temperatursensors werden gelesen und im EEPROM via I2C gespeichert.

Ihr könnt das Beispiel noch erweitern, in dem Ihr das EEPROM mit Sensordaten füllt und danach einen „roll-over“ macht. Interessant wäre dann, sich noch die letzte Speicherposition im EEPROM zu merken, um bei Stromausfall wieder an der richtigen Stelle aufzusetzen. Oder man könnte sich natürlich noch die Uhrzeit mit speichern. Oder, oder, oder … 🙂

Screenshot des seriellen Monitors

DS18x20 and 24C32
//
//    This is a demo, how to use the DS18x20 and the 24C32 EEPROM from an "Tiny RTC I2C module" package all together.
//    Stefan (swarkn) from http://www.do-it-neat.com
//
//    This demo need the following libraries:
//      https://github.com/PaulStoffregen/OneWire
//      https://github.com/Soshimo/I2C-Serial-EEPROM-Arduino-Library
//
//    Please note: I put temperature and EEPROM things appart to better understand and read the code.
//    

// includes
#include <Wire.h>
#include <i2cEEPROM.h>
#include <OneWire.h>

OneWire ds(10);                           // D18x20 Temperature chip i/o on pin 10 at your uno/nano/etc.

// global variables
byte i;                                   // counter
byte data[12];                            // hold read data
byte addr[8];                             // OneWire address of the first DS18x20 found

void setup(void) {
  // start serial port
  Serial.begin(9600);

  //// 
  //// Start DS18x20 setup
  ////
  
  // search address
  ds.reset_search();
  if ( !ds.search(addr)) {
      Serial.print("No more addresses.\n");
      ds.reset_search();
      return;
  }

  // check device address correctness
  Serial.print("R=");
  for( i = 0; i < 8; i++) {
    Serial.print(addr[i], HEX);
    Serial.print(" ");
  }
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!\n");
      return;
  }

  // identify device by ID
  if ( addr[0] == 0x10) {
      Serial.print("Device is a DS18S20 family device.\n");
  }
  else if ( addr[0] == 0x28) {
      Serial.print("Device is a DS18B20 family device.\n");
  }
  else {
      Serial.print("Device family is not recognized: 0x");
      Serial.println(addr[0],HEX);
      return;
  }
  Serial.println();

  ////
  //// Start 24C32 setup
  ////
  i2cEEPROM.begin(0x50);                // start communicating to I2C device 0x50h

}

void loop(void) {

  ////
  //// Do the DS18x20 operations
  ////

  ds.reset();                           // wire reset pulse
  ds.select(addr);                      // select device found in setup phase
  ds.write(0x44,1);                     // command: convert T, with parasite power on at the end

  ds.depower();                         // set DS to low (only in parasite power mode)
  
  ds.reset();                           // wire reset pulse
  ds.select(addr);                      // select device found in setup phase
  ds.write(0xBE);                       // DS18x20 command: read scratchpad

  Serial.print("Read data from DS18x20: ");
  for ( i = 0; i < 9; i++) {            // 9 bytes of scratchpad: 0-1b=temperature, 2-3b=alarm trigger register/user byte 1+2, 4b=configuration register, 5-7b=reserved, 8b=CRC
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
  
  ////
  //// Do the 24C32 operations
  //// 

  Serial.print("Write to EEPROM: ");
  for ( i = 0; i < 9; i++) {            // write the 9 bytes of scratchpad into EEPROM
    i2cEEPROM.writeByte(i,data[i]);     
    Serial.print(i2cEEPROM.readByte(i), HEX);
    Serial.print(" ");
  }
  Serial.println();

  Serial.print("Read from EEPROM: ");
  for ( i = 0; i < 9; i++) {            // read the 9 bytes of scratchpad from EEPROM
    Serial.print(i2cEEPROM.readByte(i), HEX);
    Serial.print(" ");
  }
  Serial.println();
  Serial.println();
  
  ////
  //// wait some time
  //// 
  delay(1000);

}

Viel Spaß damit :),
swarkn

swarkn

swarkn

Stefans Schwerpunkte liegen im Umfeld von Betriebssystemen, serverbasierten Diensten und im weitesten Sinne in allgemeiner technischer Infrastruktur. Tagsüber mit strategischen IT-Themen beschäftigt, tackert er Nachts doch mal gerne ins schwarze Loch.
swarkn
pinterest
swarkn

Autor: swarkn

Stefans Schwerpunkte liegen im Umfeld von Betriebssystemen, serverbasierten Diensten und im weitesten Sinne in allgemeiner technischer Infrastruktur. Tagsüber mit strategischen IT-Themen beschäftigt, tackert er Nachts doch mal gerne ins schwarze Loch.

Ein Gedanke zu „Beispiel-Code: Interoperatibilität DS18B20 & 24C32“

Schreib uns einen Kommentar :)