Хабрахабр

Простые эксперименты с микроконтроллером STM32F103 («Голубая таблетка»)

image
Часть 2
(часть 1)
Продолжим эксперементировать с микроконтроллером STM32F103C8T6, подключим некоторые датчики/дисплеи с интерфейсом I2C к «голубой таблетке».

Реализована поддержка популярных дисплеев I2C:

  • LCD 1602
  • SSD1306

Реализована поддержка следующих датчиков:

  • BH1750 — датчик освещенности
  • BME280 — датчик температуры, давления, влажности
  • CCS811 — датчик СО2, ЛОВ ( Летучие Органические Вещества )

Для того, чтобы начать работать с новыми функциями необходимо создать новый проект.
Ссылка для загрузки программы MIOC приведена в первой части.

Датчики

Датчик BH1750

image
BH1750 16-битный датчик освещённости (люксметр) с интерфейсом I2C. Фотодиод на BH1750 определяет интенсивность света, которая преобразуется в выходное напряжение с помощью операционного усилителя. Встроенный АЦП выдает 16-битные цифровые данные. Внутренняя логика BH1750 избавляет от необходимости каких-либо сложных вычислений, поскольку он напрямую выводит значимые цифровые данные в люксах (лк).

реагирует примерно на тот же спектральный диапазон, что и человеческий глаз. Согласно документации, датчик BH1750 чувствителен к видимому свету и практически не подвержен влиянию инфракрасного излучения, т.е.

Для работы с этим датчиком на закладке «Configuration» выбрать BH1750.

Результаты измерений будут находиться в глобальной переменной:
uint32_t BH_L;

Подключение датчика к шине I2C1:
image

Датчик BME280

image
Данный датчик измеряет параметры окружающей среды: температура, атмосферное давление, а также влажность воздуха.

Но зато стоит он гораздо дешевле. Есть ещё подобный датчик — BMP280, в котором отсутствует возможность измерять влажность.

Так же в отличие от других датчиков, данный датчик проделывает все эти измерения не только быстро, но и в более широких диапазонах. Помимо того, что датчик измеряет все вышеперечисленные параметры, он также умеет фильтровать шумы, в него встроена калибровка показаний. Например, многие датчики не умеют измерять влажность воздуха менее 20 процентов.

Заявленные характеристики у датчика следующие:
image
Датчики подключаются к шине I2C2 следующим образом:
image
Если будет использован BMP280, то в файле main/bme280.c нужно закоментировать все строки помеченные // Comment for BMP.

Результаты измерений будут находиться в глобальных переменных:
image
Пример программы, работающей с датчиками BH1750, BME280, и дисплея 1602:

#include "mx_init_hw.c" int main()

}

Результат работы программы:
image
Эта же программа будет отображать температуру, давление, влажность на дисплее SSD1306.
(подключить данный дисплей, и выбрать его в конфигурации)
image
Датчик BME280 может измерять температуру с большей точностью. Для этого его нужно откалибровать. В файле main/bme280.h для этого есть макроопределение:
#define DT 3520

Датчик CCS811

image
Окружающий нас воздух представляет собой смесь газов и состоит в основном из азота (около 78%) и кислорода (около 21%). Оставшийся процент приходится на долю различных примесей (инертные газы, углекислый газ, угарный газ, органические летучие вещества (ЛОВ) и т. д). Несмотря на то, что в процентном соотношении количества примесей мало, изменение их концентрации может оказаться очень неприятным и даже опасным для человека. Качество воздуха в офисных и бытовых помещениях чаще всего связывают с содержанием CO2 и ЛОВ.

Образование большей части из них так или иначе связано с процессами жизнедеятельности человека. К органическим летучим веществам относятся более 5000 соединений.

Оценка концентрации ЛОВ в воздухе затруднена. Таким образом, даже простое присутствие человека в замкнутом помещении приводит к «загрязнению» воздуха и необходимости проветривания. При этом учитывался тот факт, что в нормальных условиях концентрации ЛОВ и CO2 оказываются связанными. Раньше для оценки концентрации ЛОВ применяли датчики CO2. Если содержание углекислого газа в воздухе достигло некоторого предела — необходимо включать вентиляцию. Зная процентное содержание CO2, можно косвенно определить концентрацию ЛОВ.

Например, курение в помещении вызывает резкий скачок содержания ЛОВ, который датчики CO2 не фиксируют, так концентрация углекислого газа при этом сильно не меняется. На практике взаимосвязь между ЛОВ и CO2 не всегда однозначна. Компания AMS предлагает свое решение проблемы измерения концентрации ЛОВ — датчики CCS811. Датчики углекислого газа также будут бессильны, если в помещении используется бытовая химия, чистящие средства, лакокрасочные материалы или обычная парфюмерия.

Измеряемые величины автоматически устанавливаются в течение нескольких дней. Характеристики датчиков качества воздуха CCS811B:
image
Датчик имеет алгоритм автоматической калибровки. Время такого «прогрева» составляет более 30 минут, в течение которых погрешность оказывается недопустимо большой
image
Эту особенность CCS811 крайне важно учитывать. По этой причине новый датчик имеет гигантскую начальную погрешность и должен отработать как минимум трое-четверо суток до получения более-менее достоверных результатов
image
Пользователю также необходимо помнить, что каждый раз после включения датчик CCS811 должен «прогреваться».

Результаты измерений датчика находятся в глобальных переменных:
uint32_t CCS_CO2;
uint32_t CCS_TVOC;
Подключение датчика к шине I2C2
image
Программу печати результатов работы данного датчика, используя примеры выше и описание работы с консолью изложенное в первой части, можете написать самостоятельно.

Примеры прочих датчиков

Датчик движения HC-SR501

image
Некоторые датчики, например датчики движения HC-SR501 не требуют написания каких либо дополнительных сниппетов.

Для данного датчика — объявить переменную, выбрать Type=GPIO_Mode_IN_FLOATING, выбрать порт.

Далее работаем с этим датчиком так же, как с кнопкой (на получение данных). Генерировать BSP, компилировать, загрузить в МК.

Подключение датчика HC-SR501:
image

Датчик температуры/влажности DHT22

image
Датчик измерения температуры/влажности

Подключение датчика:
image
Работа с этим датчиком будет как пример пользовательского сниппета ( аналог скетча 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" ); }
}

Результат работы:
image
Чаще, чем раз в 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):
image

Сканирование шины I2Cx

Для сканирования шины I2C1 или I2C2 есть готовые «прошивки» *.hex
scanner I2Cx
Вывод информации на UART1, скорость — 115200,8,N,1
После загрузки сканера нажать кнопку «Reset».

Прошивки показывают адреса найденных устройств на шине.
image
Все три подключенных датчика, описанных выше.

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»