Добавление считывания ключей i-button в скетче с DS18B20

MaksVV
Offline
Зарегистрирован: 06.08.2015

Минипроект работает на контроль температуры в загородном доме. Хочу добавить снятие с охраны дома по ключу как от домофона. Нашёл скетч iButton допилил немного, чтобы при контакте ключа светодиод включаелся, при следующем контакте - выключался. скетч рабочий. Но когда этот скетч соединяю со своим, я так понял, происходит конфликт библиотек DallasTemperature и OneWire (хотя в моем скетче они обе присутсвуют и работают, а как добавляю iButton - конфликтует). При компиляции пишет: 

DS_GSM2:158: error: 'class DallasTemperature' has no member named 'search'

DS_GSM2:165: error: 'class DallasTemperature' has no member named 'reset_search'
 
перестаёт знать  такие команды.  (строка 59 и 65 в нижнем коде)
Скетч I-Button 
#include <OneWire.h>

byte key1[8] = {0x01, 0x55, 0xF2, 0xCF, 0x09, 0x00, 0x00, 0xF0}; // адрес "своего" ключа  iButton 

OneWire  ds(10);  // шину 1 Wire на 10 пин
bool statusLED = 0;

void setup(void) {
   pinMode(13, OUTPUT);    
}

void loop() {
  
  byte addr[8];
  byte val1 = 0;
  byte val2 = 0;
 
  delay(100);
  if (ds.search(addr))  // если адрес обнаружен, шлем идентификатор на верхний уровень
  {   
  for (int i=0; i<8; i++) {
       if (addr[i] == key1[i]) val1++;        // 1-ключ (аппаратная идентификация, например мастер-ключа)
                          }
   ds.reset_search();
  }
 
  if (val1 == 8 && statusLED == 0 ) {digitalWrite(13, HIGH); statusLED = 1; val1=0; delay (800);}
  if (val1 == 8 && statusLED == 1 ) {digitalWrite(13, LOW); statusLED = 0; val1 =0; delay (800);}  
  
  }

 

Мой скетч с добавленным i-Button 

#include <OneWire.h> // либа шины 1-wire
#include <DallasTemperature.h> // библиотека для DS18B20
#define ONE_WIRE_BUS 2  // датчики DS18B20, iButton на 2 пине 
OneWire oneWire(ONE_WIRE_BUS); // шина 1 wire  датчики DS18B20, iButton на 2 пине 
DallasTemperature ds(&oneWire);  // Везде где встречается ds - это работа с датчиками Dallas DS18B20

long previousMillis = 0;    // храним время последнего замера для цикла izmereniya()
long interval = 1000; // время интервала измерения

byte key1[8] = {0x01, 0x55, 0xF2, 0xCF, 0x09, 0x00, 0x00, 0xF0}; // адрес "своего" ключа  iButton 

bool statusLED = 0;

DeviceAddress ZalC ={0x28, 0xFF, 0xB1, 0x43, 0x52, 0x15, 0x01, 0xDB}; // Сетевой адрес датчика DS18B20 в доме
int TempC;
int  TempZalC = 20;

bool SMSAlarmTemp = false; 

bool AlarmTemp = false;


//_______Стартовый цикл________
void setup() {
  
  ds.begin();
  ds.setResolution(ZalC, 10);   
  pinMode (13, OUTPUT);
 
   }

void loop(){
  izmereniya();
   iButton ();
      }

void izmereniya()   //  Замер температур с датчиков DS18B20 и влажности с датчика DHT11 
{  // http://arduino.ru/tutorials/BlinkWithoutDelay на основе
   unsigned long currentMillis = millis();
   if(currentMillis - previousMillis > interval) { // Замеры в интервале 
     ds.requestTemperatures();            // Замеры температур с DS18B20
     delay(750);                          // Необязательная задержка
     TempZalC = ds.getTempC(ZalC);     // Считываем температуру в зале
    
     if(TempZalC == -127) // Перезапрос при ошибке датчика
     {
       ds.requestTemperatures(); delay(750); // +1 к счетчику ошибок DS18B20
       TempZalC = ds.getTempC(ZalC);     // Считываем температуру в зале
      }
      previousMillis = currentMillis;}  
     }

void iButton() {
 byte addr[8];
  byte val1 = 0;
  byte val2 = 0;
 
  delay(100);
  if (ds.search(addr))  // если адрес обнаружен, шлем идентификатор на верхний уровень
  {   
  for (int i=0; i<8; i++) {
       if (addr[i] == key1[i]) val1++;        // 1-ключ (аппаратная идентификация, например мастер-ключа)
                          }
   
   ds.reset_search();
  }
 
  if (val1 == 8 && statusLED == 0 ) {digitalWrite(13, HIGH); statusLED = 1; val1=0; delay (800);}
  if (val1 == 8 && statusLED == 1 ) {digitalWrite(13, LOW); statusLED = 0; val1 =0; delay (800);}  
  
              }

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Что можно попробовать сделать? 

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

MaksVV пишет:

Что можно попробовать сделать? 

В 71 строчке скобочку } подвинуть к левому краю. Некрасиво как- то.

:)

MaksVV
Offline
Зарегистрирован: 06.08.2015

разобрался, всем спасибо) заменяем ds. на oneWire. в строке 59 и 65 и всё работает. Только интервал измерения датчиков температуры нужно увеличить ( строка 08), а то код не успевает дойти до нужного места когда ключ iButton прикладывается. или задержки убрать в цикле измерения темпрератур (а нужны ли они там?)