ds18b20 пару раз в час вылетают значения типа -1900

vlado
Offline
Зарегистрирован: 24.11.2017


#ifdef ds18b20_feature

#include <OneWire.h>

OneWire  ds(31);  



char bufferds1_temp[10];

void ds18b20setup() {
  
}



void ds18b20loop() {
  
   //ds1  
  byte data[2];           // объявляем массив из 2-х байт
  ds.reset();             // инициализируем датчик
  ds.write(0xCC);         // пропускаем адресацию к конкретному датчику (у нас он один)
  ds.write(0x44);         // даем команду измерять температуру
  
  ds.reset();            // снова инициализируем датчик
  ds.write(0xCC);        // снова пропускаем адресацию
  ds.write(0xBE);         // даем команду готовности считывать температуру
  data[0] = ds.read();    //считываем  младший 
  data[1] = ds.read();    // и старший байты
  int Temp = (data[1] << 8) + data[0];  // преобразуем считанную информацию
  Temp = Temp >> 4;   // к нужному виду.
 
  Serial.print("1d");
  Serial.println(Temp);                 // выводим результат в последовательный порт.
  if (client.connect("arduinoClient", "mqtt", "paradox")) {
dtostrf(Temp,0, 0, bufferds1_temp);
client.publish("/mega01/tempds1", bufferds1_temp);
client.loop();
}

#endif

Приветствую !

Такая проблемка периодически (раз в пол часа) вылетают значения -1900 либо 900

Видимо датчик не успевает считать температуру либо глючит

Задержки поставить не могу, millis тоже задействован и его использование так же не желательно

Как сделать условие для данного скетча что бы если значения меньше 10 и выше 100 не учитывались 

За ранее благодарю

vlado
Offline
Зарегистрирован: 24.11.2017

sensVal constrain(sensVal10, 100);

напрашивается что то вроде этого , но грамотно встроить мозгов не хватает

b707
Offline
Зарегистрирован: 26.05.2017

Датчик не успевает. Что значит "миллис уже задействован" - это звучит бредом. Миллиса хватит на всех :)

Может вы им просто пользоваться не умеете? Похоже на то, особенно в свете того. что задаете элементарный вопрос - как ограничить получаемые данные в заданных пределах... - просто отбрасывайте значения ниже 10 и больше 100 и все. Хотя это, конечно, костыль - и скорее всего вам не поможет. Судя по вопросу. программировать вы не умеете.

Один путь - учиться.

b707
Offline
Зарегистрирован: 26.05.2017

vlado пишет:

sensVal constrain(sensVal10, 100);

напрашивается что то вроде этого , но грамотно встроить мозгов не хватает

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

vlado
Offline
Зарегистрирован: 24.11.2017

Уважаемый b707 вы внимательно читали вопрос???? 

Так на всякий случай повторю.....Был простой вопрос

Как сделать условие для данного скетча что бы если значения меньше 10 и выше 100 не учитывались ????

Если знаете ответ неужели так сложно просто помочь????

Не понимаю к чему это соплежуйство???

Я прекрасно знаю про проблемы в коде, и не отрицаю что с программированием на вы

Если бы мог сделал бы и без помощи - ток тогда к чему форум...

Тестирую в данный момент новый вариант кода ,ну и да учусь по тихоньку как за 40 переваливает мозги как то уже быстро все не схватывают

b707
Offline
Зарегистрирован: 26.05.2017

vlado пишет:

Если знаете ответ неужели так сложно просто помочь????

Уважаемый VLADO!

Откуда ж я знаю, как именно вам нужно "не учитывать данные температуры"?

Могу предложить самый тупой вариант, хотя сильно не уверен, что это то, что вам надо:

Вставьте условие

if ((temp >10) && (temp<100)) {
  // сделать что-то с температурой
}

а вместо строки "сделать что-то с температурой" подставьте все свои операторы вывода температуры в Сериал и в веб -  начиная со строки 33

b707
Offline
Зарегистрирован: 26.05.2017

Но еще раз повторяю - это бредовое решение. Решив свою проблему здесь, вы наделаете кучу плюх в другом месте, потому что не умеете. Надо учиться! Возраст "за 40" - это фигня, нам в этом форуме почти всем за 40, а многим уже и за 60...

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

vlado пишет:
тогда к чему форум...
Для общения по интересам.

sadman41
Offline
Зарегистрирован: 19.10.2016

vlado пишет:

Уважаемый b707 вы внимательно читали вопрос???? 

Так на всякий случай повторю.....Был простой вопрос

Как сделать условие для данного скетча что бы если значения меньше 10 и выше 100 не учитывались ????

Берете библиотеку DallasTemperature и забываете о своих ненужных условиях. Потому что вся проблема в том, что вы собираете недостоверные данные с пина. И не проверяете их. Это приведет к тому, что "температура" может вписаться в число 10...100, но быть абсолютно неправильной.

 

vlado
Offline
Зарегистрирован: 24.11.2017

b707 спасибо за наводку, чет совсем вылетело из головы все вполне работает..левые значения не отображаются

Дело в том что это часть кода-модульного написанного два года назад и работающего по сей день

Программистом не являюсь и то чего не знал за 2 года забыл-потому помощи и попросил.

код занимает 96% памяти ардуино мега 2560 (более 40 реле и датчиков) и зарекомендовал себя прекрасно-сбоев нет, и сильно лезть в него совсем не хочется - в данный момент аптайм 4 месяца

Условие которое тут просил разруливал центральный сервер:

проверяя 2 температурных датчика на жив или мертв

температура в границах 10-100

и включение тенов по температуре...

[/quote]

Берете библиотеку DallasTemperature и забываете о своих ненужных условиях. Потому что вся проблема в том, что вы собираете недостоверные данные с пина. И не проверяете их. Это приведет к тому, что "температура" может вписаться в число 10...100, но быть абсолютно неправильной.

[/quote]

Интересно конечно, но у меня на каждый датчик выведено по витой паре, а DallasTemperature вроде же для подключения нескольких датчиков на одну шину???

Данный код в свое время мне показался проще и этим лучше, возможно не прав...

И вроде были проблемы там было что то вроде –127 градусов время от времени а так же  с миллис(уже не помню что) и ему были более критичны задержки.

У меня есть один критичный модуль как раз на основе millis он делает задержки для различных модулей(удобно и просто)

как раз из за него я  и не смог реализовать задержки на основе millis внутри модуля.

sadman41
Offline
Зарегистрирован: 19.10.2016

vlado пишет:

Интересно конечно, но у меня на каждый датчик выведено по витой паре, а DallasTemperature вроде же для подключения нескольких датчиков на одну шину???

Данный код в свое время мне показался проще и этим лучше, возможно не прав...

1. Объект DallasTemperature привязывается к объекту oneWire. А их вы хоть на раздельные пины, хоть гроздью вешайте.

2. DallasTemperature: действительно - блокирующая библиотека и для множества датчиков не совсем подходит,если критична высокая скорость реакции. В противном случае можно в каждом раунде лупа производить замер одной точки и тогда блокировки будут размазаны по некоторому временному промежутку. Думаю, что в вашем случае считывание с  40 датчиков (по максимуму) * 400мс (11бит конверсия) будет размазано по 16 000мс, что для тэнов будет вообще незаметно.

3  В том случае, если вы хотите работать напрямую с 1-Wire, вам следует сделать следующее: проверять ds.presence, читать скретчпад полностью и проверять CRC (уже на этом этапе вы откинете все недостоверные показания). Для полного счастья необходимо скидывать незначащие биты в температуре и производить ее корректировку для отрицательных значений.

4. В вашем коде я вообще не вижу никаких задержек между командой на старт конверсии и на чтение датчика. Когда ваш DS вообще успевает что-то правильное назамерять - вот где загадка.

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

sadman41 пишет:

2. DallasTemperature: действительно - блокирующая библиотека и для множества датчиков не совсем подходит

Да с чего Вы все это взяли? У неё есть разные методы и её вполне можно использовать и без блокировки. 

sadman41
Offline
Зарегистрирован: 19.10.2016

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

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

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