logo
+7 (495) 997-37-74
Москва, ул.Международная, 15

uniSensors LoRa — Пример работы с датчиком Si7021

Беспроводной контроллер 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

Аналогичные товары