Аналоговый термометр (Troyka-модуль): подключение, настройка, схема и примеры использования
Для измерения температуры окружающей среды воспользуйтесь электронным аналоговым термометром на основе микросхемы TMP36.
Подключения и настройка
Датчик общается с управляющей электроникой по трём проводам. На выходе сенсора — аналоговый сигнал, который сообщает микроконтроллеру об измеренной температуре.
При подключении к Arduino или Iskra JS удобно использовать Troyka Shield.
С Troyka Slot Shield можно обойтись без лишних проводов.
Примеры использования
Программа для Arduino
С помощью библиотеки TroykaThermometer, выведем в Serial-порт температуру, используя три шкалы измерения.
// библиотека для работы с аналоговым термометром (Troyka-модуль)#include // создаём объект для работы с аналоговым термометром// и передаём ему номер пина выходного сигнала TroykaThermometer thermometer(A0);void setup(){// открываем последовательный порт Serial.begin(9600);}void loop(){// считываем данные с аналогового термометра thermometer.read();// вывод показателей аналогового термометра в градусах Цельсия Serial.print("Temperature is "); Serial.print(thermometer.getTemperatureC()); Serial.println(" C");// вывод показателей аналогового термометра в градусах Кельвина Serial.print("Temperature is "); Serial.print(thermometer.getTemperatureK()); Serial.println(" K");// вывод показателей аналогового термометра в градусах Фаренгейта Serial.print("Temperature is "); Serial.print(thermometer.getTemperatureF()); Serial.println(" F"); delay(1000);}
Программа для IskraJS
Выведем в Serial порт значения температуры используя четыре разные формы представления данных. Применим модуль thermometer для Iskra JS
// подключаем модуль аналогового термометраvar temperature = require('@amperka/thermometer').connect(A0);// выводим в консоль данные с термометра во всех возможных форматах setInterval(function(){ console.log('Room temperature:', temperature.read('C'),'degrees Celsius'); console.log('Room temperature:', temperature.read('V'),'V'); console.log('Room temperature:', temperature.read('mV'),'mV'); console.log('Room temperature:', temperature.read(),'from 0 to 1');},1000);
Элементы платы
Микросхема TMP36
Микросхема TMP36 от Analog Devices — это прецизионный низковольтный датчик температуры. Высокая линейность выходного сигнала, а также достаточная точность измерений позволяет подключать датчик напрямую к аналоговым входам Arduino/Iskra.
Контакты подключения трёхпроводного шлейфа
Модуль подключается к управляющей электронике по трём проводам. Назначение контактов трёхпроводного шлейфа:
Питание ( V ) — питание модуля. Соедините с питанием микроконтроллера.
Земля ( G ) — земля. Соедините с землёй микроконтроллера.
Сигнальный ( S ) — жёлтый провод. Подключите к аналоговому входу микроконтроллера. Через него управляющая плата считывает сигнал с термометра.
Датчики температуры и влажности
Существует большое число разновидностей датчиков для измерения температуры с разной точностью, степенью защиты от внешних условий и другими параметрами. Кроме описанных ниже датчиков, есть ещё модели TMP36, MAX6675, MAX31855, DS18B20.
Датчик температуры LM35
Датчик температуры LM35 позволяет очень просто получать значения температуры. Вам нужно получить показания с аналогового вывода, сделать несложные математические вычисления и получить готовый результат.
У датчик три вывода: питание и земля по краям и средний для вывода данных.
Точность составляет почти 0.75-1 градусов. Интервал показаний от -55 до +150. Но в большинстве случаев используются показания от 0 до 105. Если вам нужны отрицательные температуры, то используйте датчик TMP36.
Скетч для работы с датчиком.
const int analogIn = A0; int value = 0; double voltage = 0; double celsius = 0; void setup() < Serial.begin(9600); >void loop() < value = analogRead(analogIn); voltage = (value / 1023.0) * 5000; celsius = voltage * 0.1; Serial.print("Temperature in C text-info" >Датчик температуры и влажности DHT11
Существует семейство датчиков влажности и температуры DHT (DHT11, DHT22 и др.), которые используются для построения домашней метеостанции. Одновременно измерять температуру и относительную влажность выглядит оправданным, поскольку второе напрямую зависит от первого. Так, повышение температуры батарей центрального отопления приводит к уменьшению относительной влажности воздуха.
Считается, что оптимальное значение влажности около 50% — именно при такой влажности растения, люди и животные чувствуют себя комфортно.
DHT11
Датчик температуры и влажности DHT11 является дешёвым датчиком, который удобно использовать в домашних условиях в учебных целях. Он не обеспечивает точные показания и имеет ограниченный диапазон измерений. Но тем не менее, он очень популярен из-за своей простоты. Существуют более дорогие аналоги, в частности его старший брат DHT22.
Датчики DHT состоят из двух основных частей: ёмкостный датчик влажности и термистор. Также в корпусе установлен простенький чип для преобразования аналогового сигнала в цифровой. Считывать цифровой сигнал на выходе достаточно просто, можно использовать любой контроллер, не только Arduino.
Технические характеристики
Питание от 3 до 5В
Максимально потребляемый ток - 2.5мА при преобразовании (при запросе данных)
Рассчитан на измерение уровня влажности в диапазоне от 20% до 80%. Точность измерений в диапазоне 5%
Измеряет температуру в диапазоне от 0 до +50 градусов с точностью ±2°C
Частота измерений не более 1 Гц (одно измерение в секунду)
Размер корпуса: 15.5 мм x 12 мм x 5.5 мм
Сам датчик представляет собой синий прямоугольник с решёткой. Имеет четыре ножки, одна из которых (третья) не используется. Ножки имеют стандартное расстояние между собой и прибор легко устанавливается на макетную плату.
VCC - Питание от 3 до 5 В
DATA (OUT) - Вывод данных
NC - Не подключается
GND - Земля
При подключении используйте подтягивающий резистор к VCC и рекомендуется конденсатор (фильтр по питанию между VCC и GND).
Модуль KY-015 с датчиком DHT11
Хороший вариант - готовая плата с резистором и конденсатором. Она имеет три вывода, которые можно воткнуть в макетную плату.
DHT11 достаточно медленно конвертирует измеренные значения, считывайте показания не чаще, чем раз в секунду.
Модуль должен быть защищён от солнечного света и других излучений, имеющих в спектре ультрафиолетовую часть. Могут привести к повреждению газы, содержащие диоксид серы, пары соляной кислоты. Высокая концентрация паров этанола приведёт к полному повреждению чувствительного слоя датчика.
DHT22
По форм-фактору датчик похож на своего собрата. Может встречаться название Aosong AM2302.
Более точный датчик DHT22 имеет преимущества перед DHT11.
Диапазон температур от -40° до +80° (сравните с 0°..+50°). Точность измерений в диапазоне ±0.5°
Уровень влажности 0-99.9%. Точность измерений в диапазоне 2-4%.
Рекомендуемая частота чтения данных - не чаще, чем один раз в 2 секунды.
Учитывая широкий диапазон, датчик можно применять в сложных системах: вентиляция, кондиционирование, метеорологические станции
Диапазон питания датчика составляет +3.3. +5.5В, поэтому его можно использовать в платах Arduino с пониженными напряжениями. Рекомендуемая длина кабеля, соединяющего DHT22 с MCU при питании от 3.3В не должна превышать 100 см.
Библиотека для DHT
Измерим температуру и влажность воздуха при помощи датчика DHT11.
Следует подключить подтягивающий резистор на 10 кОм между питанием и сигналом. У меня такого не оказалось, я подключил резистор на 2.2 кОм, вроде не сгорело. Для датчика DHT22 резистор не обязателен.
Также встречается модульное исполнение датчика с тремя ножками и готовым установленным резистором. Такой модуль может быть предпочтительнее. Как правило ножки подписаны, трудностей быть не должно.
Следует помнить, что один датчик будет использовать строго один цифровой пин, поэтому при сложной конструкции из нескольких датчиков учитывайте данное обстоятельство.
У меня получилась следующая схема.
Первую ножку датчика соедините с питанием на 5В (красный провод), вторую - с пином номер 2, третью пропускаем, а четвёртую соединяем с GND (чёрный провод). Также вставляем на плату резистор - одна ножка соединяется с первой ножкой датчика, а вторая со второй.
Следующий шаг - установка библиотеки. В сети существует много библиотек для данного датчика. Популярна библиотека GitHub - adafruit/DHT-sensor-library: Arduino library for DHT11DHT22, etc Temp & Humidity Sensors. Скачиваем архив и переименовываем папку в DHT, папку размещаем в общей папке для библиотек Arduino libraries.
Второй и удобный способ - установка через менеджер библиотек. Открываем Tools | Manage Libraries. и в поиске диалогового окна вводим DHT. Найдётся несколько библиотек, выбираем библиотеку от Adafruit. Устанавливайте версию 1.2.3. Если вы будете устанавливать версию 1.3.0 или выше, то вам придётся также установить ещё библиотеку Adafruit Unified Sensor, без неё скетч не будет компилироваться.
После установки библиотеки, запускаем IDE и находим пример File | Examples | DHT sensor library | DHTtester.
Скетч по умолчанию рассчитан на датчик DH22, поэтому вам нужно сначала закомментировать строчку #define DHTTYPE DHT22 и снять комментарий с строчки #define DHTTYPE DHT11.
Полностью скетч выглядит следующим образом.
// Example testing sketch for various DHT humidity/temperature sensors // Written by ladyada, public domain #include "DHT.h" #define DHTPIN 2 // what digital pin we're connected to // Uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Connect pin 1 (on the left) of the sensor to +5V // NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1 // to 3.3V instead of 5V! // Connect pin 2 of the sensor to whatever your DHTPIN is // Connect pin 4 (on the right) of the sensor to GROUND // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor // Initialize DHT sensor. // Note that older versions of this library took an optional third parameter to // tweak the timings for faster processors. This parameter is no longer needed // as the current DHT reading algorithm adjusts itself to work on faster procs. DHT dht(DHTPIN, DHTTYPE); void setup() < Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); >void loop() < // Wait a few seconds between measurements. delay(2000); // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); // Read temperature as Fahrenheit (isFahrenheit = true) float f = dht.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) || isnan(f)) < Serial.println("Failed to read from DHT sensor!"); return; >// Compute heat index in Fahrenheit (the default) float hif = dht.computeHeatIndex(f, h); // Compute heat index in Celsius (isFahreheit = false) float hic = dht.computeHeatIndex(t, h, false); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); Serial.print(f); Serial.print(" *F\t"); Serial.print("Heat index: "); Serial.print(hic); Serial.print(" *C "); Serial.print(hif); Serial.println(" *F"); >
Запускаем скетч и наблюдаем за результатами в Serial Monitor. Датчик считается очень медленным, поэтому не следует делать слишком маленькую задержку, в примере используется пауза на две секунды.
Пример проверялся летом в жаркий день. Результаты вполне правдоподобны. Если подышать на датчик (помните в детстве мы дышали на стекло?), то влажность увеличится (и температура). Через какое-то время показания будут медленно возвращаться к первоначальным.
В составе библиотеки также есть файл с именами функций.
DHT Класс датчика. Объявляем объект класса: DHT dht(DHTPIN, DHTTYPE);. В первом параметре объявляем пин, во втором - тип датчика begin() Запускаем датчик readTemperature() Без параметров функция измеряет в градусах Цельсия. Вызов readTemperature(true) вернёт значения в градусах Фаренгейта convertCtoF() Конвертирует из одной системы в другую convertFtoC() Конвертирует из одной системы в другую computeHeatIndex() Выводит индекс жары. По умолчанию используется индекс на основе градусов Фаренгейта, где нужно указать градусы и влажность. Для температуры по Цельсию нужно указывать три параметра computeHeatIndex(t, h, false) readHumidity() Функция для измерения влажности read() Что-то считывает
Дополнительные материалы для DHT
Fritzing-Library/DHT11 Humitidy and Temperature Sensor.fzpz at master · adafruit/Fritzing-Library · GitHub - в составе Fritzing нет датчика DH11. Скачайте данный файл и перетащите его на окно программы. Теперь вы сможете составлять схемы с его участием (смотри мой скриншот выше). В программе он будет находиться в разделе MINE.
Датчик температуры и влажности DHT11 (DHT22) - здесь дана дополнительная информация о работе датчика в модульном исполнении, ссылка на даташиты, примеры кода без библиотеки, графики.
Модуль датчика температуры KY-001
Модуль состоит из датчика температуры воздуха с цифровым представлением данных. Основной компонент – микросхема DS18B20, преобразующая температуру корпуса в информацию передаваемую по последовательной двухпроводной шине данных 1-Wire. На шину данных можно установить несколько датчиков. Можно применять для измерения температуры воздуха в помещении и на открытом воздухе.
Также на модуле установлен резистор сопротивлением 4,7 кОм и светодиодный индикатор включения питания.
Технические характеристики
Питание: напряжение 3…5,5 В, ток 10 мА
Диапазон измерения температуры -55…125 °С/-57°F to 257°F
Разрешающая способность: 9…12 бит
Точность ±0,5 °С в диапазоне -10…+85 °С
Время измерения при разрешающей способности 12 бит составляет 0,75 с
Для работы с модулем используются дополнительные две библиотеки.
#include #include // Data wire is plugged into pin 2 on the Arduino #define ONE_WIRE_BUS 2 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); void setup(void) < Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); // IC Default 9 bit // If you have troubles consider upping it 12. // Ups the delay giving the IC more time to process the temperature measurement sensors.begin(); >void loop(void) < // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus Serial.print("Requesting temperatures. "); sensors.requestTemperatures(); // Send the command to get temperatures Serial.println("DONE"); Serial.print("Temperature for Device 1 is: "); // You can have more than one IC on the same bus. 0 refers to the first IC on the wire Serial.print(sensors.getTempCByIndex(0)); >
Модуль датчика температуры KY-013
Датчик является аналоговым, но использовать его нужно не для измерения конкретных температур, а для слежения за превышением пороговых значений. В модуле используется PTC-термисторы - при повышении температуры растёт и сопротивление.
При работе с датчиком пробуйте менять местами землю и питание, часто маркировка ошибочна.
void setup() < Serial.begin(9600); >void loop() < double U = analogRead(A0); // напряжение double R = (10230000 / U) - 10000; // сопротивление Serial.print("R = "); Serial.print(R); Serial.print(" U text-info" >Модуль датчика температуры KY-028
Датчик применяется для контроля температуры воздуха в помещении: регулятор температуры, автоматика систем отопления, автоматизация систем вентиляции.
Датчик грубо оценивает величину температуры, но умеет точно определять превышение порогового значения.
Технические характеристики
Напряжение питания: 3,3 – 5,5 В
Рабочая температура: 0 – 70°C
У датчика имеется два вывода: аналоговый и цифровой. Аналоговый позволяет получить температуру, цифровой - превышение установленного порога.
KY-028 | Arduino ---------------- A0 | A G | GND + | 5V D0 | D
Основной элемент датчика – терморезистор, который соединён со входом микросхемы компаратора LM393YD. С помощью подстроечного резистора выполняется настройка порога срабатывания компаратора. Так устанавливается температурный порог. При превышении температурой установленного порога на цифровом выходе D0 будет высокий уровень напряжения. Если температура мала, то на выходе D0 низкий уровень.
Датчик содержит два светодиодных индикатора. Индикатор L1 сообщает о подаче питания. Светодиод L2 включается при превышении температурой окружающего воздуха установленного порога. С его помощью удобно проводить настройку модуля.
При включении на выходе A0 присутствует напряжение соответствующее температуре в комнате. Эта температура известна лишь приблизительно. Для повышения точности можно использовать температуру тела (сожмите терморезистор пальцами), в этом случае мы узнаем напряжение аналогового выхода при температуре 36,6°C. На эти данные можно опираться в дальнейшем. Другой вариант - температура таяния льда 0°C. Используйте пакетик с таящим льдом или снегом из холодильника, чтобы получить новое значение напряжения, которому можно верить.
int led = 13; // LED pin int digitalPin = 2; int analogPin = A0; int digitalVal; // digital readings int analogVal; //analog readings void setup() < pinMode(led, OUTPUT); pinMode(digitalPin, INPUT); Serial.begin(9600); >void loop() < digitalVal = digitalRead(digitalPin); if(digitalVal == HIGH) // if temperature threshold reached < digitalWrite(led, HIGH); // turn on LED >else < digitalWrite(led, LOW); // turn off >// Read the analog pin analogVal = analogRead(analogPin); Serial.println(analogVal); delay(100); >
Записки программиста
Ранее мы научились использовать текстовые ЖК-индикаторы из Arduino. Это, бесспорно, очень классные устройства. Однако выводить с их помощью можно в основном только текст и какую-то простую псевдографику, например, прогресс бар. Для вывода же полноценной графики предназначены другие устройства — ЖК-матрицы. Сегодня при помощи такой ЖК-матрицы мы соберем термометр, который строит графики температуры.
Пара слов о датчике температуры TMP36
Датчик температуры TMP36 в этом блоге еще не упоминался, поэтому хотелось бы сказать о нем отдельные пару слов. На первый взгляд, это довольно простое устройство с тремя ножками, внешне похожее на транзистор. Если смотреть на него с плоской стороны головки, то левая ножка подключается к плюсу, правая — к минусу, а средняя — к аналоговому входу микроконтроллера. Считывая напряжение на соответствующем пине и используя незамысловатую формулу, микроконтроллер переводит напряжение в градусы Цельсия.
По крайне мере, так написано в любом учебнике по Arduino. Если вы попытаетесь использовать TMP36, как описано выше, вместо градусов Цельсия вы получите какую-то ерунду. Например, TMP36 покажет, что у вас дома 10 градусов, хотя по ощущениям скорее 20. За ответом, что же пошло не так, идем в даташит [PDF].
Из него мы узнаем, что как можно ближе к датчику нужно поставить конденсатор на 100 нФ. Вжух, и показания сразу становятся похожими на правду! Но не надолго. Если на минуту положить устройство в холодильник, а потом достать, то он покажет сильно отрицательную температуру. Такая температура может быть в морозильной камере, но в обычной камере холодильника держится небольшая положительная температура. Что намного хуже, TMP36 будет показывать отрицательную температуру еще несколько часов, даже если попытаться отогреть его паяльным феном. В общем, опять получаем не показания, а какой-то мусор.
Чтобы датчик не измерял температуру окружающих его компонентов (например, большого ЖК-дисплея в металлическом корпусе), да и поменьше издеваться над этими самыми компонентами, к датчику нужно припаять около 50 см скрученных проводов и втыкать его в макетку через них. Я использовал провода от разрезанного Ethernet-кабеля (витой пары). Конденсатор в этом случае, похоже, не нужен. Но если припаять его к датчику, вряд ли станет хуже. Если при помощи датчика вы планируете измерять температуру на улице, бросив его за окно, советую сделать провода подлиннее. Так просто удобнее. Также не забудьте обеспечить нормальную изоляцию при помощи термоусадочных трубок.
Примите во внимание, что TMP36 вообще очень чувствителен к любым скачкам напряжения. Чтобы измерения получились точными, соединительные провода на макетке лишний раз лучше не теребить.
Кажется, это все, что касается тонкостей использования TMP36.
Вывода графика температуры при помощи ЖК-матрицы
Для экспериментов я использовал ЖК-матрицу MT-12864A-2YLG. Существуют аналогичные матрицы других моделей от других производителей, все они используются точно так же. Иногда в описании пишут, что они работают на базе контроллера KS0107 или его аналога. Главное, чтобы у матрицы было 20 пинов, если она с подсветкой, или 18, если подсветки нет. В теории пинов может быть и чуть меньше. Читайте далее, и сами поймете, почему.
Для работы с матрицей мы воспользуемся библиотекой GLCD. Мне пришлось ее слегка пропатчить, чтобы избавиться от ошибки при компиляции современном avr-gcc:
./glcd/fonts/SystemFont5x7.h:48:28: error: variable 'System5x7' must be const in order to be put into read-only section by means of '__attribute__((progmem))' static uint8_t System5x7[] PROGMEM =
Просто допишите в соответствующей строке слово const, или используйте пропатченный GLCD из моего репозитория. Ссылку на него, как обычно, вы найдете в конце поста.
Библиотеку нужно положить к себе в репозиторий в каталог glcd. Также нужно подправить Makefile (что за Makefile рассказывалось в этом посте):
Само собой разумеется, номера пинов микроконтроллера в этом файле при желании можно переопределить.
Где у матрицы находятся пины с такими именами, можно узнать из таблицы 4 на странице 7 даташита [PDF]. Примите во внимание, что если у вас другая ЖК-матрица, она может и почти наверняка будет подключаться немного не так, как моя. Поэтому обязательно сверьтесь с даташитом!
Итак, используемая мной ЖК-матрица подключается таким образом:
1 — GND, земля;
2 — VCC, питание модуля;
3 — Uo, вход питания ЖК-панели. Подключается к VEE (см далее) через потенциометр на 10 кОм для регулирования контрастности. Подключать напрямую без потенциометра нельзя, увидите только черные квадраты;
4 — A0, выбор команды/данные, к glcdDI;
5 — R/W, выбор чтение/запись, к glcdRW;
6 — E, стробирование данных, к glcdEN;
7-14 — DB0-DB7, шина данных, к glcdData0Pin-glcdData7Pin;
15 — E1, выбор кристала один, к glcdCSEL1;
16 — E2, выбор кристала два, к glcdCSEL2;
17 — RES, сброс. Можно подключить к любому цифровому пину на ваш выбор, к reset-пину микроконтроллера или просто к плюсу;
18 — VEE, выход DC-DC преобразователя. Подключается через потенциометр к Uo как описано выше;
19 — A, анод подсветки. Подключаем к плюсу напрямую или через потенциометр, если хотим регулировать яркость;
20 — K, катод подсветки, к минусу;
В собранном виде цепь выглядит таким образом:
На фото вы видите устройство после того, как датчик температуры был помещен примерно на одну минут в морозилку, а затем извлечен из нее. Как можно видеть по графику, и до и после извлечения термометр показывает что-то похожее на правду.
Я предпочитаю собирать свою Arduino прямо на макетке, но вы с тем же успехом можете использовать обычную Arduino. У меня микроконтроллер использует встроенные часы и работает на частоте 1 МГц. Запрограммировано все это хозяйство самопальным AVR-программатором. Если вам больше по душе бутлоадер Arduino, вы с тем же успехом можете использовать и его.
int prev_i ; int i = curr_hist_idx ; int x = 0 ; do { if ( x >= 1 ) GLCD. DrawLine ( x - 1 , ZERO_X_OFFSET - limit_temperature ( hist [ prev_i ] ) , x, ZERO_X_OFFSET - limit_temperature ( hist [ i ] ) , BLACK ) ;
i ++ ; if ( i == HIST_SIZE ) i = 0 ; } while ( i ! = stop_i ) ;
Список методов, поддерживаемых GLCD, легко grep’ается:
ClearScreen ( uint8_t color ) ; DrawLine ( uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color ) ; DrawRect ( uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color ) ; DrawRoundRect ( uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t radius, uint8_t color ) ; FillRect ( uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color ) ; InvertRect ( uint8_t x, uint8_t y, uint8_t width, uint8_t height ) ; SetDisplayMode ( uint8_t invert ) ; DrawBitmap ( Image_t bitmap, uint8_t x, uint8_t y, uint8_t color ) ; DrawVLine ( uint8_t x, uint8_t y, uint8_t height, uint8_t color ) ; DrawHLine ( uint8_t x, uint8_t y, uint8_t width, uint8_t color ) ; DrawCircle ( uint8_t xCenter, uint8_t yCenter, uint8_t radius, uint8_t color ) ; FillCircle ( uint8_t xCenter, uint8_t yCenter, uint8_t radius, uint8_t color ) ; GotoXY ( uint8_t x, uint8_t y ) ;
Все методы возвращают void. Они имеют говорящие имена и превосходно документированы прямо в коде библиотеки.
Заключение
Неоспоримое преимущество ЖК-матрицы перед текстовым ЖК-индикатором заключается в возможности выводить не только текст, но и произвольную (до тех пор, пока она черно-белая и умещается в 128 x 64 точек) графику. Однако ЖК-матрица больше по размеру. Кроме того, для ее использования требуется 13 пинов микроконтроллера, в то время, как текстовому ЖК-индикатору нужно только 6 пинов. Наконец, GLCD отъедает заметно больше flash-памяти микроконтроллера, чем LiquidCrystal. Точные цифры, увы, я забыл выписать. Можете добыть их и оставить в комментариях в качестве домашнего задания.
Если вам нужно просто выводить текст, используйте текстовый индикатор. Если вы решили сделать свой осциллограф, или свою убийцу GameBoy с тетрисами, змейками, марио и вот этим всем, используйте матрицу.
Полную версию исходников к этой заметке вы найдете в этом репозитории на GitHub. Вопросы и дополнения, как обычно, горячо приветствуются.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.
Датчик температуры TMP36 и его подключение к Arduino
Аналоговый датчик температуры TMP36 компании Analog Devices позволит вам легко получать достаточно точные показания температуры в диапазоне от -40 до +150°C. К тому же его очень просто подключить к Arduino.
Датчик температуры TMP36 Этот датчик температуры является твердотельным, то есть для измерения температуры в нем не используется ртуть как в термометрах или термисторы (резисторы, чувствительные к температуре).
Вместо этого в нем используется тот факт, что при возрастании температуры напряжение на диоде возрастает в известной пропорции. Технически, на самом деле это падение напряжения между базой и эмиттером (Vbe) транзистора. После усиления такого изменения напряжения легко получить аналоговый сигнал, который будет прямо пропорционален температуре.
Датчик температуры TMP36 Поскольку эти датчики не имеют движущихся частей, они точны, никогда не изнашиваются, не нуждаются в калибровке и могут работать в жестких условиях окружающей среды. Кроме того, они очень дешевые и очень просты в использовании.
Выходной диапазон напряжения TMP36 составляет от 0.1В (-40°C) до 2.0В (150°C), но после 125°C точность измерения уменьшается. Подаваемое напряжение от 2.7В до 5.5В, потребление тока всего 0.05 мА.
Как измерять температуру
Использовать TMP36 для измерения температуры достаточно просто, нужно соединить его левый контакт с напряжением 2.7-5.5В, а правый с землей. Тогда на среднем выводе будет присутствовать напряжение, линейно пропорциональное температуре.
Датчик температуры TMP36 и его подключение к Arduino
Чтобы перевести напряжение в температуру просто воспользуйтесь следующей формулой (Vout измеряется в милливольтах):
Температура в °C = [Vout — 500] / 10
Например, выходное напряжение составляет 1 В, это значит, что температура равна ((1000 мВ — 500) / 10) = 50 °C.
Если вы используете датчики температуры типа LM35 и ему подобные, то ориентируйтесь на линию ‘a’ графика, показанного выше. Формула тогда будет следующая:
Температура в °C = Vout / 10
Проблема при использовании нескольких датчиков
Если вы используете несколько датчиков температуры, то можете заметить, что показания температуры непостоянны. Это значит, что датчики влияют друг на друга, когда цепь считывания аналогового сигнала переключается с одного вывода на другой. Вы можете исправить это, организовав задержку между двумя считываниями.
Подключаем датчик температуры к Arduino, Подключение датчика довольно простое В данном случае мы подключили датчик к напряжению 5 В, но также можно его подключать к 3.3 В. Не важно к какой линии питания вы его подключите, его выходное напряжение все равно не превысит 2 В. С учетом того, что АЦП в Arduino 10-и разрядный, то будет справедлива следующая формула:
Напряжение на выводе в мВ = (показания АЦП) * (5000/1024)
Эта формула преобразует число от 0 до 1023 с АЦП в 0-5000мВ (= 5В). При использовании питания 3.3 В формула будет следующая:
Напряжение на выводе в мВ = (показания АЦП) * (3300/1024)
Далее, чтобы перевести милливольты в температуру, нужно воспользоваться формулой:
Температура в цельсиях = [(аналоговое напряжение в мВ) — 500] / 10
Простой термометр на Arduino
Нижеприведенный пример кода показывает, насколько просто можно сделать термометр на Arduino. В данном случае в последовательный порт выводятся показания температуры в цельсиях и фаренгейтах.
int sensorPin = 0; //аналоговый ввод для выхода датчика TMP36 //разрешение 10 мВ / градус цельсия со смещением на 500 мВ //для отрицательной температуры void setup() < Serial.begin(9600); >void loop() < //считываем напряжение датчика int reading = analogRead(sensorPin); // преобразуем показания в напряжение, для 3.3v используйте значение 3.3 float voltage = reading * 5.0; voltage /= 1024.0; // выводим напряжение Serial.print(voltage); Serial.println(" volts"); // теперь выводим температуру float temperatureC = (voltage - 0.5) * 100 ; //исходя из 10 мВ на градус со смещением 500 мВ 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); //ждем секунду >
Повышаем точность измерения температуры
Для получения более точного результата с меньшим уровнем шумов можно задействовать опорное напряжение 3.3V с ARef. На рисунке ниже показана схема соединения. Следует отметить, что TMP36 в этом случае подключен к аналоговому вводу A1. Также не следует забывать, что при использовании вывода 3.3v в качестве опорного в коде нужно прописывать analogReference(EXTERNAL).
#define aref_voltage 3.3 // подтягиваем 3.3V к ARef int tempPin = 1; // подсоединяем датчик теперь к аналоговому вводу 1 int tempReading; void setup(void) < Serial.begin(9600); analogReference(EXTERNAL); >void loop(void) < tempReading = analogRead(tempPin); Serial.print("Temp reading = "); Serial.print(tempReading); // сырые данные // преобразуем эти данные в напряжение относительно опорного напряжения float voltage = tempReading * aref_voltage; voltage /= 1024.0; // выводим напряжение Serial.print(" - "); Serial.print(voltage); Serial.println(" volts"); // выводим температуру float temperatureC = (voltage - 0.5) * 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); >