Почистил скетч примера работы с DS18B20 из библы OneWire..

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DIYMan пишет:

Ещё раз, моё личное мнение: начинать изучение семейства С* следует именно с Кернигана и Ритчи, потом - Труп Страуса, потом - чего угодно.

Вот теперь я с Вашим мнением полностью согласен.

А что касается ООП, думаю, с точки зрения использования готовых объектов оно даже проще процедурного программирования.

avr4
Offline
Зарегистрирован: 24.12.2015

dimax, два датчика подключаются к pin2 ? извиняюсь за дилетанский вопрос...

bwn
Offline
Зарегистрирован: 25.08.2014

Не dimax, но подтверждаю.))))

avr4
Offline
Зарегистрирован: 24.12.2015

Спасибо!

avr4
Offline
Зарегистрирован: 24.12.2015

Что-то у меня от скетча для двух датчиков в порт выходит

  

...
Temp1= -0.06   Temp2= -0.06
Temp1= -0.06   Temp2= -0.06
Temp1= -0.06   Temp2= -0.06
Temp1= -0.06   Temp2= -0.06
Temp1= -0.06   Temp2= -0.06
Temp1= -0.06   Temp2= -0.06
Temp1= -0.06   Temp2= -0.06
Temp1= -0.06   Temp2= -0.06
Temp1= -0.06   Temp2= -0.06
Temp1= -0.06   Temp2= -0.06
Temp1= -0.06   Temp2= -0.06
...
 
и больше ничего
 
avr4
Offline
Зарегистрирован: 24.12.2015

Как будто у меня не на том pin они подключены... Как учили, оба датчика на pin 2 резистор 5КОм на плюсовую шину. Что я не правильно сделал?

avr4
Offline
Зарегистрирован: 24.12.2015

Почему-то с двух датчиков в порт идут -0,06.... и все. Что-то я не так делаю?

avr4
Offline
Зарегистрирован: 24.12.2015

dimax, ау...

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

avr4 пишет:

Почему-то с двух датчиков в порт идут -0,06.... и все. Что-то я не так делаю?

а резистор 4,7 ком не забыли??

avr4
Offline
Зарегистрирован: 24.12.2015

Нет не забыл, все как учили...

 

avr4
Offline
Зарегистрирован: 24.12.2015

Он правда не 4,7 а 5,0 но это ведь не принципиально

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

проверяте по одному сначала

avr4
Offline
Зарегистрирован: 24.12.2015

а если от pin 2 провод отсоединяю вообюще, то в порт пишеться все точно так же, ощущение, что как будто я не на тот pin подключаю датчики

avr4
Offline
Зарегистрирован: 24.12.2015

заряжаю скетч который в библиотеке примеров стандартный и он у меня нормально работает, выдает температуру с двух датчиков которые я подключил вижу изменения показаний если беру в руки датчик. Я бы не стал заморачиваться укорочеными вариантами для ограниченого числа датчиков, но вся беда в том что я дилетант и не знаю как к своим двум переменным присвоить результаты измерений которые дает стандартный пример. И никто мне не может этого подсказать, Как у Винни-Пуха : "Кролик он умный... У него настоящие мозги... Наверное пожтому он никогда ничего не понимает!" 

Что нужно присваивать моим Т1 и Т2?

В укороченом скетче я вижу две переменные которые могу использовать для последующего алгоритма, но этот скетч у меня выдает почему -то хрень... А в стандартном примере независимо от количества датчиков градусы цельсия присваиваются всегда одной переменной по очереди и для меня непонятно как выхватывать эти данные для присвоения моим переменным.... Хоть бы кто попался на форуме не с таким могучим интеллектом, чтобы я его мог понять

bwn
Offline
Зарегистрирован: 25.08.2014

Вы адреса своих датчиков прописали?

avr4
Offline
Зарегистрирован: 24.12.2015

Я понимаю например так...

int T1=2;

int T2=3;

pinMode (T1;INPUT);

pinMode (T2;INPUT);

Ясно что мыслю не на том уровне как Вы..

Я не знаю как прописать правильно адреса своих датчиков, тем более что они будут сидеть на одном pin И никто не может подсказать что делать

Всего-то мне надо подключить два датчика температуры к одному pin получить результаты присвоенные соответственно двум переменным и дальше приступить к алгоритму своей задачи. А подходящего примера для двух датчиков температуры нет, тот вариант, что предложил dimax выдает результаты обоих датчиков -0,06 

bwn
Offline
Зарегистрирован: 25.08.2014

Мы с вами явно о разном. Пост №4 , вариант для 2-х датчиков, строки 3-4. В них должны быть адреса ваших датчиков. В стандартных примерах к OneWire было как их считать.

bwn
Offline
Зарегистрирован: 25.08.2014

Вдогонку, т.к. каждый датчик имеет уникальный адрес, на одном пине может висеть хоть сотня штук.

avr4
Offline
Зарегистрирован: 24.12.2015

попробую понять, спасибо

ROM = 28 FF D9 2C 92 15 4 92
  Chip = DS18B20
  Data = 1 70 1 4B 46 1F FF 1F 10 69  CRC=69
  Temperature = 23.00 Celsius, 73.40 Fahrenheit
ROM = 28 FF B7 56 92 15 3 11
  Chip = DS18B20
  Data = 1 68 1 4B 46 1F FF 1F 10 17  CRC=17
  Temperature = 22.50 Celsius, 72.50 Fahrenheit
No more addresses.
 
Это пример из стандартной библиотека считывает с моих датчиков
bwn
Offline
Зарегистрирован: 25.08.2014

Чтобы понять получше, наберите в гугле "DS18B20 Чернов". Там на русском неплохо описаны эти датчики.

avr4
Offline
Зарегистрирован: 24.12.2015

Спасибо, сейчас посмотрю Чернова.

bwn
Offline
Зарегистрирован: 25.08.2014

"ROM = 28 FF D9 2C 92 15 4 92"

Это ваш датчик. Все значения двухзначные. Вместо "4" должно быть "04".

Переносите ручками в формате 0х28 ..... в addr1, следующий в addr2. И должно случиться щасье.))))

avr4
Offline
Зарегистрирован: 24.12.2015

Мне нужно в фигурных скобках 3 и 4 строк заменить содержимое на адреса моих датчиков?

Сейчас попробую, спасибо.

УРААА!!! Все пошло!!!

Спасибо за мудрые советы!!!

lohmag
Offline
Зарегистрирован: 14.10.2016

А можно сделать обновление переменной temp через callback, как например в javascript? Т.е. отправить запрос на подготовку значений температуры и потом в callback его в переменную записать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lohmag пишет:

А можно сделать обновление переменной temp через callback, как например в javascript? Т.е. отправить запрос на подготовку значений температуры и потом в callback его в переменную записать?

Вопрос "вообще" или конкретно в каки-то обстоятельствах? Вообще, конечно, можно.

lohmag
Offline
Зарегистрирован: 14.10.2016

В данном случае с данным датчиком температуры. Почему так не делают со всеми датчиками требующими время.

bwn
Offline
Зарегистрирован: 25.08.2014

lohmag пишет:

В данном случае с данным датчиком температуры. Почему так не делают со всеми датчиками требующими время.

А какое время он требует в данном топике? В первый проход дали команду на конвертацию, во втором считали готовые данные.

Logik
Offline
Зарегистрирован: 05.08.2014

lohmag пишет:

А можно сделать обновление переменной temp через callback, как например в javascript? Т.е. отправить запрос на подготовку значений температуры и потом в callback его в переменную записать?

Потому что контролер - не javascript. В отличии от JS нам самим прийдется позаботится как отмерять интервал времени до получения данных и самим вызвать callback, а раз уж самим то какая разница что вызывать, но напрямую проще. Причем выходит проще даже если засунули все в либу, т.к. прийдется переодически дергать из либы некоторую функцию для проверки готовности данных, ну и callback снова лишний. Можна еще конечно в либке через прерывание таймера сделать и тогда, казалось бы, именно калбек - то что надо, но: 1.на всякую фигню таймеров ненапасешся 2.калбек сработает из обработчика прерывания, что накладывает некоторые ограничения (например по времени отработки), а многи о этом не подозревают и все падает очень громко - системное время отстает, сириал теряет данные и т.д.

lohmag
Offline
Зарегистрирован: 14.10.2016

Просто реализовано как то хакерски, через watchdog, может быть есть более прямое решение.

bwn
Offline
Зарегистрирован: 25.08.2014

Там ниже через миллис.

danil25
danil25 аватар
Offline
Зарегистрирован: 12.11.2016

Знатаки!) Подскажите!  Я хочу  подключить датчиками температуры Ds18b20 к Arduino! http://proumnyjdom.ru/kontrollery/ds18b20-podklyuchenie-k-arduino.html Если еще добавить дисплей это будет здорово! Только как это все лучше срастить?  И не пойму почему у меня сейчас сам датчик температуру не точно показывает( 

Serg1
Offline
Зарегистрирован: 04.12.2015

 Dimax, здравствуйте!

Позаимствовали ваш код для опроса датчиков по прерыванию. Вставил в программу "Умный дом", обсуждаемую здесь:

http://arduino.ru/forum/proekty/sistema-umnyi-dom-dlya-zagorodnogo-doma-....

Кусок кода из сообщения #371 Не удаётся подружить.

Для локализации ошибки взял из вашего примера только прерывания(строка 22,23  и вызов строжевого таймера строка 33,34,35).

выдает ошибку:

Плата"Arduino/Genuino (Mega 2560)"
 
In file included from C:\Users\Сергей\Desktop\arduino-1.6.5-r5\hardware\arduino\avr\cores\arduino/Arduino.h:30:0,
                 from C:\Users\Сергей\Desktop\arduino-1.6.5-r5\скетч\libraries\OneWire/OneWire.h:7,
                 from F2.ino:6:
F2.ino: In function 'void izmereniya()':
F2:335: error: expected unqualified-id before string constant
F2:335: error: a function-definition is not allowed here before '{' token
expected unqualified-id before string constant
 
Причём, чтоит закоментить строку //ISR (WDT_vect){
и компилятор не ругается. Но и программа очевидно не будет работать?
Подскажите, если не сложно, в чём косяк.
 
Serg1
Offline
Зарегистрирован: 04.12.2015

сама программа

///Программа "умного дома" на основе 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; } // Сброс таймера
}


 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Serg1, Если обобщить -не правильно вставлен фрагмент -раз, не убраны старые ошмётки от даллосовской либы -это два.

Serg1
Offline
Зарегистрирован: 04.12.2015

В начале я пошел по пути вставки  вашего кода в программу, убирая ошметки Далласа. Избавился от всей кучи ошибок. Оставалась только  эта строка "ISR (WDT_vect){ //вектор прерывания WD". если её закоментить , то компилятор не находил ошибок. После пары дней битв с последней ошибкой, я решил пойти с другой строны- внедрить  в исходную программу ваш код, начиная с прерываний.

Вставив 6 строк сразу упёрся в ту же самую ошибку. Ругается имено на эту же строку ISR.. Скобки переставлял -не помогло.

Подскажите ,куда правильнее вставлять фрагмент.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Serg1, вы читаете что я пишу, или нет? У вас огромная бородище от старого кода висит вообще ни к чему не привязанная стр. 342-363. Кусок от моего кода стр. 334-337  пустой, он ничего не обрабатывает. В общем выглядит всё безнадёжно.

И это только один косяк,  там ещё есть ошмётки.  Мой вам добрый совет -взять исходный код того автора, ежели он вам нравится (хотя это тоже говнокод во всей своей красе) и пользоваться без совмещения с алгоритмом из этой темы.

bwn
Offline
Зарегистрирован: 25.08.2014

Serg1. А лучше взять и написать под свою хату. Ибо сомневаюсь, что вам требуются все фишки заложенные автором кода.

Serg1
Offline
Зарегистрирован: 04.12.2015

С нуля написать не смогу. Взял за основу эту и как правильный скульптор, отсекаю все лишнее.   Где рубить и что подправить под себя  в исходной программе, я понимаю.  С оптимизацией кода -сложнее.....

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

Serg1 пишет:

С нуля написать не смогу. Взял за основу эту и как правильный скульптор, отсекаю все лишнее.   Где рубить и что подправить под себя  в исходной программе, я понимаю.  С оптимизацией кода -сложнее.....

13433_3.jpg

cid
Offline
Зарегистрирован: 20.12.2016

@dimax, подскажите вариант с 2-я датчиками масштабируется до 10-15 штук простым увеличением кол-ва опросов в обработчике прерывания или здесь есть какие-то "подводные камни"?

возможно получится слишком длительная обработка прерывания и следует разделить опрос датчиков ?

bwn
Offline
Зарегистрирован: 25.08.2014

cid пишет:

@dimax, подскажите вариант с 2-я датчиками масштабируется до 10-15 штук простым увеличением кол-ва опросов в обработчике прерывания или здесь есть какие-то "подводные камни"?

возможно получится слишком длительная обработка прерывания и следует разделить опрос датчиков ?

А взять и попробовать?

cid
Offline
Зарегистрирован: 20.12.2016

bwn пишет:

cid пишет:

@dimax, подскажите вариант с 2-я датчиками масштабируется до 10-15 штук простым увеличением кол-ва опросов в обработчике прерывания или здесь есть какие-то "подводные камни"?

возможно получится слишком длительная обработка прерывания и следует разделить опрос датчиков ?

А взять и попробовать?

датчики летят свербыстрой "почтой россии", будут после НГ :)

вот и готовлю теоритическую базу

WarIock
Offline
Зарегистрирован: 10.01.2017

Камрады, такой вопрос... Опрос датчиков тормозит прерывания. Как избавится? Можно это как-то обойти? Если более конкретно, то есть программный диммер, который, используя датчик перехода через 0, повешенный на прерывание, управляет семистором. Как только к этому коду добавляется одна строка ds.write(0x??), появляется еле заметное мерцание, 2 строки - мерцание оч заметно.. и т д, в итоге мигание с частотой опроса. Временно решил проблему отправкой команд датчикам раз в секунду по одной, но мерцание все равно есть. Коллега с телевизором в середине темы испытывал схожие проблемы, скорее всего по той же причине.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

WarIock пишет:

Камрады, такой вопрос... Опрос датчиков тормозит прерывания. Как избавится? 

Вы впервые в этой теме, так что:

1) какие датчики?
2) как именно Вы их опрашиваете (код, пожалуйста)?

А избавиться очень просто

1. Не делать это в прерывании. В прерывании только взводить флаг, что нужно опросить, а собственно опрос делать снаружи;

2. Использовать неблокирующий опрос. Т.е. начинать опрос, но не ждать результата, а продолжать работу программы. А по мере поступления результата его использовать.

WarIock
Offline
Зарегистрирован: 10.01.2017

ЕвгенийП пишет:

1) какие датчики?

А тема про какие датчики?

ЕвгенийП пишет:

2) как именно Вы их опрашиваете (код, пожалуйста)?

ЕвгенийП пишет:

2) как именно Вы их опрашиваете (код, пожалуйста)?

Как все, ds.write(0x44)  ds.write(0xBE), через адрес, или через  ds.write(0xСС) - не важно, ничего не меняется. 

Если кратко, то 

  
void setup()
  attachInterrupt(1, detect_up, LOW);  
  Timer1.initialize(40);          
  Timer1.attachInterrupt(halfcycle);   //будет вызыватся каждый раз при отсчете заданого времени 
  Timer1.stop(); 

//-------------------------------------------------------------

void halfcycle()  //прерывания таймера 
{ 
  tic--;  //счетчик 
  
    if ( DimmSend > tic ) 
      digitalWrite(Dimm, HIGH); //управляем выходом (откроем семистор) 
   
} 

//-------------------------------------------------------------

void  detect_up()  // передний фронт 
{ 
  tic = 200;   //обнулим          
  Timer1.resume();   
  attachInterrupt(1, detect_down, HIGH);  
} 

//-------------------------------------------------------------

void  detect_down()  // задний фронт 
{ 
  Timer1.stop();
  digitalWrite(Dimm, LOW); 
  tic = 200;     //обнулим

  attachInterrupt(1, detect_up, LOW); 

//-------------------------------------------------------------

void  loop ()

Как только в loope появляются ds.write(0x начинает сбиваться открытие-закрытие семистора. Приэтом неважно, присутствует ли сам датчик, 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я не нашёл опроса датчиков в приведённом коде. Удачи Вам!

WarIock
Offline
Зарегистрирован: 10.01.2017

ЕвгенийП пишет:

Я не нашёл опроса датчиков в приведённом коде. Удачи Вам!

Я вот понять не могу, это тест на идиота, могу ли я написать 8 строк? Там негде ошибиться. Или мне весь код выложить? В 1500 строках говнокода будете копаться? Костыль выглядит так: 

float getTemp(){   // возвращает температуру с датчика
  byte data[12];   
  static unsigned long getTempPrevTime;
  int tmp2 = 1000;
  

 if (tic2 == 0 && millis() - getTempPrevTime > tmp2)
 { 
 tic2++;
 getTempPrevTime = millis();
// Serial.println (tic2);
 ds.reset();
 ds.write(0xCC);
 }

if (tic2 == 1 && millis() - getTempPrevTime > tmp2)
 { 
 tic2++;
 getTempPrevTime = millis();
// Serial.println (tic2); 
 ds.write(0x44);            
 }

 if (tic2 == 2 && millis() - getTempPrevTime > tmp2)
 { 
 tic2++;
 getTempPrevTime = millis();
// Serial.println (tic2);
 ds.reset();
 ds.write(0xCC);
 }

 if (tic2 == 3 && millis() - getTempPrevTime > tmp2)
 {
 tic2++;
 getTempPrevTime = millis();
// Serial.println (tic2); 
 ds.write(0xBE);
 }
 
 if (tic2 == 4 && millis() - getTempPrevTime > tmp2)
 {
  tic2=0;;
 getTempPrevTime = millis();
// Serial.println (tic2); 
  data[0] = ds.read();
  data[1] = ds.read();

 
if ((data[0] == 0 && data[1] == 0) || (data[0] == 255 && data[1] == 255))
    
 {
      er++;
        lcd.setCursor(8, 0);
        lcd.print(er);
        
      
    if (er >= 10)  
    {
      lcd.clear();
      lcd.print ("  Sensor ERROR");
      error();
    }  
   return 99.99; 
 }
int raw = (data[1] << 8) | data[0]; // Переводим в температуру   
   if (ChkRestart == 1)
      {
        lcd.clear();
        ChkRestart = 2;
      }
        lcd.setCursor(8, 0);
        lcd.print(er);
return raw / 16.0; 

 }

}

Да, проверка на отсутствие датчика такая, т к запрос crc и адресов в моем случае - лишние моргания. Да, говнокод, да не вычищен. Проблема то не в этом, проблема в том, что оnewire, похоже, перерывания отключает на время выполнения.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

WarIock пишет:

Я вот понять не могу, это тест на идиота, могу ли я написать 8 строк?

Нет. В таком тестировании нет нужды, ответ очевиден. Если бы могли, не пришли бы сюда с таким вопросом.

На, а если можете, то решайте свою проблему сами. У меня пропало желание этим заниматься.

Удачи!

WarIock
Offline
Зарегистрирован: 10.01.2017

Простите, Евгений, диалог с Вами похож на общение с девушкой  первого уровня телефонной поддержки пользователей (из разряда "проверьте, что устройство включено в розетку")  По факту: вопрос в моем первом посте вполне корректен и самодостаточен. Ответ на первую его часть достаточно прост: многие функции  библиотеки onewire, в т. ч. write на некоторое время запрещают прерывания. 

void OneWire::write(uint8_t v, uint8_t power /* = 0 */) {
    uint8_t bitMask;

    for (bitMask = 0x01; bitMask; bitMask <<= 1) {
	OneWire::write_bit( (bitMask & v)?1:0);
    }
    if ( !power) {
	noInterrupts();
	DIRECT_MODE_INPUT(baseReg, bitmask);
	DIRECT_WRITE_LOW(baseReg, bitmask);
	interrupts();
    }
}

Остался вопрос, что будет, если их не запрещать. Но, чувствую, узнать опытным путем будет быстрее.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

WarIock пишет:

Простите, Евгений, диалог с Вами похож на общение с девушкой  первого уровня телефонной поддержки пользователей (из разряда "проверьте, что устройство включено в розетку")  По факту: вопрос в моем первом посте вполне корректен и самодостаточен. Ответ на первую его часть достаточно прост: многие функции  библиотеки onewire, в т. ч. write на некоторое время запрещают прерывания. 

Простите, WarIock, разговор с Вами похож на разговор немого с глухим. Вас попросил показать код. Вы не хотите - дело Ваше. Проблему надо рещать Вам, а не мне. Мне - не надо.

Вы здесь зарегистрировались сегодня, а я давно. И кого я тут только не повидал. Человека, который ток измеряет, подключая мультиметр параллельно нагрузке - видел, человека, который описывает локальную переменную с тем же имененм, что и глобальную, а потом выносит мозг всему форуму почему глобальная не меняется, хотя ей присваивают, тоже видел и много кого видел.

Часто бывает день трахаешься, а потом выясняешь, что человек вместо сравнения написал присваивание. Но день-то потерян!

С некоторых пор, я не веду никаких разговоров с новичками, пока не увижу кода (а если надо, и схемы). Как только я наталкиваюсь на нежелание показывать код (а тут есть деятели, которые задают вопросы "как число в строку преобразовать", но при этом боятся, что их ценнейший код украдут), так вот как только человек начинает говорить, что код показать не может (по любой причине) - я ухожу в сторонку - пусть сам решает свои проблемы. У меня проблем нет и я не намерен терять полдня на помощь тому, кто активно сопротивляется и мешает себе помогать.

Вы понимаете? Нет кода - нет разговора. Очень простая позиция.