文章目录
- 原理图
- 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*10000u8 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短信模块。