IT Академия Samsung - Датчики # Датчики ## Лабораторная работа: знакомимся с сенсорами Это переработанная версия описания практикума 2.1, приведенного на сайте [myitschool.ru/edu](https://myitschool.ru/edu/mod/book/view.php?id=1833). В этом несложном практикуме мы попробуем поработать с устройствами, которые соединяются по цифровому протоколу 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://github.com/iot-academy/mbed_bme280) из нашего репозитория. Это копия [оригинальной](https://os.mbed.com/users/MACRUM/code/BME280/) библиотеки, скачать которую без VPN вряд ли удастся (а нашу - можно!). Собираем модули в единую конструкцию ![unwr_meteo_ok](/assets/images/iot-academy/unwr_meteo_ok.png) Создаем новый проект в PlatformIO, и настраиваем его на работу с платами Unwired Range. В каталоге `lib` проекта создаем каталог с именем, например, `mbed_bme280`, и в нем размещаем файлы библиотеки. Если у вас на компьютере установлен клиент системы контроля версий **git**, то можно просто перейти в Терминале в каталог `lib`, и там выполнить команду: ``` git clone https://github.com/iot-academy/mbed_bme280 ``` Пишем программу (`src/main.cpp`): ```cpp #include "mbed.h" #include "BME280.h" DigitalOut led(LED1); BME280 sensor_bme(I2C_SDA, I2C_SCL); int main() { printf("Hello, bme280!\r\n"); while(1) { ThisThread::sleep_for(1s); // 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()); } } ``` В корне проекта создаем файл `mbed_app.json` и уже известным нам содержимым: ``` { "target_overrides": { "*": { "target.printf_lib": "std" } } } ``` Компилируем, прошиваем, подключаемся к плате по последовательному порту, и наблюдаем ![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/iot-academy/mbed_opt3001) из нашего репозитория. Это копия [оригинальной](https://github.com/olegart/mbed_opt3001) библиотеки, в которую **внесены правки** для работы с Mbed 6-й версии. Демонстрационная программа: ```cpp #include "mbed.h" #include "OPT3001.h" DigitalOut led(LED1); OPT3001 sensor_opt(I2C_SDA, I2C_SCL); int main() { printf("Hello, opt3001!\r\n"); while(1) { ThisThread::sleep_for(1s); // 1 second led = !led; // Toggle LED printf("%d 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://github.com/iot-academy/mbed_lsm6ds3) из нашего репозитория. Это копия [оригинальной](https://os.mbed.com/users/einsteingustavo/code/LSM6DS3) библиотеки, в которую внесены правки для работы с Mbed 6-й версии. К тому же без VPN скачать оригинальную библиотеку сейчас вряд ли удастся. - Библиотека или ее [копия]. Демонстрационная программа: ```cpp #include "mbed.h" #include "LSM6DS3.h" DigitalOut led(LED1); 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) { ThisThread::sleep_for(1s); // 1 second led = !led; // Toggle LED accel.readAccel(); printf("%7.3f, %7.3f, %7.3f \r\n", accel.ax, accel.ay, accel.az); } } ``` Результат работы: ![term-acc](/assets/images/iot-academy/term-acc.png) <div class="validation"> Обратите внимание на то, как задается адрес датчика на шине I2C в этом случае! Попытайтесь проанализировать почему так! </div> <div class="info"> Если вы работаете с каким-либо датчиком, упомянутым в курсе IT Академии, то в нашем [репозитории](https://github.com/iot-academy/) есть копии необходимых библиотек, и в тех случаях, где это необходимо, они уже адаптированы на работу с Mbed 6-й версии. </div> ### Задача Напишите программу, которая комбинирует показания со всех трех датчиков на шине I2C, то есть для такого случая: ![umdk-i2c_x3](/assets/images/iot-academy/umdk-i2c_x3.png) #### Примечания 1. Порядок размещения модулей может быть любой, главное соблюдать расположение ключа при установке! 2. Каждая библиотека должна размещаться в собственном каталоге внутри каталога `lib` проекта.