# Кейс 2 - Продолжение (Датчики) ## 2.2. Лабораторная работа: знакомимся с сенсорами Это переработанная версия описания практикума 2.1, приведенного на сайте [myitacademy.ru/edu](https://myitacademy.ru/edu/mod/book/view.php?id=526). В этом несложном практикуме мы попробуем поработать с устройствами, которые соединяются по цифровому протоколу I2C. К каждому из этих сенсоров есть готовая библиотека, упрощающая работу. Мы будем измерять следующие показатели: 1. Температура, влажность, давление. 2. Освещенность. 3. Положение в пространстве. Поскольку протокол везде используется один и тот же, то и действия мы будем проделывать аналогичные. Небольшое различие будет лишь в используемых библиотеках. По итогам, вы сможете подключить и получить данные с каждого из указанных сенсоров. Конкретная модель сенсора не имеет большого значения в данном практикуме. Мы будем использовать модули датчиков от Unwired Devices. Кроме того, наш вариант не будет уступать предлагаемому в орингинале варианту подключения датчиков от Амперки через Slot Shield, так как Unwired Devices Kit изначально создавался так, чтобы было минимумов проводов. ### Метеодатчик Для этого задания нам понадобятся: - радиомодуль UNWR с платой-адаптером UMDK-RF ![ud-min3](/assets/images/iot-academy/ud-min3.png) - модуль метеодатчика на основе BME280 (плата UMDK-THP) ![umdk-thp](/assets/images/iot-academy/umdk-thp.png) - Библиотека [BME280](https://os.mbed.com/users/MACRUM/code/BME280/). Собираем модули в единую конструкцию ![unwr_meteo_ok](/assets/images/iot-academy/unwr_meteo_ok.png) Создаем проект в MbedStudio и импортируем [библиотеку](https://os.mbed.com/users/MACRUM/code/BME280/) в проект. Пишем программу: ```cpp #include "mbed.h" #include "BME280.h" DigitalOut led(LED1); BME280 sensor_bme(I2C_SDA, I2C_SCL); int main() { printf("Hello, bme280!\n\r"); while(1) { wait(1); // 1 second led = !led; // Toggle LED printf("%2.2f degC, %04.2f hPa, %2.2f %%\r\n", sensor_bme.getTemperature(), sensor_bme.getPressure(), sensor_bme.getHumidity()); } } ``` Компилируем, прошиваем, подключаемся к плате по последовательному порту, и наблюдаем ![term-meteo](/assets/images/iot-academy/term-meteo.png) Попробуйте нагреть датчик руками или дыханием и посмотреть, что изменится. <div class="danger"> Обратите внимание, BME280 - это датчик температуры, давления и влажности **воздуха**! Погружать датчик в какую-либо жидкость категорически **запрещается!** </div> ### Датчик освещенности Нам понадобятся: - радиомодуль UNWR с платой-адаптером UMDK-RF ![ud-min3](/assets/images/iot-academy/ud-min3.png) - модуль датчика освещенности на основе OPT3001 (плата UMDK-LIT) ![umdk-lit](/assets/images/iot-academy/umdk-lit.png) - Библиотека [OPT3001](https://github.com/olegart/mbed_opt3001). Демонстрационная программа: ```cpp #include "mbed.h" #include "OPT3001.h" DigitalOut led(LED1); OPT3001 sensor_opt(I2C_SDA, I2C_SCL); int main() { printf("Hello, opt3001!\n\r"); while(1) { wait(1); // 1 second led = !led; // Toggle LED printf("%ld lux\r\n", sensor_opt.readSensor()); } } ``` Результат работы: ![term-light](/assets/images/iot-academy/term-light.png) ### Акселерометр Нам понадобятся: - радиомодуль UNWR с платой-адаптером UMDK-RF ![ud-min3](/assets/images/iot-academy/ud-min3.png) - модуль акселерометра на основе LSM6DS3 (плата UMDK-ACC) ![umdk-acc](/assets/images/iot-academy/umdk-acc.png) - Библиотека [LSM6DS3](https://os.mbed.com/users/einsteingustavo/code/LSM6DS3). Демонстрационная программа: ```cpp #include "mbed.h" #include "LSM6DS3.h" LSM6DS3 accel(I2C_SDA, I2C_SCL, LSM6DS3_AG_I2C_ADDR(0)); int main() { // Initialize the gyro and accelerometer uint16_t status = accel.begin(); printf("LSM6DS3 WHO_AM_I's returned: 0x%X\r\n", status); while (1) { accel.readAccel(); printf("%7.3f, %7.3f, %7.3f \n\r", accel.ax, accel.ay, accel.az); wait_ms(500); } } ``` Результат работы: ![term-acc](/assets/images/iot-academy/term-acc.png) Обратите внимание на то, как задается адрес датчика на шине I2C в этом случае! ### Задача Напишите программу, которая комбинирует показания со всех трех датчиков на шине I2C, то есть для такого случая: ![umdk-i2c_x3](/assets/images/iot-academy/umdk-i2c_x3.png) Порядок размещения модулей может быть любой, главное соблюдать расположение ключа при установке! [**^ К оглавлению**](iot/samsung/archive/2020) <link rel="stylesheet" href="assets/css/danger.css" />