Термометр на ардуино со светодиодной матрицей. Бюджетный GSM термометр на Arduino Nano. Схема принципиальная цифрового термометра

Песочница

new player 12 апреля 2014 в 13:17

Термометр на Arduino с использованием LCD

  • Чулан *

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

Нам понадобится:

  1. Arduino (в моем случае - Leonardo, но может быть и любая другая)
  2. LCD-дисплей совместимый с HD44780 (16 символов, две строки)
  3. Макетная плата
  4. Потенциометр на 10кОм
  5. Датчик DS18B20, DS18S20 или же DS1822
  6. Резистор на 4.7кОм
  7. Соединительные провода

Для начала стоит отметить, что все LCD1602 идут без ножек с ходом в 2.54мм, так что стоит взять 16 таких ножек и припаять их к отверстиям на вашем LCD. Сделать это не сложно и справится с этим любой советский паяльник.

Нужно распределить все компоненты по макетной плате и подключить соединительные провода. Для начала воткнем LCD в макетную плату и подключим ножки «Vss» к -, а «Vdd» к +5В, тоже проделаем и с предпоследней и последней ножной - «А» к плюсу, а «К» к минусу.

Теперь нужно включить потенциометр - крайние ножки соединяем с + и - (полярность не важна), а центральную ножку подключим к «Vo» на дисплее. Теперь крутя ручку потенциометра можно регулировать контрастность.

Продолжим подключать дисплей - «RW» к минусу, «RS» - к 12 пину ардуино, а «E» - к 11.
От «D0» до «D3» не трогаем, а вот ножки от «D4» до «D7» соединяем с 5-2 пином соответственно.

Остается подключить DS18B20 или схожую модель - между ножками + и data ставим резистор на 4.7кОм, плюс и минус подключаем к плюсу и минусу Arduino, а вот data к 8 пину

Готово! Выглядит это так:

(на фото я загрузил в Arduino «hello, world!» из примеров к библиотеке LiquidCrystal.h)

Перед написанием кода скачайте библиотеку OneWire, она нам понадобится.

Остается загрузить код в Arduino, и мы увидим такое:

Теги: arduino, lcd, жк, термометр

О цифровых термометрах на основе Arduino было сказано немало. Все они либо подключались к компьютеру, либо выводили температуры сразу на дисплей.
Но мне был нужен уличный термометр, который автономно и отправляет данные на сайт. Итак, приступим.

Что нам понадобится:
  • Arduino Duemilanove (Freeduino 2009)
  • Ethernet Shield v2
  • цифровой датчик температуры - DS18B20
  • вентилятор для корпуса (120 мм)
  • банка от водоэмульсионки или клея ПВА (2 литра)
  • светодиод
  • витая пара
Задачи
Опрашивать датчик температуры по шине 1-Wire и каждые 3 секунды самостоятельно отправлять результаты на Web-сервер, на котором они будут храниться.
Алгоритм работы устройства:
  1. присваиваем нашему Ethernet Shield`у MAC адрес и ip-адрес
  2. инициализируем соединение с сервером на 80 порт
  3. получаем данные с цифрового датчика температуры, по 1-Wire шине
  4. формируем GET запрос
  5. отправляем GET запрос
  6. разрываем соединение
Исходный код скетча:
Комментарии по ходу кода должны внести ясность.
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(); // Завершаем соединение
}
}


Сборка устройства:
  1. первую «ногу» датчика цепляем на «минус» GND
  2. вторую «ногу» (DQ) на 7-й пин
  3. третью на «плюс»
  4. вторую и третью нужно соединить резистором на ~ 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 р.))
- если вентилятор включить слишком быстро, то он сам вносит погрешность в температуру, обдувая датчик. Он не должен сдувать, а лишь проталкивать воздух.

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

Характеристика температурного модуля DS18B20

Нельзя не упомянуть о ещё одном преимуществе модулей DS18B20. Каждый датчик данного типа использует для работы уникальный последовательный 64-битный код. Это значит, что все подобные компоненты могут функционировать на одной шине типа 1 Wire, по которой, как отмечалось выше, передается вся информация. Таким образом, для управления несколькими модулями понадобится всего один микропроцессор, причем сами температурные датчики могут быть разбросаны по солидной площади.

Детали для работы над термометром с DS18B20 на основе Arduino

Чтобы собрать качественный аналоговый термометр, нужно подготовить:

  • электросхему типа Arduino (желательно новую);
  • температурный сенсор модели DS18B20;
  • аналоговый вольтметр;
  • 5 шнуров - два шнура понадобятся для создания цепи между платой Arduino и Вольтметром, 3 провода нужны для подключения к электросхеме температурного сенсора;
  • внешний аккумулятор.

Создание электрической цепи для термометра с DS18B20 на основе Arduino

Здесь алгоритм работы довольно простой, так что соединить все компоненты в единую цепь сможет даже новичок. Для начала на модуле DS18B20 необходимо найти отрицательный контакт (если смотреть на сенсор сверху, данный контакт будет слева). Отрицательный штырек надо соединить с нижней точкой заземления на плате Arduino (она будет обозначаться аббревиатурой GND). Штырь с положительным зарядом (правый) надо подключить к контакту питания на 5 В (тоже располагается внизу платы). Далее делается сигнальный вывод на цифровой контакт 2 (находится вверху платы), чтобы стало возможным измерение температуры (в этом случае используется центральный штырек сенсора).

Чтобы при работе обеспечивалось управление вольтметром, нужно соединить его положительный контакт с цифровым выводом под номером 9. Отрицательный контакт вольтметра подключается к верхней точке заземления платы (она также обозначается сокращением GND). Чтобы поменять цифровую шкалу вольтметра, необходимо просто распечатать заранее подготовленную картинку с градусами Цельсия. Эта картинка либо приклеивается поверх старой шкалы, либо вставляется вместо неё.

Описание широтно-импульсной модуляции

Если коротко, широтно-импульсная модуляция является методом получения аналоговых результатов (таких, как температура) при помощи цифровых средств. Она хороша тем, что даже очень высокие либо очень низкие значения передаются по каналам связи одним импульсом. Весь процесс широтно-импульсной модуляции проходит так: датчик отправляет процессору сигнальный импульс, а сам процессор уже проводит его обработку, после чего выдает значение на термометр. Чтобы иметь возможность получать информацию таким образом, необходимо задействовать специальные контактные штыри на плате Arduino. Распознать эти контакты предельно просто - рядом с ними есть вот такой значок «~». Кстати, данный значок присутствует и возле контакта под номером 9, с которым мы соединяем положительный штырь вольтметра. 9-й вывод был задействован только в качестве примера; при желании можно использовать любой другой контакт, рядом с которым стоит значок «~».

Прописывание кода для работы термометра с DS18B20 на основе Arduino

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

При создании кода нужно будет прописать три основные команды:

  1. Чтение температурных значений, поступающих от датчика.
  2. Преобразование температуры методом широтно-импульсной модуляции.
  3. Вывод значений на термометр.
Исходя из этого, в самом начале настраивается считывание температуры от датчика. После этого налаживается процесс широтно-импульсной модуляции. При наличии указанной библиотеки пользователь сможет получать значения в диапазоне от 0 до 255. Настройка широтно-импульсной модуляции осуществляется в программе разработки (для этого там предусмотрен пункт меню под названием «map»). При помощи кода устанавливается минимальная и максимальная температура, которую будет учитывать термометр. Чтобы обеспечить программную связь между вольтметром и платой Arduino, нужно прописать 9-й цифровой контакт в конкретной части кода (выше было указано, что именно к нему подключается сам вольтметр).

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

Вот как выглядит весь код, необходимый для настройки работы термометра.

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

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

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

Конструкция инфракрасного термометра имеет оптическую систему, которая фокусирует инфракрасную энергию, излучаемую объектом. Далее инфракрасный датчик преобразует энергию в электрический сигнал, который затем может быть передан в микроконтроллер для интерпретации и отображения в единицах температуры.

Сегодня мы соберем термометр, используя инфракрасный датчик MLX90614, и LCD дисплей Nokia 5110 для отображения измеренной температуры.

MLX90614 представляет собой инфракрасный датчик для измерения температуры бесконтактным способом. Он может измерять температуру в диапазоне от -70 до 380 градусов Цельсия с точностью около 0,5°C.

Ниже перечислены некоторые особенности датчика MLX90614:

  • Малый размер и низкая стоимость.
  • Легко интегрировать.
  • Заводская калибровка в широком температурном диапазоне: от -40°C до 125°C для температуры окружающей среды и от -70°C до 380°C для температуры объекта.
  • Высокая точность: 0,5°C в широком температурном диапазоне 0 .. + 50°C
  • Разрешение измерения: 0,02 ° C
  • Настраиваемый выход ШИМ для непрерывного чтения
  • Датчик доступен в версиях с питанием от 3В и 5В

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

Соединение Ардуино и датчика температуры показано на схеме ниже.

MLX90614-Arduino Uno

  • VCC-5V
  • GND-GND
  • SCL-A5
  • SDA-A4

Скетч инфракрасного термометра

Наша цель сегодня — измерить температуру, обработать ее и отобразить на LCD дисплее. Для того чтобы мы могли легко общаться с температурным датчиком MLX90614, мы используем библиотеку температурного датчика mlx90614 от Adafruit и для удобного вывода текста на экран графическую библиотеку Nokia 5110 .

Мы начинаем, как обычно, с подключения всех библиотеки, которые нам понадобятся в работе:

#include #include #include

Затем создадим объект библиотеки LCD, определяя контакты Ардуино к которым подключены контакты LCD:

LCD5110 lcd(2,3,4,6,5); // при использовании шилда Nokia 5110 // LCD5110 lcd(8,9,10,12,11); //при использовании обычного дисплея Nokia 5110

После этого мы пропишем переменные для шрифтов и других элементов, необходимых для отображения, после чего создадим экземпляр датчика температуры:

Char TEMPERATURE = ‘C’; extern uint8_t SmallFont; extern uint8_t BigNumbers; extern uint8_t uic; extern uint8_t uif; extern uint8_t splash; Adafruit_MLX90614 mlx = Adafruit_MLX90614();

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

Void setup() { Serial.begin(9600); lcd.InitLCD(60); mlx.begin(); lcd.drawBitmap(0, 0, splash, 84, 48); lcd.update(); delay(3000); }

Далее идет функция void loop(). Работа функции void loop() проста. Мы начинаем с определения единицы измерения, в которой должна отображаться температура (в градусах Цельсия или Фаренгейта), затем мы читаем температуру от датчика температуры и выводим на экран.

Void loop() { String temperature=»»; lcd.clrScr(); if(TEMPERATURE == ‘C’) { temperature = String(mlx.readObjectTempC(),1); lcd.drawBitmap(0, 0, uic, 84, 48); }else { temperature = String(mlx.readObjectTempF(),1); lcd.drawBitmap(0, 0, uif, 84, 48); } if(temperature.length()>4) { temperature.remove(3,2); } Serial.println(temperature); lcd.setFont(BigNumbers); if(temperature.length()==4) { lcd.print(temperature,5,19); }else { lcd.print(temperature,15,19); }

Полный код проекта:

(658 b, скачано: 521)

Скопируйте код и загрузите его в Ардуино, затем направьте датчик температуры на объект, температуру которого вы хотите измерить. Через некоторое время температура этого объекта будет показана на экране.

Сегодня мы покажем вам как сделать свой 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, .