该环境状态检测装置的功能是对环境周围的温度、湿度、气压及光照强度进行检测,如果配上一个风速检测单元就可以作为一个简易的气象检测站来使用。
其中进行温湿度检测的器件为DHT22,进行光强检测的为BH1750,进行大气压检测的为BMP085,用于数据显示的则是双色OLED屏。
由于在前面的测评中,已分别介绍过双色OLED屏的驱动、BMP085的温度大气压检测及DHT22的温湿度检测,这里主要介绍BH1750光强检测及相应的整合处理。
BH1750与开发板的连接关系为:
CLK---PE3
DIN---PE5
输出高低电平的语句定义为:
#define SCL_Clr() GPIOE->PBC = GPIO_PIN_3
#define SCL_Set() GPIOE->PBSC = GPIO_PIN_3
#define SDA_Clr() GPIOE->PBC = GPIO_PIN_5
#define SDA_Set() GPIOE->PBSC = GPIO_PIN_5
BH1750引脚功能配置的函数为:
void BH1750_Init(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOE, ENABLE);
GPIO_InitStructure.Pin = GPIO_PIN_3|GPIO_PIN_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOE, &GPIO_InitStructure);
}
语句输入输出功能设置的函数为:
void IIC_INPUT_MODE()
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOE, ENABLE);
GPIO_InitStructure.Pin = GPIO_PIN_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOE, &GPIO_InitStructure);
}
void IIC_OUTPUT_MODE()
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOE, ENABLE);
GPIO_InitStructure.Pin = GPIO_PIN_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOE, &GPIO_InitStructure);
}
字节数据的方式函数为:
void BH1750_SendByte(char data)
{
char i;
IIC_OUTPUT_MODE();
SCL_Clr();
SysTick_Delay_Us(2);
for (i=0;i<8;i++)
{
if(data&0x80) SDA_Set();
else SDA_Clr();
data <<= 1;
SCL_Set();
SysTick_Delay_Us(2);
SCL_Clr();
SysTick_Delay_Us(2);
}
}
光强检测的函数为:
void Get_Sunlight_Value()
{
int dis_data=0;
float temp;
char i=0;
unsigned int sd;
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
SysTick_Delay_Us(180000);
Multiple_Read_BH1750();
for(i=0;i<3;i++) dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];
temp=(float) dis_data/1.2;
sd=temp;
if(sd<54612) OLED_ShowNum(0,6,sd,5,16);
}
实现光强检测与显示的主程序为:
int main(void)
{
RTC Init();
BH1750_Init();
OLEDInit();
OLED_Init();
OLED_Clear();
OLED_ShowString(20,0,"N32G457 ",16);
OLED_ShowString(20,2,"OLED & BMP085",16);
OLED_ShowString(0,4,"Sunlight=",16);
OLED_ShowString(48,6,"lx",16);
while (1)
{
Get_Sunlight_Value();
SysTick_Delay_Us(1000000);
}
}
在编译下载后,其运行效果如图1和图2所示。
为了进行多个传感器的协同工作,对引脚的使用进行了再分配,其连接情况如下:
OLED屏:
CLK---PE2
DIN---PE4
BMP085:
SCL ---PE3
SDA ---PE5
DHT22:
OUT--- PE6
BH1750:
SCL---PE8
SDA---PE9
KEY:
S1 --- PA4
为使RTC进行计时,还将PC13连接到PB8。
在配备RTC计时的情况下,温度大气压检测的主程序为:
int main(void)
{
RTC Init();
OLEDInit();
OLED_Init();
OLED_Clear();
BMP085_Init();
Init_BMP085();
OLED_ShowString(20,0,"N32G457 ",16);
OLED_ShowString(20,2," : :",16);
OLED_ShowString(20,4,"t= C",16);
OLED_ShowString(20,6,"p= KPa",16);
while (1)
{
bmp085Convert();
OLED_ShowNum(44,4,temperature/10,3,16);
OLED_ShowNum(44,6,pressure/100,5,16);
if (RTC_GetFlagStatus(RTC_FLAG_TISF) != RESET)
{
RTC_TimeShowP();
RTC_ClrFlag(RTC_FLAG_TISF);
RTC_ClrFlag(RTC_FLAG_TISOVF);
}
SysTick_Delay_Ms(1000);
}
}
在编译下载后,其运行效果如图3和图4所示。
此外,在按键的控制下可进行显示内容的切换,以显示不同传感器的检测值。
至此,当初申请测评时的目标已全部完成,从测评过程来看,由于N32G457开发板是支持在MDK上进行开发的,故非常易于上手和进行功能移植。当然,若是想在一定的系统上来进行进程化的程序管理和设计,则不妨在RT_T平台上来进行开发,它的特点就是有一定的库支持,可以在一定程度上减轻开发的劳动强度。
本帖最后由 jinglixixi 于 2022-2-28 22:48 编辑引用: Jacktang 发表于 2022-2-28 23:23 最后的总结的很好,经验之谈 一个系统开发平台有一定的库支持,确实是可以在一定程度上减轻开发的劳动强 ...