Beispiel-Code: Benutzen des DS1307 NVRAM

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

Letzte Artikel von swarkn (Alle anzeigen)

Dieses Beispiel gehört zur Baugruppe: Tiny RTC I2C Module und dient der Veranschaulichung der allgemeinen Kommunikation mit dem DS1307 (lesen der RAW-Daten) und dem Schreiben der gelesenen Werte in den NVRAM.

Ihr könnt das Beispiel noch erweitern, in dem Ihr den NVRAM mit Sensordaten füllt und danach einen „roll-over“ macht. Interessant wäre auch die Möglichkeit herauszufinden, ob die RTC einen Spannungsverlust erlitten hat. Es gibt noch so viel mehr Möglichkeiten. Aber – so viel Sand und keine Förmchen.

Screenshot des seriellen Monitors

Screenshot_DS1307
//
//    This is a demo, how to use the DS1307 to read the time direct from RAM and write it into the 56 Bytes of NVRAM
//    Stefan (swarkn) from http://www.do-it-neat.com
//
//    This demo need the following libraries:
//      https://github.com/jcw/rtclib
//
//    Please note: i put things a bit appart to better understand and read the code.
//    

// includes
#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC;                           // Set the namespace RTC to DS1307

// global variables
byte i;                                   // counter
byte data[8];                             // hold read data

void setup(void) {

  Serial.begin(9600);                     // start serial port

  ////
  //// Start DS1307 setup
  ////
  Wire.begin();               // start I²C Bus
  RTC.begin();                // start communicating to I2C device 0x68 (DS1307)
  RTC.adjust(DateTime(__DATE__, __TIME__));             // set RTC date and time to compilation time

}

void loop(void) {
 
  ////
  //// Do the DS1307 operations
  //// 

  Serial.print("Read from low RAM (0x00-0x08): ");
  for ( i = 0; i < 8; i++) {            // read 9 bytes of time register into NVRAM
    data[i] = RTC.readByteInRam(i);
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.println();  

  Serial.print("Write to NVRAM (0x08-0x10): ");
  for ( i = 0; i < 8; i++) {            // write the 9 bytes into NVRAM
    RTC.writeByteInRam(i + 0x08,data[i]);
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.println();

  Serial.print("Read from NVRAM (0x08-0x10): ");
  for ( i = 0; i < 8; i++) {            // read the 9 bytes from NVRAM
    Serial.print(RTC.readByteInRam(i + 0x08), HEX);
    Serial.print(" ");
  }
  Serial.println();
  Serial.println();
  
  ////
  //// wait some time
  //// 
  delay(1000);
}

Viel Spaß damit :),
swarkn

pinterest

Beispiel-Code: Interoperatibilität DS18B20 & 24C32

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

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