Часть 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()
{
char s[64];
float t=0, p=0, h=0;
Init_HW();
// ---------------------
// The main program loop
// ---------------------
while( TRUE )
{
delay_ms( 300 );
t = BME_T / 10.0;
p = BME_P / 100.0;
h = BME_H / 10.0;
sprintf( s, "t=%-7.1fC", t );
SSD1306_write_string( 1, s );
sprintf( s, "p=%-7.1fPa", p );
SSD1306_write_string( 2, s );
sprintf( s, "h=%-7.1f%% ", h );
SSD1306_write_string( 3, s );
sprintf( s, "T=%-7.1fH=%.1f", t, h );
LCD_write_string( 1, s );
sprintf( s, "P=%-7.1fL=%u", p, BH_L );
LCD_write_string( 2, s );
}
}
Результат работы программы:
Эта же программа будет отображать температуру, давление, влажность на дисплее SSD1306.
(подключить данный дисплей, и выбрать его в конфигурации)
Датчик BME280 может измерять температуру с большей точностью. Для этого его нужно откалибровать. В файле main/bme280.h для этого есть макроопределение:
#define DT 3520
Датчик CCS811
Окружающий нас воздух представляет собой смесь газов и состоит в основном из азота (около 78%) и кислорода (около 21%). Оставшийся процент приходится на долю различных примесей (инертные газы, углекислый газ, угарный газ, органические летучие вещества (ЛОВ) и т. д). Несмотря на то, что в процентном соотношении количества примесей мало, изменение их концентрации может оказаться очень неприятным и даже опасным для человека. Качество воздуха в офисных и бытовых помещениях чаще всего связывают с содержанием CO2 и ЛОВ.
К органическим летучим веществам относятся более 5000 соединений. Образование большей части из них так или иначе связано с процессами жизнедеятельности человека.
Таким образом, даже простое присутствие человека в замкнутом помещении приводит к «загрязнению» воздуха и необходимости проветривания. Оценка концентрации ЛОВ в воздухе затруднена. Раньше для оценки концентрации ЛОВ применяли датчики CO2. При этом учитывался тот факт, что в нормальных условиях концентрации ЛОВ и CO2 оказываются связанными. Зная процентное содержание CO2, можно косвенно определить концентрацию ЛОВ. Если содержание углекислого газа в воздухе достигло некоторого предела — необходимо включать вентиляцию.
На практике взаимосвязь между ЛОВ и CO2 не всегда однозначна. Например, курение в помещении вызывает резкий скачок содержания ЛОВ, который датчики CO2 не фиксируют, так концентрация углекислого газа при этом сильно не меняется. Датчики углекислого газа также будут бессильны, если в помещении используется бытовая химия, чистящие средства, лакокрасочные материалы или обычная парфюмерия. Компания AMS предлагает свое решение проблемы измерения концентрации ЛОВ — датчики CCS811.
Характеристики датчиков качества воздуха CCS811B:
Датчик имеет алгоритм автоматической калибровки. Измеряемые величины автоматически устанавливаются в течение нескольких дней. По этой причине новый датчик имеет гигантскую начальную погрешность и должен отработать как минимум трое-четверо суток до получения более-менее достоверных результатов
Пользователю также необходимо помнить, что каждый раз после включения датчик CCS811 должен «прогреваться». Время такого «прогрева» составляет более 30 минут, в течение которых погрешность оказывается недопустимо большой
Эту особенность 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».
Прошивки показывают адреса найденных устройств на шине.
Все три подключенных датчика, описанных выше.
Комментариев нет:
Отправить комментарий