Digitales Schlüsselbrett mit iButtons und Arduino

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

olifall
Beiträge: 79
Registriert: 17.07.2016, 09:48

Re: Digitales Schlüsselbrett mit iButtons und Arduino

Beitrag von olifall » 12.12.2016, 16:10

Hi Bulli,

kannst Du mir sagen, wie ich das im obigen Script hinterlege das der Arduino das sendet?

Gruss Oli

Bulli
Beiträge: 494
Registriert: 29.04.2014, 18:38
Hat sich bedankt: 2 Mal
Danksagung erhalten: 9 Mal

Re: Digitales Schlüsselbrett mit iButtons und Arduino

Beitrag von Bulli » 12.12.2016, 19:27

Hallo
ohne jetzt das Script genau zu kennen. Kannst du folgendes mal zum Testen ändern oder dazu schreiben.

Code: Alles auswählen

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);}



digitalWrite(7,LOW) neu Serial.println("HD10104010000")
digitalWrite(7,HIGH) neu Serial.println("HD10104000000")


Gruß
Bulli

ps ich kann dir bei deinen Vorhaben schon ein paar Tip´s geben. Aber das mußt du schon selber hinbekommen. Mir fehlt die Hardware und das Wissen um sowas nur in der Theorie zu Programmieren :-) :roll:
Und wenn du es fertig hast bitte auch hier schreiben, das hilft dann anderen bei solchen Vorhaben vielleicht auch.

olifall
Beiträge: 79
Registriert: 17.07.2016, 09:48

Re: Digitales Schlüsselbrett mit iButtons und Arduino

Beitrag von olifall » 14.12.2016, 08:55

Hi Bulli,

super vielen Dank, werde ich heute Abend gleich versuchen.

Danke

Gruss Oli

olifall
Beiträge: 79
Registriert: 17.07.2016, 09:48

Re: Digitales Schlüsselbrett mit iButtons und Arduino

Beitrag von olifall » 14.12.2016, 19:11

Hallo Bulli,

bin grad am testen, leider kommt noch nichts in der CCU an. Muss in dem CUXD Setup noch was spezielles eingetragen werden?

Gruss Oli

Bulli
Beiträge: 494
Registriert: 29.04.2014, 18:38
Hat sich bedankt: 2 Mal
Danksagung erhalten: 9 Mal

Re: Digitales Schlüsselbrett mit iButtons und Arduino

Beitrag von Bulli » 15.12.2016, 09:35

Hallo
eigentlich nicht ausser du hast 2 oder mehr Arduinos dran.

USB 1-1 - {CUX} Arduino USB [COMM] - /dev/ttyACM0 {:10s} - connected - Mon Nov 28 15:05:27 2016
dann müßte bei Geräteeinstellungen noch das "ttyACM0" mit rein siehe auch Bild weiter vorne.

Sendet der Arduino überhaupt etwas? Was sieht man in Terminal vom CuxD?
cuxd_terminal.png
Gruß
Bulli

olifall
Beiträge: 79
Registriert: 17.07.2016, 09:48

Re: Digitales Schlüsselbrett mit iButtons und Arduino

Beitrag von olifall » 15.12.2016, 20:10

ja vom Arduino kommen die Signale. Ich habe 4 Buttons konfiguriert, beim einer hängt einer dran deshalb die 1 beim Status. :roll:
Dateianhänge
CUXD.JPG
CUXD.JPG (14.93 KiB) 3595 mal betrachtet

Bulli
Beiträge: 494
Registriert: 29.04.2014, 18:38
Hat sich bedankt: 2 Mal
Danksagung erhalten: 9 Mal

Re: Digitales Schlüsselbrett mit iButtons und Arduino

Beitrag von Bulli » 16.12.2016, 07:04

Hallo
schaut so erst mal gut aus. Zeigt doch mal die Statusseite von CuxD. Bitte aber alles unten sollten die Geräte stehen.
Ist unter Info was zu sehen?

olifall
Beiträge: 79
Registriert: 17.07.2016, 09:48

Re: Digitales Schlüsselbrett mit iButtons und Arduino

Beitrag von olifall » 16.12.2016, 19:14

Hallo Bulli,

hier mal meine komplette Konfiguration.

Gruss Oli
Dateianhänge
CCU2.JPG
CUXD6.JPG
CUXD5.JPG
CUXD4.JPG
CUXD3.JPG
CUXD2.JPG
CUXD2.JPG (29.2 KiB) 3517 mal betrachtet
CUXD1.JPG

olifall
Beiträge: 79
Registriert: 17.07.2016, 09:48

Re: Digitales Schlüsselbrett mit iButtons und Arduino

Beitrag von olifall » 18.12.2016, 10:06

Hallo für diejenigen die das digitale Schlüsselbrett auch nachbauen wollen, hier die Einstellungen wie es bei mir funktioniert hat.

1. Arduino (Arduino UNO) muss folgendes senden: HD10104010000 (offen) HD10104000000 (geschlossen)
2. Gerät im CUXD (16) HMS 100 TFK
3. Ganz wichtig noch der Eintrag im CUXD Setup: TTYASSIGN=ttyACM0:CUX
4. In der CCU -> Gerät -> Einstellungen: device = ttyACM0 ID = D101 wichtig.


Und hier noch das Arduino Sketch das bei mir funktioniert:

#include <OneWire.h>

OneWire onewire_Bus(2); // 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

int but_1[6] = {0,0,22,76,108,104}; // Serien Nr des roten Transponder BENUTZER EINGABE
int but_2[6] = {0,0,024,025,026,027}; // Serien Nr. des schwarzen Transponder BENUTZER EINGABE
int but_3[6] = {0,0,021,022,030,031}; // Serien Nr. des blauen Transponder BENUTZER EINGABE
int but_4[6] = {0,0,032,033,034,035}; // Serien Nr. des gruenen Transponder BENUTZER EINGABE

int keyStatus_1, keyStatus_2, keyStatus_3, keyStatus_4 = 0; // Transponder vorhanden (oder nicht)

boolean T1_ds1, T2_ds1, T3_ds1, T4_ds1 = 0; // Merker Transponder an Eingang 1 erkannt
boolean T1_ds2, T2_ds2, T3_ds2, T4_ds2 = 0; // Merker Transponder an Eingang 2 erkannt
boolean T1_ds3, T2_ds3, T3_ds3, T4_ds3 = 0; // Merker Transponder an Eingang 3 erkannt
boolean T1_ds4, T2_ds4, T3_ds4, T4_ds4 = 0; // Merker Transponder an Eingang 4 erkannt
boolean T1_ds5, T2_ds5, T3_ds5, T4_ds5 = 0;


void setup(void) { // Hardware funktionen festlegen
Serial.begin(9600); // Ausgabe Serieller Monitor initialisieren (zur indentifikation der Transpondernummer)
}

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 = 4; i >0; i--) {
Serial.print(" : "); // Trennzeichen zwischen bytes
Serial.print(addr_1, 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 // 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;} // 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} // 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; } // 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
// 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; } // 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
// 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; } // Alle angemeldeten Transponder an diesem Pin zuruecksetzen (keyStatus==0)

// Alle angemeldeten Transponder an diesem Pin zuruecksetzen (keyStatus==0)
Serial.println("");
if (T1_ds1 == 1 | T1_ds2 == 1 | T1_ds3 == 1 | T1_ds4 == 1 | T1_ds5 ==1) { // Pruefe, ob Tranponder 1 vorhanden
Serial.println("HD10104000000");} else {Serial.println("HD10104010000");}

if (T2_ds1 == 1 | T2_ds2 == 1 | T2_ds3 == 1 | T2_ds4 == 1 | T2_ds5 ==1) { // Pruefe, ob Tranponder 2 vorhanden
Serial.println("HD10204000000");} else {Serial.println("HD10204010000"); }

if (T3_ds1 == 1 | T3_ds2 == 1 | T3_ds3 == 1 | T3_ds4 == 1 | T3_ds5 ==1) { // Pruefe, ob Tranponder 3 vorhanden
Serial.println("HD10304000000");} else {Serial.println("HD10304010000"); }

if (T4_ds1 == 1 | T4_ds2 == 1 | T4_ds3 == 1 | T4_ds4 == 1 | T4_ds5 ==1) { // Pruefe, ob Tranponder 4 vorhanden
Serial.println("HD10404000000");} else {Serial.println("HD10404010000"); }
delay(1000);
}

void getKeyCode(){ // Unterprogramm

addr_1[0]=0; // eingelesene Adresse zurueck setzen
onewire_Bus.search(addr_1); // adress suche starten und in byte "addr" schreiben
onewire_Bus.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)
onewire_Bus.reset(); // Zur�cksetzen der 1-Wire Libery ???

addr_2[0]=0; // eingelesene Adresse zurueck setzen
onewire_Bus.search(addr_2); // adress suche starten und in byte "addr" schreiben
onewire_Bus.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)
onewire_Bus.reset(); // Zur�cksetzen der 1-Wire Libery ???

addr_3[0]=0; // eingelesene Adresse zurueck setzen
onewire_Bus.search(addr_3); // adress suche starten und in byte "addr" schreiben
onewire_Bus.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)
onewire_Bus.reset(); // Zur�cksetzen der 1-Wire Libery ???

addr_4[0]=0; // eingelesene Adresse zurueck setzen
onewire_Bus.search(addr_4); // adress suche starten und in byte "addr" schreiben
onewire_Bus.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)
onewire_Bus.reset(); // Zur�cksetzen der 1-Wire Libery ???
}

olifall
Beiträge: 79
Registriert: 17.07.2016, 09:48

Re: Digitales Schlüsselbrett mit iButtons und Arduino

Beitrag von olifall » 19.01.2017, 18:56

Hallo ich hätte eine Frage an die Elektroniker. :-)

Ich bin fast fertig mit dem Schlüsselbrett, doch leider habe ich noch ein Problem. Wenn ich 3 Buttons direkt am Arduino anschliesse funktioniert alles wunderbar.
Doch wenn ich einen vierten anschliesse geht einer nicht. Jetzt habe ich noch festgestellt das wenn ich alles über die Hausinstallation anschliesse, geht immer nur einer.

Angeschlossen habe ich alle in Reihe, mit einem 10k Widerstand zwischen 5V und Anschlussport. Am Anfang von diesem Thread ist die Rede von einem 4,7k Widerstand, kann das das Problem sein?
Oder kann es sein, das die Leitung zu lang ist und der Strom für 4 Buttons zu wenig ist?

Leider kenne ich mich mit Widerständen und dem Strom nicht so genau aus, kann mir da jemand helfen?

Gruss Oli

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“