使用STM32F103微控制器(Blue Tablet)进行的简单实验

图片

第2部分<- 第1部分

让我们继续尝试STM32F103C8T6微控制器,将一些I2C传感器/显示器连接到“蓝色平板电脑”。

实现了对流行的I2C显示器的支持:

  • 液晶屏1602
  • 固态硬盘1306

实现了对以下传感器的支持:

  • BH1750-光传感器
  • BME280-温度,压力,湿度传感器
  • CCS811-CO2传感器,VOC(挥发性有机物质)

为了开始使用新功能,您需要创建一个新项目。
在第一部分中提供了下载MIOC程序的链接。

感测器


BH1750传感器


图片

具有I2C接口的BH1750 16位光传感器(照度计)。 BH1750上的光电二极管确定光的强度,并使用运算放大器将其转换为输出电压。 内置ADC提供16位数字数据。 BH1750的内部逻辑可直接输出以勒克斯(lux)为单位的重要数字数据,因此无需进行任何复杂的计算。

根据文档,BH1750传感器对可见光敏感,并且实际上不受红外辐射的影响,即 产生与人眼大致相同的光谱范围。

要使用此传感器,请在“配置”选项卡上,选择BH1750。

测量结果将在全局变量中:
uint32_t BH_L;

将传感器连接到I2C2总线:

图片

BME280传感器


图片

该传感器可测量环境参数:温度,大气压以及湿度。

还有一个类似的传感器-BMP280,它缺乏测量湿度的能力。 但它的成本要低得多。

除了传感器测量上述所有参数外,它还知道如何过滤噪声,并内置了读数校准功能。 而且,与其他传感器不同,该传感器不仅可以快速而且可以在更宽的范围内进行所有这些测量。 例如,许多传感器不知道如何测量低于20%的空气湿度。

传感器的声明特性如下:

图片
传感器按以下方式连接到I2C2总线:

图片

如果将使用BMP280,则需要在主/bme280.c文件中注释掉所有标记为// // 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可以更高精度地测量温度。 为此,必须对其进行校准。 在主文件/bme280.h中,有一个宏定义:
#定义DT 3520

CCS811传感器


图片

我们周围的空气是混合气体,主要由氮气(约占78%)和氧气(约占21%)组成。 剩余的百分比由各种杂质(惰性气体,二氧化碳,一氧化碳,有机挥发性物质(VOC)等)占。 尽管杂质的百分比很小,但是其浓度的变化可能对人类非常不愉快,甚至是危险的。 办公室和住宅场所的空气质量通常与CO2和VOC的含量有关。

有机挥发性物质包括5000多种化合物。 其中大多数人的教育在某种程度上与人类生活的过程有关。

因此,即使是简单的人类存在于封闭的房间中,也会导致空气“污染”并需要通风。 估算空气中VOC的浓度非常困难。 以前,CO2传感器用于估算VOC的浓度。 同时,考虑到在正常条件下会结合VOC和CO2的浓度这一事实。 知道了二氧化碳的百分比,就可以间接确定VOC的浓度。 如果空气中的二氧化碳含量已达到一定极限,则必须打开通风装置。

实际上,VOC和CO2之间的关系并不总是那么简单。 例如,室内吸烟会导致VOC含量急剧上升,而CO2传感器没有记录到这种变化,因此二氧化碳浓度变化不大。 如果在室内使用家用化学品,清洁产品,油漆和清漆或普通香水,二氧化碳传感器也将无能为力。 AMS提供了用于解决VOC浓度测量问题的解决方案-CCS811传感器。

CCS811B空气质量传感器的特点:

图片

该传感器具有自动校准算法。 测量值会在几天内自动设置。 因此,新传感器的初始误差很大,必须工作至少三到四天,直到获得或多或少的可靠结果:

图片

用户还需要记住,每次接通电源后,CCS811传感器都必须“预热”。 这样的“热身”时间超过30分钟,在此期间误差过大,这是无法接受的:

图片

CCS811的此功能非常重要。

传感器测量结果位于全局变量中:
uint32_t CCS_CO2;
uint32_t CCS_TVOC;

将传感器连接到I2C2总线:

图片

您可以使用上面的示例以及第一部分中有关如何使用控制台的说明来编写用于打印此传感器结果的程序。

其他传感器的例子



运动传感器HC-SR501


图片

某些传感器,例如HC-SR501运动传感器,不需要编写任何其他代码段。

对于此传感器,声明一个变量,选择Type = GPIO_Mode_IN_FLOATING,选择一个端口。

生成BSP,进行编译,然后上传到MK。 接下来,我们以与按钮相同的方式使用此传感器(以接收数据)。

HC-SR501传感器连接:

图片

温湿度传感器DHT22


图片

温湿度传感器

传感器连接:

图片

使用该传感器作为用户片段的一个示例(arduino草图的类似物)。

片段可以在这里获取:
dht22.c
把它放在主文件夹中
在此文件中,编辑以下行:

 #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内进行,其次:如果您进行更多的采访,则传感器会自动发热。

命令行界面


固件包含一个与控制台配合使用的小外壳。 您可以在main / mx_cli.c文件中查看哪些命令

如果需要,您可以添加任何团队。

CLI在No Echo模式下开始工作,也就是说,不会显示您输入的字符。 要显示您输入的字符,请键入:echo on。

“ sh 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 

输出到控制台的示例(回显):

图片

I2Cx总线扫描


要扫描I2C1或I2C2总线,有现成的“固件” * .hex
扫描仪I2Cx
信息输出到UART1,速度-115200.8,N,1
加载扫描仪后,按“重置”按钮。

固件显示总线上找到的设备的地址。

图片

上述所有三个连接的传感器。

Source: https://habr.com/ru/post/zh-CN472204/


All Articles