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):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include

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.