Датчик температуры и влажности, i2c (Metro-модуль)

Общие сведения:

Модуль Metro - Датчик температуры и влажности - является цифровым датчиком определения температуры окружающей среды и относительной влажности воздуха. Для передачи данных используется шина I2C.

К одной шине I2C можно подключить более 100 модулей.

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

Видео:

Редактируется...

Спецификация:

  • Напряжение питания: 5 В (постоянного тока)
  • Потребляемый ток: до 15 мА.
  • Диапазон измерений влажности: от 0 до 100 %.
  • Диапазон измерений температуры: от -40 до +80 °С.
  • Интерфейс: I2C.
  • Скорость шины I2C: 100 кбит/с.
  • Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
  • Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
  • Уровень логической 1 на выводах ADR: 3,3 В (толерантны к 5 В).
  • Рабочая температура: от -40 до +85 °С.
  • Габариты: 35,56 х 25,40 мм (1400 x 1000 mil).
  • Вес: 5 г.

Подключение:

У модуля имеются две колодки выводов: IN (вход) - штыревой разъем и OUT (выход) гнездовой разъем. Все модули подключаются друг к другу соединяя выход предыдущего модуля со входом следующего, образуя состав из модулей Metro в котором первым «вагоном» является плата управления Metro Leonardo или Metro ESP.

Подключение к управляющей плате Metro Leonardo:

К плате Metro Leonardo можно подключить только датчики температуры и влажности, или чередовать их с другими модулями Metro в любой последовательности.

Подключение к управляющей плате Metro ESP:

К плате Metro ESP можно подключить только датчики температуры и влажности, или чередовать их с другими модулями Metro в любой последовательности.

Модуль не поддерживает горячее подключение: Подключайте модуль только при отсутствии питания и данных на шине I2C. В противном случае потребуется отключить питание при уже подключённом модуле.

Вместо платы управления Metro Leonardo или Metro ESP можно использовать платы Arduino или Piranha, у которых будут задействованы 2 вывода шины I2C (SCL и SDA), 2 вывода питания (5V и GND) и один вывод установки адреса ADR, по умолчанию используется вывод D12 (можно менять в скетче).

Питание:

Входное напряжение питания 5 В постоянного тока, подаётся на выводы 5V и GND модуля.

Подробнее о модуле:

Модуль Metro - Датчик температуры и влажности построен на базе цифрового датчика AM2320, микроконтроллера STM32F030F4 и снабжен собственный стабилизатором напряжения.

Модуль считывает значения с датчика и позволяет:

  • Определить относительную влажность воздуха в %.
  • Определить температуру окружающей среды в °С.
  • Определить событие - влажность/температура изменилась на заданное значение.
  • Задать значение при изменении влажности/температуры на которое установится событие - влажность/температура изменилась.

Специально для работы с модулями Metro нами разработана библиотека iarduino_Metro, одна библиотека для всех модулей линейки Metro. Библиотека сама определяет наличие и тип модулей на шине I2C, присваивает им адреса и создаёт массив объектов для работы с найденными модулями. Стоит отметить что пользователю даже не обязательно знать адреса присвоенные модулям, так как для обращения к любому модулю достаточно знать его номер по порядку от платы управления Metro Leonardo или Metro ESP.

    Количество элементов массива Metro совпадает с количеством найденных модулей:
  • Metro[0] - объект для управления первым модулем (ближайшим к управляющей плате);
  • Metro[1] - объект для управления вторым модулем (следующим после первого);
  • Metro[2] - объект для управления третьим модулем (и т.д. до последнего модуля).

Подробнее про установку библиотеки читайте в нашей инструкции.

Примеры:

Вывод показаний влажности и температуры:

#include <Wire.h>                                     // Подключаем библиотеку Wire.
#include <iarduino_Metro.h>                           // Подключаем библиотеку iarduino_Metro.
                                                      //
void setup(){                                         //
    iarduino_Metro_Start();                           // Определяем подключённые модули.
    Serial.begin(9600);                               // Инициируем связь с монитором последовательного порта на скорости 9600 бит/сек.
    while(!Serial){;}                                 // Ждём готовность к работе аппаратной шины UART.
}                                                     //
                                                      //
void loop(){                                          //
    Serial.print( "Температура "                   ); //
    Serial.print( Metro[0].read( DHT_TEMPERATURE ) ); // Выводим температуру.
    Serial.print( "°C, влажность "                 ); //
    Serial.print( Metro[0].read( DHT_HUMIDITY    ) ); // Выводим влажность.
    Serial.print( "%\r\n"                          ); //
    delay(3000);                                      // Ждём 3 секунды. Чаще опрашивать датчик нет смысла.
}                                                     //

Данный пример демонстрирует вывод температуры и влажности в монитор последовательного порта.

Вывод показаний влажности и температуры при их изменении на заданное значение:

#include <Wire.h>                                     // Подключаем библиотеку Wire.
#include <iarduino_Metro.h>                           // Подключаем библиотеку iarduino_Metro.
                                                      //
void setup(){                                         //
    iarduino_Metro_Start();                           // Определяем подключённые модули.
    Serial.begin(9600);                               // Инициируем связь с монитором последовательного порта на скорости 9600 бит/сек.
    while(!Serial){;}                                 // Ждём готовность к работе аппаратной шины UART.
    Metro[0].set(5, 10);                              // Задаём диапазоны 5 °С и 10 % влажности.
}                                                     //
                                                      //
void loop(){                                          //
    if( Metro[0].read(DHT_CHANGED_TEM) ){             // Если температура изменилась на 5°С, то ...
        Serial.print(Metro[0].read(DHT_TEMPERATURE)); // Выводим температуру.
        Serial.print("°C\r\n");                       //
    }                                                 //
    if( Metro[0].read(DHT_CHANGED_HUM) ){             // Если влажность изменилась на 10%, то ...
        Serial.print(Metro[0].read(DHT_HUMIDITY));    // Выводим влажность.
        Serial.print("%\r\n");                        //
    }                                                 //
}                                                     //

В данном примере температура выводится не постоянно, а только при её изменении более чем на 5°С с момента последнего вывода, а влажность выводится при её изменении более чем на 10%. Данный принцип можно использовать для экономии места при выводе данных в монитор, или в качестве сигнализации чрезмерного изменения данных.

Описание функций библиотеки:

В данном разделе описаны функции библиотеки iarduino_Metro для работы с датчиком температуры и влажности, при работе с другими модулями Metro те же функции могут иметь другое назначение.

Подключение библиотеки:

#include <Wire.h>           // Подключаем библиотеку Wire. Для работы с Arduino, Piranha или Metro Leonardo, библиотеку Wire можно не подключать.
#include <iarduino_Metro.h> // Подключаем библиотеку iarduino_Metro.

После подключения библиотеки iarduino_Metro создавать объекты не требуется, вместо этого необходимо однократно вызвать функцию iarduino_Metro_Start(); в коде setup. Эта функция обнаружит все модули Metro, назначит им адреса на шине I2C и создаст массив объектов Metro, количество элементов которого будет совпадать с количеством найденных модулей Metro.

Определение подключённых модулей Metro:

iarduino_Metro_Start();     // В качестве аргумента функции можно указать вывод Arduino к которому подключен вход ADR модуля Metro (по умолчанию используется вывод D12).

Определение подключённых модулей Metro с возвращением их количества:

i = iarduino_Metro_Start(); // Определить все модули и записать их количество в переменную i.

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

    Например, если к управляющей плате подключено 3 любых модуля Metro, то массив Metro будет содержать 3 элемента:
  • Metro[0] - объект для управления первым модулем (ближайшим к управляющей плате);
  • Metro[1] - объект для управления вторым модулем (следующим после первого);
  • Metro[2] - объект для управления третьим модулем (дальним от управляющей платы).

Сторонние модули ша шине I2C: На шине I2C могут присутствовать сторонние модули* (не принадлежащие линейке Metro) со своими библиотеками. Это не повлияет на корректность обнаружения модулей Metro, не приведёт к присвоению неуникального адреса модулю и не нарушит очерёдность следования элементов массива Metro.
* Кроме сторонних модулей с адресом 0x09.

Функция read();

  • Назначение: Чтение температуры или влажности.
  • Синтаксис: Metro[ индекс ].read( [ПАРАМЕТР] );
  • Параметры:
    • DHT_TEMPERATURE - Вернуть текущую температуру в °С, от -40 до +80.
    • DHT_HUMIDITY - Вернуть относительную влажность воздуха в %, от 0 до 100.
    • DHT_CHANGED_TEM - Вернуть true если температура изменилась, иначе вернуть false.
    • DHT_CHANGED_HUM - Вернуть true если влажность изменилась, иначе вернуть false.
  • Возвращаемые значения: Зависят от параметра функции.
  • Примечание:
    • Значения влажности и температуры измеряются модулем каждые 3 секунды.
    • Считается что температура изменилась если с момента её последнего изменения она увеличилась или уменьшилась на значение указанное ранее в качестве 1 агрумента функции set (по умолчанию 1°С).
    • Считается что влажность изменилась если с момента её последнего изменения она увеличилась или уменьшилась на значение указанное ранее в качестве 2 агрумента функции set (по умолчанию 1%).
  • Пример:
Serial.print  ( "Температура: "                );
Serial.print  ( Metro[0].read(DHT_TEMPERATURE) ); // Выводим значение температуры.
Serial.println( " °C."                         );
Serial.print  ( "Влажность: "                  );
Serial.print  ( Metro[0].read(DHT_HUMIDITY)    ); // Выводим значение влажности.
Serial.println( " %."                          );

Функция set();

  • Назначение: Функция задаёт значения для определения факта изменения температуры или влажности.
  • Синтаксис: Metro[ индекс ].set( ТЕМПЕРАТУРА , ВЛАЖНОСТЬ );
  • Параметры:
    • ТЕМПЕРАТУРА - Целое количество °С (от 1 до 25) на которое должна подняться или упасть температура, чтоб функция read() с параметром DHT_CHANGED_TEM вернула true.
    • ВЛАЖНОСТЬ - Целое количество % (от 1 до 25) на которое должна подняться или упасть влажность, чтоб функция read() с параметром DHT_CHANGED_HUM вернула true.
  • Возвращаемые значения: Нет.
  • Примечание:
    • Если функцию set() не вызывать, то будут использоваться значения установленные по умолчанию: 1°С и 1%.
  • Пример:
    Metro[0].set(5, 10); // Задаём диапазоны 5°С и 10% влажности.
if( Metro[0].read(DHT_CHANGED_TEM) ){ Serial.println("Температура изменилась на 5°С"); }
if( Metro[0].read(DHT_CHANGED_HUM) ){ Serial.println("Влажность   изменилась на 10%"); }

Переменная address:

  • Тип: uint8_t.
  • Данные: Адрес модуля на шине I2C.
  • Примечание: Адрес формируется и присваивается во время определения модулей функцией iarduino_Metro_Start(); Не меняйте адрес, так как он используется библиотекой.
  • Пример чтения адреса модуля:
Serial.print  ( "Адрес модуля на шине I2C = " );
Serial.println( Metro[0].address              );

Переменная model:

  • Тип: uint8_t.
  • Данные: Идентификатор типа модуля.
  • Примечание: Тип модуля считывается во время определения модулей функцией iarduino_Metro_Start(); Не меняйте тип модуля, так как он используется библиотекой.
  • Пример определения типа модуля:
switch( Metro[0].model ){
    case MOD_KEY: Serial.println( "кнопка"                         ); break;
    case MOD_RGB: Serial.println( "светодиод"                      ); break;
    case MOD_RES: Serial.println( "потенциометр"                   ); break;
    case MOD_BUZ: Serial.println( "звукоизлучатель"                ); break;
    case MOD_DHT: Serial.println( "датчик влажности и температуры" ); break;
    case MOD_DSL: Serial.println( "датчик освещённости"            ); break;
    case MOD_8X8: Serial.println( "светодиодная матрица 8х8"       ); break;
    default:      Serial.println( "неизвестный модуль"             ); break;
}

Переменная version:

  • Тип: uint8_t.
  • Данные: Версия прошивки модуля.
  • Примечание: Версия прошивки считывается во время определения модулей функцией iarduino_Metro_Start(); Изменение значения переменной не изменит версию модуля и не повлияет на работу модуля, и библиотеки.
  • Пример чтения версии прошивки модуля:
Serial.print  ( "Версия прошивки модуля = " );
Serial.println( Metro[0].version            );

Переменная size:

  • Тип: uint8_t.
  • Данные: Объем памяти ОЗУ в байтах, используемый библиотекой для данного модуля.
  • Примечание: Библиотека создаёт массив объектов Metro с помощью функции iarduino_Metro_Start(); в коде setup (при старте скетча), значит и память ОЗУ для работы с модулями выделяется там же, а не во время компиляции скетча. Зная объем выделенной памяти можно определить объем свободной и рассчитать, какое количество модулей Metro ещё можно подключить. Изменение значения переменной не изменит объём выделенной памяти и не повлияет на работу модуля, и библиотеки.
  • Пример чтения объема памяти ОЗУ выделенного для работы с модулем:
Serial.print  ( "Для работы данного модуля выделено " );
Serial.print  ( Metro[0].size                         );
Serial.println( " байт памяти ОЗУ."                   );

Применение:

Модуль Metro - Датчик температуры и влажности можно использовать в любых проектах где требуется измерять температуру и (или) влажность, например, в метеостанциях, термометрах, гигрометрах, умных теплицах, увлажнителях воздуха, для контроля условий хранения складах и т.д.

Ссылки:

Обсуждение