DS18b20 показывает -127
- Войдите на сайт для отправки комментариев
Всем привет,
нужна помощь. Собрал простенькую схему - Arduino UNO, 3 датчика DS18b20 (один водонепронецаемый). Подключил, как подказано на схеме.
Простой скетч:
#include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 10 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); void setup(void){ Serial.begin(9600); sensors.begin(); } void loop(void){ sensors.requestTemperatures(); Serial.print("T0="); Serial.println(sensors.getTempCByIndex(0)); delay(200); Serial.print("T1="); Serial.println(sensors.getTempCByIndex(1)); delay(200); Serial.print("T2="); Serial.println(sensors.getTempCByIndex(2)); }
Залил на Ардуино, открыл монитор, все работает, 3 температуры отображаются. Для теста один из датчиков (водонепронецаемый, который потом будет висеть на улице) засунул в морозилку. Температура начала падать, перешла в минус, но когда дошла до -15,75 произошел какой-то глюк. Следующее значение температуры датчик показал -127.00. Остальные два датчика продолжали отображать комнатную температуру. Когда вытащил датчик из морозилки, температура начала повышаться и он снова начал показывать нормальное значение -15.75, -13,26 и т.д.
От сюда возникает вопрос - что за напасть? Почему датчик тупит, когда температура становится ниже минус 16 градусов?
От сюда возникает вопрос - что за напасть? Почему датчик тупит, когда температура становится ниже минус 16 градусов?
Я бы попробовал другой датчик или пару. Возможно в этом где-то контакты расходятся при охлаждении...
delay(1000);
Возможно стоит добавить паузу после 13 строки.
Пробовал разные варианты: другой датчик ставить, отключить все кроме одного, использовал другой скетч (взял стандартный из примеров) и т.д. Результат тот же самый.
Попробую увеличить задержку, отпишусь
исходник билиотеки содержит:
// Error Codes
#define DEVICE_DISCONNECTED -127
Попробуйте подключить по трём проводам.
Если посмотреть на Вашу схему, то Data от датчика присоединена к 9 пину. А строка
указывает на 10-й пин.
Схему взял с инета, чтобы не рисовать самому. У меня датчик подключен к 10 пину.
Да, смотрел библиотеку. Такое значение показывается, если я вообще отллючу датчик, ну а в моем случае он же работает до определенного значения.
А разве у меня подключено не по 3-м проводам?
Вот здесь http://forum.arduino.cc/index.php?topic=252071.0 обсуждалась именно эта проблема. Если коротко, то обсуждающие решили, что всему виной поддельные китайские датчики.
did5, попробуйте еще вариант без DallasTemperature, на OneWire. А вдруг ?..
did5, извиняюсь. Перепутал с темой про термореле. Там на картинке два провода.
Вот здесь http://forum.arduino.cc/index.php?topic=252071.0 обсуждалась именно эта проблема. Если коротко, то обсуждающие решили, что всему виной поддельные китайские датчики.
Прочитал обсуждение по ссылке, полноценного решения они там так и не нашли. Но есть один вариант, можно попробовать библиотеки отсюда - http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html. Кому-то помогло.
Вот полный текст процедуры из библиотеки OneWire
Критическая, на мой взгляд, величина передается процедуре delayMicroseconds(10). В разном коде (разных библиотек или просто реализаций) я наблюдал значения от 6 до 12. Попробуйте эту десятку уменьшить или увеличить немного.
Прочитал обсуждение по ссылке, полноценного решения они там так и не нашли. Но есть один вариант, можно попробовать библиотеки отсюда - http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html. Кому-то помогло.
Заработало! Скачал библиотеку DallasTemperature с этого сайта http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html. Версия у этой библиотеки и моей совпали, но при детальном сравнении выявились различия. С новой библиотекой датчик DS18B20 стал показывать корректную температуру ниже -15.75.
И что за различия, если не секрет?
И что за различия, если не секрет?
Там разница не в одной строчке, а какая конкретно повлияла на результат не знаю. Могу выложить в облоко оба архива с библиотеками и Вы сами сможете их сравнить.
Там разница не в одной строчке, а какая конкретно повлияла на результат не знаю. Могу выложить в облоко оба архива с библиотеками и Вы сами сможете их сравнить.
По-хорошему, надо диффы различающихся файлов, либо md5 чексумму рабочего архива на худой конец...
Я тоже напоролся на этот баг, добрался уже до работы с DS18B20 напрямую, по 1-wire, даже что-то получилось :-)
Хотя по сути, получилось что я писал подобие библиотеки Dallas на свой лад, и пришлось бы еще код перелопачивать :-( т.к. в тепле все работало, а при испытаниях на морозе вылез этот глюк.
Времени и нервов убил х.з. сколько :-(
Теперь буду ждать морозов, и испытывать библиотеку!
Автору благодарность, особенно если в облако выложит оба архива с библиотеками, на всякий случай.
По результатам отпишусь! (если кому интересно)
Вот обе библиотеки, выложил на Яндекс.Диск:
1. DallasTemperature.zip - с этой библиотекой нормально отображается минусовая температура (https://yadi.sk/d/DsfPqoqsd7g8f)
2. DallasTemperature(-127).zip - с этой библиотекой при температуре меьше -16 датчик показывает -127. (https://yadi.sk/d/g9SMy6fMd7gMS)
а я делал так, только на морозе не тестил. кто то кидал код, я немного переделал
сначала сканирую адреса, чтобы точно знать не какие температуры на датчиках, а на конкретном
адреса постоянно шлются в терминал, повторяются. копируешь свои и вставляешь в этот код
код для двух датчиков. для трех делается аналогично. просто добавить пару строк
1. DallasTemperature.zip - с этой библиотекой нормально отображается минусовая температура (https://yadi.sk/d/DsfPqoqsd7g8f)
2. DallasTemperature(-127).zip - с этой библиотекой при температуре меьше -16 датчик показывает -127. (https://yadi.sk/d/g9SMy6fMd7gMS)
Это абсолютно идентичные архивы. Выложите еще раз пожалуйста.
Это абсолютно идентичные архивы. Выложите еще раз пожалуйста.
С чего Вы взяли? Хеши (MD5) у них разные:
1. DallasTemperature(-127).zip - 0855BF104D427C2880DD7BA0B69EB819
2. DallasTemperature.zip - 1E4EC2201A8FCD4D16B06E317EC0C7BA
Берите крайнюю версию. Ну и OneWire тоже. Кстати одной OneWire более чем достаточно, смотрите её примеры.
С чего Вы взяли? Хеши (MD5) у них разные:
1. DallasTemperature(-127).zip - 0855BF104D427C2880DD7BA0B69EB819
2. DallasTemperature.zip - 1E4EC2201A8FCD4D16B06E317EC0C7BA
У меня тоже было "-127"
Спасибо toc от 05/11/2014 - 09:09
/ Error Codes
#define DEVICE_DISCONNECTED -127
Это значит, что минусовый провод отвалился
Если температура 0 - то резистора между + и сигналом забыл
Конечно должно насторожить -127 - байт "наоборот"
Всем спасибо!
Вот обе библиотеки, выложил на Яндекс.Диск:
1. DallasTemperature.zip - с этой библиотекой нормально отображается минусовая температура (https://yadi.sk/d/DsfPqoqsd7g8f)
2. DallasTemperature(-127).zip - с этой библиотекой при температуре меьше -16 датчик показывает -127. (https://yadi.sk/d/g9SMy6fMd7gMS)
ТС спасибо!!! наступили холода появился тотже глюк, но ваши файлы действительно не подходят, проблема не исчезла
на просторах интернета нашел нужную библиотеку (ссылка на источник) я так понимаю вы ее тоже тут нашли
проблема решилась, поправте ссылку в сообщении 20, на библиотеку на яндекс диске.
Еще раз спасибо!!!!
Это абсолютно идентичные архивы. Выложите еще раз пожалуйста.
посмотрите на ссылку в моем сообщении проблема думаю должна решиться, по крайне мере у меня решилась
Плиз реальную схему . Или фото в студию. На чем вывод организован? Если не секрет.
Тема заинтересовала есть над чем подумать и поучится. Спасибо .
Плиз реальную схему . Или фото в студию. На чем вывод организован? Если не секрет.
Тема заинтересовала есть над чем подумать и поучится. Спасибо .
Реальную схему чего, простите?
В конечном плане вывод температуры куда (дисплей или передача дальше) считать это половина идеи а вся ?
В конечном плане вывод температуры куда (дисплей или передача дальше) считать это половина идеи а вся ?
Да вы на схему гляньте, похоже ТС какой то народный мониторинг с МК90 ваял.
ТС спасибо!!! наступили холода появился тотже глюк, но ваши файлы действительно не подходят, проблема не исчезла
на просторах интернета нашел нужную библиотеку (ссылка на источник) я так понимаю вы ее тоже тут нашли
проблема решилась, поправте ссылку в сообщении 20, на библиотеку на яндекс диске.
Еще раз спасибо!!!!
А как такой скеч доработать чтоб на экране LCD 5110 выводить данные
Так же как и доработать этот:
, что бы стал мигать светодиод.
jeka_tm , можешь подсказать ?
на примере этого
вообще-то датчиков = три
задача - определить присутствие датчиков
- первый ( управляющий ) - при неполадке систему выключить , включить тревогу
- второй и третий ( информационные ) - при неполадке уведомить , но систему не выключать
по схеме "один пин - один датчик" всё понятно , ds.reset(); возвращает 1 при отклике датчика , иначе 0
как определить присутствие каждого датчика в схеме "один пин - гирлянда из трёх датчиков" ?
какой из датчиков откликнется на ds.reset(); ?
в процедуре float DS18B20(byte *adres) первый ds.reset(); обнуляет все датчики ?
а второй ds.reset(); - только адресуемый датчик ?
или надо проверять присутствие датчика после строки ds.select(adres); новым ds.reset(); ?
датчик же уже адресован...
В наличии пока один датчик , опыты проводить не на чем...
Спасибо :)
SU-27-16, а что тебя в нем смущает?
SU-27-16, а что тебя в нем смущает?
извини , дописывал сообщение....
Просто проверь через перебор доступных адресов. Типа:
Это огрызок из скетча автоматического определения количества и принадлежности. Через ds.search(addr) можешь сверять все адреса последовательно. Она начинает считывать с минимального адреса последовательно.
SU-27-16 честно сказать не знаю
ещё...
эта штука тормозит систему на секунду для каждого датчика...
думаю переделать её так
- сброс , опрос датчиков , пересчёт температуры , сброс , старт конверсии
- вызывать процедуру по миллис с периодичностью 750....2000 mS
- система будет свободна же , пока датчики конвертируют температуру ?
при первом проходе лупа все датчики вернут 4095,9 градусов , но потом покажут же правильно ?
Просто проверь через перебор доступных адресов. Типа:
Это огрызок из скетча автоматического определения количества и принадлежности. Через ds.search(addr) можешь сверять все адреса последовательно. Она начинает считывать с минимального адреса последовательно.
кататак ?
поиск датчика_1 по адресу
нашли - замер Т
не нашли - авария
поиск датчика_2,3 по адресу
нашли - замер Т
не нашли - информирование
спасибо , буду пробовать :)
SU-27-16 честно сказать не знаю
дык , всё равно - спасибо :)
Давай одну команду на общую конвертацию, а потом считывай.
Производим вход в функцию с разными интервалами flag[1].
P/S у меня адреса в епроме, 17-18 строка берут оттуда.
Просто проверь через перебор доступных адресов. Типа:
Это огрызок из скетча автоматического определения количества и принадлежности. Через ds.search(addr) можешь сверять все адреса последовательно. Она начинает считывать с минимального адреса последовательно.
кататак ?
поиск датчика_1 по адресу
нашли - замер Т
не нашли - авария
поиск датчика_2,3 по адресу
нашли - замер Т
не нашли - информирование
спасибо , буду пробовать :)
Я бы иначе сделал, проверил количество, сходится - забыли.
Не сходится, начинаем сверять адреса. Добавив к адресу байт признака, сразу знаем какого не хватает. Как то так.
По нормальному, они годами без сбоев работают, в деревне.)))))
а адреса датчиков фиксированные? Или надо предусмотреть возможность их замены без перепрошивки (автоопределение)?
наикорявейший код , "левой ногой набирал"
газКотёл с подачей , например 60 градусов ( уставка - мембранно-капиллярный регулятор ) - отстой , короче
сигнал на включение от радиоТермометра из любой зоны дома
очень часто подача и обратка падают аж до 20 градусов :)
ТЗ :
- включать котёл на подачу 60 гр по команде от радиоТермометра
- поддерживать Т подачи , например 35 гр не зависимо от команд радиоТермометра
- показывать Т подачи , обратки , наружного воздуха
- управлять Т подачи ( + 0....8 гр ) в обоих режимах в зависимости от Т наружного воздуха
( это на следОтопСезон )
Проблема - если котёл включился и датчик отсох - реле управления котлом НЕ ОТКЛЮЧАЕТСЯ :(
пока не отключается..... , кажися с вашей помощью будет отключаться :)
Состав устройства :
- нано
- реле упрКотлом ( он требует полной гальванической развязки ) , PC817 хотел - придётся отказаться
- RGB - синий = сохранение Т воды , красный - рулит радиоМодуль , зелёный проблесковый - опрос датчиков
- проблесковый красный - авария датчика - НО КАКОГО ? ( по версии ЭТОГО кода ) :)
- пин анализа активности радиоТермометра
.....отвлёкся для понимания вами чего мне хочется :)
Давай одну команду на общую конвертацию, а потом считывай.
Производим вход в функцию с разными интервалами flag[1].
P/S у меня адреса в епроме, 17-18 строка берут оттуда.
круто ! копирую , спасибо !
а адреса датчиков фиксированные? Или надо предусмотреть возможность их замены без перепрошивки (автоопределение)?
да , нет
"именные" датчики , автоопределение не нужно , заменю датчик - перепишу код под новый адрес
Делаешь: while ( ds.search(addr) ), сравниваешь считанный и записанный адрес побайтово, если байт не равен, возвращаем байт с номером признака датчика - 9й. Номер признака присваешь сам - адрес+байт признака. Массив с адресами должен быть отсортирован по возрастанию. На выходе из цикла не забывать команду ds.reset_search();