Чтение значений температуры с помощью Arduino является очень полезной задачей. Существует большое разнообразие датчиков температуры с различными функциями, которые вы можете использовать в своих проектах.
В этой статье мы собрали 8 доступных датчиков температуры, совместимых с Arduino и другими платами разработки (такими как ESP32 или ESP8266).
1. DHT11
DHT11 это цифровой датчик температуры, который измеряет температуру и относительную влажность воздуха.
Этот датчик содержат микросхему, которая выполняет аналого-цифровое преобразование и выдает цифровой сигнал с температурой и влажностью. Это делает его очень простыми в использовании с любым микроконтроллером, включая Arduino.
Цифровой мультиметр AN8009
Большой ЖК-дисплей с подсветкой, 9999 отсчетов, измерение TrueRMS…
Ниже приведены наиболее важные технические характеристики датчика температуры DHT11:
2. DHT22
Датчик температуры DHT22 очень похож на DHT11. Он также измеряет температуру и влажность, и его распиновка такая же. Он немного дороже, но более точен и имеет более широкий диапазон измерения температуры и влажности.
Ниже приводим наиболее важные характеристики датчика температуры DHT22:
3. LM35DZ, LM335, LM34
LM35DZ представляет собой линейный датчик температуры, который откалиброван непосредственно в градусах Цельсия. Аналоговый выход прямо пропорционален температуре в градусах Цельсия: 10 мВ на каждый градус Цельсия.
Этот датчик очень похож на LM335 (откалиброванный в Кельвинах) и LM34 (откалиброванный в градусах Фаренгейта).
Далее приведены наиболее важные характеристики датчика температуры LM35:
- Протокол связи: аналоговый выход
- Диапазон питания: от 4 до 30 В
- Диапазон температур: от -55 до 150ºC
- Точность: +/- 0,5ºC (при 25ºC)
- Интерфейс с Arduino: analogRead ()
4. BMP180
Хотя BMP180 является датчиком атмосферного давления, он также может измерять температуру. Это очень удобно при создании проекта метеостанции.
Ниже приведены наиболее важные характеристики датчика BMP180, когда речь идет о показаниях температуры.
- Протокол связи: I2C
- Диапазон питания (для чипа): от 1,8 до 3,6 В
- Диапазон питания (для модуля): от 3,3 до 5 В
- Диапазон температур: от 0 до 65ºC
- Точность: +/- 0,5ºC (при 25ºC)
- Библиотеки Arduino: Adafruit BME085, Adafruit Unified Sensor Library
5. TMP36
TMP36 — аналоговый датчик температуры. Он выводит аналоговое значение, пропорциональное температуре окружающей среды. Он очень похож на датчик температуры LM35.
Вот его основные характеристики:
- Протокол связи: аналоговый выход
- Диапазон питания: от 2,7 В до 5,5 В
- Диапазон температур: от -40 ° C до + 125 ° C
- Точность: +/- 1ºC (при 25ºC)
- Интерфейс с Arduino: analogRead ()
6. LM75
Датчик LM75 — еще один полезный датчик температуры. Он работает по шине I2C, то есть с Arduino этот датчик соединяется по линиям SDA и SCL.
Взгляните на следующую таблицу, где приведены сводные технические характеристики датчика LM75:
- Протокол связи: I2C
- Диапазон питания: от 3,0 до 5,5 В
- Диапазон температур: от -55 до 125 ° C
- Точность: +/- 2,0 ° C (в диапазоне от -55 до 125 ° C))
- Библиотеки Arduino: Temperature_LM75_Derived
7. BME280
BME280 является барометрическим датчиком, который также измеряет температуру и влажность. Он может обмениваться данными с микроконтроллером по шине I2C или SPI. Питание модуля BME280 составляет 3,3 В или 5 В.
В следующей таблице приведены сводные технические характеристики датчика BME280, когда речь идет о датчике температуры:
8. DS18B20
DS18B20 — цифровой дтчик температуры работающий по протоколу 1-Wire. Это означает, что для связи с Arduino требуется только одна линия данных (и GND).
Каждый датчик температуры DS18B20 имеет уникальный 64-битный серийный код. Это позволяет подключить несколько датчиков к одному проводу передачи данных. Таким образом, вы можете получать температуру от нескольких датчиков, используя всего один цифровой вывод Arduino.
Ниже приведены наиболее важные характеристики датчика температуры DS18B20:
- Протокол связи: 1-Wire
- Диапазон питания: от 3,0 до 5,5 В
- Диапазон рабочих температур: от -55ºC до + 125ºC
- Точность: +/- 0,5 ºC (в диапазоне от -10ºC до 85ºC)
- Библиотеки Arduino: DallasTemperature, OneWire
Источник
Цифровой термометр DS18B20 и ARDUINO UNO
Казалось бы, что может быть интересного и нового в измерении температуры при помощи Ардуино? Написаны сотни статей, объемом десятки мегабайт, может чуть меньше, а может и чуть больше скетчей… А вот еще и моя статья.
Зачем? Честно говоря, я тоже думал, что вопрос этот «разжеван вдоль и поперек», пока сам не столкнулся с измерением температуры. А тут полезло. Что-то не работает, что-то работает не так, возникает масса вопросов, на которые ответы приходится «выцарапывать» перерывая половину интернета, причем не только русскоязычного.
Данная статья, в отличие от моих прошлых статей на данном ресурсе гораздо более практичная, но начнем сначала.
Зачем, собственно измерять температуру чем-то новым, когда термометров продается – на любой вкус и кошелек? А дело в том, что температуру, зачастую, приходится не только измерять, но потом, на основе полученных данных что-то делать, либо просто регистрировать с целью отслеживания изменений.
Соединив, при помощи Ардуино, термодатчик с релейным блоком получим простейший терморегулятор, а если данный терморегулятор сможет отслеживать температуру по нескольким точкам (зонам) и действовать по определенному алгоритму получим довольно серьезный прибор, промышленный аналог которого стоит сопоставимо со стоимостью неплохого ноутбука. Однако, целью данной статьи не является создание заумно-сложных устройств. Цель в другом — предложить новичку простое, проверенное на практике, решение для измерения температуры. Также, как и предыдущие статьи эта будет состоять из частей. В каждой из которых будет рассмотрен свой вопрос. Части будут идти по возрастанию сложности.
Часть первая. Простейшая, но тоже полезная
Итак, от слов к делу! Для реализации данного проекта на первом этапе нам понадобится цифровой термодатчик DS18B20, ARDUINO UNO, резистор на 4,7 кОм (мощность особого значения не имеет, от 0,125 до 2 Вт целиком подходит, но имеет значение точность, чем точнее – тем лучше), кусочек 3-жильного провода (и отдельные проводки на этапе эксперимента тоже подойдут), а еще — несколько штырьков для платы. Хотя и без них тоже можно, если аккуратно, конечно. Выбор данного датчика не случаен. Дело в том, что он может отслеживать температуру в диапазоне от -55оС до +125оС с точностью в основной части диапазона 0,5оС, что вполне хватает для управления, как бытовым отоплением, так и разнообразными морозильными и холодильными установками, а также банями, саунами, теплицами, инкубаторами, рассадниками и прочим. Напоминаю, что ARDUINO UNO можно свободно приобрести здесь: arduino-kit.com.ua/uno-r3-new.html или здесь: arduino-kit.com.ua/arduino-leonardo-original-italiya-new-rev3.html , термодатчик DS18B20 — arduino-kit.com.ua/18b20-sensor-datchik-temperatury-dlya-arduino.html , хотя лично у меня – такой:arduino-kit.com.ua/cifrovoy-datchik-temperatury-odnozhilnyy-ds18b20.html достоинство моего — малые размеры, сопоставимые с размерами кабеля. Недостатки – отсутствие платы, что в некоторых условиях отрицательно сказывается на удобстве монтажа и жизнеспособности датчика. Также – у датчика arduino-kit.com.ua/18b20-sensor-datchik-temperatury-dlya-arduino.html встроен резистор и больше никаких резисторов паять не нужно, зато исчезает возможность подключить несколько датчиков «цепочкой». Подключение датчика к Ардуино видно на Рис. 1 и указано в Таблице 1. На термодатчике определить контакты просто. Нужно взять его так, чтобы смотреть на срез с цифрами, а ножки были внизу. Крайняя левая ножка будет GND, средняя DQ, а крайняя правая VDD.
Таблица 1.
Пин Ардуино Уно | Пин DS18B20 | Примечание |
GND | GND | «-» |
+5V | VDD | +5V, также подпаивается одна ножка резистора 4,7 кОм. |
10 | DQ | Цифровой ввод, также подпаивается вторая ножка резистора 4,7 кОм. |
Рисунок 1. Подключение одного термодатчика.
На рисунке видно, что было использовано два резистора. Это связано с тем, что найденный мной резистор с маркировкой «4К7», на самом деле имел довольно высокую погрешность, которую и пришлось компенсировать вторым резистором.
Общее сопротивление данной сборки составило 4,695 кОм, что я считаю вполне приемлемым. Также на рисунке можно видеть, что датчик не подпаян непосредственно к проводам (обрезок шлейфа), а вставлен в разъем. Сделано это было из соображений развития эксперимента.
Паять данные датчики настоятельно рекомендуется. Сам скетч также получился довольно компактным:
Файл DS18B20.ino
Всего 14 строчек кода с ми. Любому новичку будет по силам разобраться. В результате работы программа выдаст нечто подобное:
Рисунок 2. Результат работы с одним датчиком.
Часть вторая. Немного усложненная
Усложним мы эту часть тем, что добавим еще один датчик. Предположим, что нам нужно измерять температуру на улице и в помещении. Для этого всего лишь допаиваем один датчик «в цепочку». Очень напоминает параллельное подключение. Знатоки электрики поймут, о чем я. Но отличие есть: в данном случае выводы от центрального провода должны быть как можно короче.
Рисунок 3. Плата с двумя датчиками.
Скетч вырос всего на 3 строчки. Теперь в нем 17 строк:
Файл DS18B20_2.ino
Результаты работы этого скетча видно на Рисунке 4.
Рисунок 4. Работа с двумя датчиками.
Часть третья. Заключительная
А теперь подключим к Ардуино светодиод, который будет загораться при достижении определенной температуры. Такой себе «пороговый сигнализатор». Для этого нужен обычный светодиод и токоограничивающий резистор.
Мне под руку попался на 100 Ом, его я и использовал, подключив к 7-у контакту Ардуино. Длинную ножку светодиода (анод) подпаиваем к резистору, а короткую (катод) подключаем к контакту GND Ардуино.
Должно получиться, примерно, как на рисунке 5.
Скетч также вырос совсем не на много:
Файл DS18B20_2_plus_diod.ino
Работа данной программы на компьютере отображается точно также, как показано на Рисунке 4. Естественно переменной sensors.getTempCByIndex(1) можно оперировать в очень широких пределах и управление светодиодиком лишь самый простой пример из всех возможных.
И в заключение данной статьи еще один шаг. Сейчас я расскажу, как к одной Ардуинке подключить несколько «гирлянд» данных устройств. Дело в том, что длина «гирлянды» не может быть бесконечной, более того – она очень сильно ограничена.
В идеальных условиях – 300 метров, но создание «идеальных» условий – довольно дорогостоящее удовольствие. В реальных условиях – не рекомендуется превышать 10 метров. Для обычного «комнатного» термометра этого более чем достаточно, но если речь идет о каком-либо более серьезном оборудовании – этого катастрофически мало.
Тем более, что для стабильной работы необходимо, чтобы датчики располагались как можно ближе к проводникам шины – «гирляндой». Отводить, конечно, тоже можно, но точность и помехозащищенность в этом случае будут крайне низкими.
Итак, подключаем мы несколько «гирлянд» именно для того, чтобы собрать информацию с большого числа точек, при этом сохранив достаточную точность и помехозащищенность. Добавляем контакты согласно таблице 2:
Пин Ардуино Уно | Пин DS18B20 | Примечание |
GND | GND | «-» |
+5V | VDD | +5V, также подпаивается одна ножка резисторов 4,7 кОм. |
10 | DQ | Цифровой ввод, также подпаивается вторая ножка резистора 4,7 кОм. |
8 | DQ | Цифровой ввод, также подпаивается вторая ножка резистора 4,7 кОм. |
Как видно из таблицы – ничего сложного нет, точно такая же шина, только на другой цифровой вод. Не стал паять на 9-й контакт только из соображений удобства и скорости пайки.
Скетч:Файл DS18B20_2_plus_1.ino
- Вряд ли скетч нуждается в излишних х.
- Результат работы скетча выглядит так:
Рисунок 6. Работа одновременно двух линий датчиков.
- А плата с подключенными двумя линиями выглядит так:
Рисунок 7. Плата с двумя шинами.
- Из рисунка видно, что резистор 4,7кОм для повышения точности также выполнен составным.
- Библиотеки, примененные для написания скетчей рассмотренных в статье находятся здесь:
OneWire.hDallasTemperature.h
Обзор подготовил Павел Сергеев
Термометр с помощью arduino и датчиков LM35 и DS18B20
Я писал недавно статью, где подключал к arduino 4-разрядный 7-сегментный индикатор hs420561k-32, тогда упоминал, что хочу сделать градусник с выводом температуры на этот индикатор, только проблема была в отсутствии датчиков.
И вот наконец-то приехала посылка с недостающими запчастями и можно продолжить проект. Температурных датчиков у меня три штуки – dht11, LM35 и DS18B20.
Но использовать буду только LM35 и DS18B20, поскольку dht11 очень неточный, в даташите написано, что отклонения от реальной температуры составляют плюс-минус два градуса, а так же он работает только с положительной температурой.
Температурный датчик LM35. Подключение к arduino
Первый датчик, который будем использовать – это LM35, использовать его очень просто, тут даже дополнительные библиотеки не требуются, достаточно подключить к нему питание и считать данные на выходе с помощью аналогового пина arduino. LM35 работает с температурами от -55 до 150 градусов Цельсия и если верить даташиту, то погрешность составляет всего плюс-минус 0,25 градуса.
Хоть датчик и обрабатывает до +150 градусов, но считать ардуиной сможем только до +110, хотя и это более чем достаточно для домашнего градусника. Поскольку этот датчик имеет высокую точность, но находится в корпусе TO92, без какой-либо дополнительной защиты, использовать его будем для измерения температуры в помещении.
Официальный мануал arduino рекомендует использовать для снятия показаний этого датчика опорное напряжение 1,1 В. Чтобы настроить arduino подобным образом достаточно использовать команду analogReference(INTERNAL) в функции setup. Далее достаточно просто, с нужным интервалом, считывать напряжение с выходной ножки(OUT) датчика.
LM35 формирует напряжение 10 милливольт на один градус, таким образом имея опорное напряжение в 1,1 В легко обработать, довольно точно, данные.
void setup() {
// меняем опорное напряжение на 1.1 В, относительно которого происходят аналоговые измерения
analogReference(INTERNAL);
}
void loop() {
reading = analogRead(A0); // LM35 подключен к пину A0
temperature = (1.1 * reading * 100.0) / 1024; // получаем значение в градусах Цельсия
}
Ниже на картинке показано, какая нога датчика LM35 за что отвечает.
Температурный датчик DS18B20. Подключение к arduino
Второй датчик, который будет использован – это цифровой DS18B20. Точность в этом случае не на много ниже — плюс-минус 0,5 градуса, а диапазон измерения температуры практически такой же: от -55 до +125 градусов Цельсия.
Большим преимуществом является то, что датчик находится внутри влагозащитного корпуса, а так же имеется кабель длиной 1 метр, что позволяет вынести его на улицу, когда само устройство будет находиться в помещении.
Еще из плюсов сюда можно добавить возможность подключение одновременно до 127 датчиков на один пин ардуино, только я даже предположить не могу, где это может пригодиться :).
Считывать данные с DS18B20 немного сложнее, чем с LM35, для удобства можно воспользоваться библиотекой OneWire.
В комплекте с библиотекой идет уже готовый пример считывания данных с датчика. Информация о температуре передаются в байтах, которые необходимо сначала запросить, получить и перевести к человеческому виду. В коде примера это подробно прокомментировано, а так же в полном скетче проекта я добавил комментарии.
На картинке ниже показано, как подключать датчик DS18B20. Основным моментом является то, что необходимо использовать резистор сопротивлением 4.7 кОм для соединения провода, передающего данные и плюсовым.
Проблема вывода температуры на индикаторе hs420561k-32
Пока я разбирался с каждым датчиком по отдельности, а также когда подключал к arduino 4-х разрядный 7-сегментнтый индикатор, проблем ни каких не было, все прекрасно работало. Но стоило мне собрать все в кучу, на одну макетную плату и собрать код воедино, как сразу появилась серьезная проблема.
Я писал в прошлой статье, что для одновременного вывода данных сразу на 4-х разрядах hs420561k-32 необходимо очень быстро по очереди выводить по одному разряду, тогда создается впечатление одновременного вывода четырех цифр, глаз не успевает уловить смену разрядов.
В связи с таким способом вывода возникла сложность с одновременной работой датчика DS18B20, для его опроса требуется чуть больше секунды времени – в двух участках кода используется delay, который заставляет микроконтроллер ждать, 250 и 1000 миллисекунд.
Сначала я сделал запрос к датчику раз в 30 секунд, но это не решило проблему – два раза в минуту датчик по секунде показывал непонятно что. Поэтому пришлось отказаться от delay и добавить другую аналогичную конструкцию в код, которая будет выполнять определенные куски кода с задержкой, а остальной код будет выполняться без задержек.
Многопоточности в arduino, как оказалось, нет, но есть псевдомногопоточность, добиться ее можно используя не хитрую конструкцию с таймером, который отмеряет время в миллисекундах от старта работы микроконтроллера. Пример такого кода я приведу ниже:
bool flag = false; // флаг
unsigned long previousMillis = 0; // время последнего срабатывания
const long interval = 1000; // интервал срабатывания кода, задержка.
void setup() {
//
}
void loop() {
// получаем время в миллисекундах, которое прошло
// с момента начала работы МК
unsigned long currentMillis = millis();
// проверяем сколько прошло врмени
if (currentMillis — previousMillis >= interval) {
// если прошло нужное количество миллисекунд,
// то записываем в переменную количество прошедшего времени
previousMillis = currentMillis;
// меняем положение флага,
// это может быть вкл и выкл светодиода, например
flag = !flag;
}
}
Что использовалось в проекте:
Скетч уличного и комнатного термометра на arduino
Все сложные моменты, с которыми возникали сложности, в процессе создания термометра я описал, теперь остается только написать скетч, его код приведен ниже, а также доступен для скачивания тут: скачать.
#include // библиотека для работы с датчиком DS18B20
OneWire ds(10); // подключаем уличный датчик к 10 пину
//Пин подключен к SH_CP входу 74HC595
int clockPin = 6;
//Пин подключен к ST_CP входу 74HC595
int latchPin = 7;
//Пин подключен к DS входу 74HC595
int dataPin = 8;
int tempHomePin = A0; // градусник в помещении
// Пины разрядов цифер
int pins_numbers[4] = {2, 3, 4, 5};
// Биты для отображения цифер от 0-9, минуса и символ градуса Цельсия
byte numbers_array[22] = {
B00111111, B00000110, B01011011, B01001111, // 0 1 2 3
B01100110, B01101101, B01111101, B00000111, // 4 5 6 7
B01111111, B01101111, B01000000, B01100011, // 8 9 — о
// цифры с точкой внизу (+12 к индексу элемента)
B10111111, B10000110, B11011011, B11001111, // 0 1 2 3
B11100110, B11101101, B11111101, B10000111, // 4 5 6 7
B11111111, B11101111 // 8 9
};
int cel_celsius = 0; // переменная для хранения градусов на улице
float tempHome = 0; // переменная для хранения градусов в помещении
const long tempInterval = 3000; // интервал запроса актуальной температуры
unsigned long previousMillis = 0; // время предыдущего запроса
unsigned long previousMillis_delay = 0; // хранения последней даты срабатывания, для второй задержки
bool startQuery = false; // флаг, для обозначения начала запроса температуры
bool firstQuery = true; // флаг первого запуска, при котором получаем температуру без задержек
bool showhome = true; // флаг, который указывают какую температуру показывать — комнату или улицу
int sec_show = 5000; // интервал смены отображения погоды
unsigned long showhomeMillis_delay = 0; // хранения последней переключения градусников
// функция для вывода чисел на индикаторе
void showNumber(int numNumber, int number){
// зажигаем нужные сегменты
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numbers_array[number]);
digitalWrite(latchPin, HIGH);
// включаем нужный разряд(одну из четырех цифр)
int num_razryad = pins_numbers[numNumber-1];
for(int i; i= tempInterval) || startQuery || firstQuery) {
previousMillis = currentMillis;
// читаем данные от датчика на улицы
if ( !ds.search(addr)) {
ds.reset_search();
//delay(250);
return;
}
// если ни чего не получили или получили не понятные данные
if (OneWire::crc8(addr, 7) != addr[7]) {
return;
}
// читаем первый байт и определяем тип датчика
switch (addr[0]) {
case 0x10: // DS18S20
type_s = 1;
break;
case 0x28: // DS18B20
type_s = 0;
break;
case 0x22: // DS1822
type_s = 0;
break;
default:
return;
}
// делаем запрос на получение данных от датчика
ds.reset();
ds.select(addr);
ds.write(0x44);
// ждем
startQuery = true;
// delay(1000);
if ( currentMillis — previousMillis_delay >= 1000 ) {
previousMillis_delay = currentMillis;
}else{
return;
}
startQuery = false;
// и получаем ответ
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
// берем только первые 9 байт
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
// данные приходят в битах, переводим их в десятичное число
int16_t raw = (data[1]
Датчик температуры DS18B20 к ESP8266 и отправляем данные на БД MySql
Попробуем уже сделать на esp8266 что-нибудь действительно полезное. Большой плюс от такого дешёвого чипа, что его можно легко подружить с интернетом, а это открывает огромный потенциал в мир IoT. Дисплей мы подключили в прошлой статье, ну а теперь добавим ещё датчик температуры, возьмём для этого самую популярную модель DS18B20.
Разберёмся, как подключить датчик DS18B20 к нашей ESP8266. Распиновку легко найти в даташите, у датчика всего 3 пина, питание VCC, земля GND с собственно сигнал. Между сигнальной линией и питанием рекомендуется поставить резистор от 4.7 до 10кОм.
Для начала подключим необходимые библиотеки, для работы с этим датчиком, ведь он работает по интерфейсу OneWire, который мы совсем недавно разбирали
#include
#include
Определим контакт, куда будет подключаться сигнальная шина датчика. GPIO5 по схеме соответствует D1
#define ONE_WIRE_BUS 5
Дадим понять, что этот контакт будет работать по интерфейсу OneWire
OneWire oneWire(ONE_WIRE_BUS);
И внесём переменную массив, temperatureCString, которая будет получать данные от датчика, в формате 8 битной посылки.
DallasTemperature DS18B20(&oneWire);
char temperatureCString[7];
Затем переходим в setup, и вносим инициализацию датчика
DS18B20.begin();
Теперь нам нужно написать функцию получения температуры. Я убрал из стандартного примера получение температуры в F, и оставил только градусы Цельсия.
void getTemperature()
{
do {
DS18B20.requestTemperatures();
tempC = DS18B20.getTempCByIndex(0);
dtostrf(tempC, 2, 2, temperatureCString);
delay(100);
} while (tempC == 85.0 || tempC == (-127.0));
}
Попробуем отобразить на дисплее, температуру с градусником, с заполняемой шкалой. Как подключить дисплей к ESP8266, мы разобрали в прошлый раз.
Но картинку BMP нам заливать бессмысленно, потому-что нам нужна изменяемая шкала. Благо в библиотеке adafruit можно легко использовать геометрические фигуры.
Статья не о дисплее, поэтому просто приведу код с ми, кому интересно можно будет разобраться самому.
void disp_temp () // Функция отображения температуры
{
getTemperature(); // Получаем значение температуры
measureTemp = 145 — tempC * 2; // Вычитаем из высоты дисплея умноженное на 2 значение температуры
tft.fillScreen(ST77XX_WHITE); // Заполняем экран белым
tft.fillCircle(180, 170, 35, ST77XX_BLACK); // Рисуем чёрный и красный круг термометра
tft.fillRoundRect(165, 40, 30, 130, 15, ST77XX_BLACK); // Прямоугольник закругленный
tft.fillCircle(180, 170, 28, ST77XX_RED);
tft.fillRect(171, measureTemp, 18, tempC * 2, ST77XX_RED); // Прямоугольник с ртутью, отображает значение measure temp, высота столбика tempC*2
for (uint8_t a = 50; a < 140; a = a + 10) // Рисуем линии градусника длинные
{
tft.drawFastHLine(200, a, 14, ST77XX_BLACK);
}
for (uint8_t a = 55; a < 140; a = a + 10) // Рисуем линии грудусника короткие
{
tft.drawFastHLine(200, a, 7, ST77XX_BLACK);
}
tft.setTextSize(3); // Рисуем текст и значение температуры
tft.setTextColor(ST77XX_BLACK);
tft.setCursor(30, 90);
tft.print("Temp:");
tft.setCursor(30, 120);
tft.print(temperatureCString);
}
Смотрим на результат. Шкала справа отображает температуру от 0 до 50 градусов тепла, что как-раз обычно и наблюдается в домашних условиях.
Теперь нам нужно отправлять данные температуры на внешний сервер, на базу данных MySql
В принципе, я нашёл в интернете хорошее руководство про отправку данных через страницу на сервере правда на другом датчике, но в лоб оно не заработало, потому-что команды были заточены под старую версию PHP, и запрос GET также не исполнялся. Например, на строчку
//устанавливаем подключение к MySQL
$connect = mysql_connect($dbhost, $dbuser, $dbpass);
я сразу получил следующую ошибку, при выполнении файла php
Fatal error: Uncaught Error: Call to undefined function mysql_connect()
Так происходит, потому-что в версии php 7, формат команд немного поменялся, ко всем вставкам mysql, добавляется символ “i”, т.е. mysqli, ну и где-то добавились аргументы, поэтому подключение выполняем так
$connect = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
А отправку выполняем следующей строкой, здесь также меняются аргументы, необходимо указывать сначала подключение. Аргумент MySQL NOW()возвращает дату и время localhost, $temp – температуру, а $client_ip – адрес, с которого поступил запрос
mysqli_query($connect, «INSERT INTO temperature VALUES (NOW(), '$temp', '$client_ip')»);
Весь этот файл нужно положить в корень сайта или локалхоста, куда вы будете обращаться от esp8266. Структура файла очень простая – сначала перечисляем параметры базы данных, к которой мы подключаемся. Потом подключаемся к ней, и осуществляем отправку, где лежит переменная, которую мы передадим методом GET, с помощью esp8266
Следующие наши действия должны происходить в phpmyAdmin, где создана наша база. Нужно создать таблицу (temperature), с тремя колонками – дата, температура и ip-клиента.
Arduino HC-06 + DS18B20 (Терморегулятор)
Статьи » Arduino » Arduino HC-06 + DS18B20 (Терморегулятор)
При помощи Bluetooth модуля HC-06 и платы Arduino можно осуществить управление различными исполнительными механизмами c помощью смартфона. В данном случае речь пойдет от терморегуляторе. В качестве датчика температуры используется цифровой датчик DS18B20, температура регулируется при помощи реле (модуля реле) которое управляет нагревательным элементом.
На плате Arduino осуществляется измерение температуры и регулировка температуры срабатывания реле, а так же передача текущей температуры и температуры регулирования в Android приложение.
Android приложение в свою очередь осуществляет соединение с Bluetooth модулем HC-06, изменение температуры регулирования и получение данных от платы Arduino о текущей температуре и температуре регулирования.
Фактически плата Arduino работает автономно, измеряет температуру, управляет реле и хранит в памяти значение температуры регулирования. При изменении температуры регулирования на экран смартфона выводится уже подтвержденная и принятая платой Arduino температура.
Схема всего уст-ва очень простая, она содержит плату Arduino Nano (Uno), Bluetooth модуль HC-06 (подключение) и датчик DS18B20 показания которого передаются на вход A0. Выход управления реле (D13) и подключение датчика температуры можно изменить.
Для установки приложения на смартфон скачайте архив 18b20regapk.zip, распакуйте архив приложения и установите его.
#include #include #include OneWire oneWire(A0);// вход датчика 18b20 DallasTemperature temp(&oneWire); int buff[2],i,dig,arr[2],w=1,w1,reg; int k; int gis=1; // гистерезис 1 градус unsigned long times; void setup(){ Serial.begin(9600);Serial.setTimeout(50); pinMode(13, OUTPUT);// P1 temp.begin(); temp.setResolution(9);//12 бит reg = EEPROM.read(0); pinMode(13, OUTPUT); // выход реле } void loop() { /////// ПРИЕМ ДАННЫХ С SERIAL PORT ///////////////////////// while (Serial.available()>0){ for (i=0;i10&&w==1){ w=0; if(buff[0]==102){reg++;if(reg>125){reg=125;}} if(buff[0]==101){reg—;if(reg10000){w1=0;EEPROM.update(0,reg);} /// измерение температуры temp.requestTemperatures(); k = temp.getTempCByIndex(0); /// отправка днный в android Serial.print(k*10); Serial.println(reg); if(reg >= k + gis){digitalWrite(13,HIGH);} if(reg 0){ for (i=0;i10&&w==1){ w=0; temp_time=millis(); if(buff[0]==102){reg++;if(reg>125){reg=125;}} if(buff[0]==101){reg—;if(reg10000){w1=0;EEPROM.update(0,reg);} /// измерение температуры if(millis()-temp_time>1000){ temp.requestTemperatures(); k = temp.getTempCByIndex(0); temp_time=millis();} /// отправка днный в android Serial.print(k,1); Serial.print(«:»); Serial.print(reg); Serial.print(«:»); Serial.println(nakal); if(reg >= k + gis){digitalWrite(13,HIGH);nakal=1;} if(reg 0){ for (i=0;i10&&w==1){ w=0; temp_time=millis(); if(buff[0]>=10000){dig=buff[0];arr[0]=dig/1000;arr[1]=dig%1000;} if(buff[0]=1000){dig=buff[0];arr[0]=dig/100;arr[1]=dig%100;} if(buff[0]10000){w1=0;EEPROM.update(0,reg);} /// измерение температуры if(millis()-temp_time>1000){ temp.requestTemperatures(); k = temp.getTempCByIndex(0); temp_time=millis();} /// отправка днный в android Serial.print(k,1); Serial.print(«:»); Serial.print(reg); Serial.print(«:»); Serial.println(nakal); if(reg >= k + gis){digitalWrite(13,HIGH);nakal=1;} if(reg
DS18B20 подключение к Arduino | Технохрень
- #include
- #include
- // Пин Arduino куда подключен датчик
- #define ONE_WIRE_BUS 10
- // Объявляем переменные
- OneWire oneWire(ONE_WIRE_BUS);
- DallasTemperature sensors(&oneWire);
- // тут будет хранится адрес нашего датчика. Каждый DS18B20 имеет свой уникальный адрес, зашитый на заводе
- DeviceAddress insideThermometer;
- void setup(void)
- {
- Serial.begin(9600);
- Serial.println(«Dallas Temperature IC Control Library Demo»);
- // Поиск устройств на выбранном пине
Serial.
print(«Поиск устройств…»);
sensors.begin();
Serial.print(«Found «);
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(» штук.»);
// определяемся с режимом питания датчиков. Они кстати могут питаться по тому же проводу, по которому отправляют данные
Serial.print(«Parasite power is: «);
if (sensors.isParasitePowerMode()) Serial.println(«ON»);
- else Serial.println(«OFF»);
- // тут можно прописать адрес вручную
- // Есть 2 варианта:
- // 1) oneWire.search(deviceAddress) – сразу если известен адрес датчика
- // 2) sensors.getAddress(deviceAddress, index) – по номеру подключения, начиная с 0
- //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
- // Мы будем использовать 2 вариант – поищем первый датчик (номер=0):
if (!sensors.getAddress(insideThermometer, 0)) Serial.println(«Не найден адрес датчика 0»);
- // Показываем адрес, который нашли
- Serial.print(«Адрес датчика 0: «);
- printAddress(insideThermometer);
- Serial.println();
// устанавливаем разрешение датчика на 9 бит. Можно попробовать 10 поставить. Эта штука отвечает за точность показаний. Чем выше точность тем меньше скорость получения температуры.
sensors.setResolution(insideThermometer, 9);
Serial.print(«Разрешение датчика 0: «);
Serial.print(sensors.getResolution(insideThermometer), DEC);
- Serial.println();
- }
- // Эта волшебная функция пишет температуру в Serial
- void printTemperature(DeviceAddress deviceAddress)
- {
- // вариант 1 — медленнее
- //Serial.print(«Temp C: «);
//Serial.print(sensors.getTempC(deviceAddress)); // в цельсиях
//Serial.print(» Temp F: «);
//Serial.print(sensors.getTempF(deviceAddress)); // в фаренгейтах. причем чтобы получить температуру в фаренгейтах мы делаем второй запрос к датчику.
- // вариант 2 — быстрее
- float tempC = sensors.getTempC(deviceAddress);
- Serial.print(«Temp C: «);
- Serial.print(tempC);
- Serial.print(» Temp F: «);
Serial.println(DallasTemperature::toFahrenheit(tempC)); // чтобы получить фаренгейты в этот раз мы не делаем второй запрос к DS18B20, а просто конвертим температуру по формуле.
- }
- void loop(void)
- {
Serial.print(«Получаем температуру…»);
- sensors.requestTemperatures(); // Отправка команды на получение температуры
- Serial.println(«готово»);
- // ну и теперь вывод данных
- printTemperature(insideThermometer);
- }
- // А эта функция выводит адрес в Serial
- void printAddress(DeviceAddress deviceAddress)
- {
- for (uint8_t i = 0; i