ds18b20 пару раз в час вылетают значения типа -1900
- Войдите на сайт для отправки комментариев
Пт, 24/11/2017 - 12:53
#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 не учитывались
За ранее благодарю
sensVal = constrain(sensVal, 10, 100);
напрашивается что то вроде этого , но грамотно встроить мозгов не хватает
Датчик не успевает. Что значит "миллис уже задействован" - это звучит бредом. Миллиса хватит на всех :)
Может вы им просто пользоваться не умеете? Похоже на то, особенно в свете того. что задаете элементарный вопрос - как ограничить получаемые данные в заданных пределах... - просто отбрасывайте значения ниже 10 и больше 100 и все. Хотя это, конечно, костыль - и скорее всего вам не поможет. Судя по вопросу. программировать вы не умеете.
Один путь - учиться.
sensVal = constrain(sensVal, 10, 100);
напрашивается что то вроде этого , но грамотно встроить мозгов не хватает
Да совсем другое тут напрашивается. Данные выше 100 и ниже 10 - ошибочны, приводить их к границам - значит сохранять ощибку. В первую очередь нужно код нормальный писать, чтобы ошибок не было...
Уважаемый b707 вы внимательно читали вопрос????
Так на всякий случай повторю.....Был простой вопрос
Как сделать условие для данного скетча что бы если значения меньше 10 и выше 100 не учитывались ????
Если знаете ответ неужели так сложно просто помочь????
Не понимаю к чему это соплежуйство???
Я прекрасно знаю про проблемы в коде, и не отрицаю что с программированием на вы
Если бы мог сделал бы и без помощи - ток тогда к чему форум...
Тестирую в данный момент новый вариант кода ,ну и да учусь по тихоньку как за 40 переваливает мозги как то уже быстро все не схватывают
Если знаете ответ неужели так сложно просто помочь????
Уважаемый VLADO!
Откуда ж я знаю, как именно вам нужно "не учитывать данные температуры"?
Могу предложить самый тупой вариант, хотя сильно не уверен, что это то, что вам надо:
Вставьте условие
а вместо строки "сделать что-то с температурой" подставьте все свои операторы вывода температуры в Сериал и в веб - начиная со строки 33
Но еще раз повторяю - это бредовое решение. Решив свою проблему здесь, вы наделаете кучу плюх в другом месте, потому что не умеете. Надо учиться! Возраст "за 40" - это фигня, нам в этом форуме почти всем за 40, а многим уже и за 60...
Уважаемый b707 вы внимательно читали вопрос????
Так на всякий случай повторю.....Был простой вопрос
Как сделать условие для данного скетча что бы если значения меньше 10 и выше 100 не учитывались ????
Берете библиотеку DallasTemperature и забываете о своих ненужных условиях. Потому что вся проблема в том, что вы собираете недостоверные данные с пина. И не проверяете их. Это приведет к тому, что "температура" может вписаться в число 10...100, но быть абсолютно неправильной.
b707 спасибо за наводку, чет совсем вылетело из головы все вполне работает..левые значения не отображаются
Дело в том что это часть кода-модульного написанного два года назад и работающего по сей день
Программистом не являюсь и то чего не знал за 2 года забыл-потому помощи и попросил.
код занимает 96% памяти ардуино мега 2560 (более 40 реле и датчиков) и зарекомендовал себя прекрасно-сбоев нет, и сильно лезть в него совсем не хочется - в данный момент аптайм 4 месяца
Условие которое тут просил разруливал центральный сервер:
проверяя 2 температурных датчика на жив или мертв
температура в границах 10-100
и включение тенов по температуре...
[/quote]
Берете библиотеку DallasTemperature и забываете о своих ненужных условиях. Потому что вся проблема в том, что вы собираете недостоверные данные с пина. И не проверяете их. Это приведет к тому, что "температура" может вписаться в число 10...100, но быть абсолютно неправильной.
[/quote]
Интересно конечно, но у меня на каждый датчик выведено по витой паре, а DallasTemperature вроде же для подключения нескольких датчиков на одну шину???
Данный код в свое время мне показался проще и этим лучше, возможно не прав...
И вроде были проблемы там было что то вроде –127 градусов время от времени а так же с миллис(уже не помню что) и ему были более критичны задержки.
У меня есть один критичный модуль как раз на основе millis он делает задержки для различных модулей(удобно и просто)
как раз из за него я и не смог реализовать задержки на основе millis внутри модуля.
Интересно конечно, но у меня на каждый датчик выведено по витой паре, а DallasTemperature вроде же для подключения нескольких датчиков на одну шину???
Данный код в свое время мне показался проще и этим лучше, возможно не прав...
1. Объект DallasTemperature привязывается к объекту oneWire. А их вы хоть на раздельные пины, хоть гроздью вешайте.
2. DallasTemperature: действительно - блокирующая библиотека и для множества датчиков не совсем подходит,если критична высокая скорость реакции. В противном случае можно в каждом раунде лупа производить замер одной точки и тогда блокировки будут размазаны по некоторому временному промежутку. Думаю, что в вашем случае считывание с 40 датчиков (по максимуму) * 400мс (11бит конверсия) будет размазано по 16 000мс, что для тэнов будет вообще незаметно.
3 В том случае, если вы хотите работать напрямую с 1-Wire, вам следует сделать следующее: проверять ds.presence, читать скретчпад полностью и проверять CRC (уже на этом этапе вы откинете все недостоверные показания). Для полного счастья необходимо скидывать незначащие биты в температуре и производить ее корректировку для отрицательных значений.
4. В вашем коде я вообще не вижу никаких задержек между командой на старт конверсии и на чтение датчика. Когда ваш DS вообще успевает что-то правильное назамерять - вот где загадка.
2. DallasTemperature: действительно - блокирующая библиотека и для множества датчиков не совсем подходит
Да с чего Вы все это взяли? У неё есть разные методы и её вполне можно использовать и без блокировки.
Посмотрел, согласен, можно действовать через setWaitForConversion и иже с ними. Привык видеть, как берется "Simple" из примеров и на его основе лепится блокирующий код.
Там только в одном из неблокирующих методов есть ошибка из-за которой он становится блокирующим (именно баг, видно, что задумывалось-то нормально). Но это можно обойти даже ничего не исправляя. Я тут где-то выкладывал неблокирующие коды без изменения библиотеки.