Türöffnung mit mehreren iButton

Hallo liebe Arduinogemeinde.

leider habe ich noch nicht so viel Ahnung was Arduino-Programmierung angeht. OK ich habe eigentlich gar keine Ahnung… :-*

dennoch habe ich vor ein kleines Projekt zu basteln. einen Türöffner mit iButtons. irgendwo im Internet habe ich auch schon einen Code gefunden, der genau das auf meinem Arduino Nano macht was ich möchte. nur leider bekomme ich es nicht hin weitere iButtons hinzuzufügen. in Zeile 5 kann man die ID eingeben. Ich benötige aber eben mehr als eine ID. Für solche Profis wie Euch alle ist das sicher lächerlich schleim. Kann mich hier vielleicht einer von euch unterstützen?

vielen vielen Dank.

LG Marco

ach so, hier der Code:

#include <OneWire.h>

OneWire ibutton (2); // I button connected on PIN 2.

byte ibuttonid[10] = {1,144,74,165,21,0,0,143}; // Ibutton ID must be typed in Decimal in the following order: Family code (01 for DS1990); numbers from R. to L.; CRC. 
byte buffer[10]; //array to store the readed Ibutton ID.

boolean result;  // this variable will hold the compare result

int doorpin = 13; // the output pin to activate the door.

void setup(){
    Serial.begin(9600); 
    pinMode(doorpin,OUTPUT);
   
}

void loop(){
   
 if (!ibutton.search (buffer)){//read attached ibutton and asign value to buffer
    ibutton.reset_search();
    delay(200);
    return;
 }
  
  for (int x = 0; x<8; x++){  
    Serial.print(buffer[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) 
    Serial.print(" "); // print a space
   }
   Serial.println("\n"); // print new line
   
   // compare the ibutton id
   
  result = true; // set variable equal to one.
  for (int x=0; x<10; x++){ 
  int compare1 = ibuttonid[x];// asign each index of arrays to test, one by one and compare
  int compare2 = buffer[x];
  
  
  if(compare1 != compare2){ // if any index comparison is not equal, then the arrays are not equal and result will be 0.
   result = false; 
  }
  
  }
  if(result == true){ // if the arrays are equal, do something.
   Serial.println("Door open for 5 seconds."); 
   digitalWrite(doorpin,HIGH); // Turn on LED on pin 13 (build-in on the Arduino board)
   delay(5000); // wait five seconds. (1 second = 1000 milliseconds)
   Serial.println("Door closed");
   digitalWrite(doorpin,LOW); // turn off LED.
 }
   
    //set buffer back to cero.
    
    for (int x=0; x<10; x++){
     buffer[x] = 0 ;
    }                
}

Was genau verstehst du unter "iButton" ?

Und setze den Sketch bitte in Code-Tags, nicht in Quote-Tags. Du kannst es noch nachträglich ändern, in dem du "Quote" in "code" änderst.

Danach stimmt auch die Formatierung und der Sketch ist besser lesbar.

Damit sind vermutlich nur Taster gemeint, die über OneWire arbeiten.

Entschuldigung, habe meinen Fehler korrigiert. :-[

IButtons sind Knopfzellengroße "Schlüssel" jeder hat eine Weltweit einzige ID und eben von genau diesen ID´s muss ich mehrere in dem Code unterbringen, da ich die Tür ja nicht nur mit einem Schlüssel öffnen will, sondern eben mit Mehreren. Sobald der Chip den reader berührt, wird die ID erkannt und eben die Tür geöffnet oder nicht.

Wiki IButton

LG Marco

Sollen das RFID Tags sein?

Ich sehe es auch so, es sind RFID-Tags.

Um den Umfang zu erweitern, musst du das ID-Array um die entsprechenden Schlüssel erweitern.

const byte SCHLUESSEL = 3;  // Anzahl der gültigen Schlüssel
byte ibuttonid[SCHLUESSEL][10] = {{1, 144, 74, 165, 21, 0, 0, 143}, {2, 144, 74, 165, 21, 0, 0, 143}, {3, 144, 74, 165, 21, 0, 0, 143}}; // hier ein zweidimensionales Feld

Vergleich:

  // compare the ibutton id

  result = false;
  for (int b = 0; b < SCHLUESSEL; b++) {
    tempresult = true;
    int x = 0;
    do {
      int compare1 = ibuttonid[b][x];// asign each index of arrays to test, one by one and compare
      int compare2 = buffer[x];
      if (compare1 != compare2) { // if any index comparison is not equal, then the arrays are not equal and result will be 0.
        tempresult = false;
      }
      x++;
    } while (tempresult && (x < SCHLUESSEL));
    if (tempresult) {
      b = SCHLUESSEL;
      result = true;
    }
  }
  if (result == true) { // if the arrays are equal, do something.
    Serial.println("Door open for 5 seconds.");
    digitalWrite(doorpin, HIGH); // Turn on LED on pin 13 (build-in on the Arduino board)
    delay(5000); // wait five seconds. (1 second = 1000 milliseconds)
    Serial.println("Door closed");
    digitalWrite(doorpin, LOW); // turn off LED.
  }

Klaus_ww: Sollen das RFID Tags sein?

Nein sind keine RFID-TAGS (Radio Frequenz) sondern ein TAG in Knopfzellenformat mit 2 Kontakten der über einen "kabelgebunden" OneWire Bus ausgelesen / programmiert werden.

Die Funktion ist identisch, die Ausleseelektronik ist anders. man bekommt einen eindeutigen ID.String/Zahl.

Wie agmue schreibt du kontrollierst nicht nur 1 gültigen Schlüssel sondern die vom IButton bekommene ID mit allen gültigen Schlüsseln. Grüße Uwe

Vielen Dank agmue,

dank Copy&Paste macht der Arduino jetzt genau das was ich möchte. Du hast mir echt ne menge Zeit gespart. Werde mich jetzt mal langsam ans Arduino Programmieren rantasten.

marcospunkt: Werde mich jetzt mal langsam ans Arduino Programmieren rantasten.

Gute Idee.

Ich muss hier leider doch noch mal eine Frage stellen, da ich leider keinen Lösungsansatz finde.

Das Sketch oben funktioniert jetz super, aber ich benötige eine Möglichkeit 2 Ausgänge abwechsend anzusteuern, also: freigabe-> Relais1 schaltet für eine Sekunde. erneute Freigabe -> Relais 2 schaltet für eine Sekunde dann wieder Relais 1 usw. ist das überhaupt möglich? :-[

LG Marco

ist das überhaupt möglich

Natürlich. Wenn du dir merkst, welches Relais beim letzten Mal dran war.

const byte doorpin[2] = {13, 12 };  // Zwei Relais die abwechselnd für 1 sec geschaltet werden sollen
...

  if (result == true) { // if the arrays are equal, do something.
    static boolean relaisindex;
    Serial.print(relaisindex? "Relais 1" : "Relais 2");
    digitalWrite(doorpin[relaisindex], HIGH); // Eines der beiden Relais schalten
    delay(1000); // wait 1 second = 1000 milliseconds
    Serial.println("  geschaltet");
    digitalWrite(doorpin[relaisindex], LOW); // Relais wieder aus
    relaisindex = ! relaisindex; // beim nächsten Mal das andere Relais
  }

So, der Sketch sieht jetzt so aus:

#include <OneWire.h>

OneWire ibutton (2); // I button connected on PIN 2.

const byte SCHLUESSEL = 3;  // Anzahl der gültigen Schlüssel
byte ibuttonid[SCHLUESSEL][10] = {{1,111,11,111,11,0,0,111}, {1,111,11,111,11,0,0,112}, {1,111,11,111,11,0,0,113}}; // hier ein zweidimensionales Feld 
byte buffer[10]; //array to store the readed Ibutton ID.

boolean result;  // this variable will hold the compare result

const byte doorpin[2] = {13, 9 }; // the output pin to activate the door.


void setup(){
    Serial.begin(9600);
    pinMode(doorpin[2],OUTPUT);
   
}

void loop(){
   
 if (!ibutton.search (buffer)){//read attached ibutton and asign value to buffer
    ibutton.reset_search();
    delay(200);
    return;
 }
  
  for (int x = 0; x<8; x++){  
    Serial.print(buffer[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) 
    Serial.print(" "); // print a space
   }
   Serial.println("\n"); // print new line
   
   // compare the ibutton id
   
  result = false;
  for (int b = 0; b < SCHLUESSEL; b++) {
    result = true;
    int x = 0;
    do {
      int compare1 = ibuttonid[b][x];// asign each index of arrays to test, one by one and compare
      int compare2 = buffer[x];
      if (compare1 != compare2) { // if any index comparison is not equal, then the arrays are not equal and result will be 0.
        result = false;
      }
      x++;
    } while (result && (x < SCHLUESSEL));
    if (result) {
      b = SCHLUESSEL;
      result = true; 
  }
  
  }
  if (result == true) { // if the arrays are equal, do something.
    static boolean relaisindex;
    Serial.print(relaisindex? "Relais 1" : "Relais 2");
    digitalWrite(doorpin[relaisindex], HIGH); // Eines der beiden Relais schalten
    delay(1000); // wait 1 second = 1000 milliseconds
    Serial.println("  geschaltet");
    digitalWrite(doorpin[relaisindex], LOW); // Relais wieder aus
    relaisindex = ! relaisindex; // beim nächsten Mal das andere Relais
  }
   
    //set buffer back to cero.
    
    for (int x=0; x<10; x++){
     buffer[x] = 0 ;
    }                
}



/* by Elimeléc 
  Jun-07-2013
*/

Das Wechseln funktioniert auch, aber die Relais schalten nicht. Wenn ich Pin 13 nehme, leuchtet die LED und das Relais schaltet, aber bei den anderen Pins geht gar nichts.

Hallo, wenn das hin- und herschalten nicht funktioniert, dann nehme doch ne´ Lib dafür. Gruß und Spaß Andreas

Tipp zum elektr. Türöffner selbst (ich denke mal, dass du sowas mti den Relais aktivierst), da ich das selbe Projekt mit RFIDs vor habe: es gibt welche, die nach einem Stromstoß so lange offen bleiben, bis einer die Tür auf macht. D.h. du brauchst keine Sekunde lang öffnen oder länger, bis einer die Tür gedrückt hat.

pinMode(doorpin[2],OUTPUT);

Du setzt einen nicht existierenden Pin auf OUTPUT. doorpin[0] == 9 und doorpin[1] == 13

pinMode(doorpin[0],OUTPUT);
pinMode(doorpin[1],OUTPUT);

Vielen Dank. Jetzt kann ich mein Projekt umsetzten. Ihr seid echt super...

Hallo,

ich versuche auch gerade das Projekt umzusetzen.
Auf meinem IButton ist der Code 0000180340F5.
Wie muss ich diesen ins Programm einsetzen?
Habe schon vieles versucht aber irgendwie klappt es nicht.

Danke
Alex

Xandl: ich versuche auch gerade das Projekt umzusetzen.

Zeige Deinen Versuch und Dir kann möglicherweise geholfen werden.

Willkommen im Forum!

Hallo! Danke für die schnelle Antwort und für die nette Begrüßung.
Ich habe den gleichen AusgangsCode wie der Threadersteller verwendet. (http://elimelecsarduinoprojects.blogspot.co.at/2013/06/door-open-with-dallas-ibutton-arduino.html)

[/ #include <OneWire.h>

OneWire ibutton (2); // I button connected on PIN 2.

byte ibuttonid[10] = {1,144,74,165,21,0,0,143}; // Ibutton ID must be typed in Decimal in the following order: Family code (01 for DS1990); numbers from R. to L.; CRC. 
byte buffer[10]; //array to store the readed Ibutton ID.

boolean result;  // this variable will hold the compare result

int doorpin = 13; // the output pin to activate the door.

void setup(){
    Serial.begin(9600); 
    pinMode(doorpin,OUTPUT);
   
}

void loop(){
   
 if (!ibutton.search (buffer)){//read attached ibutton and asign value to buffer
    ibutton.reset_search();
    delay(200);
    return;
 }
  
  for (int x = 0; x<8; x++){  
    Serial.print(buffer[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) 
    Serial.print(" "); // print a space
   }
   Serial.println("\n"); // print new line
   
   // compare the ibutton id
   
  result = true; // set variable equal to one.
  for (int x=0; x<10; x++){ 
  int compare1 = ibuttonid[x];// asign each index of arrays to test, one by one and compare
  int compare2 = buffer[x];
  
  
  if(compare1 != compare2){ // if any index comparison is not equal, then the arrays are not equal and result will be 0.
   result = false; 
  }
  
  }
  if(result == true){ // if the arrays are equal, do something.
   Serial.println("Door open for 5 seconds."); 
   digitalWrite(doorpin,HIGH); // Turn on LED on pin 13 (build-in on the Arduino board)
   delay(5000); // wait five seconds. (1 second = 1000 milliseconds)
   Serial.println("Door closed");
   digitalWrite(doorpin,LOW); // turn off LED.
 }
   
    //set buffer back to cero.
    
    for (int x=0; x<10; x++){
     buffer[x] = 0 ;
    }                
}



/* by Elimeléc 
  Jun-07-2013
*/

Habe das Programm auf meinen UNO geladen aber es passiert einfach nichts.
Nun habe ich den Verdacht, dass ich die Nummer vom IButton nicht richtig in den Code eingetragen habe.


byte ibuttonid[10] = {1,144,74,165,21,0,0,143}; // Ibutton ID must be typed in Decimal in the following order: Family code (01 for DS1990); numbers from R. to L.; CRC.

Auf meinem Button steht 01 0000180340F5 also habe ich diese in Dezimal umgewandelt.
010000180340F5 → 281475379577077
Nun von Rechts nach Links. (wie im Code beschrieben) → 770775973574182

Dann in den Code eingefügt → {1,770,77,597,35,7,4,182} (stimmt der 1 ganz vorne?)
Das habe ich dann hochgeladen, aber da passiert Garnichts. Wenn ich den IButton an die Leseeinheit halte, fängt die TX LED an zu blicken. Aber am Ausgang 13 rührt sich Garnichts.

Wenn das funktioniert möchte ich weitere IButtons hinzufügen.

Hoffe es ist verständlich. Habe leider noch überhaupt keine Ahnung vom OneWire System.
Danke Alex