Sonntag, 11. Januar 2015

Der LDR und die LUX

 Alle meine Wortuhrkreationen haben ja einen LDR, um die Helligkeit der Anzeige an die Umgebungshelligkeit anzupassen.

 Ich habe dazu immer den erst besten LDR bei Reichelt gekauft. Letzthin habe ich mit WS2812B-Stripes und der Wortuhr-Firmware gespielt und festgestellt, daß der LDR irgendwie nicht so richtig will (wie ich es möchte, zumindest).

 Und bin dann auf die Idee gekommen, daß es vielleicht nicht der richtige LDR ist. Es gibt davon nämlich viele, für verschiedene Lichtstärken. Und damit kam die Frage auf: ja welche Lichtverhältnisse habe ich denn?

 Lange Rede, kurzer Sinn: ich liebe Meßgeräte, also habe ich kurzerhand ein LUX-Meter erstanden, und damit im Zimmer, in dem die Uhren typischerweise hängen, gemessen.


 Bisherige Messungen geben vielleicht schon einmal einen Anhaltspunkt:

  • Direktes Sonnenlicht durch 3-fach-Verglasung: 50.000 LUX.
  • Sonniger Vormittag, indirekt hell beleuchtete Wand: 1.200 LUX.
  • Sonniger Vormittag, indirekt dunkler beleuchtete Wand: 500 LUX.
  • Sonniger Wintermittag, kein direktes Sonnenlicht im Zimmer: 385 LUX.
  • Trüber Wintermittag: 110 LUX.
  • Später Nachmittag im Winter, düsteres Licht, reicht zum gemütlichen Essen, nicht zum Arbeiten: 2 (!) LUX.
 Vielleicht hilf das ja dem ein- oder anderen bei der Entscheidung für den 'idealen' LDR weiter.

Freitag, 9. Januar 2015

Die DS1307 und ihre Tücken

 Man glaubt ja immer, mit dem Arduino und den ganzen verfügbaren Beispielen ist das Leben einfach. Ist es meistens auch. Aber eben nicht immer.

 Schauen wir gemütlich die Sekundenanzeige einer Uhr an, die von einer DS1307 und einem Arduino gesteuert wird:



 Eigentlich langweilig, aber da! Bei 1:03 und bei 2:28! Da werden plötzlich 85 Sekunden angezeigt. Umgangssprachlich: WTF?

 Der überall zu findende Code für das Auslesen der DS1307 lautet:

Wire.requestFrom(_address, 7);

_seconds = bcdToDec(Wire.read() & 0x7f);
_minutes = bcdToDec(Wire.read());
_hours = bcdToDec(Wire.read() & 0x3f);
_dayOfWeek = bcdToDec(Wire.read());
_date = bcdToDec(Wire.read());
_month = bcdToDec(Wire.read());
_year = bcdToDec(Wire.read());

 Also: fordere von der DS1307 sieben Bytes an und verarbeite sie dann. Aber das ist eben nicht ganz richtig. Denn wer sagt denn, daß wir auch sieben Bytes bekommen haben?

 Ich habe daraufhin den Code modifiziert, so daß er 99 Sekunden zurück gibt, wenn keine sieben Bytes zurück kommen. Denn das ist der überall mißachtete Rückgabewert der Funktion "Wire.requestFrom()".

 Und siehe da:



 Bei 1:39 werden 99 Sekunden angezeigt! Es werden eben manchmal 7 Bytes angefordert, aber keine 7 Bytes zurück gegeben.

 Die Lösung lautete damit für mich: fordere 7 Bytes an, und wenn Du 7 bekommen hast, verarbeite sie. Aber eben nur dann. Bei mir:

do {
  // Reset the register pointer
  Wire.beginTransmission(_address);
  Wire.write((uint8_t)0x00);
  result = Wire.endTransmission(false); 
  
  count = Wire.requestFrom(_address, 7);
  
  if(count == 7) {
    // Success
    _seconds = bcdToDec(Wire.read() & 0x7f);
    _minutes = bcdToDec(Wire.read());
    _hours = bcdToDec(Wire.read() & 0x3f);
    _dayOfWeek = bcdToDec(Wire.read());
    _date = bcdToDec(Wire.read());
    _month = bcdToDec(Wire.read());
    _year = bcdToDec(Wire.read());
  }
  else {
    // Fail
    for (int i=0; i<count; i++) {
      Wire.read();
    }
    retries++;
  }

  result = Wire.endTransmission(true);
while ((count != 7) && (retries < 8));

Nach 8 Versuchen wird das Ganze abgebrochen. Jetzt zählen die Sekunden sauber und wie sie sollen...


Mittwoch, 7. Januar 2015

Raumgestaltung mit LED-Uhren

  Seit Kurzem sind wir stolzer Besitzer einer LED-Funk-Wanduhr von OCUVIA.

 Diese Uhren sind sehr stylisch, sie zeigen die Zeit mit farbigen, leuchtenden Punkten an.

 Der Sekundenzeiger bewegt sich dabei weich und organisch, was einen fließenden, beruhigenden Effekt gibt.

  Leider hat das anfänglich angestrebte Weihnachts-Rotwein-Rot letztlich doch nicht so gut zu unserem Interieur gepasst.

 Zum Glück kann man in den ersten 30 Tagen das Zifferblatt kostenfrei tauschen.

 Für das neue Zifferblatt nimmt man am Besten das passende Öffnungswerkzeug (Achtung! Die Schrauben haben ein Linksgewinde!). So kann man die Schrauben lösen, ohne das Acrylglas zu verkratzen.

 Jetzt passt das neue Schmuckstück wunderbar zu unserem restlichen Wohnungsinterieur.

 Danke an OCUVIA für diesen Service!

Donnerstag, 1. Januar 2015

Retro-Glasfaser-Lampen...

  ... haben so ihre Tücken. Als Kind war ich in den Einrichtungshäusern sehr beeindruckt von diesen Lampen. Meine Frau auch, darum hat sie sich eine zu Weihnachten gewünscht.

 Mit etwas Glück bekommt man sie auf eBay. Allerdings hat die Leuchtkraft stark nachgelassen, der Reflektor der Halogenlampe war blind und die Acrylglasscheiben matt geworden.

 Ein paar NeoPixel und eine ATMEGA328-MCU später erstrahlt die Lampe wieder in vollem Glanz! Und ist viel stromsparender als vorher.