Добавление считывания ключей i-button в скетче с DS18B20
- Войдите на сайт для отправки комментариев
Ср, 02/03/2016 - 18:12
Минипроект работает на контроль температуры в загородном доме. Хочу добавить снятие с охраны дома по ключу как от домофона. Нашёл скетч 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);} }
Что можно попробовать сделать?
Что можно попробовать сделать?
В 71 строчке скобочку } подвинуть к левому краю. Некрасиво как- то.
:)
разобрался, всем спасибо) заменяем ds. на oneWire. в строке 59 и 65 и всё работает. Только интервал измерения датчиков температуры нужно увеличить ( строка 08), а то код не успевает дойти до нужного места когда ключ iButton прикладывается. или задержки убрать в цикле измерения темпрератур (а нужны ли они там?)