home
erste Version am 19.11.2016
letzte Änderung am 18.12.2016

RTC+EEPROM-Kombimodul


In Laufe dieser Woche sind drei weitere Module für den Arduino  aus China angekommen.
Jedes Modul enthält eine Uhr mit einem "Digital Temp Sensor" (DS3231) und vier Kilobyte EEPROM-Speicher (AT24C32).
Beide Chips sind via I2C abfrag- bzw. steuerbar.

Der Verkauf erfolgte durch "Well-Goal" und leider wurden die Module nicht, wie in der Spezifikation angegeben, mit einem Akku "LIR2032" geliefert.
Stattdessen war eine Batterie "CR2032" verbaut. Immerhin liefern alle drei Batterien eine Spannung von knapp über 3V - könnten also als "voll" bezeichnet werden.
Nach Ausbau der Batterie und Anschluss des Moduls an 5V habe ich am Batterie-Halter eine Spannung von ca. 4V gemessen.
Will heißen: das Modul enthält eine Lade-Schaltung für den Akku..... nicht so gut, wenn dann statt Akku eine Batterie drin steckt.
Also musste ich erstmal rausfinden, wie ich das Modul für Batterie-Betrieb umbaue.
Der Schaltplan und die jeweilige Position der abzulötenden Teile ist hier dokumentiert.
Oder jetzt auch hier:
Foto vom ungebauten Modul
Ich habe die überflüssige LED (alias D1) und den 200Ω Widerstand (alias R5) abgelötet.
Durch den jetzt fehlenden R5 ist die Lade-Schaltung nicht mehr aktiv bzw. existent.

Für erste Tests fand ich diese Library ganz brauchbar.



Nach Sichtung der der Library beiliegen Beispiel-Programme sah mein erstes Progrämmchen so aus:
#include <DS3231_Simple.h>

DS3231_Simple Clock;

void setup() {
  Serial.begin(115200);
  Clock.begin();
}

void loop() {
  DateTime dt;
  float temp;

  dt=Clock.read();
  temp=Clock.getTemperatureFloat();

  Serial.print("20");
  Serial.print(dt.Year);
  Serial.print(".");
  Serial.print(dt.Month);
  Serial.print(".");
  Serial.print(dt.Day);
  Serial.print(" ");
  Serial.print(dt.Hour);
  Serial.print(":");
  Serial.print(dt.Minute);
  Serial.print(":");
  Serial.print(dt.Second);
  Serial.print("  -  ");
  Serial.print(temp);
  Serial.println("");

  delay(1000);
}

Liefert z.B. folgende Konsolen-Ausgabe, nachdem die Uhr zuvor gestellt wurde:
2016.11.19 11:10:18  -  19.50
2016.11.19 11:10:19  -  19.50
2016.11.19 11:10:20  -  19.50
2016.11.19 11:10:21  -  19.50
2016.11.19 11:10:22  -  19.50
2016.11.19 11:10:23  -  19.50
2016.11.19 11:10:24  -  19.50
[.....]
Nehme ich das Modul in die Hand (um es anzuwärmen), dauert es einige Zeit, bis sich der Temperatur-Wert ändert.
Konkret wird nur alle 64 Sekunden ein neuer Wert geliefert. So steht es zum einen als Kommentar in einem der Beispiel-Programme und deckt sich zum anderen auch mit meiner eigenen Beobachtung.
Gemäß Datenblatt (s.o.) liegt das offenbar daran, dass die Temperatur dazu genutzt wird, "the oscillator frequency every 64 seconds" zu korrigieren....aber weil dieser Messwert nur auf  ±3°C genau ist, will man den wohl eh nicht anderweitig nutzen.

Außerdem habe ich mir seinerzeit zusammen mit diesen Modulen extra noch einen Zehnerpack DS18B20-TemperaturSensoren mit ±0,5°C Abweichung bestellt. Deren Lieferung steht jedoch noch aus. Heute kostet der Zehnerpack bei "Dallas" 16,99€, ich habe (vor fast vier Wochen) bei "AZ-Delivery" für 7,49€ bestellt.

Final soll daraus ein Temperatur- und Helligkeits-Logger werden, der einmal pro Minute ein Wertepaar erfasst, dieses zusammen mit einem Zeitstempel lokal speichert und einmal täglich via WLAN über einen ESP8266 (analog zur Rollladensteuerung) an ein Python-Script meldet, welches die Daten dann in eine SQLite3-Datenbank schreibt.
Sollte sich zeigen, dass die 4KB EEPROM-Speicher nicht reichen, habe ich auch drei SD-Card-Module und (erstmal nur) eine SD-Card mit 16GB bestellt. Da passen dann notfalls auch die gesamten Messwerte für ein ganzes Jahr rauf.


LDRs

Der Zehnerpack LDRs für die Lichtmessung ist bereits vor einiger Zeit angekommen. Die erste Testreihe damit habe ich schon durchgeführt.
Dabei wurden zwei LDRs über AnalogIn-Ports abgefragt - als Spannungsteiler geschaltet, einmal mit 10kΩ und einmal mit 1MΩ in Reihe.
Beschaltung des Arduinos
Programm für den Arduino
Schaltplan 2xLDR

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

void loop() {
  Serial.print(analogRead(0));
  Serial.print("  ");
  Serial.println(analogRead(1));
  delay(1000);
}
Programm für den Raspberry Pi
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import time

dev="/dev/ttyACM0"

term=open(dev, "r+")
while True:
  ln=term.readline().strip()
  if ln!="":
    txt="%s - %s"%(time.strftime("%Y.%m.%d %H:%M:%S"), ln)
    print txt
    log=open("/home/dede/light.log", "a")
    log.write(txt+"\n")
    log.close()

Es kamen folgende Kurven heraus, nachdem die sekündlich protokollierten Daten in das von tun0graf geforderte Format mit einem Wert pro Minute umgewandelt waren (die Oberkante entspricht also 60x1023):
Screenshot der visualisierten
        LDR-Daten
Die Messung erfolgte zwischen "2016.10.30 12:43:00" und "2016.10.31 10:06:00" Ortszeit an der Nordseite unseres Hauses.
Die übersteuerte Kurve wurde zwischen dem LDR gemessen, der mit dem 1MΩ Widerstand in Reihe geschaltet war. Die andere entsprechend mit dem 10kΩ Widerstand.
Zwischen 06:20 und 06:22 sowie zwischen 19:56 und 20:04 sind Blips zu erkennen.
Diese sind dadurch entstanden, dass die Schaltung an der Innenseite des Schlafzimmer-Fensters angebracht war und die Sensoren nicht 100%'ig gegen Licht von innen abgeschottet werden konnten (die Sensoren steckten nur im übrig bleibenden Stück Papp-Rohr einer Rolle Klopapier).
Somit ist die Decken-Beleuchtung im Schlafzimmer zu diesen Zeiten offenbar kurzfristig eingeschaltet gewesen.
Weiterhin ist an den Kurven erkennbar, dass es Ende Oktober um 06:30 Uhr beginnt, hell zu werden und ab 17:30 Uhr wieder dunkel.
Ich bin mir noch nicht ganz schlüssig, welche Kurve bzw. welcher Widerstand sinnvoller ist.
Entweder eine hohe Auflösung bei Dunkelheit - dafür aber völlige Übersteuerung bei Tageslicht.
Oder eben differenzierte Werte über den Tag - mit geringerer Empfindlichkeit bei wenig Licht.

Für sowas wie eine Rollladen-Steuerung wären beide Kurven irgendwie brauchbar.
Weil ich es dafür aber nicht mehr benötige, werde ich mich wohl für den 10kΩ Widerstand entscheiden.