Kategorien
Allgemeine Beiträge Software & Code

Beispiel-Code: Interoperatibilität DS18B20 & 24C32

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
Letzte Artikel von swarkn (Alle anzeigen)

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

pinterest
Kategorien
Allgemeine Beiträge Baugruppen

Tiny RTC I2C Module

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
Letzte Artikel von swarkn (Alle anzeigen)

Hallo zusammen,

ich möchte euch heute gerne das Tiny RTC I2C Module vorstellen. Das Modul selbst dürfte alter Kaffee sein. Ich habe aber festgestellt, dass sich im Internet seit der ersten Veröffentlichung um 2010 wohl so einiges geändert hat. Es tummeln sich jede Menge veralteter Code und Libraries da draußen.

Wir hatten ohnehin vor, die Baugruppen in unserem Besitz auf unserer Seite ins rechte Bild zu setzen. *daumenhoch*

Baugruppe

NameTiny RTC I2C Module
Revisionv1.1
Designhttp://www.dfrobot.com (Waiman)
Herstellerunterschiedlich

Beschreibung

Der hauptsächliche Einsatzzweck des Tiny RTC I2C Modules ist sicherlich die zur Verfügungstellung des aktuellen Datums und Uhrzeit. Das Besondere ist in jedem Fall die integrierte Batterie. Das Datum und Uhrzeit sollte laut dem Designer mindestens 9 Jahre ohne externe Stromversorgung gepuffert werden. Interessant in Schaltungen, welche aus Stromspargründen nur wenige Male am Tag/Monat mit Strom versorgt werden.

Das Package unterstützt Schaltjahre, 12h und 24h Anzeige (abhängig von der verwendeten Bibliothek) und einen Kalender bis ins Jahr 2100. Weiter werden 4k programmierbarer EEPROM Speicher sowie 56Bytes nicht-flüchtigen RAM Speichers zur Verfügung gestellt.

Weitere Besonderheiten sind der Frequenz-Ausgang welcher für externe Schaltvorgänge verwendet werden kann, ein über I2C programmierbares EEPROM, sowie ein digitales Thermometer. Mögliche Taktungen für den Frequenzausgang sind 1, 4, 8 und 32Hz.

Software

Designers Libraryhttp://www.dfrobot.com

Download | Dokumentation

Unsere Empfehlunghttp://jeelabs.org

Download | Dokumentation

Chipsatz

DS130764 x 8, Serial, I²C Real -Time Clock
DS18B201-Wire Digital Thermometer

Sollte kein DS18x20 auf eurem Package verbaut sein, einfach kaufen und auf den Platzhalter löten (s. unten Bilder, Form beachten!).

24C32I2C EEPROM chip

Bilder des Tiny RTC I2C Module

 Das Wiring

Arduino UNO/NanoTiny RTC I2C Modules
GNDGND
5VVCC
analog 4SDA
analog 5SCL
digital 10DS

Original Beispiel-Code

examples/ds1307/ds1307.inohttp://github.com

Screenshot des seriellen Monitors

RTClib_output

Unser Beispiel-Code

Interoperatibilität DS18B20 & 24C32

Benutzen des DS1307 NVRAM

Möglich wären weiter:

Benutzen des 1Hz Frequenz-Ausganges

Viel Spaß!

swarkn

pinterest