Подключение термометра к ардуино. Инфракрасный термометр на Ардуино с датчиком MLX90614. Подключение DS18B20 к Arduino
Узнайте, как использовать RF модуль 433 МГц совместно с ATMega328P-PU. В данной статье мы соберем схему из датчика DHT11 и радиочастотного передатчика. А также соберем приемное устройство с радиоприемником 433 МГц и LCD дисплеем.
Что нам потребуется
- компьютер с установленной Arduino IDE (я использую версию 1.6.5);
- библиотека VirtualWire (ссылка ниже);
- ATMega328P;
- программатор AVR MKII ISP;
- датчик температуры и относительной влажности воздуха DHT11 ;
- компоненты из перечня элементов, приведенного ниже.
Введение
В данной статье я покажу вам, как собрать устройство, которое измеряет температуру и относительную влажность воздуха и посылает измеренные значения с помощью стандартного радиочастотного модуля 433 МГц. Датчик температуры и влажности, используемый в устройстве, - это DHT11.
Существует множество способов передачи небольшого объема данных с помощью Arduino или контроллеров ATMega. Один из них использует уже готовую библиотеку, подобную RCSwitch, Radiohead или VirtualWire. Кроме того, можно отправить необработанные данные с помощью встроенного в микроконтроллер модуля UART. Но использовать встроенный модуль UART не рекомендуется, так как приемник будет собирать и все помехи, и микроконтроллер будет работать не так, как предполагалось. В данной статье для передачи и приема данных я использую библиотеку VirtualWire. Эта библиотека работает с Arduino IDE 1.6.2 и 1.6.5.
Модуль передатчика 433 МГц, когда не передает данные, всё равно излучает радиочастотные колебания и передает шум. Он также может создавать помехи другим радиочастотным устройствам. Чтобы не допустить этого, я включаю его, когда необходимо передать данные, и выключаю его, когда передача закончена.
Аппаратная часть
Нам необходимы две структурные схемы. Одна для передающего устройства, вторая для приемного.
Передатчик
Нам необходимы:
- способ прошивки микроконтроллера → ISP;
- датчик для измерения температуры и влажности → DHT11;
- микроконтроллер для обработки данных → ATMega32p;
- способ беспроводной передачи данных → радиочастотный модуль 433 МГц.
Приемник
Нам необходимы:
- способ приема радиосигнала → радиочастотный модуль 433 МГц;
- способ обработки принятых данных → Arduino Mega;
- способ отображения температуры и влажности → 16x2 LCD.
Принципиальные схемы
Передатчик
Передающая часть беспроводного термометра на ATMega328p
()
В данном примере я не буду выводить неиспользуемые выводы микроконтроллера на внешние контакты термометра, после чего их можно было бы использовать для дальнейшего усовершенствования устройства. Здесь мы рассматриваем лишь идею для устройства и соберем его только на макетной плате.
Приемник
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне» )
Пожалуйста, обратите внимание, что приемник построен на базе платы Arduino Mega, которая не изображена на схеме. Для подключения платы Arduino Mega соедините с ней радиочастотный модуль и LCD дисплей согласно метка на схеме.
Перечень элементов
Передатчик
Перечень элементов передающей части беспроводного термометра на ATMega328p
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне» )
Приемник
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне» )
Программа
Программа передатчика
Сперва рассмотрим программу передающей части:
Для передачи влажности и температуры в одном сообщении я соединяю их вместе. Сначала данные считываются в переменную как целые числа, потом целые числа преобразовываются в массив символов, а затем они соединяются друг с другом. На приемной стороне данные будут разделены на отдельные символы. Делая это, я ограничиваю себя двумя цифрами градусов. Если датчик находится в среде с температурой менее 10°C, я буду получать на дисплее символы мусора. Например, если температура составляет 20°C, а влажность - 45%, то будет передаваться сообщение 2045, и всё хорошо. Если температура равна 9°C, а влажность - 78%, то передастся сообщение 978x, где «x» - случайный символ. Поэтому, если вы будете собирать данный беспроводной термометр, я советую вам изменить программу для передачи правильных данных, когда температура будет меньше 10°C.
Программа приемника
// Подключаем необходимые библиотеки #includeИнтересный способ использования библиотеки LiquidCrystal - это создание пользовательских символов. С помощью createChar я создал символ градусов. Таким же способом вы можете создать и свои собственные символы. Чтобы создать пользовательский символ или значок, вам необходимо объявить его, как массив из восьми байт, и «нарисовать», какие пиксели будут включены (1 - включен, 0 - выключен).
В функции setup() вы создаете его с помощью createChar . createChar принимает два аргумента: номер позиции для хранения символа и массив байт, в котором определено, какие пиксели будут отображаться. В нашем случае это lcd.createChar(1, degreesymbol) . Затем символ выводится на LCD с помощью функции lcd.write .
Сегодня мы покажем вам как сделать свой 7-сегментный термометр с Arduino Uno в основе и датчиком температуры ds18b20. Чтоб упростить дело можно также использовать макетную плату - так построить его гораздо легче. Давайте начнем. Для этого проекта вам понадобится:
- Ардуино Уно
- Печатная плата
- Датчик температуры ds18b20
- 4.7 ком резистор
- 2х7-сегментных LED индикатора типа АЛС
- Источник питания (батарейки)
Если вы предпочитаете построить этот термометр без готового модуля Arduino Uno, вам также понадобится:
- 16 МГц кварцевый генератор
- 2х и 1х 100nF конденсаторы 22pF
- 10К резистор
- 28-контактное DIP гнездо для МС
- Кнопка вкл/выкл
Источник питания устройства
Если вы делаете это с Arduino Uno, то понадобится напряжение не менее 6 В - аккумулятор или AC-DC адаптер. Вы также можете использовать USB-кабель для питания термометра от компьютера. Если же вы предпочитаете трудный путь - необходимо будет 3 штуки АА батарей. Максимальное напряжение питания для микроконтроллера 5 В.
Схема принципиальная цифрового термометра
Итак, самое простое - это построить термометр на макетной плате, и сложный - построить его на основе Arduino платы.
Это уменьшенная схема - сохраните её на компьютер чтоб посмотреть увеличенной. Код прошивки, установленный с помощью codebender, .
В этом уроке мы покажем вам, как можно сделать простой термометр на Arduino, используя обычный ЖК-дисплей 16x2 и датчик температуры LM35.
Значения будут преобразованы в градусы Цельсия и Фаренгейта. Все комплектующие для проекта можно найти на АлиЭкспресс или, например, на Амперке.
Для сборки нашего Ардуино термометра нам понадобится ряд деталей, которые мы можем найти на любых интернет-магазинах:
- 1 x Arduino UNO (может быть любая плата Arduino)
- 1 х макет
- 1 x USB-кабель
- 1 x 16x2 ЖК-дисплей
- 1 датчик температуры LM35
- 1 x 10k Потенциометр
- 1 x 220 Ом резистор
- 1 x 9 В Батарея и зажим (опционально для большей мобильности)
- 18 проводов перемычек
Шаг 2. Подключение компонентов к макету
Вставьте ЖК-дисплей, потенциометр и LM35 в макет. Их расположение не имеет значения, поместите их так, как вам нравится.
Шаг 3. Подключение ЖК-дисплея
Это самая сложная часть - теперь вам нужно сделать большую часть соединений. Они заключаются в следующем:
- LCD Pin → Arduino Pin
- 4 → 12
- 6 → 11
- 11 → 5
- 12 → 4
- 13 → 3
- 14 → 2
- LCD Pin → Контакт макетной платы
- 1,5,16 → GND (Земля)
- 2 → 5 В
- 15 → 5 В (используя резистор на 220 Ом!)
Шаг 4. Подключение потенциометра и LM35
Здесь соединения следующие:
Потенциометр
Одна из сторон идет к GND (Земля), противоположная - к питанию 5 В. Средний контакт подключается к контакту 3 ЖК-дисплея
См. Рисунок выше.
Внимание ! Пожалуйста, убедитесь, что вы правильно вставляете датчик! Если вы перепутаете соединения, он сгорит!
После подключения всего, подключите Arduino к компьютеру и загрузите код, который ниже. Добавлены несколько комментариев, чтобы объяснить некоторые части кода.
#include
Шаг 6. Заключение
Наслаждайтесь термометром который вы сделали своими руками. Не стесняйтесь изменять код по своему вкусу и улучшать проект, добавляя больше датчиков и прочее.
В этом уроке мы покажем вам как сделать ЖК-термометр на основе Arduino UNO и аналогового температурного датчика LM35/36.
Этот проект очень хорошо подойдет для начинающих, он не требует каких-либо специальных технических навыков или навыков программирования, и вам понадобится достаточно немного времени для реализации проекта.
Вот что нам нужно для создания термометра:
1x макетная плата
ЖК-дисплей 16x2
LM35 или LM36 аналоговый температурный датчик
10К потенциометр для регулировки яркости дисплея (можете использовать и 50К)
19 перемычек для подключения всего
Вы можете заказать это всё на официальной сайте Arduino или в любом интернет-магазине, который продает всё для радиолюбителей. Вы можете купить всё отдельно в следующих магазинах: Adafruit, SparkFun, Aliexpress, Banggood и т.д.
Шаг 2: Собираем схему
Следуя приведенной выше схеме Fritzing, подключите ЖК-дисплей к макету, а затем подключите его к плате Arduino с помощью перемычек. После этого вставьте потенциометр и датчик в макет, соедините левый и правый выводы с землей и + 5 В, а средний - с ЖК-дисплеем.
Затем подключите датчик к земле и к + 5 В и к Arduino, но будьте очень осторожны, потому что, если вы подключите его неправильно, датчик нагреется до 280+ C (540 F) и может повредиться. После того, как вы подключили все, переходите к следующему шагу.
Шаг 3: Программирование Arduino
Вы должны использовать один из двух скетчей ниже. Загрузите его в Arduino, используя , которую вы можете скачать с официальной страницы Arduino.
Если вы ничего не видите на ЖК-дисплее или видите прямоугольники, поверните потенциометр против или по часовой стрелке пока не увидите, что всё очищено. Теперь у вас есть термометр и вы сможете измерять температуру воздуха вокруг вас, внутри вашего дома или снаружи.
Код 1
// initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // initialize our variables int sensorPin = 0; int tempC, tempF; void setup() { // set up the LCD"s number of columns and rows: lcd.begin(16, 2); } void loop() { tempC = get_temperature(sensorPin); tempF = celsius_to_fahrenheit(tempC); lcd.setCursor(0,0); lcd.print(tempF); lcd.print(" "); lcd.print((char)223); lcd.print("F"); delay(200); } int get_temperature(int pin) { // We need to tell the function which pin the sensor is hooked up to. We"re using // the variable pin for that above // Read the value on that pin int temperature = analogRead(pin); // Calculate the temperature based on the reading and send that value back float voltage = temperature * 5.0; voltage = voltage / 1024.0; return ((voltage - 0.5) * 100); } int celsius_to_fahrenheit(int temp) { return (temp * 9 / 5) + 32; }
Код 2
#include
В итоге у нас получился вот такой результат:
Хороших вам проектов!
О цифровых термометрах на основе Arduino было сказано немало. Все они либо подключались к компьютеру, либо выводили температуры сразу на дисплей.
Но мне был нужен уличный термометр, который автономно и отправляет данные на сайт. Итак, приступим.
Что нам понадобится:
- Arduino Duemilanove (Freeduino 2009)
- Ethernet Shield v2
- цифровой датчик температуры - DS18B20
- вентилятор для корпуса (120 мм)
- банка от водоэмульсионки или клея ПВА (2 литра)
- светодиод
- витая пара
Задачи
Опрашивать датчик температуры по шине 1-Wire и каждые 3 секунды самостоятельно отправлять результаты на Web-сервер, на котором они будут храниться.Алгоритм работы устройства:
- присваиваем нашему Ethernet Shield`у MAC адрес и ip-адрес
- инициализируем соединение с сервером на 80 порт
- получаем данные с цифрового датчика температуры, по 1-Wire шине
- формируем GET запрос
- отправляем GET запрос
- разрываем соединение
Исходный код скетча:
Комментарии по ходу кода должны внести ясность.include
// Библиотеки ниже нет в стандартной поставке среды разработки Arduino.
// придётся её скопировать.
include// MAC-адрес нашего устройства
byte mac = { 0x00, 0x3A, 0xF1, 0x19, 0x69, 0xFC };
// ip-адрес устройства
byte ip = { 192, 168, 1, 156 };
// ip-адрес удалённого сервера
byte server = { 79, 140, 28, 20 }; // измените на свой
char temp;
byte isdata=0;Client client(server, 80); // 80-порт.
DallasTemperature tempSensor;void setup()
{
Ethernet.begin(mac, ip); // Инициализируем Ethernet Shield
tempSensor.begin(7); // Датчик температуры на 7-й пин
Serial.begin(9600); // Скорость консольного порта 9600 (пригодится для отладки)
}void loop()
{
delay(3000); // задержка в 3 сек.
// Соединяемся
if (client.connect()) {
Serial.println("connecting..." ); // Serial.println для отладки. Лучше его оставить, на всякий случай, потом будет легче понять, в чём проблема.
// Обработчик ошибок датчика
switch (tempSensor.isValid())
{
case 1:
Serial.println("Invalid CRC" ); // ошибка контрольной суммы
tempSensor.reset(); // сбросить девайс
return ;
case 2:
Serial.println("Invalid device" ); // какой-то "левый" датчик:)
tempSensor.reset(); // сбросить девайс
return ;
}Serial.println("connected" );
char buf;
float f=tempSensor.getTemperature(); // получаем температуруSerial.println(tempSensor.getTemperature());
// Ниже извращения с отделением дробной части и целой. Почему-то Arduino не хочет работать с float.
// Вместо числа вставляет вопросик. Наверное, виной тому отсутствие аппаратной поддержки работы с
// числами с плавающей запятой в Arduino. Буду рад увидеть более красивое решение в комментариях.
int temp1 = (f - (int )f) * 100; // выделяем дробную часть
// Составляем GET запрос. Переменная code нужна для того, чтобы вражеский термометр не слал какие попало значения.
// проверяется на стороне Web-сервера.
sprintf(buf, "GET /class/backend/meteo.php?temp=%0d.%d&code=123456 HTTP/1.0" , (int )f, abs(temp1));Serial.println(buf);
client.println(buf); // Отправляем GET запрос
client.println("Host: opck.info" ); // Указываем, какой конкретно host на данном ip нас интересует.
client.println();} else {
Serial.println("connection failed" );
}while (client.available()) {
isdata=1;
char c = client.read(); // Читаем, что нам ответил Web-сервер
Serial.print(c);if (!client.connected()) {
isdata=0;
Serial.println();
Serial.println("disconnecting." );
client.stop(); // Завершаем соединение
}
}
Сборка устройства:
- первую «ногу» датчика цепляем на «минус» GND
- вторую «ногу» (DQ) на 7-й пин
- третью на «плюс»
- вторую и третью нужно соединить резистором на ~ 4,7 К. Но я заменил резистор на светодиод и получил индикатор обращения к шине датчика (ВНИМАНИЕ! Без резистора или светодиода работать ничего не будет. Не забудьте!)
По идее, вот и всё. Должно работать.
Работает, но боевые условия показали, что когда падает солнечный свет на датчик, тот может нагреваться и показывать температуру гораздо выше реальной. Всё правильно - он покажет температуру на солнце. А нам нужна температура воздуха.
В первый раз для этого был собран корпус из-под банки от кофе, обёрнутый в фольгу. Но это ничем не помогло.
Изучение фотографий реальных метео-станций помогло найти решение. Корпус для датчика должен быть больше, и к тому же иметь активную вентиляцию для таких случаев.
Делаем корпус для датчика
Подходящей по размеру оказалась банка от водоэмульсионной краски (такие же бывают из-под клея ПВА, объёмом 2-3 литра). В нижней части банки делаем отверстие под вентилятор. И прикрепляем его к банке. В центре банки размещаем площадку под датчики, диаметром немного меньшим самой банки, чтобы воздух мог циркулировать.Несколько фото:
Как вы помните, резистор я заменил светодиодом, поэтому делаем и для него отверстие, чтобы всегда было видно работу устройства.
Крышка от банки нам не нужна, вместо неё нужен навес, такой, чтобы и воздух пропускал, и чтобы атмосферные осадки не попадали внутрь (датчик-то будет расположен на улице).
Корпус для Arduino я сделал из пластмассовой коробки от mp3-плеера Explay C360.
Backend, принимающий данные:
На стороне сервера работает скрипт, к которому обращается термометр. Скрипт проверяет правильность секретного кода, чтобы показания нельзя было подменить.А затем добавляет новую запись в таблицу MySql. Потом эти данные можно выводить как угодно. При этом каждую минуту данные за прошедшую минуту усредняются и добавляются в другую таблицу.
Нужно это для того, чтобы:
1. проще было делать выборки в базе (не правда ли, удобнее указать конкретную минуту и получить результат)
2. выборки были быстрее (за год ~500 000 записей вместо 10 000 000)
Во время длительной работы датчика обнаружилась проблема, иногда он самопроизвольно (раз в 3-4 часа) выдаёт рандомное значение. Поэтому я добавил проверку на изменение температуры больше чем на 1 градус в течении 15 секунд. Такие значения игнорируются.
Недостатки:
Точность датчика 0.5* С, что для меня недостаточно. Но есть способ улучшить его характеристики. Понадобится ещё один, или более датчиков (желательно из разных партий). Получаем данные со всех датчиков и считаем среднее арифметическое. Так можно добиться точности до сотых градуса.Планы на будущее:
- датчик влажности
- датчик давления
- датчик скорости ветра
- датчик освещённости
- поставить несколько таких в городе и делать свои прогнозы погоды
- питать Arduino по Power over Ethernet
- автоматизировать включение и частоту вращения вентилятора в зависимости от освещения
- удалённое управление
- сброс данных на случай отсутствия связи (для меня это критично)
Известные мне недостатки:
- высокая цена - 2180 руб. (Freeduino 2009 (800 р.) + Ethernet Shield v2 (1300 р.) + 1 датчик (80 р.))- если вентилятор включить слишком быстро, то он сам вносит погрешность в температуру, обдувая датчик. Он не должен сдувать, а лишь проталкивать воздух.