Verwendung eines iButton an einem Arduino via OneWire

Seit einiger Zeit habe ich mich mal ein bisschen mit 1-Wire auseinander gesetzt und habe dabei auch mal mit iButtons auf der Basis eines DS1990A (Siehe Übersicht) herumgespielt. Doch was sind iButtons eigentlich?

iButton ist ein Markenname von Dallas Semiconductor bzw. seit 2001 Maxim Integrated. Ein iButton ist ein IC mit einer Eindrahttechnik-Schnittstelle. Die Gehäuse (Microcan F5 (17,35 x 5,89 mm) und das etwas seltenere flache Microcan F3 (17,35 x 3,1 mm)) bestehen aus 0,254 mm dickem Edelstahlblech und ähneln einer Knopfzelle mit 16 mm Durchmesser.
[…]
Allen gemeinsam ist die weltweit einmalige 64-bit-Seriennummer (bestehend aus 8-Bit Family-Code, 48-Bit Nummer (Unique-Device-ID) und 8-Bit Zyklische-Redundanzprüfungs-Prüfsumme) und die OneWire-Schnittstelle.

Quelle

Die Eigenschaft aus dem letzten Satz kann man sich zunutze machen um eine Zuordnung von iButton zu Person oder Gegenstand zu schaffen. Wie sieht das nun aus?
20160808-114642-001-Exp

Dieses Knopfzellenartige Gerät hält man dann auf den Leser, welcher letztendlich nur ein Lesegerät für den eigentlichen iButton ist. Dahinter ist keine Intelligenz, es wird lediglich durchgeleitet, was aufgelegt wird. Der Rand ist dabei Ground und die Mitte die Datenleitung.
20160808-114714-002-Exp

Das ganze mal als Schaltplan mit einem Arduino Mega 2560 und der Verbindung zum Pin 42.
5697-iButton-Arduino

Eigentlich easy, jetzt noch ein bisschen Code dazu (Hier komplett als platformio Projekt):

#include <OneWire.h>
 
OneWire ibutton (42); // iButton connected on PIN 42.
 
byte buffer[8];
 
void setup(){
  Serial.begin(115200);
  Serial.println("Hello"); // print new line
}
 
void loop(){
  // Search for an iButton and assign the value to the buffer if found.
  if (!ibutton.search (buffer)){
     ibutton.reset_search();
     delay(250);
     return;
  }
  // At this point an iButton is found
  Serial.println("1-Wire Device Detected, ID is:");
 
  for (int x = 0; x<8; x++){
    Serial.print(buffer[x],HEX);
    Serial.print(" ");
  }
  Serial.print("\n");
 
  // Check if this is a iButton
  if ( buffer[0] != 0x01) {
    Serial.println("Device is not a iButton");
  } else {
    Serial.println("Device is a iButton");
  }
 
  if ( ibutton.crc8( buffer, 7) != buffer[7]) {
      Serial.println("CRC is not valid!");
  }
  Serial.println("Done.\n\n");  
}

Läuft.

Nutzung von platform.io im Atom Editor zur Entwicklung von Arduino Code

Wenn man viel Arduino Code entwickelt gehen einem schnell die Abhängigkeiten auf den Senkel. Gleichzeitig fragt man sich ob es nicht ein besser integriertes Tool für diese Art der Entwicklung gibt. Ich kann vermelden: Ja gibts 😉
Nutzung von platform.io im Atom Editor zur Entwicklung von Arduino Code weiterlesen