diff --git a/README.md b/README.md index e32e5fa..c71fbb2 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,16 @@ # 基于 Raspberry Pico / Pico W 的厨房危险(火灾)报警 (Pico W WiFi传输暂时不玩) - * 使用 DS18B20温度传感器 - * 使用 CH4 N55A甲烷气体传感器(进口) (弃用) - * 使用 PASCO2V01 CO2二氧化碳传感器模块(进口模块暂时买不到!) - * 使用 MH-Z14B CO2二氧化碳传感器模块(国产)(0 - 5000ppm) - * 使用 ZE07-CO CO一氧化碳传感器模块(国产) - * 使用 HC-12 433MHZ传感器模块(国产) - * 使用 ZC05/ZC13 可燃气体(天然气 CH4)传感器模块(国产) -## Build -``` +* 使用 DS18B20温度传感器 +* 使用 CH4 N55A甲烷气体传感器(进口) (弃用) +* 使用 PASCO2V01 CO2二氧化碳传感器模块(进口模块暂时买不到!) +* 使用 MH-Z14B CO2二氧化碳传感器模块(国产)(0 - 5000ppm) +* 使用 ZE07-CO CO一氧化碳传感器模块(国产) +* 使用 HC-12 433MHZ传感器模块(国产) +* 使用 ZC05/ZC13 可燃气体(天然气 CH4)传感器模块(国产) + +## 源码构建 + +```bash # 使用WSL Debian GNU/Linux 12 (bookworm) 构建 # 确保Pico-SDK环境变量 export PICO_SDK_PATH=/mnt/c/Users/niuyuling/Desktop/raspberry-pico/SDK/pico-sdk @@ -29,7 +31,7 @@ # 树莓派Zero W 433MHZ HC-12接收服务端构建 - apt install libmysqlclient-dev + apt install libmysqlclient-dev cd ~ git clone https://github.com/WiringPi/WiringPi.git cd WiringPi @@ -39,7 +41,8 @@ ./hc-12 ``` -## display + +## 展示 + ![brief](HARDWARE/IMG/db.jpg) ![brief](HARDWARE/IMG/display.png) - diff --git a/SOFTWARE-FreeRTOS/Source/DS18B20.cpp b/SOFTWARE-FreeRTOS/Source/DS18B20.cpp index 56c371d..be53c27 100644 --- a/SOFTWARE-FreeRTOS/Source/DS18B20.cpp +++ b/SOFTWARE-FreeRTOS/Source/DS18B20.cpp @@ -12,25 +12,23 @@ void DS18B20(void *pvParameters) one_wire.init(); rom_address_t address { }; - + _printTaskStackHighWaterMark("DS18B20"); - while (1) - { + while (1) { one_wire.single_device_read_rom(address); one_wire.convert_temperature(address, true, false); TEMPERATURE = one_wire.temperature(address); - //printf("Device Address: %02x%02x%02x%02x%02x%02x%02x%02x Temperature: %3.1f°C\n", address.rom[0], address.rom[1], address.rom[2], address.rom[3], - // address.rom[4], address.rom[5], address.rom[6], address.rom[7], one_wire.temperature(address)); - + printf("Device Address: %02x%02x%02x%02x%02x%02x%02x%02x Temperature: %3.1f°C\n", address.rom[0], address.rom[1], address.rom[2], address.rom[3], address.rom[4], address.rom[5], address.rom[6], address.rom[7], one_wire.temperature(address)); + // 发送数据到队列 xQueueSend(xQueue, &TEMPERATURE, portMAX_DELAY); vTaskDelay(pdMS_TO_TICKS(1000)); - + //_printTaskStackHighWaterMark("DS18B20"); vTaskDelay(pdMS_TO_TICKS(3000)); // 非阻塞延时 } - - return ; + + return; } diff --git a/SOFTWARE-FreeRTOS/Source/DS18B20.hpp b/SOFTWARE-FreeRTOS/Source/DS18B20.hpp index 14ff5fe..b4abc09 100644 --- a/SOFTWARE-FreeRTOS/Source/DS18B20.hpp +++ b/SOFTWARE-FreeRTOS/Source/DS18B20.hpp @@ -15,7 +15,6 @@ #define DS18B20_PIN 15 // DS18B20 引脚 - extern QueueHandle_t xQueue; extern void DS18B20(void *pvParameters); diff --git a/SOFTWARE-FreeRTOS/Source/HC-12.hpp b/SOFTWARE-FreeRTOS/Source/HC-12.hpp index 506fff6..5d15999 100644 --- a/SOFTWARE-FreeRTOS/Source/HC-12.hpp +++ b/SOFTWARE-FreeRTOS/Source/HC-12.hpp @@ -7,8 +7,8 @@ #include "uart_rx.pio.h" #define HC_12_PIO pio1 -#define HC_12_PIO_TX_PIN 16 // 接 HC-12 RX -#define HC_12_PIO_RX_PIN 15 // 接 HC-12 TX +#define HC_12_PIO_TX_PIN 16 // 接 HC-12 RX +#define HC_12_PIO_RX_PIN 15 // 接 HC-12 TX #define HC_12_PIO_SM_TX 0 #define HC_12_PIO_SM_RX 1 #define HC_12_PIO_SERIAL_BAUD 9600 diff --git a/SOFTWARE-FreeRTOS/Source/MHZ14B.cpp b/SOFTWARE-FreeRTOS/Source/MHZ14B.cpp index 0ad3665..334055b 100644 --- a/SOFTWARE-FreeRTOS/Source/MHZ14B.cpp +++ b/SOFTWARE-FreeRTOS/Source/MHZ14B.cpp @@ -1,7 +1,6 @@ #include "MHZ14B.hpp" #include "common.hpp" - void MH_Z14B_INIT() { // 初始化UART @@ -16,7 +15,6 @@ void MH_Z14B_INIT() static uint16_t MH_Z14B(int *MH_Z14B_DATA_IS_OK) { - // 0x86 读气体浓度值 uint8_t CMD[9] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 }; uart_write_blocking(UART1, CMD, 9); @@ -60,15 +58,13 @@ void CO2(void *pvParameters) int MH_Z14B_DATA_IS_OK = 0; MH_Z14B_INIT(); _printTaskStackHighWaterMark("MH_Z14B"); - - while(1) - { + + while (1) { CO2_DATA = MH_Z14B(&MH_Z14B_DATA_IS_OK); if (CO2_DATA != -1 && MH_Z14B_DATA_IS_OK == 1) { printf("CO2 Concentration: %d ppm\n", CO2_DATA); } - - _printTaskStackHighWaterMark("MH_Z14B"); + //_printTaskStackHighWaterMark("MH_Z14B"); vTaskDelay(pdMS_TO_TICKS(3000)); // 非阻塞延时 } -} \ No newline at end of file +} diff --git a/SOFTWARE-FreeRTOS/Source/ZC13.cpp b/SOFTWARE-FreeRTOS/Source/ZC13.cpp index 2fb6d52..87fb4a4 100644 --- a/SOFTWARE-FreeRTOS/Source/ZC13.cpp +++ b/SOFTWARE-FreeRTOS/Source/ZC13.cpp @@ -12,26 +12,28 @@ int ZC13_INIT() return 0; } -int ZC13_PIO_UART_TX_DATA(PIO pio, uint sm, uint8_t *DATA, int DATA_LEN) { - - for (int i = 0; i < DATA_LEN; i++) { +int ZC13_PIO_UART_TX_DATA(PIO pio, uint sm, uint8_t * DATA, int DATA_LEN) +{ + + for (int i = 0; i < DATA_LEN; i++) { uart_tx_program_putc(pio, sm, DATA[i]); sleep_ms(3); } - - return 0; + + return 0; } -int ZC13_PIO_UART_RX_DATA(PIO pio, uint sm, uint8_t *DATA, int DATA_LEN) { +int ZC13_PIO_UART_RX_DATA(PIO pio, uint sm, uint8_t * DATA, int DATA_LEN) +{ char c = '\0'; int received_count = 0; - int timeout_ms = 100; // 设置较长的超时时间 + int timeout_ms = 100; // 设置较长的超时时间 while (received_count < DATA_LEN && timeout_ms > 0) { if (uart_rx_program_available(pio, sm)) { c = uart_rx_program_getc(pio, sm); DATA[received_count++] = c; - printf("0x%X ", c); + //printf("0x%X ", c); if (c == '\n') { // 接收到换行符,停止接收数据 break; @@ -58,15 +60,14 @@ int ZC13(const char *model) // 发送指令 uint8_t CH4_CMD[9] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 }; - ZC13_PIO_UART_TX_DATA(ZC13_PIO, ZC13_PIO_SM_TX, CH4_CMD, sizeof(CH4_CMD)); + ZC13_PIO_UART_TX_DATA(ZC13_PIO, ZC13_PIO_SM_TX, CH4_CMD, sizeof(CH4_CMD)); sleep_ms(200); - - // 接收指令 - CH4_DATA_LEN = ZC13_PIO_UART_RX_DATA(ZC13_PIO, ZC13_PIO_SM_RX, CH4_DATA, 9); + // 接收指令 + CH4_DATA_LEN = ZC13_PIO_UART_RX_DATA(ZC13_PIO, ZC13_PIO_SM_RX, CH4_DATA, 9); - printf("\n"); - printf("%d\n", CH4_DATA_LEN); + //printf("\n"); + // printf("%d\n", CH4_DATA_LEN); uint8_t highByte = CH4_DATA[2]; // 假设这是气体浓度高位字节 uint8_t lowByte = CH4_DATA[3]; // 假设这是气体浓度高位字节 @@ -77,26 +78,26 @@ int ZC13(const char *model) printf("CH4 sensor malfunction!\n"); } else { if (CH4_DATA[1] == 0X86) { - if ( 0 == strcasecmp(model, "ZC05")) { - // 计算气体浓度值 - uint16_t gasConcentration = (highByte & 0x3F) * 256 + lowByte; - // 输出气体浓度值 - printf("CH4 Concentration: %uppm\n", gasConcentration); - - return gasConcentration; - } - - if ( 0 == strcasecmp(model, "ZC13")) { - // 计算气体浓度值 - uint16_t gasConcentration = (highByte & 0x1F) * 256 + lowByte; - // 输出气体浓度值 - printf("CH4 Concentration: %uppm\n", gasConcentration); - - return gasConcentration; - } + if (0 == strcasecmp(model, "ZC05")) { + // 计算气体浓度值 + uint16_t gasConcentration = (highByte & 0x3F) * 256 + lowByte; + // 输出气体浓度值 + printf("CH4 Concentration: %uppm\n", gasConcentration); + + return gasConcentration; + } + + if (0 == strcasecmp(model, "ZC13")) { + // 计算气体浓度值 + uint16_t gasConcentration = (highByte & 0x1F) * 256 + lowByte; + // 输出气体浓度值 + printf("CH4 Concentration: %uppm\n", gasConcentration); + + return gasConcentration; + } } } - + return -1; } @@ -104,11 +105,11 @@ void CH4(void *pvParameters) { ZC13_INIT(); _printTaskStackHighWaterMark("ZC13"); - while(1) - { - + + while (1) { + ZC13("ZC05"); - _printTaskStackHighWaterMark("ZC13"); + //_printTaskStackHighWaterMark("ZC13"); vTaskDelay(pdMS_TO_TICKS(3000)); // 非阻塞延时 } -} \ No newline at end of file +} diff --git a/SOFTWARE-FreeRTOS/Source/ZC13.hpp b/SOFTWARE-FreeRTOS/Source/ZC13.hpp index 3f04a0a..5998f20 100644 --- a/SOFTWARE-FreeRTOS/Source/ZC13.hpp +++ b/SOFTWARE-FreeRTOS/Source/ZC13.hpp @@ -12,11 +12,11 @@ #include "pico/stdlib.h" #include "hardware/pio.h" #include "uart_tx.pio.h" -#include "uart_rx.pio.h" +#include "uart_rx.pio.h" #define ZC13_PIO pio0 -#define ZC13_PIO_TX_PIN 19 // 接ZC13 4 TX PIN -#define ZC13_PIO_RX_PIN 20 // 接ZC13 5 RX PIN +#define ZC13_PIO_TX_PIN 19 // 接ZC13 4 TX PIN +#define ZC13_PIO_RX_PIN 20 // 接ZC13 5 RX PIN #define ZC13_PIO_SM_TX 0 #define ZC13_PIO_SM_RX 1 #define ZC13_PIO_SERIAL_BAUD 9600 diff --git a/SOFTWARE-FreeRTOS/Source/common.cpp b/SOFTWARE-FreeRTOS/Source/common.cpp index e235bc6..4f46658 100644 --- a/SOFTWARE-FreeRTOS/Source/common.cpp +++ b/SOFTWARE-FreeRTOS/Source/common.cpp @@ -34,31 +34,31 @@ void vApplicationTickHook(void) /* The full demo includes a software timer demo/test that requires prodding periodically from the tick interrupt. */ /*完整的演示包括软件定时器演示/测试,需要 - 从滴答声中断中周期性地发出提示*/ + 从滴答声中断中周期性地发出提示 */ #if (mainENABLE_TIMER_DEMO == 1) vTimerPeriodicISRTests(); #endif /* Call the periodic queue overwrite from ISR demo. */ - /*调用ISR演示中的周期性队列覆盖*/ + /*调用ISR演示中的周期性队列覆盖 */ #if (mainENABLE_QUEUE_OVERWRITE == 1) vQueueOverwritePeriodicISRDemo(); #endif /* Call the periodic event group from ISR demo. */ - /*从ISR演示中调用定期事件组*/ + /*从ISR演示中调用定期事件组 */ #if (mainENABLE_EVENT_GROUP == 1) vPeriodicEventGroupsProcessing(); #endif /* Call the code that uses a mutex from an ISR. */ - /*从ISR调用使用互斥的代码*/ + /*从ISR调用使用互斥的代码 */ #if (mainENABLE_INTERRUPT_SEMAPHORE == 1) vInterruptSemaphorePeriodicTest(); #endif /* Call the code that 'gives' a task notification from an ISR. */ - /*调用从ISR“发出”任务通知的代码*/ + /*调用从ISR“发出”任务通知的代码 */ #if (mainENABLE_TASK_NOTIFY == 1) xNotifyTaskFromISR(); #endif @@ -66,16 +66,12 @@ void vApplicationTickHook(void) #endif } - void _printTaskStackHighWaterMark(const char *task_name) { TaskHandle_t currentTask = xTaskGetCurrentTaskHandle(); - if (currentTask != NULL) - { + if (currentTask != NULL) { printf("%s TASK STACK HIGH WATER MARK: %ld\n", task_name, uxTaskGetStackHighWaterMark(currentTask)); - } - else - { + } else { printf("FAILED TO GET CURRENT TASK HANDLE.\n"); } } diff --git a/SOFTWARE-FreeRTOS/Source/common.hpp b/SOFTWARE-FreeRTOS/Source/common.hpp index 00454e1..f77bff0 100644 --- a/SOFTWARE-FreeRTOS/Source/common.hpp +++ b/SOFTWARE-FreeRTOS/Source/common.hpp @@ -10,7 +10,6 @@ #include #include "hardware/pio.h" - #define BUILD(fmt...) do { fprintf(stderr,"%s %s ",__DATE__,__TIME__); fprintf(stderr, ##fmt); } while(0) static inline bool uart_rx_program_available(PIO pio, uint sm) diff --git a/SOFTWARE-FreeRTOS/Source/main.cpp b/SOFTWARE-FreeRTOS/Source/main.cpp index 7069137..0af4f22 100644 --- a/SOFTWARE-FreeRTOS/Source/main.cpp +++ b/SOFTWARE-FreeRTOS/Source/main.cpp @@ -19,8 +19,8 @@ #include "MHZ14B.hpp" #ifndef PICO_DEFAULT_LED_PIN - #warning pio/hello_pio example requires a board with a regular LED - #define PICO_DEFAULT_LED_PIN 25 +#warning pio/hello_pio example requires a board with a regular LED +#define PICO_DEFAULT_LED_PIN 25 #endif void Led_Blinky(void *pvParameters) @@ -30,24 +30,23 @@ void Led_Blinky(void *pvParameters) const uint LED_PIN = PICO_DEFAULT_LED_PIN; gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); - + _printTaskStackHighWaterMark("Led_Blinky"); float TEMPERATURE; - + while (1) { vTaskDelay(pdMS_TO_TICKS(500)); gpio_put(LED_PIN, 1); - + vTaskDelay(pdMS_TO_TICKS(500)); gpio_put(LED_PIN, 0); - + // 从队列接收数据 if (xQueueReceive(xQueue, &TEMPERATURE, portMAX_DELAY) == pdPASS) { // 处理接收到的数据 printf("%f\n", TEMPERATURE); } - //_printTaskStackHighWaterMark("Led_Blinky"); } @@ -60,7 +59,7 @@ void Read_Onboard_Temperature(void *pvParameters) adc_init(); adc_set_temp_sensor_enabled(true); adc_select_input(4); // Input 4 is the onboard temperature sensor. - + //_printTaskStackHighWaterMark("Read_Onboard_Temperature"); while (1) { @@ -70,9 +69,9 @@ void Read_Onboard_Temperature(void *pvParameters) float tempC = 27.0f - (adc - 0.706f) / 0.001721f; printf("Onboard temperature %.02f°C %.02f°F\n", tempC, (tempC * 9 / 5 + 32)); - + //_printTaskStackHighWaterMark("Read_Onboard_Temperature"); - + vTaskDelay(pdMS_TO_TICKS(3000)); // 非阻塞延时 } } @@ -82,12 +81,10 @@ int main(void) stdio_init_all(); sleep_ms(3000); //set_sys_clock_khz(250000, true); - - + // 创建队列 xQueue = xQueueCreate(10, sizeof(long)); - - + // 创建任务 BaseType_t xReturned; TaskHandle_t Led_Blinky_xHandle = NULL; @@ -97,31 +94,25 @@ int main(void) // 板载LED闪烁 xReturned = xTaskCreate(Led_Blinky, "Blinky task", 512, NULL, tskIDLE_PRIORITY, &Led_Blinky_xHandle); - if (xReturned == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) - { + if (xReturned == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) { printf("Blinky Task Error!"); } - // DS18B20 xReturned = xTaskCreate(DS18B20, "DS18B20 task", 1024, NULL, tskIDLE_PRIORITY, &DS18B20_xHandle); - if (xReturned == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) - { + if (xReturned == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) { printf("DS18B20() Task Error!"); } - // CH4 xReturned = xTaskCreate(CH4, "CH4 task", 1024, NULL, tskIDLE_PRIORITY, &CH4_xHandle); - if (xReturned == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) - { + if (xReturned == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) { printf("CH4() Task Error!"); } - // CO2 xReturned = xTaskCreate(CO2, "CO2 task", 1024, NULL, tskIDLE_PRIORITY, &CO2_xHandle); - if (xReturned == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) - { + if (xReturned == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) { printf("CO2() Task Error!"); } + vTaskStartScheduler(); return 0; diff --git a/SOFTWARE/Source/HC-12.hpp b/SOFTWARE/Source/HC-12.hpp index 506fff6..5d15999 100644 --- a/SOFTWARE/Source/HC-12.hpp +++ b/SOFTWARE/Source/HC-12.hpp @@ -7,8 +7,8 @@ #include "uart_rx.pio.h" #define HC_12_PIO pio1 -#define HC_12_PIO_TX_PIN 16 // 接 HC-12 RX -#define HC_12_PIO_RX_PIN 15 // 接 HC-12 TX +#define HC_12_PIO_TX_PIN 16 // 接 HC-12 RX +#define HC_12_PIO_RX_PIN 15 // 接 HC-12 TX #define HC_12_PIO_SM_TX 0 #define HC_12_PIO_SM_RX 1 #define HC_12_PIO_SERIAL_BAUD 9600 diff --git a/SOFTWARE/Source/MAIN.cpp b/SOFTWARE/Source/MAIN.cpp index 955610c..ab72584 100644 --- a/SOFTWARE/Source/MAIN.cpp +++ b/SOFTWARE/Source/MAIN.cpp @@ -297,8 +297,6 @@ int main() } watchdog_update(); // 喂狗 - - // CH4 FIFO_ = multicore_fifo_pop_blocking(); if (FIFO_ == 1) { @@ -325,22 +323,22 @@ int main() printf("Temperature: %.3f°C\n", TEMPERATURE); } //_433_MHZ(addDigit(TEMPERATURE, SIGN_DS18B20)); - - if (TEMPERATURE != 85) { - char TEMPERATURE_TEMP[BUFER] = { 0 }; - sprintf(TEMPERATURE_TEMP, "Temperature: %.3f°C\n", TEMPERATURE); - _HC_12(TEMPERATURE_TEMP); - TEMPERATURE = -1; - } + if (TEMPERATURE != 85) { + char TEMPERATURE_TEMP[BUFER] = { 0 }; + sprintf(TEMPERATURE_TEMP, "Temperature: %.3f°C\n", TEMPERATURE); + _HC_12(TEMPERATURE_TEMP); + + TEMPERATURE = -1; + } } watchdog_update(); // 喂狗 - - // ZC13 CH4 传感器 - char CH4_DATA[BUFER] = { 0 }; - sprintf(CH4_DATA, "CH4 Concentration: %d\n", ZC13("ZC05")); - _HC_12(CH4_DATA); + + // ZC13 CH4 传感器 + char CH4_DATA[BUFER] = { 0 }; + sprintf(CH4_DATA, "CH4 Concentration: %d\n", ZC13("ZC05")); + _HC_12(CH4_DATA); watchdog_update(); // 喂狗 // ME2_CO CO diff --git a/SOFTWARE/Source/MAIN.hpp b/SOFTWARE/Source/MAIN.hpp index d28c571..b8e8557 100644 --- a/SOFTWARE/Source/MAIN.hpp +++ b/SOFTWARE/Source/MAIN.hpp @@ -43,7 +43,7 @@ #define UART1_RX_PIN 4 // MH-Z14B R #define UART0 uart0 -#define UART0_TX_PIN 1 // -#define UART0_RX_PIN 0 // +#define UART0_TX_PIN 1 // +#define UART0_RX_PIN 0 // #endif diff --git a/SOFTWARE/Source/ZC13.cpp b/SOFTWARE/Source/ZC13.cpp index b80755e..72c5a7e 100644 --- a/SOFTWARE/Source/ZC13.cpp +++ b/SOFTWARE/Source/ZC13.cpp @@ -12,26 +12,28 @@ int ZC13_INIT() return 0; } -int ZC13_PIO_UART_TX_DATA(PIO pio, uint sm, uint8_t *DATA, int DATA_LEN) { - - for (int i = 0; i < DATA_LEN; i++) { +int ZC13_PIO_UART_TX_DATA(PIO pio, uint sm, uint8_t * DATA, int DATA_LEN) +{ + + for (int i = 0; i < DATA_LEN; i++) { uart_tx_program_putc(pio, sm, DATA[i]); sleep_ms(3); } - - return 0; + + return 0; } -int ZC13_PIO_UART_RX_DATA(PIO pio, uint sm, uint8_t *DATA, int DATA_LEN) { +int ZC13_PIO_UART_RX_DATA(PIO pio, uint sm, uint8_t * DATA, int DATA_LEN) +{ char c = '\0'; int received_count = 0; - int timeout_ms = 100; // 设置较长的超时时间 + int timeout_ms = 100; // 设置较长的超时时间 while (received_count < DATA_LEN && timeout_ms > 0) { if (uart_rx_program_available(pio, sm)) { c = uart_rx_program_getc(pio, sm); DATA[received_count++] = c; - printf("0x%X ", c); + printf("0x%X ", c); if (c == '\n') { // 接收到换行符,停止接收数据 break; @@ -58,15 +60,14 @@ int ZC13(const char *model) // 发送指令 uint8_t CH4_CMD[9] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 }; - ZC13_PIO_UART_TX_DATA(ZC13_PIO, ZC13_PIO_SM_TX, CH4_CMD, sizeof(CH4_CMD)); + ZC13_PIO_UART_TX_DATA(ZC13_PIO, ZC13_PIO_SM_TX, CH4_CMD, sizeof(CH4_CMD)); sleep_ms(200); - - // 接收指令 - CH4_DATA_LEN = ZC13_PIO_UART_RX_DATA(ZC13_PIO, ZC13_PIO_SM_RX, CH4_DATA, 9); + // 接收指令 + CH4_DATA_LEN = ZC13_PIO_UART_RX_DATA(ZC13_PIO, ZC13_PIO_SM_RX, CH4_DATA, 9); printf("\n"); - printf("%d\n", CH4_DATA_LEN); + printf("%d\n", CH4_DATA_LEN); uint8_t highByte = CH4_DATA[2]; // 假设这是气体浓度高位字节 uint8_t lowByte = CH4_DATA[3]; // 假设这是气体浓度高位字节 @@ -77,26 +78,26 @@ int ZC13(const char *model) printf("CH4 sensor malfunction!\n"); } else { if (CH4_DATA[1] == 0X86) { - if ( 0 == strcasecmp(model, "ZC05")) { - // 计算气体浓度值 - uint16_t gasConcentration = (highByte & 0x3F) * 256 + lowByte; - // 输出气体浓度值 - printf("CH4 Concentration: %uppm\n", gasConcentration); - - return gasConcentration; - } - - if ( 0 == strcasecmp(model, "ZC13")) { - // 计算气体浓度值 - uint16_t gasConcentration = (highByte & 0x1F) * 256 + lowByte; - // 输出气体浓度值 - printf("CH4 Concentration: %uppm\n", gasConcentration); - - return gasConcentration; - } + if (0 == strcasecmp(model, "ZC05")) { + // 计算气体浓度值 + uint16_t gasConcentration = (highByte & 0x3F) * 256 + lowByte; + // 输出气体浓度值 + printf("CH4 Concentration: %uppm\n", gasConcentration); + + return gasConcentration; + } + + if (0 == strcasecmp(model, "ZC13")) { + // 计算气体浓度值 + uint16_t gasConcentration = (highByte & 0x1F) * 256 + lowByte; + // 输出气体浓度值 + printf("CH4 Concentration: %uppm\n", gasConcentration); + + return gasConcentration; + } } } - + return -1; } @@ -168,4 +169,4 @@ int ZC13(const char *model) return -1; } -*/ \ No newline at end of file +*/ diff --git a/SOFTWARE/Source/ZC13.hpp b/SOFTWARE/Source/ZC13.hpp index 51fcc67..8641326 100644 --- a/SOFTWARE/Source/ZC13.hpp +++ b/SOFTWARE/Source/ZC13.hpp @@ -9,8 +9,8 @@ #include "uart_rx.pio.h" #define ZC13_PIO pio0 -#define ZC13_PIO_TX_PIN 19 // 接ZC13 4 TX PIN -#define ZC13_PIO_RX_PIN 20 // 接ZC13 5 RX PIN +#define ZC13_PIO_TX_PIN 19 // 接ZC13 4 TX PIN +#define ZC13_PIO_RX_PIN 20 // 接ZC13 5 RX PIN #define ZC13_PIO_SM_TX 0 #define ZC13_PIO_SM_RX 1 #define ZC13_PIO_SERIAL_BAUD 9600