Добавить второй ключ ibutton в arduino

rus2014
Offline
Зарегистрирован: 11.09.2014

Как добавить второй ключ ibutton в arduino?

// ПРИ считывании ключа включается светодиод, при повторном считывании ключа выключается
#include <OneWire.h> //
OneWire  ds(10);    

void setup(void) {  
  Serial.begin(9600);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
}

void loop(void) {

  byte key[8] = {0x1, 0x43, 0xDA, 0xB5, 0x33, 0x22, 0x0, 0x88};
  //            {0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x9B};

  //Key1 : 1 43 DA B5 33 22 0 88  первый ключ
  //Key2 : 1 FF FF FF FF 0 0 9B второй ключ

  byte addr[8];
  byte val = 0;

  if (ds.search(addr)) {    
    for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;                       

    if (val == 8) {
      digitalWrite(4, HIGH);//делаем что нибудь
      delay(500);
    }
  }
  //ds.reset_search(); 

  if (ds.search(addr)) {    
    for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;                       

    if (val == 8) {
      digitalWrite(4, LOW);//делаем что нибудь
      delay(500);    
    }
  }

  ds.reset_search();   
}  

 

mira
Offline
Зарегистрирован: 07.06.2016

Можно вот так наколхозить:

 byte key1[8] = {0x1, 0x43, 0xDA, 0xB5, 0x33, 0x22, 0x0, 0x88};  
 byte key2[8] = {0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x9B};

 

  if (ds.search(addr)) { 
    for (byte i = 0; i < 8; i++) {
      if (addr[i] == key1[i]) val1++;
      if (addr[i] == key2[i]) val2++;
    }
    if (val1 == 8) || (val2 ==8) {
      digitalWrite(4, HIGH);//делаем что нибудь
      delay(500); 
    }
  }

  if (ds.search(addr)) { 
    for (byte i = 0; i < 8; i++) {
      if (addr[i] == key1[i]) val1++;
      if (addr[i] == key2[i]) val2++;
    }
    if (val1 == 8) || (val2 ==8) {
      digitalWrite(4, LOW);//делаем что нибудь
      delay(500); 
    }

 

 

только если ключ сработал, то мне кажется лучше сделать чтобы 5-10 секунд пин был HIGH, а затем в LOW, чем ключ включает пин и выключает

  if (ds.search(addr)) { 
    for (byte i = 0; i < 8; i++) {
      if (addr[i] == key1[i]) val1++;
      if (addr[i] == key2[i]) val2++;
    }
    if (val1 == 8) || (val2 ==8) {
      digitalWrite(4, HIGH);//открываем замок
      delay(5000); 
     digitalWrite(4, LOW;//закрываем замок
    }
  }

Ну я только учусь, потому строго не судите

rus2014
Offline
Зарегистрирован: 11.09.2014

У меня получилось почти также. Но думаю будет лучше использовать код с добавление ключей в EEPROM.

//2 КЛЮЧА ПРИ считывании ключа включается светодиод, через 5 сек тухнет
#include <OneWire.h> //
OneWire  ds(10);   
byte key1[8] = {0x1, 0x43, 0xDA, 0xB5, 0x33, 0x22, 0x0, 0x88};            
byte key2[8] = {0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x9B};


void setup(void) {  
  Serial.begin(9600);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);
}

void loop(void) {
  byte addr[8];
  byte val1 = 0;
  byte val2 = 0;

  if (ds.search(addr)) {    
    for (byte i = 0; i < 8; i++) 
    { 
      // 1-ключ (аппаратная идентификация, например мастер-ключа)
      if (addr[i] == key1[i]) val1++; 

      // 2-ключ
      if (addr[i] == key2[i]) val2++;
    }
    ds.reset_search();
  }
  if (val1 == 8) {
    digitalWrite(4, HIGH);//делаем что нибудь
    delay(5000);
    digitalWrite(4, LOW);//делаем что нибудь
  }
  if (val2 == 8) {
    digitalWrite(4, HIGH);//делаем что нибудь
    delay(5000);
    digitalWrite(4, LOW);//делаем что нибудь
  }
}

Спасибо за подсказку! а вкл и выкл при повторном считывании экспиременты для основного проекта.-)