1. Overview
The module is mh-z14a carbon dioxide sensor, UART output, using USART2. 2. Wiring
The positive (pin 1) is connected to the P5 3 feet 5V, the negative (PIN 3) is connected to the P5 5 feet Gnd,rxd (pin 11) P5 6 feet Txd,txd (pin 19) connected P5 7 feet RXD. 3. Debug Key issues (1) Baud rate 9600, data bit 8 bit, stop bit 1 bit, check bit none. (2) Communication mode: STM32 sends the instruction of reading CO2 concentration through US2_TX, the sensor returns the concentration data by US2_RX. (3) Read gas concentration value command
0xFF 0x01 0x86 0x00 0x00 0x00 0x00 0x00 0x79
return value
0xFF 0x86 High Low----checksum value
Gas concentration value = high * + Low
(4) Calibration and calculation
<1> from Byte1 to byte7:0x01 + 0x86 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 = 0x87
<2> Reverse: 0xff-0x87 = 0x78
<3> Inverse plus 1:0x78 + 0x01 = 0x79
Char getchecksum (char *packet)
{
char I, checksum;
for (i = 1; i < 8; i++)
{
checksum + = Packet[i]
;
} checksum = 0xff–checksum;
Checksum + = 1;
return checksum;
}
(5) Start by using the Usart_senddata function to send command data to the serial port:
for (i = 0; i < 9; i++)//Send read CO2 gas concentration instruction, after sending a byte must delay a period of time sensor to correctly receive the instruction
{
usart_senddata (usart2,co2txbuffer[ I]);
Delay_ms (+);
}
The discovery sends the reading CO2 gas concentration instruction, after sending a byte must delay a period of time the sensor to receive the instruction correctly, altogether sends 9 bytes.
It was later discovered that there was a dedicated send data function usart_senddata_length (usart2,co2txbuffer,9):
void Usart_senddata_length (usart_typedef* usartx, u8* data,u16 Length)
{/
* Check The parameters */
U16 i;< C3/>for (i=0;i<length;i++)
{
usart_senddata (Usartx, data[i]);//Send data to the serial while
(Usart_getflagstatus ( USARTX,USART_FLAG_TC)!=set);//wait for Send end
}
(6) Serial 2 interrupt processing function, update CO2 gas concentration data co2data:
void Usart2_irqhandler (void) //Serial 2 Interrupt Service program
{
char i, checksum = 0;
if (Usart_getitstatus (USART2, usart_it_rxne)! = RESET)//Receive interrupt
{
usart_rx_buf_2[usart2count++] = Usart_ Receivedata (USART2);//Read 9 bytes to usart_rx_buf_2
if (usart2count = = 9)
Usart2count = 0;//when the 9th character is received, the usart_rx_ from the array Buf_1 Start write//
calculate checksum
//1, from Byte1 to byte7:0x01 + 0x86 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 = 0x87
//2, Reverse: 0xFF- 0x87 = 0x78
//3, Inverse plus 1:0x78 + 0x01 = 0x79 for
(i = 1; i < 8; i++)
{
checksum + = usart_rx_buf_2[i];< c16/>}
checksum = 0xff-checksum;
Checksum + = 1;
}
if (checksum = = Usart_rx_buf_2[8])//prove that the received data is correct
co2data = usart_rx_buf_2[2] * + usart_rx_buf_2[3];
}
(7) Code address
4.mh-z14a Carbon dioxide sensor data