Добавление считывания ключей 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 прикладывается. или задержки убрать в цикле измерения темпрератур (а нужны ли они там?)