Андрей Смирнов
Время чтения: ~23 мин.
Просмотров: 0

Измерение температуры с помощью термистора ntc

Что потребуется

Полный сет компонентов проекта. В сет входят:

  • Arduino Uno

  • Troyka Slot Shield

  • цифровой метеодатчик

  • четырёхразряный индикатор Quad Display

  • барометр

  • датчик температуры DS18B20 и модуль подтяжки

  • SD картридер и карта форматаmicro-SD

Описание датчика DS18B20 для Arduino

DS18B20 – это цифровой температурный датчик, обладающий множеством полезных функций. По сути, DS18B20 – это целый микроконтроллер, который может хранить значение измерений, сигнализировать о выходе температуры за установленные границы (сами границы мы можем устанавливать и менять), менять точность измерений, способ взаимодействия с контроллером и многое другое. Все это в очень небольшом корпусе, который, к тому же, доступен в водонепроницаемом исполнении.

Микросхема имеет три выхода, из которых для данных используется только один, два остальных – это земля и питание. Число проводов можно сократить до двух, если использовать схему с паразитным питанием и соединить Vdd с землей. К одному проводу с данными можно подключить сразу несколько датчиков DS18B20 и в плате Ардуино будет задействован всего один пин.

Особенности цифрового датчика DS18B20

Погрешность измерения не больше 0,5 С (для температур от -10С до +85С), что позволяет точно определить значение температуры. Не требуется дополнительная калибровка.
Температурный диапазон измерений лежит в пределах от -55 С до +125 С.
Датчик питается напряжением от 3,3В до 5В.
Можно программно задать максимальную разрешающую способность до 0,0625С, наибольшее разрешение 12 бит.
Присутствует функция тревожного сигнала.
Каждое устройство обладает своим уникальным серийным кодом.
Не требуются дополнительные внешние элементы.
Можно подключить сразу до 127 датчиков к одной линии связи.
Информация передается по протоколу 1-Wire.
Для присоединения к микроконтроллеру нужны только 3 провода.
Существует так называемый режим паразитного питания – в нем происходит питание напрямую от линии связи. Для подключения в этом случае нужны только 2 провода

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

Память датчика состоит из двух видов: оперативной и энергонезависимой – SRAM и EEPROM. В последнюю записываются регистры конфигурации и регистры TH, TL, которые могут использоваться как регистры общего назначения, если не используются для указания диапазона допустимых значений температуры.

Основной задачей DS18B20 является определение температуры и преобразование полученного результата в цифровой вид. Мы можем самостоятельно задать необходимое разрешение, установив количество бит точности – 9, 10, 11 и 12. В этих случаях разрешающие способности будут соответственно равны 0,5С, 0,25С, 0,125С и 0,0625С.

Во время включения питания датчик находится в состоянии покоя. Для начала измерения контроллер Ардуино выполняет команду «преобразование температуры». Полученный результат сохранится в 2 байтах регистра температуры, после чего датчик вернется в первоначальное состояние покоя. Если схема подключена в режиме внешнего питания, микроконтроллер регулирует состояние конвертации. Во время выполнения команды линия находится в низком состоянии, после окончания программы линия переходит в высокое состояние. Такой метод не допустим при питании от паразитной емкости, так как на шине постоянно должен сохраняться высокий уровень сигнала.

Полученные температурные измерения сохраняются в SRAM датчика. 1 и 2 байты сохраняют полученное значение температуры, 3 и 4 сохраняют пределы измерения, 5 и 6 зарезервированы, 7 и 8 используются для высокоточного определения температуры, последний 9 байт хранит устойчивый к помехам CRC код.

Подключение нескольких датчиков температуры DS18B20 к Ардуино

Все датчики DS18B20 подключаются параллельно, для них всех достаточно одного резистора.  При помощи библиотеки OneWire можно одновременно считать все данные со всех датчиков. Если количество подключаемых датчиков более 10, нужно подобрать резистор с сопротивлением не более 1,6 кОм. Также для более точного измерения температуры нужно поставить дополнительный резистор на 100…120 Ом между выходом data на плате Ардуино и data на каждом датчике. Узнать, с какого датчика получено то или иное значение, можно с помощью уникального серийного 64-битного кода, который будет выдан в результате выполнения программы.

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

В режиме паразитного питания схема выглядит иначе. Контакт Vdd практически не задействован, питание идет через выход data.

Скетч для Arduino и сенсора DS18B20

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

После того как вы скачали архив с библиотекой, ее надо импортировать. Для этого в Arduino IDE выберите пункт “Sketch” — “Import Library” — “Add Library” и выберите архив, который вы скачали. Если у вас возникли проблемы, с установкой библиотеки, ознакомьтесь с инструкцией по установке библиотек в Arduino.

Загружаем скетч на Arduino

Скетч, который представлен ниже, есть в библиотеке OneWire, в категории examples. Перейдите в “File” — “Examples” — “OneWire” и выберите пример “DS18x20_Temperature”. Код программы представлен ниже.

Данный пример использует библиотеку OneWire Library, для того, чтобы собрать данные со всех подключенных датчиков температуры DS28B20 (как подключить несколько сенсоров описано в конце статьи) и отобразить их в окне серийного монитора Arduino IDE.

В окне серийного монитора вы увидите примерно следующее:

ROM = 28 88 84 82 5 0 0 6A

Chip = DS18B20

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Temperature = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

ROM = 28 88 84 82 5 0 0 6A

Chip = DS18B20

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Temperature = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

ROM = 28 88 84 82 5 0 0 6A

Chip = DS18B20

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Temperature = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

Обычное или паразитное питание?

DS18B20 может работать в обычном или в так называемом «паразитном» режиме. В обычном режиме для подключения используется 3 коннектора, в «паразитном» режиме — в его лишь 2.

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

  • Для «паразитного» режима в строке 65 надо указать: ds.write(0x44, 1);
  • Для обычного режима в строке 65 указывается: ds.write(0x44);

Убедитесь, что вы указали корректные пины!

В строке 10, где указано “OneWire ds(2);” устанавливается пин, к которому подключен контакт data с сенсора.

В этом примере использован пин 2, но значения пина по умолчанию в примере OneWire стоит на 10. Можно использовать и его.

#include &ltOneWire.h&gt

// пример использования библиотеки OneWire DS18S20, DS18B20, DS1822

OneWire ds(2); // на пине 10 (нужен резистор 4.7 КОм)

void setup(void) {

Serial.begin(9600);

}

void loop(void) {

byte i;

byte present = 0;

byte type_s;

byte data;

byte addr;

float celsius, fahrenheit;

if ( !ds.search(addr)) {

Serial.println(«No more addresses.»);

Serial.println();

ds.reset_search();

delay(250);

return;

}

Serial.print(«ROM =»);

for( i = 0; i

Serial.write(‘ ‘);

Serial.print(addr, HEX);

}

if (OneWire::crc8(addr, 7) != addr) {

Serial.println(«CRC is not valid!»);

return;

}

Serial.println();

// первый байт определяет чип

switch (addr) {

case 0x10:

Serial.println(» Chip = DS18S20″); // или более старый DS1820

type_s = 1;

break;

case 0x28:

Serial.println(» Chip = DS18B20″);

type_s = 0;

break;

case 0x22:

Serial.println(» Chip = DS1822″);

type_s = 0;

break;

default:

Serial.println(«Device is not a DS18x20 family device.»);

return;

}

ds.reset();

ds.select(addr);

ds.write(0x44); // начинаем преобразование, используя ds.write(0x44,1) с «паразитным» питанием

delay(1000); // 750 может быть достаточно, а может быть и не хватит

// мы могли бы использовать тут ds.depower(), но reset позаботится об этом

present = ds.reset();

ds.select(addr);

ds.write(0xBE);

Serial.print(» Data = «);

Serial.print(present, HEX);

Serial.print(» «);

for ( i = 0; i

data = ds.read();

Serial.print(data, HEX);

Serial.print(» «);

}

Serial.print(» CRC=»);

Serial.print(OneWire::crc8(data, 8), HEX);

Serial.println();

// конвертируем данный в фактическую температуру

// так как результат является 16 битным целым, его надо хранить в

// переменной с типом данных «int16_t», которая всегда равна 16 битам,

// даже если мы проводим компиляцию на 32-х битном процессоре

int16_t raw = (data

if (type_s) {

raw = raw

if (data == 0x10) {

raw = (raw & 0xFFF0) + 12 — data;

}

} else {

byte cfg = (data & 0x60);

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

if (cfg == 0x00) raw = raw & ~7; // разрешение 9 бит, 93.75 мс

else if (cfg == 0x20) raw = raw & ~3; // разрешение 10 бит, 187.5 мс

else if (cfg == 0x40) raw = raw & ~1; // разрешение 11 бит, 375 мс

//// разрешение по умолчанию равно 12 бит, время преобразования — 750 мс

}

celsius = (float)raw / 16.0;

fahrenheit = celsius * 1.8 + 32.0;

Serial.print(» Temperature = «);

Serial.print(celsius);

Serial.print(» Celsius, «);

Serial.print(fahrenheit);

Serial.println(» Fahrenheit»);

}

Уравнение Стейнхарта – Харта

В практических устройствах модель линейного приближения (см. Выше) является точной только в ограниченном диапазоне температур. В более широких диапазонах температур более сложная передаточная функция между сопротивлением и температурой обеспечивает более точную характеристику характеристик. Уравнение Стейнхарта – Харта является широко используемым приближением третьего порядка:

1Тзнак равноа+бпер⁡р+c(пер⁡р)3,{\ displaystyle {\ frac {1} {T}} = a + b \ ln R + c \, (\ ln R) ^ {3},}

где a , b и c называются параметрами Стейнхарта – Харта и должны быть указаны для каждого устройства. T — абсолютная температура , а R — сопротивление. Чтобы определить зависимость сопротивления от температуры, можно решить приведенное выше кубическое уравнение в , действительный корень которого равен
пер⁡р{\ Displaystyle \ ln R}

пер⁡рзнак равноб3cИкс13-Икс13{\ displaystyle \ ln R = {\ frac {b} {3c \, x ^ {1/3}}} — x ^ {1/3}}

где

yзнак равно12c(а-1Т),Иксзнак равноy+(б3c)3+y2.{\ displaystyle {\ begin {align} y & = {\ frac {1} {2c}} \ left (a — {\ frac {1} {T}} \ right), \\ x & = y + {\ sqrt {\ left ({\ frac {b} {3c}} \ right) ^ {3} + y ^ {2}}}. \ end {align}}}

Ошибка в уравнении Стейнхарта – Харта обычно составляет менее 0,02 ° C при измерении температуры в диапазоне 200 ° C. Например, типичные значения для термистора с сопротивлением 3 кОм при комнатной температуре (25 ° C = 298,15 K):

азнак равно1,40×10-3,бзнак равно2.37×10-4,cзнак равно9,90×10-8.{\ displaystyle {\ begin {align} a & = 1,40 \ times 10 ^ {- 3}, \\ b & = 2,37 \ times 10 ^ {- 4}, \\ c & = 9,90 \ times 10 ^ {- 8}. \ конец {выровнен}}}

ТОП-5: GTS SEA-DOO SEASCOOTER

Это ближайший родственник подводного буксировщика под названием GTI. Для людей, немыслящих жизнь без скорости, но пока не желающих обременять себя громоздкими конструкциями, он будет идеальным выбором при подготовке к летнему отдыху, запланированному в прекрасные города, раскинувшиеся по берегу Черного моря.

Параметры

Они лучше, чем у выше описанной модели, поэтому устройство и занимает в ТОП-6 более высокую ступень:

  • наибольшая скорость — 5,5 км/ч;
  • масса – 8,2 кг;
  • на одной зарядке работает 1,5 ч;
  • максимальная глубина возможного погружения – 30 метров;
  • производитель – Канада.

Компания предоставляет гарантии на свою продукцию и позволяет подводный буксировщик купить в кредит.

Стоимость

Где купитьЦена
https://www.open-dive.ru/catalog/buksirovschiki/buksirovschik-sea-doo-seascooter-gts 42112 рублей
https://hunterlake.ru/buksirovschik-sea-doo-seascooter-gts 42112 рублей
http://electric-mobile.ru/gts-sea-doo-seascooter.html 42115 рублей
http://romanov-motors.ru/katalog/podvodnyie-buksirovschiki/gts-sea-doo-seascooter 42115 рублей
http://td-mk.ru/goods/buksirovshik-dlia-daivinga-GTS-Sea-Doo-SEASCOOTER-glubina-do-30m-90min-45km-ch-82kg/ 42115 рублей

С погружающимся на 30 метров вглубь буксировщиком подводным занятия сноркелингом и дайвингом будут интереснее и эффективнее.

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

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

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

Для выполнения математических операций в программе мы должны подключить заголовочный файл библиотеки “#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);

}

Настройка ThingSpeak

Структурная схема работы нашего проекта представлена на следующем рисунке и она содержит 4 секции. Вначале с помощью датчика температуры и влажности DHT11 измеряются эти параметры атмосферы. Затем плата Arduino Uno считывает эти данные с DHT11 и преобразует их в нужную для нас форму, а затем она передает их на Wi-Fi модуль. После этого Wi-Fi модуль ESP8266 передает эти данные на сервер ThingSpeak. Затем сервис ThingSpeak анализирует эти данные и показывает их в удобной графической форме. Также дополнительно значения температуры и влажности показываются на экране ЖК дисплея.

Сервис ThingSpeak представляет собой достаточно удобную платформу для реализации различных проектов тематики интернета вещей (IoT) на Arduino. С помощью сервиса ThingSpeak мы можем просматривать (контролировать) наши данные через сеть Интернет из любой точки мира, также с его помощью мы можем управлять нашими системами (устройствами) через интернет. ThingSpeak собирает данные от датчиков, анализирует и визуализирует эти данные, а затем реагирует на различные события, которые могут привести к изменению этих данных. В этой части статьи мы рассмотрим как передавать данные на сервер ThingSpeak с использованием Wi-Fi модуля ESP8266.

1. Вначале нам необходимо создать аккаунт на ThingSpeak.com, заходим туда, жмем Sign In, а потом Get Started.

2. Затем идем в пункт меню ‘Channels’ (каналы) и создаем новый канал с помощью кнопки New Channel.

3. После этого увидите форму для создания нового канала, заполните там поля Name (имя) и Description (описание) по своему усмотрению. Затем напишите ‘Humidity’ (влажность) и ‘Temperature’ (температура) в Field 1 (поле 1) и Field 2 (поле 2) и поставьте галочки в чек-боксах напротив этих полей. Также поставьте галочку в чек-боксе ‘Make Public’ (сделать общедоступным) в форме ниже и сохраните канал (Save the Channel). Теперь новый канал для вас создан.

4. Теперь откройте вкладку ‘API keys’ чтобы записать свои ключи с этой вкладки. Нам будет нужен только ключ для записи (Write key). Скопируйте этот ключ в переменную char *api_key в тексте программы (приведен в конце статьи).

5. После этого кликните на ‘Data Import/Export’ и скопируйте Update Channel Feed GET Request URL, который будет примерно вида https://api.thingspeak.com/update?api_key=SIWOYBX26OXQ1WMS&field1=0.

6. Теперь необходимо открыть api.thingspeak.com используя функцию httpGet с postUrl в виде “update?api_key=SIWOYBX26OXQ1WMS&field1=0” и затем передать данные используя адрес обновления запроса.

Перед передачей данных необходимо отредактировать строку запроса или postUrl с полями данных температуры и влажности как показано в программном коде ниже. Здесь мы добавили в строку оба параметра, которые нам необходимо передать используя GET запрос к серверу, после этого необходимо использовать httpGet чтобы передать данные на сервер. Более подробно все эти процессы представлены в полном тексте программы, представленном в конце статьи.

В рассматриваемом проекте плата Arduino передает сигнал старта (после которого начинаются измерения) на датчик DHT, а в ответ датчик DHT передает Arduino сигнал, содержащий необходимые данные измерений. Плата Arduino собирает и извлекает эти данные в два приема: сначала извлекается влажность, а потом извлекается температура. Далее эти данные обрабатываются и передаются на ЖК дисплей 16×2 и сервер ThingSpeak. Сервис ThingSpeak отображает данные температуры и влажности в виде графиков, пример которых показан на следующем рисунке.

How Accurate is the Reading?

You may notice that above, the temperature reading is 28.16°C — does that mean we have 0.01°C accuracy? Unfortunately no! The thermistor has error and the analog reading circuitry has error.

We can approximate the expected error by first taking into account the thermistor resistance error. The thermistor is correct to 1%, which means that at 25°C it can read 10,100 to 9900 ohms. At around 25°C a difference of 450 ohms represents 1°C so 1% error means about +-0.25°C (you may be able to calibrate this away by determining the resistance of the thermistor in a 0°C ice bath and removing any offset). You can also spring for a 0.1% thermistor which will reduce the possible resistance error down to +-0.03°C

Then there is the error of the ADC, for every bit that it is wrong the resistance (around 25°C) can be off by about 50 ohms. This isn’t too bad, and is a smaller error than the thermistor error itself +-(0.1°C) but there is no way to calibrate it ‘away’ — a higher precision ADC (12-16 bits instead of 10) will give you more precise readings

In general, we think thermistors are higher precision than thermocouples, or most low cost digital sensors, but you will not get better than +-0.1°C accuracy on an Arduino with a 1% thermistor and we would suggest assuming no better than +-0.5°C.

3Скетч Arduino для ультразвукового дальномера

Напишем скетч для нашего дальномера:

const int trigPin = 6; // вывод триггера датчика HC-SR04
const int echoPin = 5; // вывод приёмника датчика HC-SR04

#include <LiquidCrystal.h> // подключаем стандартную библиотеку
LiquidCrystal lcd(12, 11, 10, 9, 8, 7); //инициализация ЖКИ 

void setup() {
  pinMode(trigPin, OUTPUT); // триггер - выходной пин
  pinMode(echoPin, INPUT); // эхо - входной
  digitalWrite(trigPin, LOW); 
  lcd.begin(16, 2); //задаём кол-во строк и символов в строке
  lcd.setCursor(10, 0); // выравниваем надпись по правому краю
  lcd.print("Dist:");
  lcd.setCursor(14, 1); 
  lcd.print("cm");
}

void loop() {
  long distance = getDistance(); // получаем дистанцию с датчика   
  lcd.setCursor(10, 1);
  lcd.print("    "); // очищаем ЖКИ от предыдущего значения
  lcd.setCursor(10, 1);
  lcd.print((String)distance); // выводим новую дистанцию
  delay(100);
}

// Определение дистанции до объекта в см
long getDistance() {
  long distacne_cm = getEchoTiming() * 1.7 * 0.01;
  return distacne_cm;
}

// Определение времени задержки
long getEchoTiming() {
  digitalWrite(trigPin, HIGH); // генерируем импульс запуска
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // определение на пине echoPin длительности уровня HIGH, мкс:
  long duration = pulseIn(echoPin, HIGH);
  return duration;
}

Тут всё просто. Сначала инициализируем ЖКИ на выводах 12, 11, 10, 9, 8 и 7 с помощью библиотеки LiquidCrystal из состава Arduino IDE. Далее привяжем выводы «триггер» и «эхо» дальномера к выводам 6 и 5 платы Arduino. Каждые 100 мс будем запрашивать с детектора расстояние с помощью функции getDistance() и выводить на ЖК-дисплей.

У меня на LCD дисплее имеется дефект, и его левая половина почти не работает. Поэтому я вывожу надписи выровненными по правому краю.

После того как записали скетч в память Arduino, можем собирать прибор. Предлагаемая мной компоновка внутренностей показана на рисунке. Дисплей и датчик я закрепил с помощью термоклея. Он держит достаточно прочно, но при этом даёт возможность снять соединённые детали, если понадобится. Желательно всё разместить так, чтобы можно было подключиться к USB порту Arduino и поправить «прошивку» при необходимости. Например, изменить выводимый текст или поправить коэффициенты для расчёта дистанции. Может понадобиться менять контрастность ЖК дисплея, так что также желательно иметь в доступности регулятор потенциометра.

Вариант готового прибора показан на фотографии. Он достаточно компактен и удобен в использовании.

Вариант компоновки ультразвукового дальномераВнешний вид готового ультразвукового дальномера

Но следует иметь в виду несколько важных замечаний при его использовании:

  • Ультразвук лучше отражается от гладких поверхностей, чем от поглощающих (например, мягкого ковра). Поэтому следует выбирать место расположения дальномера при измерении так, чтобы напротив дальномера располагалась гладкая отражающая поверхность (например, стена).
  • Показания прибора могут существенно отличаться в зависимости от угла направления на цель. Поэтому лучше всего провести несколько измерений, немного изменяя угол направления на цель, и взять среднее значение от всех измерений.

Подключение термистора к Ардуино

Чтобы измерить сопротивление термистора, подключим его в качестве
нижнего плеча делителя напряжения. Среднюю же точку делителя подключим к
аналоговому входу Ардуино — A0.

Чтобы измерить сопротивление термистора, подключим его в качестве нижнего плеча делителя напряжения. Среднюю же точку делителя подключим к аналоговому входу Ардуино — A0. 

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

Внешний вид макета

Какое сопротивление должен иметь резистор в верхнем плече делителя?
Как правило, используют резистор с сопротивлением, совпадающим по
порядку с номиналом термистора. В нашем уроке мы используем резистор на
R1 = 102 кОм, его легко получить последовательным соединением двух
резисторов на 51 кОм.

How a Thermistor Works

Thermistors are variable resistors that change their resistance with temperature. They are classified by the way their resistance responds to temperature changes. In Negative Temperature Coefficient (NTC) thermistors, resistance decreases with an increase in temperature. In Positive Temperature Coefficient (PTC) thermistors, resistance increases with an increase in temperature.

NTC thermistors are the most common, and that’s the type we’ll be using in this tutorial. NTC thermistors are made from a semiconducting material (such as a metal oxide or ceramic) that’s been heated and compressed to form a temperature sensitive conducting material.

The conducting material contains charge carriers that allow current to flow through it. High temperatures cause the semiconducting material to release more charge carriers. In NTC thermistors made from ferric oxide, electrons are the charge carriers. In nickel oxide NTC thermistors, the charge carriers are electron holes.

Теги

433 МГцArduinoArduino MegaATmegaDHT11LCD дисплейДатчик температурыИзмерениеИзмерение температурыОтносительная влажность воздухаРадиомодульТемператураТермометр

Простой термометр на Arduino

В этом примере программы для Arduino показано как можно быстро создать термометр с использованием датчика температуры. Текущее значение температуры будет отображаться в серийном мониторе в градусах по Цельсию и по Фаренгейту.

//TMP36 переменные

int sensorPin = 0; //аналоговый пин, к которому подключен датчик температуры TMP36 //разрешающая способность равна 10 мВ/градус по Цельсию

//с отступом 500 мВ для отрицательных температур

/*

* setup() – эта функция отрабатывает один раз при запуске Arduino

* Инициализация серийного протокола связи с компьютером

*/

void setup()

{

Serial.begin(9600); //Начало обмена данными с компьютером по серийному протоколу,

// чтобы отобразить результат измерений в серийном мониторе

}

void loop() // запускается вновь и вновь

{

//получаем значения напряжения с датчика температуры

int reading = analogRead(sensorPin);

// преобразовываем полученные данные в напряжение. Если используем Arduino 3.3 В, то меняем константу на 3.3

float voltage = reading * 5.0;

voltage /= 1024.0;

// отображаем напряжение

Serial.print(voltage); Serial.println(» volts»);

// теперь отображаем температуру

float temperatureC = (voltage — 0.5) * 100 ; //конвертируем 10 мВ на градус с учетом отступа 500 мВ

//в градусы ((напряжение – 500 мВ) умноженное на 100)

Serial.print(temperatureC); Serial.println(» degrees C»);

// преобразуем в градусы по Фаренгейту

float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;

Serial.print(temperatureF); Serial.println(» degrees F»);

delay(1000); //ожидаем 1 секунду

}

Шаг 3. Наблюдение за аналоговым входом

В схеме вы можете увидеть, что температурный датчик подключен к источнику питания (5 вольт) и заземлению (0 В) и аналоговому выходу A0. По мере повышения температуры выход, подключенный к A0, увеличивает свое напряжение. Вы также можете видеть, что три светодиода подключены к их собственным цифровым выводам.

Несмотря на то, что Arduino — это цифровой инструмент, он может получать информацию от аналоговых датчиков для измерения таких параметров, как температура или свет. Для этого вы воспользуетесь встроенным аналого-цифровым преобразователем Arduino (ADC).

Аналоговые контакты от A0 до A5 могут интерпретировать напряжения от 0 до 5 В и переводить это напряжение в значения от 0 до 1023 для использования в скетче Arduino. Аналоговые контакты в основном используются для считывания информации с датчиков (они также могут быть использованы как цифровые выходы 14-19, несвязанные).

Analog Voltage Reading Method

To measure the temperature, we need to measure the resistance. However, a microcontroller does not have a resistance-meter built in. Instead, it only has a voltage reader known as a analog-digital-converter. So what we have to do is convert the resistance into a voltage, and we’ll do that by adding another resistor and connecting them in series. Now you just measure the voltage in the middle, as the resistance changes, the voltage changes too, according to the simple voltage-divider equation. We just need to keep one resistor fixed

Say the fixed resistor is 10K and the variable resistor is called R — the voltage output (Vo) is:

Vo = R / (R + 10K) * Vcc

Where Vcc is the power supply voltage (3.3V or 5V)

Now we want to connect it up to a microcontroller. Remember that when you measure a voltage (Vi) into an Arduino ADC, you’ll get a number.

ADC value = Vi * 1023 / Varef

So now we combine the two (Vo = Vi) and get:

ADC value = R / (R + 10K) * Vcc * 1023 / Varef

What is nice is that if you notice, if Vcc (logic voltage) is the same as the ARef, analog reference voltage, the values cancel out!

ADC value = R / (R + 10K) * 1023

It doesn’t matter what voltage you’re running under. Handy!

Finally, what we really want to do is get that R (the unknown resistance). So we do a little math to move the R to one side:

R = 10K / (1023/ADC — 1)

Использование термопары

Если вы используете интерфейсный чип AD595, можно просто подключить выходное напряжение к аналоговому входу на вашем Arduino (или другом микроконтроллере) и произвести дополнительную математическую операцию, чтобы преобразовать ваши 10 мВ/°C в числовое значение на выходе.

Если вы планируете использовать MAX6675/MAX31855 или их аналоги, подключение будет чуть сложнее. Первое: Vin и GND надо подключить к источнику питания 3-5 В. Оставшиеся три пина (data пины) подключаются к цифровым контактам Arduino:

  • CLK (clock — часы) — входа на MAX6675/MAX31855 (и выход на Arduino), который сигнализирует, когда надо передавать новый бит данных;
  • DO (data out — вывод данных) выход с MAX6675/MAX31855 (входа на Arduino), через который передается каждый бит данных;
  • CS (chip select — выбор чипа) вход на MAX6675/MAX31855 (выход с Arduino), который сообщает, когда настало время считать показания термопары и вывести больше данных.

В начале скетчей для Arduino надо инициализировать эти пины. В нашем конкретном примере DO подключается к цифровому пину digital 3 на Arduino, CS — к цифровому пину digital 4, а CLK подключается к пину 5.

Если вы используете MAX31855 v1.0 в зашумленных условиях, рекомендуется добавить конденсатор на 0.01 мкФ между контактами термопары (смотрите на рисунке выше).

MAX31855 не поддерживает заземленные термопары. Если сенсор заземляется, чип вернет вам ошибку.

Часто задаваемые вопросы

Кажется, температура, которую показывает моя термопара меняется в противоположном направлении! Я повышаю температуру, а по показаниям она уменьшается.

Скорее всего это случилось из-за того, что вы неправильно подключили контакты термопары или они неправильно маркированы. Попробуйте поменять местами красный и оранжевый провода термопары.

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

Платы MAX31855 очень чувствительные. Для того, чтобы исправить эту проблему, можно установить конденсатор на 0.001 или 0.01 мкФ между контактами термопары (например, установить конденсатор в терминале для подключения контактов термопары или припаять его снизу как это показано на фото ниже).

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

Термопары типа K не являются прецизионными (точными) сенсорами! Отклонения в показаниях наверняка будут. Эти отклонения можно компенсировать на уровне программы для Arduino или другого микроконтроллера. Как правило, термометры, в которых используется термопара, калибруются именно на уровне программного обеспечения.

Для точного измерения температуры можно использовать 1% термистор.

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

Вы можете подключить столько плат MAX31855, сколько у вас пинов на Arduino. При этом объедините пины CLK и DO со всех плат и подключите к одному пину на Arduino, а контакты CS подключайте к отдельным пинам на Arduino.

После этого создайте новые функции для термопар в скетче Arduino IDE подобным образом:

Adafruit_MAX31855 thermocouple1(thermoCLK, thermoCS1, thermoDO);

Adafruit_MAX31855 thermocouple2(thermoCLK, thermoCS2, thermoDO);

Adafruit_MAX31855 thermocouple3(thermoCLK, thermoCS3, thermoDO);

Можно использовать одинаковые CS и CLK пины, но разные контакты DO

Adafruit_MAX31855 thermocouple1(thermoCLK, thermoCS, thermoDO1);

Adafruit_MAX31855 thermocouple2(thermoCLK, thermoCS, thermoDO2);

Adafruit_MAX31855 thermocouple3(thermoCLK, thermoCS, thermoDO3);

При очень высоких или очень низких температурах, измерения некорректные

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации