文章目录
- 原理图
- ZE08-CH2O甲醛传感器
- A9短信模块
- 实物
原理图
ZE08-CH2O甲醛传感器
ZE08-CH2O是一种甲醛(甲醛)传感器,用于检测环境中的甲醛浓度。甲醛是一种有毒气体,广泛用于建筑材料、家具、地毯、化妆品和其他消费品的生产中。高浓度的甲醛对人体健康有害,可能导致呼吸道问题、眼痛、皮肤刺激甚至癌症。
ZE08-CH2O传感器采用电化学原理,能够测量环境中甲醛的浓度,并输出相应的电信号。它通常与微控制器或数据采集系统配合使用,以便监测甲醛浓度并采取适当的措施,如提醒用户开窗通风或触发警报。
这种传感器通常具有以下特点:
高灵敏度:能够检测到低浓度的甲醛。
高精度:提供准确的测量结果。
高稳定性:能够长时间稳定地工作。
快速响应:能够迅速检测到甲醛浓度的变化。
小型化设计:体积小,便于集成到不同的应用中。
采用5V供电,然后使用STM32F103C8T6单片机的串口3,波特率9600,与ZE08-CH2O甲醛传感器进行通信。ZE08-CH2O甲醛传感器的输出电平是3.3。
串口接收的代码:
u32 ch2o_high = 1000;//甲醛的最大值,高于就报警 1000就是0.1mg/m3
u32 ch2o;//甲醛浓度 mg/m3*10000
u8 UART3_dat_ch2o[20];
u8 ch2o_cnt = 0;
void USART3_IRQHandler(void) {
u8 res;
if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) /* 接收到数据 */
{
res = USART_ReceiveData(USART3);
//回发
//USART_SendData(USART3, res); /* 发送数据到串口3 */
UART3_dat_ch2o[ch2o_cnt]=res;
switch (ch2o_cnt) {
case 0:
if (UART3_dat_ch2o[ch2o_cnt] == 0xFF) ch2o_cnt = 1;
else ch2o_cnt = 0;
break;
case 1:
if (UART3_dat_ch2o[ch2o_cnt] == 0x17) ch2o_cnt = 2;
else ch2o_cnt = 0;
break;
case 2:
if (UART3_dat_ch2o[ch2o_cnt] == 0x04) ch2o_cnt = 3;
else ch2o_cnt = 0;
break;
case 3:
if (UART3_dat_ch2o[ch2o_cnt] == 0x00) ch2o_cnt = 4;
else ch2o_cnt = 0;
break;
case 4:
ch2o_cnt = 5;
break;
case 5:
ch2o_cnt = 6;
break;
case 6:
if (UART3_dat_ch2o[ch2o_cnt] == 0x13) ch2o_cnt = 7;
else ch2o_cnt = 0;
break;
case 7:
if (UART3_dat_ch2o[ch2o_cnt] == 0x88) ch2o_cnt = 8;
else ch2o_cnt = 0;
break;
case 8: //校验接收的数据 正确则处理接收的数据
if ((UART3_dat_ch2o[ch2o_cnt] + UART3_dat_ch2o[1] + UART3_dat_ch2o[2] + UART3_dat_ch2o[3] +
UART3_dat_ch2o[4] + UART3_dat_ch2o[5] + UART3_dat_ch2o[6] + UART3_dat_ch2o[7]) % 256 == 0) {
ch2o = UART3_dat_ch2o[4] * 256 + UART3_dat_ch2o[5];
ch2o = ch2o * 13.392857;
ch2o_cnt = 0;
} else {
ch2o_cnt = 0;
}
break;
}
}
}
显示的代码:
//甲醛
memset(xianshi, 0, sizeof(xianshi));
sprintf(xianshi, "C:%d.%04d mg/m3 ", (int) ch2o / 10000, (int) ch2o % 10000);
OLED_P8x16Str(16 * 0, 4, xianshi, 0);
A9短信模块
引脚图:
原理图:
初始化:
void init_A9(void) {
OK = 0;
printf("AT\r\n");
delay_ms(500);
printf("AT\r\n");
delay_ms(500);
while (1) {
if (OK == 1) /* OK */
{
OK = 0;
break;
} else {
delay_ms(500);
printf("AT\r\n"); /* 再次测试AT */
OLED_P8x16Str(16 * 0, 2, "SIM AT TEST ", 0);
}
}
/* 检测卡SIM */
OK = 0;
printf("AT+CCID\r\n");
delay_ms(500);
while (OK == 0) {
printf("AT+CCID\r\n");
OLED_P8x16Str(16 * 0, 2, "SIM ERROR ", 0);
delay_ms(500);
}
}
//A9模块
void USART1_IRQHandler(void) /* 串口1中断服务程序 */
{
u8 receiveData;
static unsigned char over_flag = 0; /* 完成标志 */
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) /* 接收中断(接收到的数据必须是0x0d 0x0a结尾) */
{
receiveData = USART_ReceiveData(USART1); /* 读取接收到的数据 */
if (receiveData == '>') {
OKGSM = 1;
}
RX_BUF[LENGTH++] = receiveData;
if (receiveData == '\r') {
over_flag = 1;
} else if (((receiveData == '\n') && (over_flag == 1))) /* 收到\r\n */
{
RX_BUF[LENGTH] = '\0';
LENGTH = 0;
over_flag = 0; /* 完成标志 */
if (strstr(RX_BUF, "OK") != NULL) {
OK = 1;
} else {
OK = 0;
}
}
}
}
发送短信:
void send_once_GSM(void) {
printf("AT+CMGF=1\r\n");
OK = 0;
delay_ms(500);
while (OK == 0) {
printf("AT+CMGF=1\r\n");
delay_ms(500);
}
printf("AT+CMGS=\"13198256451\"\r\n");
OKGSM = 0;
delay_ms(500);
while (OKGSM == 0) {
printf("AT+CMGS=\"13198256451\"\r\n");
delay_ms(500);
} /* 等待 反应 */
delay_ms(500);
printf("message warining!!!!!!! ");
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
USART_SendData(USART1, 0x1a); /* 短信结尾字符 */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
}
实物
最终搭载了SIM800C短信模块。