Перейти к содержанию
Клуб помидороводов - tomat-pomidor.com


  • записей
    8
  • комментарий
    1
  • просмотра
    453

Измерение температуры , на кого поставить ?


feniсs

32 просмотра

Казалось бы основа основ в измерениях , а особо не разбежишься в выборе

Ну само-собою 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у с ардуиной

1133371978_LM33502.thumb.jpg.cbe772ea099351456d8e5a4728fdbd0f.jpg с плоттера такой график получил , зубья до 1° при опросе 0,2сек , можно конечто брать к примеру среднеарифметическое за 10 измерений скажем и будет относительно сносно , но ради чего столько мытарств

При том еще что в тесте датчик стоял у проца радом , а отведи его на несколько метров ... , там вообще ужас будет

Короче так и остается одна DS18B20

Вариант первый :

Подключение DS18B20 без запроса адреса прописки , на один цифровой вход такое делать чревато , стоит одному датчику не отозваться при опросе и весь ряд сместится на одну позицию , так что для меня главный принцип , если нет адресации , то 1 вход - 1 датчик

Спрашивается а есть ли смысл потреблять датчики без прописки , отвечу есть , есть он в том случае если есть вероятность выхода датчика из строя , а снимать блок с ардуиной и перепрошивать адрес нового датчика несподручно

У меня например такая система в бане стоит , там три термометра , бак с водой , температура у пола и у головы , в моечное отделение только через стекло дисплей торчит , было уже раз что в баке термометр потек , быстро поменял его и все , снимать процессорный блок , вынимать ардуинку и тащить ее домой на перепошивку не пришлось

Комплектация :

Arduino nano

HD44780 2004 + модуль посл.интерфейса

DS18B20 3шт.

R 4,7ком 3шт.

Схема подключения :

1586251197_318202004(2).thumb.JPG.8d518441ba5615540ebd413587a4c042.JPG

1825213469_318202004.thumb.JPG.cad1925c8e647a17f9e92b9df5e8a60b.JPG макет в сборе , очень так единодушно датчики показания выдают , правда все три были из одной партии

Программа (скетч) :

#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шт.

Схема подключения :

1363625928_318202004.thumb.JPG.8b667b935ac89b737c6e6e9fe0908aa1.JPG

Программа (скетч) :

#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х

804794308_.thumb.jpg.65d2d66f2ee2d343023044b7f0c0e47c.jpg как в паспортном столе за шоколадку выведаете адреса работников вносим их в скетч

Ну и напоследок мне все же захотелось хоть какую-то компанию DS18B20 найти , пошел по подселенцам , нашел парочку :

в модуле давления BMP180 и в датчике влажности GXHT30

Вариант третий :

Он чисто соревновательный , или будем считать что работников выгнали нормы ГТО сдавать:cheesy:

 Комплектация :

Arduino nano

HD44780 2004 + модуль посл.интерфейса

DS18B20 1шт.

R 4,7ком 1шт.

BMP180

GXHT30

Схема подключения :

526975034_3182018030.thumb.JPG.e0bc8baed1483a046854438e82cda5f7.JPG

Пара скриншотов с выходными данными :

1099337871_1.thumb.JPG.a3c24b49de067667c8966d357773dcfe.JPG

1509994055_2.thumb.JPG.113cf574db1b5c1f116988cff6e6ed4f.JPG

Опять же очень близко ложаться данные

Программа (скетч) :

#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 Комментариев


Рекомендуемые комментарии

Комментариев нет

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...