# Датчики
## Лабораторная работа: знакомимся с сенсорами
Это переработанная версия описания практикума 2.1, приведенного на сайте [innovationcampus.ru/](https://innovationcampus.ru/lms/mod/book/view.php?id=1323).
В этом несложном практикуме мы попробуем поработать с устройствами, которые соединяются по цифровому протоколу 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)
Попробуйте нагреть датчик руками или дыханием и посмотреть, что изменится.
Обратите внимание, BME280 – это датчик температуры, давления и влажности **воздуха**! Погружать датчик в какую-либо жидкость категорически **запрещается!**
### Датчик освещенности
Нам понадобятся:
- радиомодуль 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)
Обратите внимание на то, как задается адрес датчика на шине I2C в этом случае! Попытайтесь проанализировать почему так!
Если вы работаете с каким-либо датчиком, упомянутым в курсе IT Академии, то в нашем [репозитории](https://github.com/iot-academy/) есть копии необходимых библиотек, и в тех случаях,
где это необходимо, они уже адаптированы на работу с Mbed 6-й версии.
### Задача
Напишите программу, которая комбинирует показания со всех трех датчиков на шине I2C, то есть для такого случая:
![umdk-i2c_x3](/assets/images/iot-academy/umdk-i2c_x3.png)
#### Примечания
1. Порядок размещения модулей может быть любой, главное соблюдать расположение ключа при установке!
2. Каждая библиотека должна размещаться в собственном каталоге внутри каталога `lib` проекта.