Датчик температуры DS18B20 с гидроизоляцией
- Войдите на сайт для отправки комментариев
Сб, 09/01/2016 - 12:57
Появился вопрос по сабжу.
Проект - контроллер аквариума. Использую Uno R3, экран 16х2 + i2c, релле на 2 выхода и собственно сам датчик DS18B20. На этапе макетирования все работало, температуру меряло, выводило на экран.
Сейчас все собрал в коробку все спаял, подключил и начал проводить полевые испытания :) при первом погружении датчика в аквариум на глубину свыше 15 см сигнал от датчика начинает чудить пропадая на экране, если еще глубже погружать пропадает вовсе, кто подскажет в каком направлении рыть.
П.С. начинающий ардуинщик, опыта мало.
А можно фото датчика?
Проверь герметичность датчика. Срежь термоусадку и посмотри, может там вода.
У меня висевший на улице датчик в металлическом колпачке и термоусадке все равно где-то через год набрал воды. Следующая версия пошла уже с забитым внутрь колпачка теплопроводящим герметиком. Посмотрим, насколько такой вариант сдюжит.
Сам Датчик
По поводу герментичности, у меня два этих датчика, причем 1 вообще никогда не использовался, я когда заметил проблему, подключил второй и сразу опустил на дно аквариума ,тот же эффект сигнал пропадает, вытаскиваешь все нормально ...
Срезать сразу термоусадку, герметик и обратно ставить.
Приятель просто голый даллас залил герметиком.
Пару лет уже работает в аквариуме.
как бы очевидно, что датчик явно без гидроизоляции - срежь термоусадку, залей колпачёк силиконовым герметиком, воткни втуда датчик, вытри выдавившися силикон, установи термоусадку.
Первое что сделал, намертво перемотал изолентой и сунул в аквас, ничего особо не поменялось...
И кстати напомнило:
Силикон бывает нейтральный и уксусный.
Сначала заливал нейтральным, потом решил проверить уксусный.
Щупы мультика в незатвердевшем уксусном силиконе на пределе 20 Мегаом показывали обрыв,
что было довольно неожиданно с учётом запаха уксуса вокруг.
Пошёл дальше, стал заливать кислотным платы блока питания камер для пробы:
трансформатор 220-15 ас, 4 диода, кондёры 2000.0, 7812, всё на платке
и этим-же силиконом залито в заднюю часть хаузинга камер
Залито основательно чтобы не отваливались провода при их дёргании( глю-ган не держит-плавится летом)
Сделано было штук 100-200 за много лет, 10-15 лет назад,
все блоки питания до сих пор живы.
Правда не все камеры...
Та что теперь спокойно отношусь к кислотному силикону и считаю его вполне " электротехническим"
То есть даже неплохим изолятором ( 220 на первичке тех трансформаторов)
Кстати для пробы подавал 220 сразу после заливки, никаких проблем.
И никакой коррозии не видел ( иногда приносили хаузинги на ремонт)
А у кого-то есть отрицательный опыт применения кислотного силикона в "изоляции" электротехники ?
А у кого-то есть отрицательный опыт применения кислотного силикона в "изоляции" электротехники ?
у меня есть - медные провода зеленеют.
поэтому был забракован для электротехнических работ как потенциально небезопасный.
Я так и думал.... А пайки оставались даже блестящими
Есть двухкомпонентный.
Приятель брал где то однокомпонетный нетральный как краска.
Всё намного проще. Вода добавляет ёмкость на линии. Получается, что тупо заваливаются фронты импульсов. Отсюда и глюки.
Это единственный вариант, объясняющий это явление.
Ищите проблему в софте.
Для эксперимента, можете подобавлять ёмкости, величной начиная от 1н и выше, между выводом данных и землёй (или питанием). Получите такой же эффект.
Одну ногу емкость линии отгрызла. Вода ни при чем. Ага.
Что ? Вы про какую ногу говорите ?
У человека, при погружении датчика в воду, появляются проблемы с измерением. Это ёмкость влияет.
Alexino, ни у кого не влияет, а у него влияет? Разве что у него в воду фаза 220вольт опущена, тогда будет влиять :))
А кабель на металлический стакан не течёт ?
Ёмкости там от силы пару сотен пик от воды добавится.
резистор проверьте или поставьте раза в 2 поменьше.
Alexino, ни у кого не влияет, а у него влияет? Разве что у него в воду фаза 220вольт опущена, тогда будет влиять :))
Вы уверены, что у него реалзиция 1-Wire идеальная ? Я, например, нет. Я даже больше скажу - у него проблема с реализацией интерфейса. Тупо не выдержаны временные интервалы для тайм-слотов.
Вы просто не встречались с ситцациями, при которых датчик наинает лагать даже при 2ух-3ёх-метровом проводе, при этом отлино работая на проводе < 1 метра. И это всё - последствия незнания интерфейса с которым работаешь.
И фаза тут совсем не при чём, я не о наводках говорю, а о ёмкости воды, которая, кстати, не такая уж и маленькая.
PS: Для эксперемента, повесьте ёмкость в 0.01-0.1 мкф, при сопротивлении подтяжки даже в 1к - рубль за сто даю, Ваш термометр загнётся...
А вот совет по уменьшению сопротивления - в точку.
#include <OneWire.h> //Подключаем библиотеку для использования однопроводного интерфейса //Температурного датчика DS18B20 #include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC //И модуля ЖК дисплея 16Х2, который также испольует I2C #include <LiquidCrystal_I2C.h> //Подключаем библиотеку для Модуля ЖК дисплея 16Х2 #include <RTClib.h> //Подключаем библиотеку для использования модуля часов реального времени RTC //--------------------------------------------------- int TSensorPin = 11; //Определяем порт шины OneWire (IC) для температурного датчика DS18B20 OneWire ds(TSensorPin); //Создаем соответсвующий объект LiquidCrystal_I2C lcd(0x27,16,2); //Устанавливаем I2С адрес ЖК-дисплея = 0x27. Это данные из документации на I2C модуль на дисплее RTC_DS1307 RTC; //Создаем переменную класса - для использования RTC //----------Объявляем разные переменные-------------- const int RelayChn1 = 4; //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля const int RelayChn2 = 8; //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля const int RelayChn3 = 9; //Используем цифровой ПОРТ 8 для ТРЕТЬЕГО канала релейного модуля //----------Настройки времени и продолжительности включения реле //----------ПЕРВЫЙ канал---------------------------- const long StartRelCn_1 = 5900; //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток) //в данном случае 25200 - это 7 часов 00 минут = ( 60секунд *60 минут *7 = 25200) const long DurationCh_1 = 10; //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах) //----------ВТОРОЙ канал---------------------------- const long StartRelCn_2 = 37800; //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток) //В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800) const long DurationCh_2 = 15; //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах) //----------ТРЕТИЙ КАНАЛ---------------------------- float t0 = 30.5; //Уставка температуры для ТРЕТЬЕГО канала релейного модуля float tGistrsis = 0.7; //Уставка гистерезиса - т.е отклонения от темп-ры уставки //т.е. в данном случае 0,7 = плюс минус 0,35 градуса //----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение (и аналогичных событиях) void setup(){ digitalWrite(TSensorPin,HIGH); pinMode(RelayChn1,OUTPUT); //Инициализируем порт для ПЕРВОГО канала как ВЫХОД pinMode(RelayChn2,OUTPUT); //Инициализируем порт для ВТОРОГО канала как ВЫХОД pinMode(RelayChn3,OUTPUT); //Инициализируем порт для ТРЕТЬЕГО канала как ВЫХОД digitalWrite(RelayChn1,HIGH); //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень digitalWrite(RelayChn2,HIGH); //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой digitalWrite(RelayChn3,HIGH); // Wire.begin(); //Инициируем I2C интерфейс RTC.begin(); //Инициирум RTC модуль lcd.init(); //Инициализируем ЖК дисплей lcd.setBacklight(1); //Включаем на ЖК дисплее подсветку // RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале, //для того, чтобы загрузить в RTC дату и время на момент компиляции программы //Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки //времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!! //----------Подготавливаем экран ЖК дисплея - выводим на него статичные поля lcd.clear(); lcd.setCursor(9, 0); lcd.print("t="); lcd.setCursor(0, 1); lcd.print("R1=0"); lcd.setCursor(5, 1); lcd.print("R2=0"); lcd.setCursor(10, 1); lcd.print("R3=0"); } // КОНЕЦ ИНИЦИАЛИЗАЦИИ //-------------------------------------------------- void loop() // ПРОГРАММЫй безусловный ЦИКЛ { DateTime myTime = RTC.now(); //Читаем данные времени из RTC //---------Вывод часов на ЖК-------------------- lcd.setCursor(0, 0); //Перемещаем курсор ЖК дисплея в первую строку в 5-ю позицию if (myTime.hour() < 10) lcd.print ("0"); //так дополняются лидирующие нули - когда есть необходимость lcd.print(myTime.hour()); //Выводим значение ЧАСОВ lcd.print(':'); //Выводим символ разделителя (:) if (myTime.minute() < 10) lcd.print ("0"); lcd.print(myTime.minute()); //Выводим значение МИНУТ lcd.print(':'); //Выводим символ разделителя (:) if (myTime.second() < 10) lcd.print ("0"); lcd.print(myTime.second()); //Выводим значение СУЕКУНД //----------Раздел обработки реле по времени ---- long utime = myTime.unixtime(); //сохраняем время в формате UNIX utime %= 86400; //Сохраняем в переменной остаток деления на кол-во секнд в сутках, //Это дает количество секунд с начала текущих суток //------------КАНАЛ 1------------------------------ if ((utime >= StartRelCn_1) && (utime < (StartRelCn_1+DurationCh_1))) //Если секунд с начала суток больше, чем задано для включения //Но, одновременно и меньше, чем задано для включения + длительность { digitalWrite(RelayChn1,LOW); //Устанавливаем на ПЕРВОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает lcd.setCursor(3, 1); lcd.print("1"); } else { digitalWrite(RelayChn1,HIGH); //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается lcd.setCursor(3, 1); lcd.print("0"); } //------------КАНАЛ 2 - все аналогично ----------- if ((utime >= StartRelCn_2) && (utime < (StartRelCn_2+DurationCh_2))) { digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает lcd.setCursor(8, 1); lcd.print("1"); } else { digitalWrite(RelayChn2,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается lcd.setCursor(8, 1); lcd.print("0"); } //----------Вывод температуры на ЖК-------------- float temp = getTemp(); //Читаем температуру с датчика lcd.setCursor(11, 0); //Выводим температуру на ЖК lcd.print(temp); //------------КАНАЛ 3 Контроль температуры ------- if (temp < t0-tGistrsis/2) { digitalWrite(RelayChn3,LOW); //Устанавливаем на ТРЕТЬЕМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает lcd.setCursor(13, 1); lcd.print("1"); } else if (temp > t0+tGistrsis/2) { digitalWrite(RelayChn3,HIGH); //Устанавливаем на ТРЕТЬЕМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается lcd.setCursor(13, 1); lcd.print("0"); } } //------------Конец ЦИКЛА----------------------------- //***************************************************** //-------------Объявления и реализация функций--------- float getTemp(){ //функция чтения значения температуры с датчика DS18B20 по шине OneWire byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search lcd.setCursor(0, 0); lcd.print("NO more addrss!"); ds.reset_search(); return -1001; } if ( OneWire::crc8( addr, 7) != addr[7]) { lcd.setCursor(0, 0); lcd.print("CRC is not valid!"); return -1002; } if ( addr[0] != 0x10 && addr[0] != 0x28) { lcd.setCursor(0, 0); lcd.print("NOT recognizd!"); return -1003; } ds.reset(); ds.select(addr); ds.write(0x44,1); byte present = ds.reset(); ds.select(addr); ds.write(0xBE); for (int i = 0; i < 9; i++) { data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float TRead = ((MSB<<8) | LSB); float Temperature = TRead / 16; return Temperature; }Сам код, уже не помню какой резистор ставил, после работы дома буду поменяю, за наводку спасибо, в микроэлектронике нуб, пока учусь
А где задержка между началом преобразования и чтением температуры ?
Измерял ёмкость кабеля в моей сети из пятидесяти одного датчика.
7000 пик было максимум.
7 хвостов в разные стороны. 50- 100 метров.
Половина по правилам, датчики сидят последовательно.
Некоторые со звездой на конце, из одной точки 3-4 по сторонам 20-30 метров
Каждый хвост к своему пину.
Резисторы 1к8, питание каждого хвоста 78L05,
кондёр по питанию не помню, 1000.0 или 2000.0, что под руку попалось.
При токе с десяток миллиамер не важно.
Всё работает уже давно и без глюков.
Изредка CRC можно увидеть, но это судьба такая.
Так что думайте......
Сегодняшний скриншот:
Вторая цифра- номер канала. A0-A7 на мега 256
Разве она нужна ? Если что код не мой.
Если не сделать паузу после StartConvrersion и ReadScratcpad более 0,75 секунды ( на 12- разрядах)
то вы считаете предыдущее преобразование.
Кстати, а кто вам мешает проверить датчик простым примером из библиотеки?
Там софтом всё в порядке
Всё работает уже давно и без глюков.
Изредка CRC можно увидеть, но это судьба такая.
Но есть варианты, когда не будет работать даже с 5-тью метрами провода - этой ёмкости будет достаточно, чтобы завалить фронты на столько, что плохо-реализованный интерфейс будет давать знать о себе.
По данному примеру сказать ничего не могу, ибо вся реализация спрятана в библиотеку. И компильнуть код не могу, в надежде на то, что библиотека стандартная, ругается на OneWire.h Но могу сказать точно - причина у ТС в ёмкости, возникающей при опускании датчика с проводом в воду. И с вероятностью в 99.9% уменьшение сопротивления подтяжки его спасёт, это основы электроники (RC-цепь). Остальные 0.1% - исправление его собственной программы.
Итог: поставил 4.7 кОМ как советуют к этому датчику, 2кОм, 1 кОм ничего не поменялось, при погружении на 30 см начинаются глюки
П.С. к работающему контроллеру подцепил запасно датчик, все на нем проводил.
lex0r, ну возьмите уже отдельную 3х литровую банку, и протестируйте на ней. В #15 я конечно пошутил, но нужно точно убедиться, что нет привязки к конкретному аквариуму.
Проверил на бутыле 19 литровом, действительно датчик работает нормально, в аквариуме сразу глючит, все фильтры вырубил из сети, все равно тоже самое
lex0r, ну вот, уже что-то. Разбирайтесь, нам отсюда не виден ваш аквариум. Как это не смешно, но наиболее вероятная причина -переменный ток в воде :)
Да , и на время эксперимента уберите электрического ската из аквариума.
Вообщем, решил отключить вилки питания света подключенные к реллешке( релле на две нагрузки), при выключении одной из нагрузок из сети все глюки датчика пропадают...
У меня с подобным реле тоже глюки, НАНО начинает малость бредить :(
lex0r, производители этих модулей ставят самые дешевые реле. У них изначально завышенное сопротивление соединённых контактов, из-за этого место сопрокосновения контактов подгорает и начинает генерить очень сильные помехи. Видимо опуская датчик в аквариум вы приближались сильно к проводам этой лампочки, и этого хватало, что бы полностью нарушить работу датчика.
Не согласен, сейчас подсоединил релле длинными прводами специально подальше увел от самой платы уно и опять при погружении тоже самое, видимо через управляющие пины какие то помехи идут.
lex0r, Вы задержку после команды преобразования поставили ?
И ещё, ошибки CRC пишет ? Или просто начинает врать температуру ?
Опишите подробнее симптомы.
Честно говоря не понял где задержку поставить
179for(inti = 0; i < 9; i++) {180data[i] = ds.read();Перед этими строками? и задержку функцией delay ставить ?
Ошибку пишет эту, нет датчика в цепи
if( !ds.search(addr)) {148//no more sensors on chain, reset search149lcd.setCursor(0, 0);150lcd.print("NO more addrss!");151152ds.reset_search();153return-1001;float getTemp(){ //функция чтения значения температуры с датчика DS18B20 по шине OneWire byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search lcd.setCursor(0, 0); lcd.print("NO more addrss!"); ds.reset_search(); return -1001; } ds.reset_search(); if ( OneWire::crc8( addr, 7) != addr[7]) { lcd.setCursor(0, 0); lcd.print("CRC is not valid!"); return -1002; } if ( addr[0] != 0x10 && addr[0] != 0x28) { lcd.setCursor(0, 0); lcd.print("NOT recognizd!"); return -1003; } ds.reset(); ds.select(addr); ds.write(0x44,1); delay(1000); ds.reset(); ds.select(addr); ds.write(0xBE); for (int i = 0; i < 9; i++) { data[i] = ds.read(); } byte MSB = data[1]; byte LSB = data[0]; float TRead = ((MSB<<8) | LSB); float Temperature = TRead / 16; return Temperature; }Кстати, если в устройстве датчик всего один, то пользовать поиск и выбор по ID вовсе не обязательно.
Совершенно не понятно, зачем это сделано в программе.
Будет повешан еще 1 датчик для измерения температуры воздуха на тот же канал
lex0r, ну вот, уже что-то. Разбирайтесь, нам отсюда не виден ваш аквариум. Как это не смешно, но наиболее вероятная причина -переменный ток в воде :)
Похоже.
Выньте все приборы которые опущены в воду. Особенно нагреватели.
Короче сделайте из аквариума макет 3-ёх литровой банки.
Если аквариум имеет металлический каркас- соедините с землёй Ардуины.
Попробуйте запитать плату с датчиком от батареек.
Эм если читали тему, то все дело в релле, которое наводки дикие создает
lex0r, вы не все детали проговариваете. Какие-то вновь вспывающие факты начинают противоречить предыдущим. Например сначала вы писали, что глюк появляется только опуская датчик в воду, а вынимая обратно всё ок. Но ведь как я понимаю провода к реле подключены были и в том и в другом случае, и экперемент отличался только местополодением датчика. Выходит что-то ещё было изменено? Вы отсоединяли реле, когда вынимали датчик?
Никакого противоречия
Собрал устройство с релле на две нагрузки + ртс часы + датчик температуры с гидроизоляцией.
Стал тестировать работу, без погружения датчика в аквариум все работает хорошо, свет вклчюается выключается через заданное время, температура измеряется.
Когда стал опускать датчик в воду начались глюки. После нашего разговора дял интереса повыключал из пилота электро приборы для аквариума (два фильтра), все оставалось по прежнему в воду пихаю глючит вынимаю работает, выключит нагрузки на релле из сети (свет для аквариума) глюки пропали.
Потом отключил полностью релле от ардуины, опустил в аквариум датчик, датчик работает нормально.
готов записать видео всех моих действий вечером, после работы
lex0r, Вы задержку поставили после преобразования ? Она обязательна ! Как после её установки ведёт себя устройство ?
Опустите датчик в воду. При всё отключено работает? Вы пишите "работает"
Включайте ваши нагрузки по одной, но напрямую в розетки. Датчик после этого работает?
Кстати у вас 5-ти Вольтовые реле.
Откуда они питаются? ( там на плате есть синяя перемычка)
выключит нагрузки на релле из сети (свет для аквариума) глюки пропали.
Ну а почему в моём сообщении #31 вы с чем-то несогласны? Значит утечка тока идёт через свет в аквариуме. Стало быть моё сообщение #15 было пророческим. Как у вас организован свет, где находятся лампочки физически?
Похоже на это, хотя для утечки от света
необходим замкнутый контур для прохождения этого тока, а у нас его нет ;(
Да и что с того что даже по земле аквариум-Ардуина течёт небольшой ток ( через кондёры фильтров лампы и блока питания)
Не может он создать что-то критическое.
У нас земля Ардуины , датчика и реле жёстко связаны, а земля реле возможно даже развязана оптронами .
Создать разность потенциалов на участке проводника нужен "реальный" и не маленький ток.
Свет у меня на люминесцентных лампах с электрическими пускателями, сами лампы закреплены на пластике, с водой вообще никак не соприкасаются, исключаю вариант с утечками, аквариум без металлокаркаса абсолютно, вечером покажу все на видео
Свет у меня на люминесцентных лампах с электрическими пускателями...
Вот так, под пытками, правда и открывается. :)) При работающих лампах извлеките стартер из той, которая дает помехи.
Если сразу не помогло, то проверьте комбинации лампа-стартер-реле и выясните, что именно дает помеху. ЛДС вообще источник повышенных помех, неисправные стартеры к ним - особо злостных помех, плюс некачественный контакт питания (реле) это вообще - гремучая смесь.
С ЭПРА проблем не было, работают пол года, тогда у меня возникает вопрос ЭПРА убран далеко, помехи идут через управляющие провода на реллешке ?
https://www.youtube.com/watch?v=wEnxOfqAWRU видео не полное к сожалению, как оказалось, когда закончили съемки, моя благоверная перепутала продолжение съемки со стопами, завтра дубль 2 сделаем )
https://www.youtube.com/watch?v=wEnxOfqAWRU
Автор ограничил доступ к видео.
Сожалеем об этом.
Открыл доступ.