Простые эксперименты с микроконтроллером 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()
{
    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 );
    }
}


Результат работы программы:
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
Датчик имеет алгоритм автоматической калибровки. Измеряемые величины автоматически устанавливаются в течение нескольких дней. По этой причине новый датчик имеет гигантскую начальную погрешность и должен отработать как минимум трое-четверо суток до получения более-менее достоверных результатов
image
Пользователю также необходимо помнить, что каждый раз после включения датчик CCS811 должен «прогреваться». Время такого «прогрева» составляет более 30 минут, в течение которых погрешность оказывается недопустимо большой
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
Все три подключенных датчика, описанных выше.

© Habrahabr.ru