Измерение температуры , на кого поставить ?
Казалось бы основа основ в измерениях , а особо не разбежишься в выборе
Ну само-собою DS18B20 , однозначно он доминирует , для защищенных от воздействия влаги местах как правило ставят исполнение ТО92 ну или SO8 , для улицы , земли или воды ТО92 упакованный в металлическую гильзу , якобы герметический вариант , но на практике и они воду часто начинают пропускать , страхуясь еще пару раз обтягиваю гильзу термоусадкой
Обещанная точность у DS18B20 0,5° , при этом дискретность 1/16°
Наш народ прям не ровно дышит к паразитному питанию (подключению по двум проводам) - никогда не занимался таким крохоборством , экономии на копейку , а падает и длинна надежного соединения , хотя тут еще большое дело влияет качество питания всей схемы , для длинных линий вообще лучше отказаться от импульсных блоков питания , у себя только через это смог бесперебойно снимать показания от паука с 15м лапами
К тому же в последнее время от китайцев идут нормальные чипы , во всем нормальные , только режим двухпроводки они не поддерживают , и таких идет наверно с 90% микросхем, лично мне оно фиолетово , тоскливей было лет 5-7 назад когда пошла от них упрощенка что поддерживала только режим 9 бит
Есть еще микрушка в SO8 корпусе LM75А , первый же минус что на вольные хлеба ее не выставишь , надумаешься как герметизировать , второе это обмен данными через I2C , т.е. далеко от проца не уведешь (хотя это вопрос для меня пока открыт , на днях сам проверять буду , поскольку для меня это актульно с другими датчиками , пока только знаю что 1метр это не проблема и без всякой витой пары , обычной сигнальной многожилкой)
Удивило что по LM75А очень посредственную точность заявляют +/-2° , но тем не менее решил было ее опробовать , да ничего не вышло , один единственный модуль лежал и как выяснилось бракованный , по установленному адресу чип распознается , а данные одни и теже выдает не зависимо от температуры , ну значит и не судьба
Из того что на слуху остаются аналоговые датчики температуры LM335 и LM35 , 335 кристалл выдает температуру в кельвинах из расчета 10мв/1° , а 35 кристалл вещает в градусах цельсия , но только положительные значения , с той же характеристикой 10мв/1°
Первая неприятность - последние несколько лет у китайцев идет сплошной перемеркер , впаривают обычные биполярные транзисторы в ТО92 корпусе , им всей работы лазером новую маркировку нанести LM335 или LM35 , в принципе 335 у меня еще щепотка с хороших времен сохранилась , и есть еще даже отечественные К1019ЕМ1 , да только толку , аналоговое напряжение далеко проблемно тянуть
А основная проблема дискретность измерения аналоговой величины на ардуино , если брать за опорное 3,3в , то 1единица у 10р-АЦП будет ~3,3мв или 0,33° в данных LM335 , для очистки совести все же погонял 335у с ардуиной
с плоттера такой график получил , зубья до 1° при опросе 0,2сек , можно конечто брать к примеру среднеарифметическое за 10 измерений скажем и будет относительно сносно , но ради чего столько мытарств
При том еще что в тесте датчик стоял у проца радом , а отведи его на несколько метров ... , там вообще ужас будет
Короче так и остается одна DS18B20
Вариант первый :
Подключение DS18B20 без запроса адреса прописки , на один цифровой вход такое делать чревато , стоит одному датчику не отозваться при опросе и весь ряд сместится на одну позицию , так что для меня главный принцип , если нет адресации , то 1 вход - 1 датчик
Спрашивается а есть ли смысл потреблять датчики без прописки , отвечу есть , есть он в том случае если есть вероятность выхода датчика из строя , а снимать блок с ардуиной и перепрошивать адрес нового датчика несподручно
У меня например такая система в бане стоит , там три термометра , бак с водой , температура у пола и у головы , в моечное отделение только через стекло дисплей торчит , было уже раз что в баке термометр потек , быстро поменял его и все , снимать процессорный блок , вынимать ардуинку и тащить ее домой на перепошивку не пришлось
Комплектация :
Arduino nano
HD44780 2004 + модуль посл.интерфейса
DS18B20 3шт.
R 4,7ком 3шт.
Схема подключения :
макет в сборе , очень так единодушно датчики показания выдают , правда все три были из одной партии
Программа (скетч) :
#include <LiquidCrystal_I2C.h>//библиотека под LCD
LiquidCrystal_I2C lcd(0x27,20,4);
#include <OneWire.h> // Библиотека для работы с шиной 1-Wire
#include <DallasTemperature.h> // Библиотека для работы с датчиками
OneWire T1(4); // Задаем пин для датчика 1 на шину 1-Wire с именем Т1
OneWire T2(5); // Задаем пин для датчика 2 на шину 1-Wire с именем Т2
OneWire T3(6); // Задаем пин для датчика 3 на шину 1-Wire с именем Т3
DallasTemperature sensors1(&T1); // Датчик 1 на шине Т1
DallasTemperature sensors2(&T2); // Датчик 2 на шине Т2
DallasTemperature sensors3(&T3); // Датчик 3 на шине Т3
void setup() {
lcd.init();// Инициализация lcd дисплея
lcd.backlight();// Включение подсветки дисплея
sensors1.begin(); // Инициализируем датчик 1
sensors2.begin(); // Инициализируем датчик 2
sensors3.begin(); // Инициализируем датчик 3
}
void loop() {
sensors1.requestTemperatures(); // Запрашиваем регистрацию температуры на датчике 1
sensors2.requestTemperatures(); // Запрашиваем регистрацию температуры на датчике 2
sensors3.requestTemperatures(); // Запрашиваем регистрацию температуры на датчике 3
float temp1 = sensors1.getTempCByIndex(0); // Снимаем показания с датчика 1
float temp2 = sensors2.getTempCByIndex(0); // Снимаем показания с датчика 2
float temp3 = sensors3.getTempCByIndex(0); // Снимаем показания с датчика 3
lcd.setCursor(0, 0);
lcd.print("TEPMOMETP 1");
lcd.setCursor(12, 0);
lcd.print(" "); //протир 8 знакомест перед выводом значения
lcd.setCursor(12, 0);
lcd.print(temp1); //вывод значения датчика
lcd.print("c");
lcd.setCursor(0, 1);
lcd.print("TEPMOMETP 2");
lcd.setCursor(12, 1);
lcd.print(" "); //протир 8 знакомест перед выводом значения
lcd.setCursor(12, 1);
lcd.print(temp2); //вывод значения датчика
lcd.print("c");
lcd.setCursor(0, 2);
lcd.print("TEPMOMETP 3");
lcd.setCursor(12, 2);
lcd.print(" "); //протир 8 знакомест перед выводом значения
lcd.setCursor(12, 2);
lcd.print(temp3); //вывод значения датчика
lcd.print("c");
delay(1000); // Делаем замеры раз в секунду
}
Вариант второй :
Теперь подключит те же три датчика , но предварительно проверим у них паспорта с пропиской , теперь их можно вешать на один общий вз
Комплектация :
Arduino nano
HD44780 2004 + модуль посл.интерфейса
DS18B20 3шт.
R 4,7ком 1шт.
Схема подключения :
Программа (скетч) :
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
OneWire oneWire(5);//все датчики на D5
DallasTemperature ds(&oneWire);
DeviceAddress sensor1 = {0x28, 0x27, 0x1D, 0x43, 0xD4, 0xE1, 0x3C, 0xFE };//адреса конкретных датчиков
DeviceAddress sensor2 = {0x28, 0xA8, 0x3F, 0x43, 0xD4, 0xE1, 0x3C, 0x4B };
DeviceAddress sensor3 = {0x28, 0x60, 0x43, 0x43, 0xD4, 0xE1, 0x3C, 0x39};
void setup() {
ds.begin();
lcd.init();
}
void loop()
{
ds.requestTemperatures(); // считываем температуру с датчиков
lcd.setCursor(0,0);
lcd.print("TEPMOMETP 1");
lcd.setCursor(12,0);
lcd.print(" ");//8 знакомест затир
lcd.setCursor(12,0);
lcd.print(ds.getTempC(sensor1));//вывод температуры 1 датчика
lcd.print("c");
lcd.setCursor(0,1);
lcd.print("TEPMOMETP 2");
lcd.setCursor(12,1);
lcd.print(" ");
lcd.setCursor(12,1);
lcd.print(ds.getTempC(sensor2));
lcd.print("c");
lcd.setCursor(0,2);
lcd.print("TEPMOMETP 3");
lcd.setCursor(12,2);
lcd.print(" ");
lcd.setCursor(12,2);
lcd.print(ds.getTempC(sensor3));
lcd.print("c");
delay (1000);
}
В среде разработке Arduino IDE есть в примерах програмка для считывания адреса у 1820х
как в паспортном столе за шоколадку выведаете адреса работников вносим их в скетч
Ну и напоследок мне все же захотелось хоть какую-то компанию DS18B20 найти , пошел по подселенцам , нашел парочку :
в модуле давления BMP180 и в датчике влажности GXHT30
Вариант третий :
Он чисто соревновательный , или будем считать что работников выгнали нормы ГТО сдавать
Комплектация :
Arduino nano
HD44780 2004 + модуль посл.интерфейса
DS18B20 1шт.
R 4,7ком 1шт.
BMP180
GXHT30
Схема подключения :
Пара скриншотов с выходными данными :
Опять же очень близко ложаться данные
Программа (скетч) :
#include <LiquidCrystal_I2C.h>//библиотека под LCD
LiquidCrystal_I2C lcd(0x27,20,4);
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire T1(5);
DallasTemperature sensors1(&T1);
#include <BMP085.h>//библиотека для работы модуля BMP180
BMP085 dps = BMP085();
long Temperature = 0, Pressure = 0,Altitude = 0;
#include "Adafruit_SHT31.h"// библиотека под эту серию датчиков влажности
Adafruit_SHT31 sht31 = Adafruit_SHT31();
void setup() {
Wire.begin();
dps.init();
lcd.init();// Инициализация lcd дисплея
lcd.backlight();// Включение подсветки дисплея
sensors1.begin(); // Инициализируем датчик 1
sht31.begin(0x44);//инициализация датчика GXHT30 44 адресу
}
void loop() {
sensors1.requestTemperatures(); // Запрашиваем регистрацию температуры на датчике 1
float temp1 = sensors1.getTempCByIndex(0); // Снимаем показания с датчика 1
lcd.setCursor(0, 0);
lcd.print("DS18B20 T1");
lcd.setCursor(12, 0);
lcd.print(" "); //протир 8 знакомест перед выводом значения
lcd.setCursor(12, 0);
lcd.print(temp1); //вывод значения датчика
lcd.print("c");
dps.getTemperature(&Temperature);
float t=Temperature;
lcd.setCursor(0, 1);
lcd.print("BMP180 T2");
lcd.setCursor(12, 1);
lcd.print(" "); //протир 8 знакомест перед выводом значения
lcd.setCursor(12, 1);
lcd.print(t/10); //вывод значения датчика
lcd.print("c");
float T3 = sht31.readTemperature();
lcd.setCursor(0, 2);
lcd.print("GXHT30 T3");
lcd.setCursor(12, 2);
lcd.print(" "); //протир 8 знакомест перед выводом значения
lcd.setCursor(12, 2);
lcd.print(T3);
lcd.print("c");
delay(1000);
}
Наврятли потребуется такая сборка , но пусть будет , раз уж написана , под час ведь бывает что начнешь скрещивать двух индивидов и ошибки так и лезут из-за невнимательности
Перейти к содержанию
0 Комментариев
Рекомендуемые комментарии
Комментариев нет
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти