заряжаю скетч который в библиотеке примеров стандартный и он у меня нормально работает, выдает температуру с двух датчиков которые я подключил вижу изменения показаний если беру в руки датчик. Я бы не стал заморачиваться укорочеными вариантами для ограниченого числа датчиков, но вся беда в том что я дилетант и не знаю как к своим двум переменным присвоить результаты измерений которые дает стандартный пример. И никто мне не может этого подсказать, Как у Винни-Пуха : "Кролик он умный... У него настоящие мозги... Наверное пожтому он никогда ничего не понимает!"
Что нужно присваивать моим Т1 и Т2?
В укороченом скетче я вижу две переменные которые могу использовать для последующего алгоритма, но этот скетч у меня выдает почему -то хрень... А в стандартном примере независимо от количества датчиков градусы цельсия присваиваются всегда одной переменной по очереди и для меня непонятно как выхватывать эти данные для присвоения моим переменным.... Хоть бы кто попался на форуме не с таким могучим интеллектом, чтобы я его мог понять
Я не знаю как прописать правильно адреса своих датчиков, тем более что они будут сидеть на одном pin И никто не может подсказать что делать
Всего-то мне надо подключить два датчика температуры к одному pin получить результаты присвоенные соответственно двум переменным и дальше приступить к алгоритму своей задачи. А подходящего примера для двух датчиков температуры нет, тот вариант, что предложил dimax выдает результаты обоих датчиков -0,06
Мы с вами явно о разном. Пост №4 , вариант для 2-х датчиков, строки 3-4. В них должны быть адреса ваших датчиков. В стандартных примерах к OneWire было как их считать.
А можно сделать обновление переменной temp через callback, как например в javascript? Т.е. отправить запрос на подготовку значений температуры и потом в callback его в переменную записать?
А можно сделать обновление переменной temp через callback, как например в javascript? Т.е. отправить запрос на подготовку значений температуры и потом в callback его в переменную записать?
Вопрос "вообще" или конкретно в каки-то обстоятельствах? Вообще, конечно, можно.
А можно сделать обновление переменной temp через callback, как например в javascript? Т.е. отправить запрос на подготовку значений температуры и потом в callback его в переменную записать?
Потому что контролер - не javascript. В отличии от JS нам самим прийдется позаботится как отмерять интервал времени до получения данных и самим вызвать callback, а раз уж самим то какая разница что вызывать, но напрямую проще. Причем выходит проще даже если засунули все в либу, т.к. прийдется переодически дергать из либы некоторую функцию для проверки готовности данных, ну и callback снова лишний. Можна еще конечно в либке через прерывание таймера сделать и тогда, казалось бы, именно калбек - то что надо, но: 1.на всякую фигню таймеров ненапасешся 2.калбек сработает из обработчика прерывания, что накладывает некоторые ограничения (например по времени отработки), а многи о этом не подозревают и все падает очень громко - системное время отстает, сириал теряет данные и т.д.
Знатаки!) Подскажите! Я хочу подключить датчиками температуры Ds18b20 к Arduino! http://proumnyjdom.ru/kontrollery/ds18b20-podklyuchenie-k-arduino.html Если еще добавить дисплей это будет здорово! Только как это все лучше срастить? И не пойму почему у меня сейчас сам датчик температуру не точно показывает(
///Программа "умного дома" на основе Arduino MEGA2560/
//Автор: Макаров Вячеслав г.Омск email:chernisheevka@mail.ru
#include <OneWire.h> // библиотека для DS18B20
#include <DallasTemperature.h> // библиотека для DS18B20
// http://compcar.ru/forum/showthread.php?t=8593&page=43 чтение датчиков по адресам
// http://robocraft.ru/blog/arduino/136.html про датчики DS18S20
// http://mk90.blogspot.ru/2011/04/1-wire.html соединение датчиков DS18B20
#define ONE_WIRE_BUS 7 // датчики DS18B20 на 7 пин
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature ds(&oneWire); // Везде где встречается ds - это работа с датчиками Dallas DS18B20
DeviceAddress ZalC = { 0x28, 0x8C, 0xAE, 0xEA, 0x05, 0x00, 0x00, 0x7F }; // Сетевой адрес датчика DS18B20 в доме
DeviceAddress UlicaC = { 0x28, 0x2B, 0x0F, 0x36, 0x04, 0x00, 0x00, 0xE0 }; // Сетевой адрес датчика DS18B20 на улице
DeviceAddress KuhnyaC = { 0x28, 0x8D, 0x76, 0x7C, 0x06, 0x00, 0x00, 0x24 }; // Сетевой адрес датчика DS18 на батарее
int tempC; // для работы с DS18B20
int TempZalC = 20; // Переменная. Измеренная температура в зале (По умолчанию 20гр.*С)
int TempUlicaC = 20; // Переменная. Измеренная температура на улице (По умолчанию 20гр.*С)
int TempKuhnyaC = 20; // Переменная. Измеренная температура на батарее (По умолчанию 20гр.*С)
int TempPodpol = 7; // Переменная. Измеренная температура в подполе (По умолчанию 7гр.*С)
int UlicaS = 15; // Переменная. Измеренная освещенность на улице (По умолчанию 15%)
int TEMPMINZ = 15; // Переменная. Уставка сигнализации минимальной температуры в зале (По умолчанию 15гр.*С)
int TEMPMINU = -25; // Переменная. Уставка сигнализации минимальной температуры на улице (По умолчанию -25гр.*С)
int TEMPMINK = 10; // Переменная. Уставка сигнализации минимальной температуры в радиаторе (По умолчанию 10гр.*С)
int TEMPMINP = 1; // Переменная. Уставка сигнализации минимальной температуры в подполе (По умолчанию 1гр.*С)
int TEMPMAXZ = 31; // Переменная. Уставка сигнализации максимальной температуры в зале (По умолчанию 31гр.*С)
int TEMPMAXU = 40; // Переменная. Уставка сигнализации максимальной температуры на улице (По умолчанию 40гр.*С)
int TEMPMAXK = 77; // Переменная. Уставка сигнализации максимальной температуры в радиаторе (По умолчанию 77гр.*С)
int TEMPMAXP = 25; // Переменная. Уставка сигнализации максимальной температуры в подполе (По умолчанию 25гр.*С)
//_______Все для циклов SavePar(),PrintPar(),ReadPar()____________________________________________________
#include <EEPROM.h> // библиотека для записи в память микроконтроллера
int Epause_K; // Переменная печати времени выдержки спец из памяти
int Epause_V; // Переменная печати времени выдержки спец из памяти
int Epause_Z; // Переменная печати времени выдержки спец из памяти
int Epause_S; // Переменная печати времени выдержки спец из памяти
//_______Все для цикла void irremote()____________________________________________________________________
#include <IRremote.h>// удалил 2 фаила из библиотеки ремоте туул
//как исправить косяк с конфликтом таймеров при работе библиотеки IRremote и функции Tone
// http://www.arduino.ru/forum/programmirovanie/motor-shield-v3-podklyuchen...
IRrecv irrecv(8);
decode_results results;
//_______Все для цикла void otoplenie()____________________________________________________________________
int tempDust = 22; // Уставка желаемой температуры в доме (По умолчанию 22гр.С)
int tempDECOust = 15; // Уставка температуры в доме в режиме "Экономия"(По умолчанию 15гр.С)
// http://blockduino.blogspot.ca/2013/08/Password-Keypad-w-Sound.html кодовый замок
#include <dht11.h> //библиотека датчика DTH11
#define DHT11PIN 6 //Датчик DTH11 на pin6
dht11 dht;
#include <DS1307.h> //Подключение модуля DS1307
DS1307 rtc(20,21);//(sda 20,scl 21)
Time t;
int RTCSekunda; // Переменная "секунда" для суточного таймера цикл RTCtimer()
int RTCChas; // Переменная "час" для суточного таймера цикл RTCtimer()
int RTCMinuta; // Переменная "минута" для суточного таймера
boolean statusKur=false; // Флаг "работа курантов"
boolean statusDay=false; // Флаг "Режим работы true - дневной, false - ночной"
boolean SMSDvigenieK=false; // Флаг "Отправлена СМС о движении на кухне"
boolean SMSDvigenieV=false; // Флаг "Отправлена СМС о движении в ванной"
boolean SMSDvigenieZ=false; // Флаг "Отправлена СМС о движении в зале"
boolean SMSDvigenieS=false; // Флаг "Отправлена СМС о входе"
boolean SMSopenKal=false; // Флаг "Отправлена СМС открыта калитка"
boolean SMSopenBan=false; // Флаг "Отправлена СМС открыта баня"
boolean SMSdomofon=false; // Флаг "Отправлена СМС Кто там? Кто там?"
boolean SMSVoltOFF=false; // Флаг "Отправлена СМС об отключении питания 220в"
boolean SMSVoltON=false; // Флаг "Отправлена СМС о восстановлении питания 220в"
boolean SMSBanyaTemp=false; // Флаг "Отправлена СМС о предельной температуре в бане"
boolean SMSPodpol=false; // Флаг "Отправлена СМС об затоплении подпола"
boolean SMSFireSensor=false; // Флаг "Отправлена СМС о сработке дымового датчика"
boolean SMSFireAlarm=false; // Флаг "Отправлена СМС о сработке пожарной сигнализации"
boolean SMSDelete=false; // Флаг "Удалены все СМС на SIM900"
boolean TimeSMSzapros=false; // Флаг "Отправлена СМС о состоянии дома по таймеру"
boolean SMSAlarmTemp=false; // Флаг "Отправлена СМС о критической температуре"
boolean SMSVoltIBP=false; // Флаг "Отправлена СМС о низком заряде аккумулятора"
//boolean EcoTempDust=false; // Флаг "Экономия отопления"
int SMSschet=0; // Подсчет кол-ва отправленных смс
int Fireschet=0; // Подсчет кол-ва срабатываний пож.шлейфа
int dsshet=0; // Подсчет кол-ва ошибок DS18B20
int dhtschet=0; // Подсчет кол-ва ошибок DHT11
int dht2schet=0; // Подсчет кол-ва повторных ошибок DHT11
int Dayschet=0; // Подсчет кол-ва дней бесперебойной работы после последней прошивки
int vlaga=0; // Значение влажности в цикле ventilyaciya()
int pambilang; // переменная для цикла sirena()
//_______Все для цикла void voltmetr()
float vout = 0.0; // Напряжение на входе аналового входа
float Vpit = 0.0; // Измеряемое напряжение на выходе ИБП
int volt = 0; // Напряжение на входе АЦП
int statushome=0; // переменная статуса включения умного дома 1 - включен, 0 -выключен
int statusotp=0; // статус отопления дома 0 - откл , 1- вкл , 2- экономия
int statusrzd=0; // статус питания розеток дома 0 - откл , 1- вкл
int statusgaraj=0; // статус питания гаража 0 - откл , 1- вкл
int statusbania=0; // статус питания бани 0 - откл , 1- вкл
int statusPump=0; // статус питания станции водоснабжения 0 - откл , 1- вкл
int perimetr=0; // статус включения охраны периметра 0 - откл , 1- вкл
int statusperimetr=0; // статус периметра 1 - все двери закрыты , 0 - дверь не закрыта
int statuspoliv=0; // статус полива 0 - откл , 1- вкл , 2- Таймер
int statusAlarm=0; // Переменная "Наличие тревоги"
int AlarmTemp=0; // Переменная "Наличие тревоги по критической температуре"
int statusFireAlarm=1; // Переменная "Режим работы пож.сигнализации" - 0 - откл , 1- вкл , 2- проверка, 3-в тревоге
int signaliz=0; // Переменная "Режим работы охр.сигнализации" - 0 - откл , 1- вкл , 2- постановка на охрану, 3-в тревоге
int statusPIK=0; // статус работы тональной пищалки - 0 - откл , 1- вкл
int ULsvet=2; // Режим работы уличного освещения - 0 - откл , 1- вкл , 2- АВТОРЕЖИМ
boolean statusBlock=false; // статус блокировки освещения зала пользователем
int intervalPIK = 1000;// интервал для цикла Pik()
int TonPIK = 2500; // частота тона пищалки
//_________ Уставки для работы по расписанию________________________
int TimeOFFpump = 0; // Время выключения насосной станции (По умолчанию 0:00)
int TimeONperimetr = 23; // Время включения охраны периметра (По умолчанию 23:00)
int TimeOFFperimetr = 6; // Время выключения охраны периметра (По умолчанию 6:00)
int TimeONdren = 20; // Время включения дренажного насоса (По умолчанию 20:00)
int TimeOFFdren = 21; // Время выключения дренажного насоса (По умолчанию 21:00)
int TimeONnagr = 4; // Время включения нагревателя воды (По умолчанию 06:00)
int TimeOFFnagr = 22; // Время выключения нагревателя воды (По умолчанию 23:00)
//_________ флаги для таймеров______________________________________
boolean Timer1On = false; //Флаг таймера РЕЗЕРВ
boolean Timer2On = false; //Флаг таймера постановки на охрану
//_________ переменные времени для таймеров_________________________
unsigned long EndPikMillis = 0; // храним время последнего тона для цикла Pik()
unsigned long NowTime1 = 0; // переменная хранения времени таймера №1
unsigned long StartTime1 = 0; // переменная хранения времени запуска таймера №1
unsigned long NowTime2 = 0; // переменная хранения времени таймера №2
unsigned long StartTime2 = 0; // переменная хранения времени запуска таймера №2
//_________ флаги для цикла Kvitirovanie()(сброс звука сирены)______________________________________
boolean KvitDI30 = false; //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход 30
boolean KvitDI29 = false; //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход 29
boolean KvitDI31 = false; //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход 31
boolean KvitZalC = false; //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура зал
boolean KvitUlicaC = false; //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура улицы
boolean KvitKuhnyaC = false; //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура кухни
boolean KvitPodpolC=false; //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. температура в подполе
//boolean KvitAI14 = false; //Флаг. false = Квитирование выкл., true - Квитирование уже вкл. Вход A14
long previousMillis = 0; // храним время последнего замера влажности для цикла izmereniya()
long interval = 120000; // интервал между замерами параметров для цикла izmereniya() 2 минуты
//______ Переменные для цикла avtosvet() взято с http://zelectro.com.ua/PIR_sensor ___________________________
long unsigned int lowIn_K; // Время, в которое был принят сигнал отсутствия движения на кухне(LOW)
long unsigned int lowIn_V; // Время, в которое был принят сигнал отсутствия движения в ванной(LOW)
long unsigned int lowIn_Z; // Время, в которое был принят сигнал отсутствия движения в зале(LOW)
long unsigned int lowIn_S; // Время, в которое был принят сигнал отсутствия движения в сенях(LOW)
int pause_K = 1; //Пауза, после которой движение считается оконченным (1 мин)
int pause_V = 1; //Пауза, после которой движение считается оконченным (1 мин)
int pause_Z = 4; //Пауза, после которой движение считается оконченным (4 мин)
int pause_S = 1; //Пауза, после которой движение считается оконченным (1 мин)
boolean lockLow_K = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean lockLow_V = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean lockLow_Z = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean lockLow_S = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean takeLowTime_K; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime_V; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime_Z; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime_S; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
int pirPin_K = 26; //вывод подключения PIR датчика Кухни
int pirPin_V = 24; //вывод подключения PIR датчика Ванной
int pirPin_Z = 22; //вывод подключения PIR датчика Зал
int pirPin_S = 28; //вывод подключения PIR датчика Сени
//_______Для работы терминала по bluetooth___________________________
int inSize=0; // Переменная которая будет содержать размер буфера терминала bluetooth
char str[128]; // Так как типа string тут нет, будем использовать массив символов
//_______Для работы терминала по Sim900______________________________
String currStr = "";
boolean isStringMessage = false; // Переменная принимает значение True, если текущая строка является сообщением
//___________________ Стартовый цикл _________________________________
void setup()
{
WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // разрешение прерывания + выдержка 1 секунда
ds.begin();
ds.setResolution(ZalC, 10);
ds.setResolution(UlicaC, 10);
ds.setResolution(KuhnyaC, 10);
pinMode(22, INPUT); digitalWrite(22,HIGH); // вход датчик движения зал
pinMode(24, INPUT); digitalWrite(24,HIGH); // вход датчик движения ванна
pinMode(26, INPUT); digitalWrite(26,HIGH); // вход датчик движения кухня
pinMode(28, INPUT); digitalWrite(28,HIGH); // вход датчик движения сени
pinMode(30, INPUT); digitalWrite(30,HIGH); // вход сигнализатор "Вода в подполе"
pinMode(32, INPUT); digitalWrite(32,HIGH); // Резерв
pinMode(34, INPUT); digitalWrite(34,HIGH); // Резерв
pinMode(36, INPUT); digitalWrite(36,HIGH); // Кнопка звонка домофона
pinMode(23, INPUT); digitalWrite(23,HIGH); // вход концевики ворот
pinMode(25, INPUT); digitalWrite(25,HIGH); // вход концевик входной двери
pinMode(27, INPUT); digitalWrite(27,HIGH); // вход концевик двери бани
pinMode(29, INPUT); digitalWrite(29,HIGH); // вход термостат "Баня готова"
pinMode(31, INPUT); digitalWrite(31,HIGH); // вход термостат "Очень высока температура в бане"
pinMode(33, INPUT); digitalWrite(33,HIGH); // Дымовой шлейф №1
pinMode(35, INPUT); digitalWrite(35,HIGH); // Дымовой шлейф №2
pinMode(37, INPUT); digitalWrite(37,HIGH); // Нет напряжения после УЗО
pinMode( 5, OUTPUT); // Пьезо динамик
pinMode(13, OUTPUT); // Лампа УД включен
pinMode(38, OUTPUT); // Свет в Кухня
pinMode(40, OUTPUT); // Свет в Ванна
pinMode(42, OUTPUT); // Свет в Зал
pinMode(44, OUTPUT); // Свет в Сени
pinMode(46, OUTPUT); // Питание насосной станции
pinMode(48, OUTPUT); // Питание дренажного насоса
pinMode(50, OUTPUT); // Питание водонагревателя
pinMode(52, OUTPUT); // Освещение двора
digitalWrite(38,HIGH); // Подаем единицы на плату реле (сигнал инвентированный)
digitalWrite(40,HIGH); // Подаем единицы на плату реле (сигнал инвентированный)
digitalWrite(42,HIGH); // Подаем единицы на плату реле (сигнал инвентированный)
digitalWrite(44,HIGH); // Подаем единицы на плату реле (сигнал инвентированный)
digitalWrite(46,HIGH); // Подаем единицы на плату реле (сигнал инвентированный)
digitalWrite(48,HIGH); // Подаем единицы на плату реле (сигнал инвентированный)
digitalWrite(50,HIGH); // Подаем единицы на плату реле (сигнал инвентированный)
digitalWrite(52,HIGH); // Подаем единицы на плату реле (сигнал инвентированный)
pinMode(39, OUTPUT); // Питание гаража
pinMode(41, OUTPUT); // Питание бани
pinMode(43, OUTPUT); // Питание розеток дома
pinMode(45, OUTPUT); // Питание вентиляции
pinMode(47, OUTPUT); // Клапан полива
pinMode(49, OUTPUT); // Сирены
pinMode(51, OUTPUT); // Номер дома
pinMode(53, OUTPUT); // Управление отоплением
Serial.begin(9600); // Связь по терминалу
Serial1.begin(9600); // HC-05 Bluetooth http://robocraft.ru/blog/electronics/587.html#comment4652
Serial2.begin(115200); // GSM SMS-передача плата SIM900
//Serial3.begin(9600); // Плата голосового оповещения на attiny2313 и SD-карте
if(EEPROM.read(0)==10){ReadPar();} // Чтение настроек из памяти, если они туда были сохранены ранее
delay(2000);
SMSVoltON=true;
NastroykaGSM(); // Настройка работы с SIM900
irrecv.enableIRIn(); // Запуск ИК-приемника
tone(5, 2000, 200); // Звук, когда все готово! выключил
delay(4000);
t = rtc.getTime();
RTCChas = t.hour; // t.hour - запрос часов
RTCMinuta = t.min; // t.min - запрос минут
SMSschet = EEPROM.read(51); // чтение кол-ва ранее отправленных СМС
startOneSMS();
Serial2.print("SmartHome vkluchen - "); vremya2(); EndSMS();// время включения
}
void loop()
{
RTCtimer();
izmereniya();
alarms();
irremote();
bluetooth();
sms_read();
osvechenie(); // Управление освещением во дворе
if (!statusFireAlarm==0){FireAlarm();} // Работа пожарной сигнализации
if (statushome==1) {avtosvet();} // Автоматическое управление освещением в доме меньше 11%
if (statushome==1){digitalWrite(13,HIGH);} else {digitalWrite(13, LOW);} // Лампа "Умный дом включен"
//if (statushome==1){ventilyaciya();} // Управление вентиляцией в подполе по датчику влажности DHT11
if (statusotp==1) {otoplenie();} else {digitalWrite(53, LOW);} // Управление работой газового котла 1 - вкл., 0 - откл.
if (!signaliz==0){signalizSMS();} // Работа сигнализации сигнализации при режимах 1,2,3
if (statusPIK==1){Pik();} // Работа тональной пищалки
if (perimetr==1){Operimetr();} // Охрана периметра участка
if ((statusPump==1) && (digitalRead(30)==LOW)) {digitalWrite(46,LOW);} else {digitalWrite(46, HIGH);} // Питание станции водоснабжения (Сигнал инвертированный)
if (statusrzd==1){digitalWrite(43,HIGH);} else {digitalWrite(43, LOW);} // Питание розеток дома
if (statusgaraj==1){digitalWrite(39,HIGH);} else {digitalWrite(39, LOW);} // Питание гаража
if (statusbania==1){digitalWrite(41,HIGH);} else {digitalWrite(41, LOW);} // Питание бани
if (statuspoliv==0) {digitalWrite(47, LOW);} // Выключение клапана полива
if (statuspoliv==1) {digitalWrite(47, HIGH);} // Включение клапана полива на постоянку
if (statuspoliv==2) {digitalWrite(47, HIGH); timerPoliv();} // Клапан полива включен по таймеру
if ((perimetr==1 && statusperimetr==0) || statusAlarm==1) { sirena();} // Работа малой сирены
//if (analogRead(14)>100) {KvitAI14=false;} // Сброс квитирования при возвращении параметра в норму
if (digitalRead(29)==LOW) {KvitDI29=false;} // Сброс квитирования при возвращении параметра в норму
if (digitalRead(30)==LOW) {KvitDI30=false;} // Сброс квитирования при возвращении параметра в норму
if (digitalRead(31)==LOW) {KvitDI31=false;} // Сброс квитирования при возвращении параметра в норму
}
void izmereniya() // Замер температур с датчиков DS18B20 и влажности с датчика DHT11
{ // http://arduino.ru/tutorials/BlinkWithoutDelay на основе
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) { // Замеры в интервале
dht.read(DHT11PIN); // Замеры температур с DHT11
delay(100); // Необязательная задержка
vlaga = dht.humidity; // Уровень влажности % с DHT11
TempPodpol = dht.temperature; // Температура в подполе с DHT11
if (TempPodpol < 3 || TempPodpol > 35){ // Перезапрос. Борьба с помехами.
dhtschet++; // +1 к счетчику ошибок DHT11
delay(300); // Необязательная задержка
dht.read(DHT11PIN); // Замеры температур с DHT11
vlaga = dht.humidity; // Уровень влажности % с DHT11
TempPodpol = dht.temperature; // Температура в подполе с DHT11
if (TempPodpol < 3 || TempPodpol > 35){ // Перезапрос. Борьба с помехами.
dht2schet++; // +1 к счетчику повторных ошибок DHT11
}
}
ISR (WDT_vect){ //вектор прерывания WD
static boolean n=0; // флаг работы: запрос температуры или её чтение
n=!n;
}
ds.requestTemperatures(); // Замеры температур с DS18B20
delay(750); // Необязательная задержка
TempZalC = ds.getTempC(ZalC); // Считываем температуру в зале
delay(100);
TempUlicaC = ds.getTempC(UlicaC); // Считываем температуру на улице
delay(100);
TempKuhnyaC = ds.getTempC(KuhnyaC); // Считываем температуру в кухне
delay(100);
if(TempZalC== -127 || TempUlicaC== -127 || TempKuhnyaC== -127) // Перезапрос при ошибке датчика
{
ds.requestTemperatures(); delay(750); dsshet++ ; // +1 к счетчику ошибок DS18B20
TempZalC = ds.getTempC(ZalC); // Считываем температуру в зале
delay(100);
TempUlicaC = ds.getTempC(UlicaC); // Считываем температуру на улице
delay(100);
TempKuhnyaC = ds.getTempC(KuhnyaC); // Считываем температуру в кухне
delay(100);
}
UlicaS = analogRead(A15)/10; // Считываем освещенность на улице
voltmetr(); // Считываем напряжения на выходе ИБП (норма 13,5в)
previousMillis = currentMillis;} // Сброс таймера
}
void voltmetr() //____________Цикл "Вольтметр"__измерение напряжения на выходе ИБП
// Взято с http://digitrode.ru/computing-devices/mcu_cpu/87-voltmetr-na-arduino.html
{
volt = analogRead(A0); // А0 аналоговый вход вольтметра
vout = (volt * 5.0) / 1024.0;
Vpit = vout / (10000.0/(100000.0+10000.0)); // По формуле Vpit = vout / (R2/(R1+R2))
if (Vpit<0.09) { Vpit=0.0;} // Округление до нуля
}
void osvechenie() // Работа уличного освещения двора
{
if ( ULsvet==2 ) // Если режим работы автоматический
{
if (UlicaS > 8){digitalWrite(52,HIGH);} // Освещение двора выключить при освещении больше 8% (сигнал инвертированный)
if (UlicaS < 4) {digitalWrite(52,LOW);} // Освещение двора включить при освещении меньше 4% (сигнал инвертированный)
}
}
void avtosvet() //______Цикл управления автоматическим освещением____________________________________
{
//______Ниже для зала______________________________________
if(digitalRead(pirPin_Z) == HIGH && statusBlock==false && UlicaS < 30) //Если обнаружено движение, нет блокировки, и освещенность улицы меньше 20%
{
if(lockLow_Z) //Если до этого момента еще не включили реле
{ lockLow_Z = false; digitalWrite(42, LOW); delay(50);} //Включаем свет.
takeLowTime_Z = true;
}
if(digitalRead(pirPin_Z) == LOW) //Ели движения нет
{ //Если время окончания движения еще не записано
if(takeLowTime_Z){lowIn_Z = millis();takeLowTime_Z = false;} //Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
if(!lockLow_Z && millis() - lowIn_Z > (pause_Z * 60000)) //Если время без движение превышает паузу => движение окончено
{ lockLow_Z = true; digitalWrite(42, HIGH); delay(50);} //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
}
if (statushome==1 && UlicaS > 35) {digitalWrite(42,HIGH);} // Отключение реле управления освещением больше 35%
//______Ниже для кухни______________________________________
if(digitalRead(pirPin_K) == HIGH && statusDay==false && UlicaS < 30) //Если обнаружено движение с 23 до 8 включаем подсветку
{
if(lockLow_K) //Если до этого момента еще не включили реле
{ lockLow_K = false; digitalWrite(38, LOW); delay(50);} //Включаем свет.
takeLowTime_K = true;}
if(digitalRead(pirPin_K) == LOW) //Ели движения нет
{ //Если время окончания движения еще не записано
if(takeLowTime_K){lowIn_K = millis();takeLowTime_K = false;} //Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
if(!lockLow_K && millis() - lowIn_K > (pause_K * 60000)) //Если время без движение превышает паузу => движение окончено
{ lockLow_K = true; digitalWrite(38, HIGH); delay(50);} //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
}
if (statushome==1 && UlicaS > 35) {digitalWrite(38,HIGH);} // Отключение реле управления освещением больше 20%
//______Ниже для ванной комнаты_____________________________
if(digitalRead(pirPin_V) == HIGH && UlicaS < 30) //Если обнаружено движение
{
if(lockLow_V) //Если до этого момента еще не включили реле
{ lockLow_V = false; digitalWrite(40, LOW); delay(50);} //Включаем свет.
takeLowTime_V = true;}
if(digitalRead(pirPin_V) == LOW) //Ели движения нет
{ //Если время окончания движения еще не записано
if(takeLowTime_V){lowIn_V = millis();takeLowTime_V = false;} //Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
if(!lockLow_V && millis() - lowIn_V > (pause_V * 60000)) //Если время без движение превышает паузу => движение окончено
{ lockLow_V = true; digitalWrite(40, HIGH); delay(50);} //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
}
if (statushome==1 && UlicaS > 35) {digitalWrite(40,HIGH);} // Отключение реле управления освещением больше 35%
//______Ниже для сеней______________________________________
if(digitalRead(pirPin_S) == HIGH && UlicaS < 16) //Если обнаружено движение
{
if(lockLow_S) //Если до этого момента еще не включили реле
{ lockLow_S = false; digitalWrite(44, LOW); delay(50);} //Включаем свет.
takeLowTime_S = true;}
if(digitalRead(pirPin_S) == LOW) //Ели движения нет
{ //Если время окончания движения еще не записано
if(takeLowTime_S){lowIn_S = millis();takeLowTime_S = false;} //Сохраним время окончания движения изменим значения флага, чтобы больше не брать время, пока не будет нового движения
if(!lockLow_S && millis() - lowIn_S > (pause_S * 60000)) //Если время без движение превышает паузу => движение окончено
{ lockLow_S = true; digitalWrite(44, HIGH); delay(50);} //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
}
if (statushome==1 && UlicaS > 20) {digitalWrite(44,HIGH);} // Отключение реле управления освещением больше 20%
}
// void ventilciya()
// {
// if (vlaga > 60) {digitalWrite(45, HIGH);} // Включение вентилятора при влажности более 60%
// if (vlaga < 40) {digitalWrite(45, LOW);} // Выключение вентилятора при влажности менее 40%
// }
void homeON() //____________Цикл включения умного дома____________________________________________________
{
statushome=1; // статус умного дома 0 - откл , 1- вкл
// statusotp=1; // статус отопления дома 0 - откл , 1- вкл
statusrzd=1; // статус питания розеток дома 0 - откл , 1- вкл
// statusgaraj=1; // статус питания гаража 0 - откл , 1- вкл
// statusbania=1; // статус питания бани 0 - откл , 1- вкл
}
void homeOFF() //____________Цикл выключения умного дома________________________
{
statushome=0; // статус питания дома 0 - откл , 1- вкл
statusrzd=0; // статус питания розеток дома 0 - откл , 1- вкл
statusgaraj=0; // статус питания гаража 0 - откл , 1- вкл
statusbania=0; // статус питания бани 0 - откл , 1- вкл
statusPump=0; // статус питания станции водоснабжения 0 - откл , 1- вкл
digitalWrite(38,HIGH); // выключение реле (сигнал инвертированный)
digitalWrite(40,HIGH); // выключение реле (сигнал инвертированный)
digitalWrite(42,HIGH); // выключение реле (сигнал инвертированный)
digitalWrite(44,HIGH); // выключение реле (сигнал инвертированный)
digitalWrite(46,HIGH); // выключение реле (сигнал инвертированный)
digitalWrite(48,HIGH); // выключение реле (сигнал инвертированный)
digitalWrite(50,HIGH); // выключение реле (сигнал инвертированный)
SMSAlarmTemp=false; // сброс флага отправки СМС о критической темпертуры
SMSBanyaTemp=false; // сброс флага отправки СМС о критической темпертуры в бане
SMSPodpol=false; // сброс флага отправки СМС о воде в подполе
}
void otoplenie() // Цикл управления газовым котлом (Сигнал инвертированный!(Особенность подключения к котлу))
{
if ( statusotp==0) // Отключено
{ digitalWrite(53,HIGH);} // Отключить отопление
if ( statusotp==1) // Климат-контроль
{ if ( TempZalC > (tempDust+1)){digitalWrite(53,HIGH);} // Отключить отопление если температура больше желаемой на 1грС
if ( !TempZalC== -127 && (TempZalC < tempDust) ) {digitalWrite(53,LOW);} // Включить отопление если температура меньше желаемой
}
if ( statusotp==2) // Экономия
{ if ( TempZalC > (tempDECOust+1)){digitalWrite(53,HIGH);} // Отключить отопление если температура больше желаемой на 1грС
if ( !TempZalC== -127 && (TempZalC < tempDECOust) ) {digitalWrite(53,LOW);} // Включить отопление если температура меньше желаемой
}
}
void timerPoliv() // Таймер клапана полива огорода 0 - откл , 1- вкл , 2- Таймер
{
NowTime1 = millis();
if(Timer1On == true) { StartTime1 = NowTime1 ; Timer1On = false; statuspoliv=2;}
if( statuspoliv==2 && NowTime1 - StartTime1 > 900000) // выдержка 15 минут
{ statuspoliv=0; } // Сброс таймера
}
В начале я пошел по пути вставки вашего кода в программу, убирая ошметки Далласа. Избавился от всей кучи ошибок. Оставалась только эта строка "ISR (WDT_vect){ //вектор прерывания WD". если её закоментить , то компилятор не находил ошибок. После пары дней битв с последней ошибкой, я решил пойти с другой строны- внедрить в исходную программу ваш код, начиная с прерываний.
Вставив 6 строк сразу упёрся в ту же самую ошибку. Ругается имено на эту же строку ISR.. Скобки переставлял -не помогло.
Serg1, вы читаете что я пишу, или нет? У вас огромная бородище от старого кода висит вообще ни к чему не привязанная стр. 342-363. Кусок от моего кода стр. 334-337 пустой, он ничего не обрабатывает. В общем выглядит всё безнадёжно.
И это только один косяк, там ещё есть ошмётки. Мой вам добрый совет -взять исходный код того автора, ежели он вам нравится (хотя это тоже говнокод во всей своей красе) и пользоваться без совмещения с алгоритмом из этой темы.
С нуля написать не смогу. Взял за основу эту и как правильный скульптор, отсекаю все лишнее. Где рубить и что подправить под себя в исходной программе, я понимаю. С оптимизацией кода -сложнее.....
С нуля написать не смогу. Взял за основу эту и как правильный скульптор, отсекаю все лишнее. Где рубить и что подправить под себя в исходной программе, я понимаю. С оптимизацией кода -сложнее.....
@dimax, подскажите вариант с 2-я датчиками масштабируется до 10-15 штук простым увеличением кол-ва опросов в обработчике прерывания или здесь есть какие-то "подводные камни"?
возможно получится слишком длительная обработка прерывания и следует разделить опрос датчиков ?
@dimax, подскажите вариант с 2-я датчиками масштабируется до 10-15 штук простым увеличением кол-ва опросов в обработчике прерывания или здесь есть какие-то "подводные камни"?
возможно получится слишком длительная обработка прерывания и следует разделить опрос датчиков ?
@dimax, подскажите вариант с 2-я датчиками масштабируется до 10-15 штук простым увеличением кол-ва опросов в обработчике прерывания или здесь есть какие-то "подводные камни"?
возможно получится слишком длительная обработка прерывания и следует разделить опрос датчиков ?
А взять и попробовать?
датчики летят свербыстрой "почтой россии", будут после НГ :)
Камрады, такой вопрос... Опрос датчиков тормозит прерывания. Как избавится? Можно это как-то обойти? Если более конкретно, то есть программный диммер, который, используя датчик перехода через 0, повешенный на прерывание, управляет семистором. Как только к этому коду добавляется одна строка ds.write(0x??), появляется еле заметное мерцание, 2 строки - мерцание оч заметно.. и т д, в итоге мигание с частотой опроса. Временно решил проблему отправкой команд датчикам раз в секунду по одной, но мерцание все равно есть. Коллега с телевизором в середине темы испытывал схожие проблемы, скорее всего по той же причине.
Камрады, такой вопрос... Опрос датчиков тормозит прерывания. Как избавится?
Вы впервые в этой теме, так что:
1) какие датчики?
2) как именно Вы их опрашиваете (код, пожалуйста)?
А избавиться очень просто
1. Не делать это в прерывании. В прерывании только взводить флаг, что нужно опросить, а собственно опрос делать снаружи;
2. Использовать неблокирующий опрос. Т.е. начинать опрос, но не ждать результата, а продолжать работу программы. А по мере поступления результата его использовать.
Я не нашёл опроса датчиков в приведённом коде. Удачи Вам!
Я вот понять не могу, это тест на идиота, могу ли я написать 8 строк? Там негде ошибиться. Или мне весь код выложить? В 1500 строках говнокода будете копаться? Костыль выглядит так:
Да, проверка на отсутствие датчика такая, т к запрос crc и адресов в моем случае - лишние моргания. Да, говнокод, да не вычищен. Проблема то не в этом, проблема в том, что оnewire, похоже, перерывания отключает на время выполнения.
Простите, Евгений, диалог с Вами похож на общение с девушкой первого уровня телефонной поддержки пользователей (из разряда "проверьте, что устройство включено в розетку") По факту: вопрос в моем первом посте вполне корректен и самодостаточен. Ответ на первую его часть достаточно прост: многие функции библиотеки onewire, в т. ч. write на некоторое время запрещают прерывания.
Простите, Евгений, диалог с Вами похож на общение с девушкой первого уровня телефонной поддержки пользователей (из разряда "проверьте, что устройство включено в розетку") По факту: вопрос в моем первом посте вполне корректен и самодостаточен. Ответ на первую его часть достаточно прост: многие функции библиотеки onewire, в т. ч. write на некоторое время запрещают прерывания.
Простите, WarIock, разговор с Вами похож на разговор немого с глухим. Вас попросил показать код. Вы не хотите - дело Ваше. Проблему надо рещать Вам, а не мне. Мне - не надо.
Вы здесь зарегистрировались сегодня, а я давно. И кого я тут только не повидал. Человека, который ток измеряет, подключая мультиметр параллельно нагрузке - видел, человека, который описывает локальную переменную с тем же имененм, что и глобальную, а потом выносит мозг всему форуму почему глобальная не меняется, хотя ей присваивают, тоже видел и много кого видел.
Часто бывает день трахаешься, а потом выясняешь, что человек вместо сравнения написал присваивание. Но день-то потерян!
С некоторых пор, я не веду никаких разговоров с новичками, пока не увижу кода (а если надо, и схемы). Как только я наталкиваюсь на нежелание показывать код (а тут есть деятели, которые задают вопросы "как число в строку преобразовать", но при этом боятся, что их ценнейший код украдут), так вот как только человек начинает говорить, что код показать не может (по любой причине) - я ухожу в сторонку - пусть сам решает свои проблемы. У меня проблем нет и я не намерен терять полдня на помощь тому, кто активно сопротивляется и мешает себе помогать.
Вы понимаете? Нет кода - нет разговора. Очень простая позиция.
Ещё раз, моё личное мнение: начинать изучение семейства С* следует именно с Кернигана и Ритчи, потом - Труп Страуса, потом - чего угодно.
Вот теперь я с Вашим мнением полностью согласен.
А что касается ООП, думаю, с точки зрения использования готовых объектов оно даже проще процедурного программирования.
dimax, два датчика подключаются к pin2 ? извиняюсь за дилетанский вопрос...
Не dimax, но подтверждаю.))))
Спасибо!
Что-то у меня от скетча для двух датчиков в порт выходит
Как будто у меня не на том pin они подключены... Как учили, оба датчика на pin 2 резистор 5КОм на плюсовую шину. Что я не правильно сделал?
Почему-то с двух датчиков в порт идут -0,06.... и все. Что-то я не так делаю?
dimax, ау...
Почему-то с двух датчиков в порт идут -0,06.... и все. Что-то я не так делаю?
а резистор 4,7 ком не забыли??
Нет не забыл, все как учили...
Он правда не 4,7 а 5,0 но это ведь не принципиально
проверяте по одному сначала
а если от pin 2 провод отсоединяю вообюще, то в порт пишеться все точно так же, ощущение, что как будто я не на тот pin подключаю датчики
заряжаю скетч который в библиотеке примеров стандартный и он у меня нормально работает, выдает температуру с двух датчиков которые я подключил вижу изменения показаний если беру в руки датчик. Я бы не стал заморачиваться укорочеными вариантами для ограниченого числа датчиков, но вся беда в том что я дилетант и не знаю как к своим двум переменным присвоить результаты измерений которые дает стандартный пример. И никто мне не может этого подсказать, Как у Винни-Пуха : "Кролик он умный... У него настоящие мозги... Наверное пожтому он никогда ничего не понимает!"
Что нужно присваивать моим Т1 и Т2?
В укороченом скетче я вижу две переменные которые могу использовать для последующего алгоритма, но этот скетч у меня выдает почему -то хрень... А в стандартном примере независимо от количества датчиков градусы цельсия присваиваются всегда одной переменной по очереди и для меня непонятно как выхватывать эти данные для присвоения моим переменным.... Хоть бы кто попался на форуме не с таким могучим интеллектом, чтобы я его мог понять
Вы адреса своих датчиков прописали?
Я понимаю например так...
int T1=2;
int T2=3;
pinMode (T1;INPUT);
pinMode (T2;INPUT);
Ясно что мыслю не на том уровне как Вы..
Я не знаю как прописать правильно адреса своих датчиков, тем более что они будут сидеть на одном pin И никто не может подсказать что делать
Всего-то мне надо подключить два датчика температуры к одному pin получить результаты присвоенные соответственно двум переменным и дальше приступить к алгоритму своей задачи. А подходящего примера для двух датчиков температуры нет, тот вариант, что предложил dimax выдает результаты обоих датчиков -0,06
Мы с вами явно о разном. Пост №4 , вариант для 2-х датчиков, строки 3-4. В них должны быть адреса ваших датчиков. В стандартных примерах к OneWire было как их считать.
Вдогонку, т.к. каждый датчик имеет уникальный адрес, на одном пине может висеть хоть сотня штук.
попробую понять, спасибо
Чтобы понять получше, наберите в гугле "DS18B20 Чернов". Там на русском неплохо описаны эти датчики.
Спасибо, сейчас посмотрю Чернова.
"ROM = 28 FF D9 2C 92 15 4 92"
Это ваш датчик. Все значения двухзначные. Вместо "4" должно быть "04".
Переносите ручками в формате 0х28 ..... в addr1, следующий в addr2. И должно случиться щасье.))))
Мне нужно в фигурных скобках 3 и 4 строк заменить содержимое на адреса моих датчиков?
Сейчас попробую, спасибо.
УРААА!!! Все пошло!!!
Спасибо за мудрые советы!!!
А можно сделать обновление переменной temp через callback, как например в javascript? Т.е. отправить запрос на подготовку значений температуры и потом в callback его в переменную записать?
А можно сделать обновление переменной temp через callback, как например в javascript? Т.е. отправить запрос на подготовку значений температуры и потом в callback его в переменную записать?
Вопрос "вообще" или конкретно в каки-то обстоятельствах? Вообще, конечно, можно.
В данном случае с данным датчиком температуры. Почему так не делают со всеми датчиками требующими время.
В данном случае с данным датчиком температуры. Почему так не делают со всеми датчиками требующими время.
А какое время он требует в данном топике? В первый проход дали команду на конвертацию, во втором считали готовые данные.
А можно сделать обновление переменной temp через callback, как например в javascript? Т.е. отправить запрос на подготовку значений температуры и потом в callback его в переменную записать?
Потому что контролер - не javascript. В отличии от JS нам самим прийдется позаботится как отмерять интервал времени до получения данных и самим вызвать callback, а раз уж самим то какая разница что вызывать, но напрямую проще. Причем выходит проще даже если засунули все в либу, т.к. прийдется переодически дергать из либы некоторую функцию для проверки готовности данных, ну и callback снова лишний. Можна еще конечно в либке через прерывание таймера сделать и тогда, казалось бы, именно калбек - то что надо, но: 1.на всякую фигню таймеров ненапасешся 2.калбек сработает из обработчика прерывания, что накладывает некоторые ограничения (например по времени отработки), а многи о этом не подозревают и все падает очень громко - системное время отстает, сириал теряет данные и т.д.
Просто реализовано как то хакерски, через watchdog, может быть есть более прямое решение.
Там ниже через миллис.
Знатаки!) Подскажите! Я хочу подключить датчиками температуры Ds18b20 к Arduino! http://proumnyjdom.ru/kontrollery/ds18b20-podklyuchenie-k-arduino.html Если еще добавить дисплей это будет здорово! Только как это все лучше срастить? И не пойму почему у меня сейчас сам датчик температуру не точно показывает(
Dimax, здравствуйте!
Позаимствовали ваш код для опроса датчиков по прерыванию. Вставил в программу "Умный дом", обсуждаемую здесь:
http://arduino.ru/forum/proekty/sistema-umnyi-dom-dlya-zagorodnogo-doma-....
Кусок кода из сообщения #371 Не удаётся подружить.
Для локализации ошибки взял из вашего примера только прерывания(строка 22,23 и вызов строжевого таймера строка 33,34,35).
выдает ошибку:
сама программа
Serg1, Если обобщить -не правильно вставлен фрагмент -раз, не убраны старые ошмётки от даллосовской либы -это два.
В начале я пошел по пути вставки вашего кода в программу, убирая ошметки Далласа. Избавился от всей кучи ошибок. Оставалась только эта строка "ISR (WDT_vect){ //вектор прерывания WD". если её закоментить , то компилятор не находил ошибок. После пары дней битв с последней ошибкой, я решил пойти с другой строны- внедрить в исходную программу ваш код, начиная с прерываний.
Вставив 6 строк сразу упёрся в ту же самую ошибку. Ругается имено на эту же строку ISR.. Скобки переставлял -не помогло.
Подскажите ,куда правильнее вставлять фрагмент.
Serg1, вы читаете что я пишу, или нет? У вас огромная бородище от старого кода висит вообще ни к чему не привязанная стр. 342-363. Кусок от моего кода стр. 334-337 пустой, он ничего не обрабатывает. В общем выглядит всё безнадёжно.
И это только один косяк, там ещё есть ошмётки. Мой вам добрый совет -взять исходный код того автора, ежели он вам нравится (хотя это тоже говнокод во всей своей красе) и пользоваться без совмещения с алгоритмом из этой темы.
Serg1. А лучше взять и написать под свою хату. Ибо сомневаюсь, что вам требуются все фишки заложенные автором кода.
С нуля написать не смогу. Взял за основу эту и как правильный скульптор, отсекаю все лишнее. Где рубить и что подправить под себя в исходной программе, я понимаю. С оптимизацией кода -сложнее.....
С нуля написать не смогу. Взял за основу эту и как правильный скульптор, отсекаю все лишнее. Где рубить и что подправить под себя в исходной программе, я понимаю. С оптимизацией кода -сложнее.....
@dimax, подскажите вариант с 2-я датчиками масштабируется до 10-15 штук простым увеличением кол-ва опросов в обработчике прерывания или здесь есть какие-то "подводные камни"?
возможно получится слишком длительная обработка прерывания и следует разделить опрос датчиков ?
@dimax, подскажите вариант с 2-я датчиками масштабируется до 10-15 штук простым увеличением кол-ва опросов в обработчике прерывания или здесь есть какие-то "подводные камни"?
возможно получится слишком длительная обработка прерывания и следует разделить опрос датчиков ?
А взять и попробовать?
@dimax, подскажите вариант с 2-я датчиками масштабируется до 10-15 штук простым увеличением кол-ва опросов в обработчике прерывания или здесь есть какие-то "подводные камни"?
возможно получится слишком длительная обработка прерывания и следует разделить опрос датчиков ?
А взять и попробовать?
датчики летят свербыстрой "почтой россии", будут после НГ :)
вот и готовлю теоритическую базу
Камрады, такой вопрос... Опрос датчиков тормозит прерывания. Как избавится? Можно это как-то обойти? Если более конкретно, то есть программный диммер, который, используя датчик перехода через 0, повешенный на прерывание, управляет семистором. Как только к этому коду добавляется одна строка ds.write(0x??), появляется еле заметное мерцание, 2 строки - мерцание оч заметно.. и т д, в итоге мигание с частотой опроса. Временно решил проблему отправкой команд датчикам раз в секунду по одной, но мерцание все равно есть. Коллега с телевизором в середине темы испытывал схожие проблемы, скорее всего по той же причине.
Камрады, такой вопрос... Опрос датчиков тормозит прерывания. Как избавится?
Вы впервые в этой теме, так что:
1) какие датчики?
2) как именно Вы их опрашиваете (код, пожалуйста)?
А избавиться очень просто
1. Не делать это в прерывании. В прерывании только взводить флаг, что нужно опросить, а собственно опрос делать снаружи;
2. Использовать неблокирующий опрос. Т.е. начинать опрос, но не ждать результата, а продолжать работу программы. А по мере поступления результата его использовать.
1) какие датчики?
А тема про какие датчики?
2) как именно Вы их опрашиваете (код, пожалуйста)?
2) как именно Вы их опрашиваете (код, пожалуйста)?
Как все, ds.write(0x44) ds.write(0xBE), через адрес, или через ds.write(0xСС) - не важно, ничего не меняется.
Если кратко, то
Как только в loope появляются ds.write(0x начинает сбиваться открытие-закрытие семистора. Приэтом неважно, присутствует ли сам датчик,
Я не нашёл опроса датчиков в приведённом коде. Удачи Вам!
Я не нашёл опроса датчиков в приведённом коде. Удачи Вам!
Я вот понять не могу, это тест на идиота, могу ли я написать 8 строк? Там негде ошибиться. Или мне весь код выложить? В 1500 строках говнокода будете копаться? Костыль выглядит так:
Да, проверка на отсутствие датчика такая, т к запрос crc и адресов в моем случае - лишние моргания. Да, говнокод, да не вычищен. Проблема то не в этом, проблема в том, что оnewire, похоже, перерывания отключает на время выполнения.
Я вот понять не могу, это тест на идиота, могу ли я написать 8 строк?
Нет. В таком тестировании нет нужды, ответ очевиден. Если бы могли, не пришли бы сюда с таким вопросом.
На, а если можете, то решайте свою проблему сами. У меня пропало желание этим заниматься.
Удачи!
Простите, Евгений, диалог с Вами похож на общение с девушкой первого уровня телефонной поддержки пользователей (из разряда "проверьте, что устройство включено в розетку") По факту: вопрос в моем первом посте вполне корректен и самодостаточен. Ответ на первую его часть достаточно прост: многие функции библиотеки onewire, в т. ч. write на некоторое время запрещают прерывания.
Остался вопрос, что будет, если их не запрещать. Но, чувствую, узнать опытным путем будет быстрее.
Простите, Евгений, диалог с Вами похож на общение с девушкой первого уровня телефонной поддержки пользователей (из разряда "проверьте, что устройство включено в розетку") По факту: вопрос в моем первом посте вполне корректен и самодостаточен. Ответ на первую его часть достаточно прост: многие функции библиотеки onewire, в т. ч. write на некоторое время запрещают прерывания.
Простите, WarIock, разговор с Вами похож на разговор немого с глухим. Вас попросил показать код. Вы не хотите - дело Ваше. Проблему надо рещать Вам, а не мне. Мне - не надо.
Вы здесь зарегистрировались сегодня, а я давно. И кого я тут только не повидал. Человека, который ток измеряет, подключая мультиметр параллельно нагрузке - видел, человека, который описывает локальную переменную с тем же имененм, что и глобальную, а потом выносит мозг всему форуму почему глобальная не меняется, хотя ей присваивают, тоже видел и много кого видел.
Часто бывает день трахаешься, а потом выясняешь, что человек вместо сравнения написал присваивание. Но день-то потерян!
С некоторых пор, я не веду никаких разговоров с новичками, пока не увижу кода (а если надо, и схемы). Как только я наталкиваюсь на нежелание показывать код (а тут есть деятели, которые задают вопросы "как число в строку преобразовать", но при этом боятся, что их ценнейший код украдут), так вот как только человек начинает говорить, что код показать не может (по любой причине) - я ухожу в сторонку - пусть сам решает свои проблемы. У меня проблем нет и я не намерен терять полдня на помощь тому, кто активно сопротивляется и мешает себе помогать.
Вы понимаете? Нет кода - нет разговора. Очень простая позиция.