Термометр ds18b20. основы

DHT11 против DHT22/AM2302

У нас есть две версии серии датчиков DHTxx. Они выглядят немного похоже и имеют одинаковую распиновку, но имеют разные характеристики. Вот подробности.

DHT22 является более дорогой версией, которая, очевидно, имеет лучшие характеристики. Диапазон измерения температуры составляет от -40°C до +80°C с точностью ±0,5 градуса, а диапазон температур DHT11 составляет от 0°C до 50°C с точностью ±2 градуса. Также датчик DHT22 имеет более широкий диапазон измерения влажности, от 0 до 100% с точностью 2-5%, в то время как диапазон измерения влажности DHT11 составляет от 20 до 80% с точностью 5%.

Сравнение спецификаций DHT11 и DHT22/AM2302
 
  DHT11 DHT22
Рабочее напряжение от 3 до 5 В от 3 до 5 В
Максимальный рабочий ток 2,5 мА макс 2,5 мА макс
Диапазон измерения влажности 20-80% / 5% 0-100% / 2-5%
Диапазон измерения температуры 0-50°C / ± 2°C от -40 до 80°C / ± 0,5°C
Частота выборки 1 Гц (чтение каждую секунду) 0,5 Гц (чтение каждые 2 секунды)
Размер корпуса 15,5 мм х 12 мм х 5,5 мм 15,1 мм х 25 мм х 7,7 мм
Преимущество Ультра низкая стоимость Более точный

Хотя DHT22/AM2302 более точен и работает в большем диапазоне температур и влажности; есть три вещи, в которых DHT11 сильно превосходит DHT22. Он более дешевый, меньше по размеру и имеет более высокую частоту выборки. Частота выборки DHT11 составляет 1 Гц, то есть одно чтение каждую секунду, в то время как частота выборки DHT22 составляет 0,5 Гц, то есть одно чтение каждые две секунды.

Рабочее напряжение обоих датчиков составляет от 3 до 5 вольт, в то время как максимальный ток, используемый во время преобразования (при запросе данных), составляет 2,5 мА. И самое приятное, что датчики DHT11 и DHT22/AM2302 являются «взаимозаменяемыми», то есть, если вы создаете свой проект с одним датчиком, вы можете просто отключить его и использовать другой датчик. Ваш код, возможно, придется немного изменить, но, по крайней мере, схема не изменится!

Для получения более подробной информации обратитесь к техническим описаниям датчиков DHT11 и DHT22/AM2302.

Тестирование работы термометра

Когда аппаратная часть проекта будет готова, загрузите программу в плату Arduino Pro Mini. Для этой цели можно использовать TTL programmer или FTDI board. Но если вы в этом проекте будете использовать плату Arduino Nano, то ее можно будет программировать с помощью USB кабеля, подключаемого к компьютеру.

Когда все будет готово, нажмите кнопку – она запустит в работу наш бесконтактный термометр. После этого вы должны увидеть как лазерный луч подсвечивает объект, а на экране OLED дисплея показывается температура этого объекта. Мы с помощью данного термометра проверяли температуру компонентов на печатной плате.

Работа термометра была проверена и на других объектах: паяльник, сопло 3D принтера, кусках льда и т.п. Более подробно работу термометра вы можете посмотреть на видео, приведенном в конце статьи.

Как подключить несколько сенсоров DS18B20 к Arduino?

Вы можете подключить несколько цифровых датчиков температуры DS18B20 параллельно. При этом библиотека OneWire library позволит вам считывать данные со всех датчиков одновременно.

Ниже описаны два метода подключения сенсоров.

Для большого количества сенсоров (больше 10), надо использовать резисторы с меньшим сопротивлением (например, 1.6 КОм или даже меньше).

Кроме того, если вы подключаете параллельно более 10 датчиков, могут возникнуть проблемы (погрешности при съеме показаний). Поэтому рекомендуется устанавливать дополнительный резистор сопротивлением 100…120 Ом между контактом data на Arduino и data на каждом сенсоре!

Результат работы предыдущего скетча с двумя подключенными сенсорами может выглядет примерно следующим образом:

ROM = 28 88 84 82 5 0 0 6A

Chip = DS18B20

Data = 1 51 1 4B 46 7F FF F 10 FE CRC=FE

Temperature = 21.06 Celsius, 69.91 Fahrenheit

ROM = 28 DA CA 27 5 0 0 49

Chip = DS18B20

Data = 1 4E 1 4B 46 7F FF 2 10 D9 CRC=D9

Temperature = 20.87 Celsius, 69.57 Fahrenheit

No more addresses.

Выбираем правильный сенсор

Было бы неплохо знать, с какого именно сенсора вы получаете данные, когда вы используете параллельно несколько датчиков. Как это сделать?

Серийный номер

Так как датчики цифровые, у каждого из них есть индивидуальный серийный номер, который можно использовать для опознавания того или иного сенсора. Вроде бы все просто. Но… нам ведь надо предварительно определить эти серийные номера, прежде чем использовать их для опознавания сенсора, правильно?

Вы могли обратить на примерах выше, что скетч выдает нам данные в виде 64-битного серийного номера — значение “ROM”. Например:

28 88 84 82 5 0 0 6A или 28 DA CA 27 5 0 0 49 в примере выше.

Не забывайте, если вы используете одновременно большое количество датчиков (10 и больше), надо добавить резисторы 100 … 120 Ом между контактами data с сенсора DS18B20 и пином data на Arduino (для каждого датчика!).

Ниже показана схема параллельного подключения нескольких сенсоров с использованием трех контактов.

Паразитный режим питания

В «паразитном» режиме контакт Vdd остается фактически не задействован. Питание датчика осуществляется через контакт data.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

Скетч для DS18B20

Алгоритм получения информации о температуре в скетче состоит из следующих этапов:

  • Определение адреса датчика, проверка его подключения.
  • На датчик подается команда с требованием прочитать температуру и выложить измеренное значение в регистр. Процедура происходит дольше остальных, на нее необходимо примерно 750 мс.
  • Подается команда на чтение информации из регистра и отправка полученного значения в «монитор порта»,
  • Если требуется, то производится конвертация в градусы Цельсия/Фаренгейта.

Пример простого скетча для DS18B20

Самый простой скетч для работы с цифровым датчиком выглядит следующим образом. (в скетче мы используем библиотеку OneWire, о которой поговорим подробнее чуть позже).

#include /* * Описание взаимодействия с цифровым датчиком ds18b20 * Подключение ds18b20 к ардуино через пин 8 */ OneWire ds(8); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком void setup(){ Serial.begin(9600); } void loop(){ // Определяем температуру от датчика DS18b20 byte data; // Место для значения температуры ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем — датчик его положит во внутреннюю память delay(1000); // Микросхема измеряет температуру, а мы ждем. ds.reset(); // Теперь готовимся получить значение измеренной температуры ds.write(0xCC); ds.write(0xBE); // Просим передать нам значение регистров со значением температуры // Получаем и считываем ответ data = ds.read(); // Читаем младший байт значения температуры data = ds.read(); // А теперь старший // Формируем итоговое значение: // — сперва «склеиваем» значение, // — затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию — это 0,0625) float temperature = ((data <<

Скетч для работы с датчиком ds18b20 без delay

Можно немного усложнить программу для ds18b20, чтобы избавиться от функции delay(), тормозящей выполнение скетча.

#include OneWire ds(8); // Объект OneWire int temperature = 0; // Глобальная переменная для хранения значение температуры с датчика DS18B20 long lastUpdateTime = 0; // Переменная для хранения времени последнего считывания с датчика const int TEMP_UPDATE_TIME = 1000; // Определяем периодичность проверок void setup(){ Serial.begin(9600); } void loop(){ detectTemperature(); // Определяем температуру от датчика DS18b20 Serial.println(temperature); // Выводим полученное значение температуры // Т.к. переменная temperature имеет тип int, дробная часть будет просто отбрасываться } int detectTemperature(){ byte data; ds.reset(); ds.write(0xCC); ds.write(0x44); if (millis() — lastUpdateTime > TEMP_UPDATE_TIME) { lastUpdateTime = millis(); ds.reset(); ds.write(0xCC); ds.write(0xBE); data = ds.read(); data = ds.read(); // Формируем значение temperature = (data <<

Библиотека DallasTemperature и DS18b20

В своих скетчах мы можем использовать библиотеку DallasTemperature, упрощающую некоторые аспекты работы с датчиком ds18b20 по 1-Wire. Пример скетча:

#include // Номер пина Arduino с подключенным датчиком #define PIN_DS18B20 8 // Создаем объект OneWire OneWire oneWire(PIN_DS18B20); // Создаем объект DallasTemperature для работы с сенсорами, передавая ему ссылку на объект для работы с 1-Wire. DallasTemperature dallasSensors(&oneWire); // Специальный объект для хранения адреса устройства DeviceAddress sensorAddress; void loop(void){ // Запрос на измерения датчиком температуры Serial.print(«Измеряем температуру…»); dallasSensors.requestTemperatures(); // Просим ds18b20 собрать данные Serial.println(«Выполнено»); // Запрос на получение сохраненного значения температуры printTemperature(sensorAddress); // Задержка для того, чтобы можно было что-то разобрать на экране delay(1000); } // Вспомогательная функция печати значения температуры для устрйоства void printTemperature(DeviceAddress deviceAddress){ float tempC = dallasSensors.getTempC(deviceAddress); Serial.print(«Temp C: «); Serial.println(tempC); } // Вспомогательная функция для отображения адреса датчика ds18b20 void printAddress(DeviceAddress deviceAddress){ for (uint8_t i = 0; i < 8; i++) { if (deviceAddress< 16) Serial.print(«0»); Serial.print(deviceAddress, HEX); } }

LCD дисплей 1602

Жидкокристаллический дисплей (Liquid Crystal Display) сокращенно LCD построен на технологии жидких кристаллов. Самый распространенный LCD дисплей на рынке является дисплей LCD 1602A, который может отображать ASCII символа в 2 строки (16 знаков в 1 строке) каждый символ в виде матрицы 5х7 пикселей.

Характеристики дисплея 1602:

  • напряжение питания: 5 В
  • размер дисплея: 2.6 дюйма
  • тип дисплея: 2 строки по 16 символов
  • цвет подсветки: синий
  • цвет символов: белый
  • габаритные: 80мм x 35мм x 11мм

В данном примере будем использовать LCD дисплей 1602A оборудованным последовательной шиной I2C. I2C — это последовательная асимметричная шина для связи между интегральными схемами внутри электронных приборов. Использует две двунаправленные линии связи (SDA и SCL), применяется для соединения низкоскоростных периферийных компонентов с процессорами и микроконтроллерами.

внешний вид платы дисплея

Жидкокристаллический дисплей 1602 с I2C модулем подключается к плате Ардуино всего 4 проводами — 2 провода данных и 2 провода питания. Подключение проводится стандартно для шины I2C:

  • вывод SDA подключается к порту A4;
  • вывод SCL подключается к порту A5;
  • вывод Vcc LCD дисплея осуществляется к разъему +5V платы Arduino UNO;
  • вывод GND дисплея осуществляется к разъему GND платы Arduino UNO;

Introducing DS18B20 Temperature Sensor

The DS18B20 temperature sensor is a one-wire digital temperature sensor. This means that it just requires one data line (and GND) to communicate with the Arduino.

It can be powered by an external power supply or it can derive power from the data line (called “parasite mode”), which eliminates the need for an external power supply.

The following table shows how you should wire the DS18B20 sensor to your Arduino board:

DS18B20 Arduino
GND GND
DQ Any digital pin (with 4.7k Ohm pull-up resistor)
VDD 5V (normal mode) or GND (parasite mode)

Each DS18B20 temperature sensor has a unique 64-bit serial code. This allows you to wire multiple sensors to the same data wire. So, you can get temperature from multiple sensors using just one Arduino digital pin.

The DS18B20 temperature sensor is also available in waterproof version.

Here’s a summary of the most relevant specs of the DS18B20 temperature sensor:

  • Communicates over one-wire bus communication
  • Power supply range: 3.0V to 5.5V
  • Operating temperature range: -55ºC to +125ºC
  • Accuracy +/-0.5 ºC (between the range -10ºC to 85ºC)

For more information consult the DS18B20 datasheet.

Принципиальные схемы

Передатчик

Передающая часть беспроводного термометра на ATMega328p
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)

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

Приемник

Приемная часть беспроводного термометра на Arduino Mega
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)

Пожалуйста, обратите внимание, что приемник построен на базе платы Arduino Mega, которая не изображена на схеме. Для подключения платы Arduino Mega соедините с ней радиочастотный модуль и LCD дисплей согласно метка на схеме

Исходный код программы

Arduino

#include <math.h>
#include «LiquidCrystal.h»
#define RELAY 8
LiquidCrystal lcd(6,7,5,4,3,2);
float A = 1.009249522e-03, B = 2.378405444e-04, C = 2.019202697e-07;
float T,logRt,Tf,Tc;
float Thermistor(int Vo) {
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt)); // // рассчитываем температуру в кельвинах с помощью уравнения Stein-Hart
Tc = T — 273.15; // преобразуем кельвины в градусы Цельсия
Tf = (T * 1.8) + 32.0; // преобразуем кельвины в градусы по шкале Фаренгейта
return T;
}
void setup() {
lcd.begin(16,2);
lcd.clear();
pinMode(RELAY, OUTPUT);
}
void loop() {

lcd.setCursor(0,0);
lcd.print(«Temperature:»);
lcd.print(int(Thermistor(analogRead(0))));
lcd.print(«C «);
delay(500); // ждем 0.5 секунды перед очередным измерением температуры
if (Tc > 28) digitalWrite(RELAY, HIGH),lcd.setCursor(0,1),lcd.print(«Light status:ON «),delay(500);
else if (Tc < 28) digitalWrite(RELAY, LOW),lcd.setCursor(0,1),lcd.print(«Light status:OFF»),delay(500);

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

#include <math.h>
#include «LiquidCrystal.h»
#define RELAY 8  

LiquidCrystallcd(6,7,5,4,3,2);

floatA=1.009249522e-03,B=2.378405444e-04,C=2.019202697e-07;

floatT,logRt,Tf,Tc;

floatThermistor(intVo){

logRt=log(10000.0*((1024.0Vo-1)));

T=(1.0(A+B*logRt+C*logRt*logRt*logRt));// // рассчитываем температуру в кельвинах с помощью уравнения Stein-Hart

Tc=T-273.15;// преобразуем кельвины в градусы Цельсия

Tf=(T*1.8)+32.0;// преобразуем кельвины в градусы по шкале Фаренгейта

returnT;

}

voidsetup(){

lcd.begin(16,2);

lcd.clear();

pinMode(RELAY,OUTPUT);

}

voidloop(){

lcd.setCursor(,);

lcd.print(«Temperature:»);

lcd.print(int(Thermistor(analogRead())));

lcd.print(«C «);

delay(500);// ждем 0.5 секунды перед очередным измерением температуры

if(Tc>28)digitalWrite(RELAY,HIGH),lcd.setCursor(,1),lcd.print(«Light status:ON «),delay(500);

elseif(Tc<28)digitalWrite(RELAY,LOW),lcd.setCursor(,1),lcd.print(«Light status:OFF»),delay(500);

}

DS18B20 with I2C LCD example code

/* DS18B20 1-Wire digital temperature sensor with 16x2 I2C LCD and Arduino example code. More info: https://www.makerguides.com */

// Include the required Arduino libraries:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>

// Define to which pin of the Arduino the 1-Wire bus is connected:
#define ONE_WIRE_BUS 2

// Create a new instance of the oneWire class to communicate with any OneWire device:
OneWire oneWire(ONE_WIRE_BUS);

// Pass the oneWire reference to DallasTemperature library:
DallasTemperature sensors(&oneWire);

LiquidCrystal_I2C lcd(0x27, 16, 2);

// Degree symbol:
byte Degree[] = {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};

void setup() {
  // Start up the library:
  sensors.begin();
  // Start the LCD and turn on the backlight:
  lcd.init();
  lcd.backlight();
  // Create a custom character:
  lcd.createChar(0, Degree);
}

void loop() {
  // Send the command for all devices on the bus to perform a temperature conversion:
  sensors.requestTemperatures();

  // Fetch the temperature in degrees Celsius for device index:
  float tempC = sensors.getTempCByIndex(0); // the index 0 refers to the first device

  // Print the temperature on the LCD;
  lcd.setCursor(0,0);
  lcd.print("Temperature:");
  lcd.setCursor(0,1);
  lcd.print(tempC);
  lcd.write(0); // print the custom character
  lcd.print("C");

  // Wait 1 second:
  delay(1000);
}

You should see the following output on the LCD:

Работа схемы

Схема устройства представлена на следующем рисунке.

При изменении температуры изменяется сопротивление терморезистора (термистора). Но в нашей схеме мы не будем измерять сопротивление термистора напрямую, вместо этого мы использовали делитель напряжения, одним из резисторов которого является известное сопротивление 10 кОм, а вторым – наш терморезистор. Средняя точка делителя напряжения подключена к аналоговому входу A0 платы Arduino, поэтому при помощи аналогово-цифрового преобразования (АЦП) на этом контакте мы можем определить падение напряжение на терморезисторе в любой момент времени и, следовательно, и его сопротивление. Благодаря этим данным мы по формулам, приведенным ниже в данной статье, можем определить значение температуры.

Код

Вам нужно будет установить две библиотеки: OneWire и Dallas Temperature.

Установка библиотеки OneWire

  1. Распакуйте этот ZIP-файл. В результате у вас должна получиться папка под названием «OneWire-master».
  2. Переименуйте папку «OneWire-master» на «OneWire».
  3. Переместите папку «OneWire» в папку библиотек IDE Arduino.
  4. Откройте IDE Arduino.

Установка библиотеки DallasTemperature

  1. Распакуйте этот ZIP-файл. В результате у вас должна получиться папка под названием «Arduino-Temperature-Control-Library-master».
  2. Переименуйте папку «Arduino-Temperature-Control-Library-master» на «DallasTemperature».
  3. Переместите папку «DallasTemperature» в папку библиотек IDE Arduino.
  4. Наконец, откройте IDE Arduino.

После установки необходимых библиотек загрузите в IDE Arduino скетч, показанный ниже:

 1 /*********
 2   Автор - Руи Сантос (Rui Santos)
 3   Более подробно о проекте на: http://randomnerdtutorials.com 
 4   За основу взят пример «Dallas Temperature Library»
 5 *********/
 6 
 7 #include <OneWire.h>
 8 #include <DallasTemperature.h>
 9 
10 // контакт для данных подключаем к цифровому контакту 2 на Arduino: 
11 #define ONE_WIRE_BUS 2
12 
13 // создаем экземпляр класса OneWire, чтобы с его помощью
14 // общаться с однопроводным устройством
15 // (т.е. в нашем случае – с температурным датчиком):
16 OneWire oneWire(ONE_WIRE_BUS);
17 
18 // передаем объект oneWire объекту sensors: 
19 DallasTemperature sensors(&oneWire);
20 
21 void setup(void)
22 {
23   // запускаем последовательную коммуникацию (в отладочных целях): 
24   Serial.begin(9600);
25   // запускаем библиотеку:
26   sensors.begin();
27 }
28 
29 
30 void loop(void){ 
31   // вызываем функцию sensors.requestTemperatures(), 
32   // которая приказывает всем устройствам, подключенным к шине,
33   // выполнить конверсию температурных данных:
34 
35   sensors.requestTemperatures();
36   
37   Serial.print("Celsius temperature: ");
38   //  "Температура в Цельсиях: "
39   // почему «byIndex»? к одной шине может быть подключено 
40   // больше одного датчика; самое первое устройство на шине – это «0»:
41   Serial.print(sensors.getTempCByIndex()); 
42   Serial.print(" - Fahrenheit temperature: ");
43   //  " - Температура в Фаренгейтах: "
44   Serial.println(sensors.getTempFByIndex());
45   delay(1000);
46 }

Наконец, открываем монитор порта IDE Arduino на скорости 9600 бод. В нем должны появиться данные о температуре – в градусах Цельсия и Фаренгейта.

Дизайн корпуса для термометра

Мы в нашем проекте для изготовления корпуса нашего бесконтактного термометра использовали 3D принтер. Корпус термометра состоит из двух частей. Верхняя часть термометра содержит все его основные компоненты: плату Arduino, OLED дисплей, датчик температуры и лазерный диод. Нижняя часть термометра представляет собой ручку, в которой размещены батарейка и кнопка включения термометра. Внешний вид корпуса термометра показан на следующем рисунке.

3D печать компонентов термометра

Представленная 3D модель затем была сохранена в виде STL файлов и конвертирована в G-code (G-код) с помощью программного обеспечения Cura. Для печати компонентов термометра мы использовали 3D принтер Tevo tarantula. После печати компонентов мы скрепили их вместе с помощью шурупов. Если ваш принтер поддерживает возможность печати корпуса термометра целиком, то тогда ваша задача упрощается.

Напечатанные нами элементы корпуса термометра с размещенными внутри электронными компонентами показаны на следующих рисунках.

Мы решили верхнюю часть корпуса термометра оставить открытой для возможности внесения в нее изменений, но вы можете сделать ее закрытой.

Distance

Some people recommend a 30m maximum but the note below indicates 60m
can be achieved (even further 200m if a fet driver is used):

With any network system transmission line effects come into play and
it can get very complicated (the above application note goes into a
little detail about this).

Also in that note, is the concept of ‘weight’ which is a value assigned to each device added to the bus (Each device has a value of ‘weight’ that shortens the maximum length of cable that can be used). ‘weight’ is measured in metres.

You start from the network ‘weight’, again measured in metres, and is
the total length of cable used in the network — and how much cable can
be driven. The examples quoted in the application note suggest that the
‘weight’ for using a simple pull-up is 200m. However by using active
pull-ups this can be increased to 500m.

Each device added to the network adds a ‘weight’ cost to the network
since it loads the cable with capacitance — reducing the pull-up time
and also consuming power.

You can think of the ‘weight’ cost as the amount of cable «used up by each added device». If you added 30 devices of
‘weight’ cost 1m then the maximum cable length would have to be reduced
by 30m. Note that this is a simple view and the achievable length may be
shorter due to cable connections causing transmission line reflections
but it is a good starting point.

Исходный код программы

Полный код программы представлен в конце статьи, здесь же сначала рассмотрим его наиболее важные фрагменты.

Для выполнения математических операций в программе мы должны подключить заголовочный файл библиотеки “#include <math.h>”, а для работы с ЖК дисплеем – подключить библиотеку “#include <LiquidCrystal.h>». Далее в функции setup() мы должны инициализировать ЖК дисплей.

Arduino

Void setup(){
lcd.begin(16,2);
lcd.clear();
}

1
2
3
4

Voidsetup(){

lcd.begin(16,2);

lcd.clear();

}

Значение температуры мы будем рассчитывать в программе с помощью рассмотренного выше уравнения Стейнхарта-Харта.

Arduino

float a = 1.009249522e-03, b = 2.378405444e-04, c = 2.019202697e-07;
float T,logRt,Tf,Tc;
float Thermistor(int Vo) {
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Stein-Hart
Tc = T — 273.15; // переводим температуру из кельвинов в градусы Цельсия
Tf = (Tc * 1.8) + 32.0; // переводим температуру в шкалу Фаренгейта
return T;
}

1
2
3
4
5
6
7
8
9

floata=1.009249522e-03,b=2.378405444e-04,c=2.019202697e-07;

floatT,logRt,Tf,Tc;

floatThermistor(intVo){

logRt=log(10000.0*((1024.0Vo-1)));

T=(1.0(A+B*logRt+C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Stein-Hart

Tc=T-273.15;// переводим температуру из кельвинов в градусы Цельсия

Tf=(Tc*1.8)+32.0;// переводим температуру в шкалу Фаренгейта

returnT;

}

Также в программе мы считываем значение с аналогового входа платы Arduino.

Arduino

lcd.print((Thermistor(analogRead(0))));

1 lcd.print((Thermistor(analogRead())));

Внешний вид работы нашего проекта показан на следующем рисунке – на ЖК дисплее выводятся значения температуры в кельвинах, градусах Цельсия и по шкале Фаренгейта.

Схему можно запитать по кабелю USB или использовать адаптер на 12 В.

Далее представлен полный текст программы.

Arduino

#include <math.h>
#include «LiquidCrystal.h»
LiquidCrystal lcd(44,46,40,52,50,48);
float A = 1.009249522e-03, B = 2.378405444e-04, C = 2.019202697e-07;
float T,logRt,Tf,Tc;
float Thermistor(int Vo) { // функция для расчета значения температуры
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt)); // рассчитываем значение температуры в кельвинах по формуле Стейнхарта-Харта
Tc = T — 273.15; // переводим температуру из кельвинов в градусы
Tf = (Tc * 1.8) + 32.0; // переводим температуру в шкалу Фаренгейта
return T;
}
void setup(){
lcd.begin(16,2);
lcd.clear();
}
void loop()
{
lcd.setCursor(0,0);
lcd.print(«Temp:»);
lcd.print((Thermistor(analogRead(0))));
lcd.print(«k «);

lcd.setCursor(0,1);
lcd.print((Tc));
lcd.print(» C ;»);
lcd.setCursor(9,1);
lcd.print((Tf));
lcd.print(» F»);
delay(800);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

#include <math.h>
#include «LiquidCrystal.h»

LiquidCrystallcd(44,46,40,52,50,48);

floatA=1.009249522e-03,B=2.378405444e-04,C=2.019202697e-07;

floatT,logRt,Tf,Tc;

floatThermistor(intVo){// функция для расчета значения температуры

logRt=log(10000.0*((1024.0Vo-1)));

T=(1.0(A+B*logRt+C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Стейнхарта-Харта

Tc=T-273.15;// переводим температуру из кельвинов в градусы

Tf=(Tc*1.8)+32.0;// переводим температуру в шкалу Фаренгейта

returnT;

}

voidsetup(){

lcd.begin(16,2);

lcd.clear();

}

voidloop()

{

lcd.setCursor(,);

lcd.print(«Temp:»);

lcd.print((Thermistor(analogRead())));

lcd.print(«k «);

lcd.setCursor(,1);

lcd.print((Tc));

lcd.print(» C ;»);

lcd.setCursor(9,1);

lcd.print((Tf));

lcd.print(» F»);

delay(800);

}