对于环境监测记录仪,它涉及温度、湿度、光强、气压等的检测,这里仅以光照强度检测为例加以介绍。
进行光照强度的检测所用的传感器为BH1750,是一种I2C接口的器件,它与开发板的连接关系为:
SCL---PA5
SDA---PA6
为输出高低电平所做的语句定义为:
#define SCL_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 1)
#define SCL_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 0)
#define SDA_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, 1)
#define SDA_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, 0)
其读取数据的语句定义为:
#define IIC_SDA_IN HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6)
为转换数据引脚的工作模式,所配置的工作模式设置函数为:
void IIC_INPUT_MODE_SET()
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void IIC_OUTPUT_MODE_SET()
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
为实现检测数据的更新显示及波形的绘制,其读取光照强度的函数为:
void Get_Sunlight_Value()
{
int dis_data=0;
float temp;
char i=0;
unsigned int sd;
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
Delay_us(100);
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 > 999)
{
zz[8] = sd%10000/1000+'0';
zx[9] =zz[8];
}
else
{
zz[8] = ' ';
zx[9] ='0';
}
if(sd > 99)
{
zz[9] = sd%1000/100+'0';
zx[10] =zz[9];
}
else
{
zz[9] = ' ';
zx[10] ='0';
}
if(sd > 9)
{
zz[10] = sd%100/10+'0';
zx[11] =zz[10];
}
else
{
zz[10] =' ';
}
zz[11] = sd%10+'0';
zx[12] =zz[11];
HAL_UART_Transmit(&huart2, (uint8_t *)zz,16, 100);
}
为使检测结果的输出与RTC的时间刷新同步,其RTC显示函数的内容为:
static void RTC_TimeShow(uint8_t *showtime)
{
RTC_DateTypeDef sdatestructureget;
RTC_TimeTypeDef stimestructureget;
HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
if(p!=stimestructureget.Seconds)
{
zl[8]=stimestructureget.Hours/10+'0';
zl[9]=stimestructureget.Hours%10+'0';
zl[11]=stimestructureget.Minutes/10+'0';
zl[12]=stimestructureget.Minutes%10+'0';
zl[14]=stimestructureget.Seconds/10+'0';
zl[15]=stimestructureget.Seconds%10+'0';
p=stimestructureget.Seconds;
HAL_UART_Transmit(&huart2, (uint8_t *)zl,20, 100);
Get_Sunlight_Value();
HAL_UART_Transmit(&huart2, (uint8_t *)zx,16, 100);
}
}
在上述函数的配合下,光照强度检测的显示效果如图1所示。
图1 显示效果
由于环境监测记录仪不但要处理温度、湿度、光强、气压的检测、显示及波形绘制,还要涉及到数据的记录问题。为减轻其处理工作量,是将数据记录工作交由串口记录模块来完成的,记录的数据由串口发送到记录模块即可完成文件的记录处理,其记录的数据形式如图2所示。
图2 记录形式