Беспроводной контроллер uniSensors LoRa, кроме микроконтроллера ATmega328P и LoRa модуля, содержит также и несколько других компонентов, которые значительно расширяют его возможности. Это микросхема EEPROM памяти на 4 Мб, высокоточный датчик температуры и влажности Si7021 и криптомикросхема ATSHA204.
В этой статье мы поговорим об использовании датчика температуры и влажности Silicon Labs Si7021. О работе и программировании других компонентов контроллера uniSensors LoRa вы можете узнать из других статей этой документации.
Характеристики Si7021
Ниже представлены основные технические характеристики датчика Si7021:
- Точность измерения температуры: ±0.4 °C (-10 — 85°C)
- Точность измерения влажности: ±3 % (0 — 80 %)
- Диапазон измерения температуры: от -40 до 125 °C
- Диапазон измерения влажности: от 0 до 100 %
- Разрешение измерения температуры: 14 бит
- Разрешение измерения влажности: 12 бит
- Напряжение питания 1,9 — 3,6 В
- Тип интерфейса: I2C
Из представленных характеристик видно, что датчик Silicon Labs Si7021 является отличным решением для построения современных IoT проектов любителями DIY и профессиональными разработчиками.
Подключение датчика Si7021
На фотографии обозначено расположение датчика Si7021 на плате uniSensors LoRa. Обратите внимание, что датчик закрыт защитной мембраной — её ненужно удалять, иначе датчик со временем загрязнится и начнёт выдавать неверные показания.
К микроконтроллеру ATmega328P датчик Si7021 подключается при помощи I2С интерфейса, ниже представлена электрическая схема его подключения.
Программирование Si7021
Для программирования датчика Si7021 сначала нужно подключить к среде Arduino IDE библиотеку Si7021. Это делается стандартным способом, на котором мы тут останавливаться не будем.
Примечание. Здесь предполагается, что вы достаточно опытный пользователь, знакомы с работой в Arduino IDE и умеете создавать скетчи и загружать их в микроконтроллер.
После подключения библиотеки «Si7021», можно начинать создавать скетчи и загружать их в контроллер uniSensors LoRa.
Работа с датчиком Si7021
Далее мы рассмотрим типовые операциями с датчиком Si7021. Это чтение данных о температуре и влажности, получение серийного номера датчика, версии его программного обеспечения и т. п. операции.
Сначала приведём полный код скетча uniSensors Si7021 example:
/* uniSensors Si7021 example (based on standard example of Si7021 Library) (c)2020 Electromicro License: GNU GPL 2.1 A simple example of Si7021 sensor. */ #include <Wire.h> #include "Si7021.h" Si7021 si7021; void setup() { Serial.begin(115200); Serial.println(F("Start Si7021 example...")); si7021.begin(); uint64_t serialNumber = 0ULL; serialNumber = si7021.getSerialNumber(); Serial.print("Serial number: "); Serial.print((uint32_t)(serialNumber >> 32), HEX); Serial.print((uint32_t)(serialNumber) , HEX); Serial.println(); Serial.print("Firmware version: "); Serial.println(si7021.getFirmwareVersion()); } void loop() { Serial.print(" h:"); Serial.print(si7021.measureHumidity(), 1); Serial.print(" t:"); Serial.print(si7021.getTemperatureFromPreviousHumidityMeasurement(), 1); Serial.println(); delay(10000); }
А теперь подробно разберём его работу. В начале скетча мы подключаем необходимые для его работы библиотеки Wire и Si7021.
#include <Wire.h> #include "Si7021.h"
Затем объявляем объект si7021, который и будет работать с нашим датчиком температуры и влажности.
Si7021 si7021;
Далее идёт функция setup(), в которой устанавливаются все необходимые параметры и получаются мета-данные с датчика Si7021.
void setup() { Serial.begin(115200); Serial.println(F("Start Si7021 example...")); si7021.begin(); uint64_t serialNumber = 0ULL; serialNumber = si7021.getSerialNumber(); Serial.print("Serial number: "); Serial.print((uint32_t)(serialNumber >> 32), HEX); Serial.print((uint32_t)(serialNumber) , HEX); Serial.println(); Serial.print("Firmware version: "); Serial.println(si7021.getFirmwareVersion()); }
Рассмотрим содержимое функции setup() подробно. Вначале мы инициализируем Serial на скорости 115200 (не забудьте выставить такую же скорость в вашем Serial мониторе) и выводим надпись о старте нашего скетча.
Serial.begin(115200); Serial.println(F("Start Si7021 example..."));
Затем стартуем работу объекта si7021, представляющего в системе наш датчик.
si7021.begin();
И получаем 64-битный серийный номер нашего датчика. За это отвечает функция getSerialNumber() библиотеки Si7021.
uint64_t serialNumber = 0ULL; serialNumber = si7021.getSerialNumber();
Далее выводим этот номер в Serial. Несколько усложнённая процедура вывода серийного номера связана с тем, что Arduino не умеет напрямую выводить 64-битные цифры в Serial, поэтому это приходится делать в два приёма.
Serial.print("Serial number: "); Serial.print((uint32_t)(serialNumber >> 32), HEX); Serial.print((uint32_t)(serialNumber) , HEX); Serial.println();
И при помощи функции getFirmwareVersion() получаем номер версии программного обеспечения нашего датчика Si7021.
Serial.print("Firmware version: "); Serial.println(si7021.getFirmwareVersion());
На этом работа функции setup() заканчивается и начинается работа функции loop() — это бесконечный цикл, который постоянно повторяет исполнение находящегося в нём кода.
void loop() { Serial.print(" h:"); Serial.print(si7021.measureHumidity(), 1); Serial.print(" t:"); Serial.print(si7021.getTemperatureFromPreviousHumidityMeasurement(), 1); Serial.println(); delay(10000); }
Здесь, при помощи функции measureHumidity(), мы получаем текущие показания влажности окружающего воздуха и выводим их в Serial.
Serial.print(" h:"); Serial.print(si7021.measureHumidity(), 1);
А затем, при помощи функции getTemperatureFromPreviousHumidityMeasurement(), мы получаем данные о температуре воздуха.
Serial.print(" t:"); Serial.print(si7021.getTemperatureFromPreviousHumidityMeasurement(), 1);
Небольшое пояснение: само измерение параметров происходит при вызове функции measureHumidity(), а функция getTemperatureFromPreviousHumidityMeasurement() ничего не измеряет, а только возвращает ранее измеренные данные о температуре. Это сделано для минимизации количества обращений к датчику и уменьшения задержек в работе микроконтроллера.
Далее делается пауза в 10 секунд и цикл измерений и вывода данных в Serial повторяется.
delay(10000);
Результат работы нашего скетча. Всё работает именно так, как и задумывалось.
Как вы видите, работа с датчиком Si7021 в среде Arduino максимально упрощена и использование этого датчика в составе контроллера uniSensors LoRa не представляет каких-либо проблем.
Калибровка датчика Si7021
При работе в среде с повышенной влажностью (больше 80% относительной влажности) на датчике может конденсироваться влага, которая искажает его показания. Поэтому в подобных случаях время от времени рекомендуется проводить процедуру «сушки» датчика Si7021.
Для этой цели в датчик встроен специальный нагревательный резистор, а в библиотеке Si7021 предусмотрена специальная функция. Рассмотрим подробно скетч и процедуру нагрева датчика Si7021.
/* uniSensors Si7021 Heater example (based on standard example of Si7021 Library) (c)2020 Electromicro License: GNU GPL 2.1 A simple example of Si7021 sensor. */ #include <Wire.h> #include "Si7021.h" Si7021 si7021; void setup() { Serial.begin(115200); Serial.println(F("Start Si7021 Heater example...")); si7021.begin(); } void printInfo() { Serial.print("Humidity: "); Serial.print(si7021.measureHumidity()); Serial.print("% - Temperature: "); Serial.print(si7021.getTemperatureFromPreviousHumidityMeasurement()); Serial.println("C"); } void loop() { Serial.println("Heater ON"); si7021.setHeater(true, 0x04); for (byte i = 0; i < 10; i++) { printInfo(); delay(2000); } Serial.println("Heater OFF"); si7021.setHeater(false); while(true) { printInfo(); delay(2000); } }
Начало скетча и функция setup() практически не отличается от аналогичных частей предыдущего, подробно рассмотренного примера, поэтому на них мы останавливаться не будем. Начнём наше рассмотрение с функции printInfo(). Это вспомогательная функция вывода в сериал показаний о температуре и влажности датчика Si7021, которая будет использоваться в других частях скетча.
void printInfo() { Serial.print("Humidity: "); Serial.print(si7021.measureHumidity()); Serial.print("% - Temperature: "); Serial.print(si7021.getTemperatureFromPreviousHumidityMeasurement()); Serial.println("C"); }
Далее идёт функция loop(), в которой происходят все основные действия.
void loop() { Serial.println("Heater ON"); si7021.setHeater(true, 0x04); for (byte i = 0; i < 10; i++) { printInfo(); delay(2000); } Serial.println("Heater OFF"); si7021.setHeater(false); while(true) { printInfo(); delay(2000); } }
Вначале командой setHeater(true, 0x04) включается нагреватель датчика Si7021 с током нагрева 28 мА при питании от напряжения 3,3 вольт. Мощность нагрева можно устанавливать в диапазоне от 0x00 до 0x0F, но рекомендуется не превышать значение 0x04 потому, что чем больше значение, тем больше датчик потребляет от источника питания.
Serial.println("Heater ON"); si7021.setHeater(true, 0x04);
После включения нагрева производится 10 измерений температуры и влажности с интервалом в 2 секунды.
for (byte i = 0; i < 10; i++) { printInfo(); delay(2000); }
Затем выключается нагрев.
Serial.println("Heater OFF"); si7021.setHeater(false);
И в бесконечном цикле проводятся измерения температуры и влажности и эти данные выводятся в Serial.
while(true) { printInfo(); delay(2000); }
Скриншот результата работы нашего скетча.
На скриншоте видно как включается нагрев и показания температуры начинают расти, а показания влажности — падать. После выключения нагрева происходит обратная реакция, показания влажности растут, а показания температуры — падают.
На практике эту операцию не стоит проводить при относительной влажности окружающего воздуха менее 80% и без каких-то явных показаний для неё, типа выпадения тумана или росы. Особенно аккуратно нужно подходить к использованию нагрева при питании контроллера от батарей — ток нагревателя может достигать 100 мА, что очень быстро разрядит вашу батарею.
Заключение
Датчик температуры и влажности, встроенный в контроллер uniSensors LoRa, легко программируется и является отличным инструментом для создания современных IoT приложений и ваших проектов.
Файлы для скачивания
Библиотека для работы с датчиком Si7021
Ссылки по теме
Обзор контроллера uniSensors LoRa
Спецификации и подключение uniSensors LoRa
Программирование uniSensors LoRa
Где купить?
uniSensors LoRa в магазине «Electromicro»
Техническая поддержка
Мы внимательно относимся к потребностям наших клиентов и осуществляем техническую поддержку всей выпускаемой продукции. Вы можете написать нам письмо с вашим вопросом или позвонить по телефону и специалист нашей компании проконсультирует вас и поможет решить вашу проблему.
- Емейл для вопросов по нашей продукции: electromicro@bk.ru
- Наш телефон: +7 (495) 997-37-74