ich habe mir ein digitales Schlüsselbrett mit magnetischen iButton gebaut.
Damit kann recht einfach eine Anwesenheit erkannt werden...
Die Idee stammt nicht von mir sondern aus vom KNX-User-Forum http://knx-user-forum.de/forum/supportf ... -ansteuern
Darauf aufmerksam gemacht hat mich dieser Artikel: http://homematic-forum.de/forum/viewtop ... 20#p184704.
Verwendet habe ich:
5 magnetische iButton Holder
5 magnetische iButtons (versch. Farben)
5 4k7 Ohm widerstände (Reichelt)
1 Duo LED (Reichelt)
2 1k Ohm widerstand (Reichel)
1 Arduino mini pro (Wattenrott) kann aber jeder china klon (3$) verwendet werden...
den hatte ich noch rumfliegen und er passte ins das Schlüsselbrett.
1 Schlüsselbrett (ich hab ein 40x40 Buche Kantholz verwendet)
5 Eingänge auf der CCU (ich hatte noch jede Menge Schaltzustandseingänge frei
....deswegen hab ich mich nicht mit der ethernet Anbindung auseinander gesetzt http://homematic-forum.de/forum/viewtop ... 31&t=19304.
Die 1-wire iButton hier bezogen: http://shop.wiregate.de/ibutton.html (schnelle Lieferung. Zur Zeit ausverkauft)
Alternativ gibt es diese günstig hier http://demiurg.pl/ibutton-readers-with-bicolour-led (keine eigenen Erfahrungen)
Die magnetischen Halter verdrahten und an die Eingänge 2-6 anschließen (4k7 Pull-up widerstand nicht vergessen)
Die Ausgänge für die Homematic an die Pins 7-11 (OpenCollector)
Die Status Duo LED an die Ausgänge 12 und 13 (Ich hab nen 1k widerstand benutzt...bei 5V DC gehen auch 200 Ohm, ich wollte es etwas dezenter.
Dann bekommt der Arduino noch 5V DC (Der Minus sollte das gleiche Potential wie die Homematic haben)
Die 1-Wire Libary downloaden und installieren http://www.hacktronics.com/code/OneWire.zip (wenn noch nicht vorhanden)
Den Arduino mit folgendem Script bespielen:
Code: Alles auswählen
#include <OneWire.h>
OneWire ds_1(2); // Pin des 1-Wire Transponders
OneWire ds_2(3); // Pin des 1-Wire Transponders
OneWire ds_3(4); // Pin des 1-Wire Transponders
OneWire ds_4(5); // Pin des 1-Wire Transponders
OneWire ds_5(6); // Pin des 1-Wire Transponders
byte addr_1[8]; // adresse des Transponders
byte addr_2[8]; // adresse des Transponders
byte addr_3[8]; // adresse des Transponders
byte addr_4[8]; // adresse des Transponders
byte addr_5[8]; // adresse des Transponders
int but_1[6] = {0,0,XXX,XXX,XXX,XXX}; // Serien Nr des roten Transponder BENUTZER EINGABE
int but_2[6] = {0,0,XXX,XXX,XXX,XXX}; // Serien Nr. des schwarzen Transponder BENUTZER EINGABE
int but_3[6] = {0,0,XXX,XXX,XXX,XXX}; // Serien Nr. des blauen Transponder BENUTZER EINGABE
int but_4[6] = {0,0,XXX,XXX,XXX,XXX}; // Serien Nr. des gruenen Transponder BENUTZER EINGABE
int but_5[6] = {0,0,XXX,XXX,XXX,XXX}; // Serien Nr. des gelben Transponder BENUTZER EINGABE
int keyStatus_1, keyStatus_2, keyStatus_3, keyStatus_4, keyStatus_5 = 0; // Transponder vorhanden (oder nicht)
boolean T1_ds1, T2_ds1, T3_ds1, T4_ds1, T5_ds1 = 0; // Merker Transponder an Eingang 1 erkannt
boolean T1_ds2, T2_ds2, T3_ds2, T4_ds2, T5_ds2 = 0; // Merker Transponder an Eingang 2 erkannt
boolean T1_ds3, T2_ds3, T3_ds3, T4_ds3, T5_ds3 = 0; // Merker Transponder an Eingang 3 erkannt
boolean T1_ds4, T2_ds4, T3_ds4, T4_ds4, T5_ds4 = 0; // Merker Transponder an Eingang 4 erkannt
boolean T1_ds5, T2_ds5, T3_ds5, T4_ds5, T5_ds5 = 0; // Merker Transponder an Eingang 5 erkannt
void setup(void) { // Hardware funktionen festlegen
//Serial.begin(9600); // Ausgabe Serieller Monitor initialisieren (zur indentifikation der Transpondernummer)
pinMode(7, OUTPUT); // Pin 7 als Ausgang deklariert (roter Transponder)
pinMode(8, OUTPUT); // Pin 8 als Ausgang deklariert (schwarzer Transponder)
pinMode(9, OUTPUT); // Pin 9 als Ausgang deklariert (blauer Transponder)
pinMode(10, OUTPUT); // Pin 10 als Ausgang deklariert (gruener Transponder)
pinMode(11, OUTPUT); // Pin 11 als Ausgang deklariert (gelber Transponder)
pinMode(12, OUTPUT); // Pin 12 als Ausgang deklariert (status LED ROT - nicht anwesend)
pinMode(13, OUTPUT); // Pin 13 als Ausgang deklariert (status LED GRUEN - anwesend)
}
void loop(void) { // Main Programm
getKeyCode(); // Aufruf Unterprogramm
if(keyStatus_1==1){ // Ist ein Transponder vorhanden ->
/*Serial.println("");
byte i; // Aufbereiten der Serien Nr. zur Ausgabe an Seriellen Monitor (indentifikation)
for( i = 5; i >0; i--) {
Serial.print(" : "); // Trennzeichen zwischen bytes
Serial.print(addr_1[i], DEC); // Ausgabe Serien Nr. auf Serien Monitor
}*/
if(addr_1[1] == but_1[5] && addr_1[2] == but_1[4] && addr_1[3] == but_1[3] && addr_1[4] == but_1[2]){ // vergleiche Serien Nr. des schwarzen Transponders
T1_ds1=1;} else {T1_ds1=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des schwarzen Transponder nicht uebereinstimmt
if(addr_1[1] == but_2[5] && addr_1[2] == but_2[4] && addr_1[3] == but_2[3] && addr_1[4] == but_2[2]){ // vergleiche Serien Nr. des roten Transponders
T2_ds1=1;} else {T2_ds1=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des roten Transponder nicht uebereinstimmt
if(addr_1[1] == but_3[5] && addr_1[2] == but_3[4] && addr_1[3] == but_3[3] && addr_1[4] == but_3[2]){ // vergleiche Serien Nr. des blauen Transponders
T3_ds1=1;} else {T3_ds1=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des blauen Transponder nicht uebereinstimmt
if(addr_1[1] == but_4[5] && addr_1[2] == but_4[4] && addr_1[3] == but_4[3] && addr_1[4] == but_4[2]){ // vergleiche Serien Nr. des gruenen Transponders
T4_ds1=1;} else {T4_ds1=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des gruenen Transponder nicht uebereinstimmt
if(addr_1[1] == but_5[5] && addr_1[2] == but_5[4] && addr_1[3] == but_5[3] && addr_1[4] == but_5[2]){ // vergleiche Serien Nr. des gelben Transponders
T5_ds1=1;} else {T5_ds1=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des gelben Transponder nicht uebereinstimmt
}
else {T1_ds1=0;T2_ds1=0;T3_ds1=0;T4_ds1=0;T5_ds1=0;} // Alle angemeldeten Transponder an diesem Pin zuruecksetzen (keyStatus==0)
if(keyStatus_2==1){ // Ist ein Transponder vorhanden ->
if(addr_2[1] == but_1[5] && addr_2[2] == but_1[4] && addr_2[3] == but_1[3] && addr_2[4] == but_1[2]){ // vergleiche Serien Nr. des schwarzen Transponders
T1_ds2=1;} else {T1_ds2=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des schwarzen Transponder nicht uebereinstimmt
if(addr_2[1] == but_2[5] && addr_2[2] == but_2[4] && addr_2[3] == but_2[3] && addr_2[4] == but_2[2]){ // vergleiche Serien Nr. des roten Transponders
T2_ds2=1;} else {T2_ds2=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des roten Transponder nicht uebereinstimmt
if(addr_2[1] == but_3[5] && addr_2[2] == but_3[4] && addr_2[3] == but_3[3] && addr_2[4] == but_3[2]){ // vergleiche Serien Nr. des blauen Transponders
T3_ds2=1;} else {T3_ds2=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des blauen Transponder nicht uebereinstimmt
if(addr_2[1] == but_4[5] && addr_2[2] == but_4[4] && addr_2[3] == but_4[3] && addr_2[4] == but_4[2]){ // vergleiche Serien Nr. des gruenen Transponders
T4_ds2=1;} else {T4_ds2=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des gruenen Transponder nicht uebereinstimmt
if(addr_2[1] == but_5[5] && addr_2[2] == but_5[4] && addr_2[3] == but_5[3] && addr_2[4] == but_5[2]){ // vergleiche Serien Nr. des gelben Transponders
T5_ds2=1;} else {T5_ds2=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des gelben Transponder nicht uebereinstimmt
}
else {T1_ds2=0; T2_ds2=0; T3_ds2=0; T4_ds2=0; T5_ds2=0;} // Alle angemeldeten Transponder an diesem Pin zuruecksetzen (keyStatus==0)
if(keyStatus_3==1){ // Ist ein Transponder vorhanden ->
if(addr_3[1] == but_1[5] && addr_3[2] == but_1[4] && addr_3[3] == but_1[3] && addr_3[4] == but_1[2]){ // vergleiche Serien Nr. des schwarzen Transponders
T1_ds3=1;} else {T1_ds3=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des schwarzen Transponder nicht uebereinstimmt
if(addr_3[1] == but_2[5] && addr_3[2] == but_2[4] && addr_3[3] == but_2[3] && addr_3[4] == but_2[2]){ // vergleiche Serien Nr. des roten Transponders
T2_ds3=1;} else {T2_ds3=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des roten Transponder nicht uebereinstimmt
if(addr_3[1] == but_3[5] && addr_3[2] == but_3[4] && addr_3[3] == but_3[3] && addr_3[4] == but_3[2]){ // vergleiche Serien Nr. des blauen Transponders
T3_ds3=1;} else {T3_ds3=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des blauen Transponder nicht uebereinstimmt
if(addr_3[1] == but_4[5] && addr_3[2] == but_4[4] && addr_3[3] == but_4[3] && addr_3[4] == but_4[2]){ // vergleiche Serien Nr. des gruenen Transponders
T4_ds3=1;} else {T4_ds3=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des gruenen Transponder nicht uebereinstimmt
if(addr_3[1] == but_5[5] && addr_3[2] == but_5[4] && addr_3[3] == but_5[3] && addr_3[4] == but_5[2]){ // vergleiche Serien Nr. des gelben Transponders
T5_ds3=1;} else {T5_ds3=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des gelben Transponder nicht uebereinstimmt
}
else {T1_ds3=0; T2_ds3=0; T3_ds3=0; T4_ds3=0; T5_ds3=0;} // Alle angemeldeten Transponder an diesem Pin zuruecksetzen (keyStatus==0)
if(keyStatus_4==1){ // Ist ein Transponder vorhanden ->
if(addr_4[1] == but_1[5] && addr_4[2] == but_1[4] && addr_4[3] == but_1[3] && addr_4[4] == but_1[2]){ // vergleiche Serien Nr. des schwarzen Transponders
T1_ds4=1;} else {T1_ds4=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des schwarzen Transponder nicht uebereinstimmt
if(addr_4[1] == but_2[5] && addr_4[2] == but_2[4] && addr_4[3] == but_2[3] && addr_4[4] == but_2[2]){ // vergleiche Serien Nr. des roten Transponders
T2_ds4=1;} else {T2_ds4=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des roten Transponder nicht uebereinstimmt
if(addr_4[1] == but_3[5] && addr_4[2] == but_3[4] && addr_4[3] == but_3[3] && addr_4[4] == but_3[2]){ // vergleiche Serien Nr. des blauen Transponders
T3_ds4=1;} else {T3_ds4=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des blauen Transponder nicht uebereinstimmt
if(addr_4[1] == but_4[5] && addr_4[2] == but_4[4] && addr_4[3] == but_4[3] && addr_4[4] == but_4[2]){ // vergleiche Serien Nr. des gruenen Transponders
T4_ds4=1;} else {T4_ds4=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des gruenen Transponder nicht uebereinstimmt
if(addr_4[1] == but_5[5] && addr_4[2] == but_5[4] && addr_4[3] == but_5[3] && addr_4[4] == but_5[2]){ // vergleiche Serien Nr. des gelben Transponders
T5_ds4=1;} else {T5_ds4=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des gelben Transponder nicht uebereinstimmt
}
else {T1_ds4=0; T2_ds4=0; T3_ds4=0; T4_ds4=0; T5_ds4=0;} // Alle angemeldeten Transponder an diesem Pin zuruecksetzen (keyStatus==0)
if(keyStatus_5==1){ // Ist ein Transponder vorhanden ->
if(addr_5[1] == but_1[5] && addr_5[2] == but_1[4] && addr_5[3] == but_1[3] && addr_5[4] == but_1[2]){ // vergleiche Serien Nr. des schwarzen Transponders
T1_ds5=1;} else {T1_ds5=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des schwarzen Transponder nicht uebereinstimmt
if(addr_5[1] == but_2[5] && addr_5[2] == but_2[4] && addr_5[3] == but_2[3] && addr_5[4] == but_2[2]){ // vergleiche Serien Nr. des roten Transponders
T2_ds5=1;} else {T2_ds5=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des roten Transponder nicht uebereinstimmt
if(addr_3[1] == but_3[5] && addr_3[2] == but_3[4] && addr_3[3] == but_3[3] && addr_3[4] == but_3[2]){ // vergleiche Serien Nr. des blauen Transponders
T3_ds5=1;} else {T3_ds5=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des blauen Transponder nicht uebereinstimmt
if(addr_5[1] == but_4[5] && addr_5[2] == but_4[4] && addr_5[3] == but_4[3] && addr_5[4] == but_4[2]){ // vergleiche Serien Nr. des gruenen Transponders
T4_ds5=1;} else {T4_ds5=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des gruenen Transponder nicht uebereinstimmt
if(addr_5[1] == but_5[5] && addr_5[2] == but_5[4] && addr_5[3] == but_5[3] && addr_5[4] == but_5[2]){ // vergleiche Serien Nr. des gelben Transponders
T5_ds5=1;} else {T5_ds5=0;} // Merker ruecksetzen , wenn Serien Nr. nicht mit dem des gelben Transponder nicht uebereinstimmt
}
else {T1_ds5=0; T2_ds5=0; T3_ds5=0; T4_ds5=0; T5_ds5=0;} // Alle angemeldeten Transponder an diesem Pin zuruecksetzen (keyStatus==0)
if (T1_ds1 == 1 | T1_ds2 == 1 | T1_ds3 == 1 | T1_ds4 == 1 | T1_ds5 ==1) { // Pruefe, ob Tranponder 1 vorhanden
digitalWrite(7,LOW);} else {digitalWrite(7,HIGH);} // setze Ausgang 7 auf LOW (OC), wenn dem so ist
if (T2_ds1 == 1 | T2_ds2 == 1 | T2_ds3 == 1 | T2_ds4 == 1 | T2_ds5 ==1) { // Pruefe, ob Tranponder 2 vorhanden
digitalWrite(8,LOW);} else {digitalWrite(8,HIGH);} // setze Ausgang 8 auf LOW (OC), wenn dem so ist
if (T3_ds1 == 1 | T3_ds2 == 1 | T3_ds3 == 1 | T3_ds4 == 1 | T3_ds5 ==1) { // Pruefe, ob Tranponder 3 vorhanden
digitalWrite(9,LOW);} else {digitalWrite(9,HIGH);} // setze Ausgang 9 auf LOW (OC), wenn dem so ist
if (T4_ds1 == 1 | T4_ds2 == 1 | T4_ds3 == 1 | T4_ds4 == 1 | T4_ds5 ==1) { // Pruefe, ob Tranponder 4 vorhanden
digitalWrite(10,LOW);} else {digitalWrite(10,HIGH);} // setze Ausgang 10 auf LOW (OC), wenn dem so ist
if (T5_ds1 == 1 | T5_ds2 == 1 | T5_ds3 == 1 | T5_ds4 == 1 | T5_ds5 ==1) { // Pruefe, ob Tranponder 5 vorhanden
digitalWrite(11,LOW);} else {digitalWrite(11,HIGH);} // setze Ausgang 11 auf LOW (OC), wenn dem so ist
if (digitalRead(7) == 0 | digitalRead(8) == 0 | digitalRead(9) == 0 | digitalRead(10) == 0 | digitalRead(11) == 0) { // Pruefe, ob 1/5 Transpondern vorhanden
digitalWrite(13,HIGH);} else {digitalWrite(13,LOW);} // Setze status LED "anwesend"
if (digitalRead(7) == 1 && digitalRead(8) == 1 && digitalRead(9) == 1 && digitalRead(10) == 1 && digitalRead(11) == 1) { // Pruefe ob KEIN Transponder vorhanden
digitalWrite(12,HIGH);} else {digitalWrite(12,LOW);} // Setze status LED "abwesend"
}
void getKeyCode(){ // Unterprogramm
addr_1[0]=0; // eingelesene Adresse zurueck setzen
ds_1.search(addr_1); // adress suche starten und in byte "addr" schreiben
ds_1.reset_search(); // adress suche stoppen
if (addr_1[0]==0x01){keyStatus_1=1;} // Ist ein Tranponder vorhanden schreibe 1 (Dieser "Merker" ist notwendig,
else keyStatus_1=0; // Andernfalls schreibe 0 ansonsten steht für einen Zyklus eine 0 an)
ds_1.reset(); // Zurücksetzen der 1-Wire Libery ???
addr_2[0]=0; // eingelesene Adresse zurueck setzen
ds_2.search(addr_2); // adress suche starten und in byte "addr" schreiben
ds_2.reset_search(); // adress suche stoppen
if (addr_2[0]==0x01){keyStatus_2=1;} // Ist ein Tranponder vorhanden schreibe 1 (Dieser "Merker" ist notwendig,
else keyStatus_2=0; // Andernfalls schreibe 0 ansonsten steht für einen Zyklus eine 0 an)
ds_2.reset(); // Zurücksetzen der 1-Wire Libery ???
addr_3[0]=0; // eingelesene Adresse zurueck setzen
ds_3.search(addr_3); // adress suche starten und in byte "addr" schreiben
ds_3.reset_search(); // adress suche stoppen
if (addr_3[0]==0x01){keyStatus_3=1;} // Ist ein Tranponder vorhanden schreibe 1 (Dieser "Merker" ist notwendig,
else keyStatus_3=0; // Andernfalls schreibe 0 ansonsten steht für einen Zyklus eine 0 an)
ds_3.reset(); // Zurücksetzen der 1-Wire Libery ???
addr_4[0]=0; // eingelesene Adresse zurueck setzen
ds_4.search(addr_4); // adress suche starten und in byte "addr" schreiben
ds_4.reset_search(); // adress suche stoppen
if (addr_4[0]==0x01){keyStatus_4=1;} // Ist ein Tranponder vorhanden schreibe 1 (Dieser "Merker" ist notwendig,
else keyStatus_4=0; // Andernfalls schreibe 0 ansonsten steht für einen Zyklus eine 0 an)
ds_4.reset(); // Zurücksetzen der 1-Wire Libery ???
addr_5[0]=0; // eingelesene Adresse zurueck setzen
ds_5.search(addr_5); // adress suche starten und in byte "addr" schreiben
ds_5.reset_search(); // adress suche stoppen
if (addr_5[0]==0x01){keyStatus_5=1;} // Ist ein Tranponder vorhanden schreibe 1 (Dieser "Merker" ist notwendig,
else keyStatus_5=0; // Andernfalls schreibe 0 ansonsten steht für einen Zyklus eine 0 an)
ds_5.reset(); // Zurücksetzen der 1-Wire Libery ???
}
Ich bin gespannt ob es noch andere einsetzen und ob das Projekt sich weiter entwickelt...
Gruß
Thomas