Простые эксперименты с микроконтроллером STM32F103 («Голубая таблетка»)
Часть 2
(часть 1)
Продолжим эксперементировать с микроконтроллером STM32F103C8T6, подключим некоторые датчики/дисплеи с интерфейсом I2C к «голубой таблетке».
Реализована поддержка популярных дисплеев I2C:
- LCD 1602
- SSD1306
Реализована поддержка следующих датчиков:
- BH1750 — датчик освещенности
- BME280 — датчик температуры, давления, влажности
- CCS811 — датчик СО2, ЛОВ ( Летучие Органические Вещества )
Для того, чтобы начать работать с новыми функциями необходимо создать новый проект.
Ссылка для загрузки программы MIOC приведена в первой части.
Датчики
Датчик BH1750
BH1750 16-битный датчик освещённости (люксметр) с интерфейсом I2C. Фотодиод на BH1750 определяет интенсивность света, которая преобразуется в выходное напряжение с помощью операционного усилителя. Встроенный АЦП выдает 16-битные цифровые данные. Внутренняя логика BH1750 избавляет от необходимости каких-либо сложных вычислений, поскольку он напрямую выводит значимые цифровые данные в люксах (лк).
реагирует примерно на тот же спектральный диапазон, что и человеческий глаз. Согласно документации, датчик BH1750 чувствителен к видимому свету и практически не подвержен влиянию инфракрасного излучения, т.е.
Для работы с этим датчиком на закладке «Configuration» выбрать BH1750.
Результаты измерений будут находиться в глобальной переменной:
uint32_t BH_L;
Подключение датчика к шине I2C1:
Датчик BME280
Данный датчик измеряет параметры окружающей среды: температура, атмосферное давление, а также влажность воздуха.
Но зато стоит он гораздо дешевле. Есть ещё подобный датчик — BMP280, в котором отсутствует возможность измерять влажность.
Так же в отличие от других датчиков, данный датчик проделывает все эти измерения не только быстро, но и в более широких диапазонах. Помимо того, что датчик измеряет все вышеперечисленные параметры, он также умеет фильтровать шумы, в него встроена калибровка показаний. Например, многие датчики не умеют измерять влажность воздуха менее 20 процентов.
Заявленные характеристики у датчика следующие:
Датчики подключаются к шине I2C2 следующим образом:
Если будет использован BMP280, то в файле main/bme280.c нужно закоментировать все строки помеченные // Comment for BMP.
Результаты измерений будут находиться в глобальных переменных:
Пример программы, работающей с датчиками BH1750, BME280, и дисплея 1602:
#include "mx_init_hw.c" int main()
}
Результат работы программы:
Эта же программа будет отображать температуру, давление, влажность на дисплее SSD1306.
(подключить данный дисплей, и выбрать его в конфигурации)
Датчик BME280 может измерять температуру с большей точностью. Для этого его нужно откалибровать. В файле main/bme280.h для этого есть макроопределение:
#define DT 3520
Датчик CCS811
Окружающий нас воздух представляет собой смесь газов и состоит в основном из азота (около 78%) и кислорода (около 21%). Оставшийся процент приходится на долю различных примесей (инертные газы, углекислый газ, угарный газ, органические летучие вещества (ЛОВ) и т. д). Несмотря на то, что в процентном соотношении количества примесей мало, изменение их концентрации может оказаться очень неприятным и даже опасным для человека. Качество воздуха в офисных и бытовых помещениях чаще всего связывают с содержанием CO2 и ЛОВ.
Образование большей части из них так или иначе связано с процессами жизнедеятельности человека. К органическим летучим веществам относятся более 5000 соединений.
Оценка концентрации ЛОВ в воздухе затруднена. Таким образом, даже простое присутствие человека в замкнутом помещении приводит к «загрязнению» воздуха и необходимости проветривания. При этом учитывался тот факт, что в нормальных условиях концентрации ЛОВ и CO2 оказываются связанными. Раньше для оценки концентрации ЛОВ применяли датчики CO2. Если содержание углекислого газа в воздухе достигло некоторого предела — необходимо включать вентиляцию. Зная процентное содержание CO2, можно косвенно определить концентрацию ЛОВ.
Например, курение в помещении вызывает резкий скачок содержания ЛОВ, который датчики CO2 не фиксируют, так концентрация углекислого газа при этом сильно не меняется. На практике взаимосвязь между ЛОВ и CO2 не всегда однозначна. Компания AMS предлагает свое решение проблемы измерения концентрации ЛОВ — датчики CCS811. Датчики углекислого газа также будут бессильны, если в помещении используется бытовая химия, чистящие средства, лакокрасочные материалы или обычная парфюмерия.
Измеряемые величины автоматически устанавливаются в течение нескольких дней. Характеристики датчиков качества воздуха CCS811B:
Датчик имеет алгоритм автоматической калибровки. Время такого «прогрева» составляет более 30 минут, в течение которых погрешность оказывается недопустимо большой
Эту особенность CCS811 крайне важно учитывать. По этой причине новый датчик имеет гигантскую начальную погрешность и должен отработать как минимум трое-четверо суток до получения более-менее достоверных результатов
Пользователю также необходимо помнить, что каждый раз после включения датчик CCS811 должен «прогреваться».
Результаты измерений датчика находятся в глобальных переменных:
uint32_t CCS_CO2;
uint32_t CCS_TVOC;
Подключение датчика к шине I2C2
Программу печати результатов работы данного датчика, используя примеры выше и описание работы с консолью изложенное в первой части, можете написать самостоятельно.
Примеры прочих датчиков
Датчик движения HC-SR501
Некоторые датчики, например датчики движения HC-SR501 не требуют написания каких либо дополнительных сниппетов.
Для данного датчика — объявить переменную, выбрать Type=GPIO_Mode_IN_FLOATING, выбрать порт.
Далее работаем с этим датчиком так же, как с кнопкой (на получение данных). Генерировать BSP, компилировать, загрузить в МК.
Подключение датчика HC-SR501:
Датчик температуры/влажности DHT22
Датчик измерения температуры/влажности
Подключение датчика:
Работа с этим датчиком будет как пример пользовательского сниппета ( аналог скетча arduino ).
Снипет можно взять здесь
dht22.c
Поместить его в папку main
В данном файле отредактировать строки:
#define PORT GPIOA
#define PIN GPIO_Pin_5
по фактическому подключению датчика
Текст программы для работы с данным сниппетом:
#include "mx_init_hw.c"
#include "dht_22.c" int main()
{ int16_t dht_t, dht_h; Init_HW(); dht_init(); // --------------------- // The main program loop // --------------------- while( TRUE ) { delay_ms( 5000 ); if( !get_dht_data( &dht_t, &dht_h ) ) print( "t=%.1f h=%.1f\r\n", (float)dht_t / 10.0, (float)dht_h / 10.0 ) else print( "DHT 22 - ERR\r\n" ); }
}
Результат работы:
Чаще, чем раз в 4-5 секунд датчик опрашивать нет смысла. Причины: вычисление температуры происходит в течении 800-900 mS, второе: если опрашивать чаще, то идет саморазогрев датчика.
CLI
Посмотреть какие команды есть можно в файле main/mx_cli.c
При желании можно добавить какие либо свои команды.
CLI начинает работать в режиме No Echo, т. Прошивка содержит небольшой командный интерпретатор, работающий с консолью. Вводимые символы не отображаются. е. Для отображения вводимых символов необходимо напечатать: echo on
Номер в первой позиции соответствует номеру строки в таблице конфигуратора. Команда «sh on» будет выводить два раза в секунду значения переменных, объявленных в конфигураторе и переменных связанных с датчиками. Данная команда сделана для передачи данных в систему подключенную к консоли.
Поэтому при совместном использовании оператора «print» и «echo on» может произойти перемешивание выводимой информации. Никаких флагов и мьютексов, анализирующих занятость консоли — нет. Для решения данной проблемы можно использовать два канала вывода. Не следует применять оба метода одновременно. Или наоборот.
Использовать функции:
Например консоль на UART1, а вывод пользовательской информации на VCP.
send_uart1( char *data, int len )
send_usb( char *data, int len )
Для облегчения использования этих функций можно в файле gbl.h изменить макроопределение printf. Например на следующее:
#define printf(fmt,argv...){char s[128];sprintf(s,fmt,##argv);send_usb(s,strlen(s));} // вывод на VCP
Пример вывода на консоль (echo on):
Сканирование шины I2Cx
Для сканирования шины I2C1 или I2C2 есть готовые «прошивки» *.hex
scanner I2Cx
Вывод информации на UART1, скорость — 115200,8,N,1
После загрузки сканера нажать кнопку «Reset».
Прошивки показывают адреса найденных устройств на шине.
Все три подключенных датчика, описанных выше.