From 9f863206db95cad9d91dccebf211a6901a461eb6 Mon Sep 17 00:00:00 2001 From: kkira Date: Thu, 18 Jun 2026 21:40:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20STM?= =?UTF-8?q?,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D1=83=D1=82=D0=B0=D0=BD=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- STM32_CO2_NODE/Core/Src/freertos.cpp | 12 ++-- STM32_CO2_NODE/Drivers/MHZ19C/mhz19c.cpp | 80 ++++++++++++++++----- STM32_CO2_NODE/Drivers/MHZ19C/mhz19c.hpp | 21 +++--- STM32_CO2_NODE/FATFS/App/Tasks/can_task.cpp | 30 ++++++++ STM32_CO2_NODE/FATFS/App/Tasks/can_task.hpp | 3 + STM32_CO2_NODE/FATFS/App/Tasks/co2_task.cpp | 35 +++++---- STM32_CO2_NODE/FATFS/App/Tasks/sd_task.cpp | 29 ++++++-- STM32_CO2_NODE/FATFS/App/Tasks/sd_task.hpp | 12 +--- 8 files changed, 161 insertions(+), 61 deletions(-) create mode 100644 STM32_CO2_NODE/FATFS/App/Tasks/can_task.cpp create mode 100644 STM32_CO2_NODE/FATFS/App/Tasks/can_task.hpp diff --git a/STM32_CO2_NODE/Core/Src/freertos.cpp b/STM32_CO2_NODE/Core/Src/freertos.cpp index 9e7dc2b..a246de9 100644 --- a/STM32_CO2_NODE/Core/Src/freertos.cpp +++ b/STM32_CO2_NODE/Core/Src/freertos.cpp @@ -11,6 +11,7 @@ #include "queues.hpp" #include "co2_task.hpp" #include "sd_task.hpp" +#include "can_task.hpp" /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ @@ -97,11 +98,10 @@ void StartSDTask(void *argument) /* CAN Task */ void StartCANTask(void *argument) { - (void)argument; + (void)argument; - for (;;) - { - /* example placeholder */ - osDelay(10); - } + for(;;) + { + CANTask_RunOnce(); + } } diff --git a/STM32_CO2_NODE/Drivers/MHZ19C/mhz19c.cpp b/STM32_CO2_NODE/Drivers/MHZ19C/mhz19c.cpp index 11e1de3..5ce2d65 100644 --- a/STM32_CO2_NODE/Drivers/MHZ19C/mhz19c.cpp +++ b/STM32_CO2_NODE/Drivers/MHZ19C/mhz19c.cpp @@ -3,10 +3,11 @@ MHZ19C::MHZ19C(UART_HandleTypeDef* huart) : uart(huart) { - buildRequest(); + BuildReadFrame(); } -void MHZ19C::buildRequest() { +void MHZ19C::BuildReadFrame() +{ txFrame[0] = 0xFF; txFrame[1] = 0x01; txFrame[2] = 0x86; @@ -15,29 +16,76 @@ void MHZ19C::buildRequest() { txFrame[5] = 0x00; txFrame[6] = 0x00; txFrame[7] = 0x00; - txFrame[8] = checksum(txFrame); + txFrame[8] = Checksum(txFrame); } -uint8_t MHZ19C::checksum(uint8_t* data) { +uint8_t MHZ19C::Checksum(uint8_t* data) +{ uint8_t sum = 0; - for(int i=1;i<8;i++) sum += data[i]; + + for(int i = 1; i < 8; i++) + { + sum += data[i]; + } + return 0xFF - sum + 1; } -void MHZ19C::requestCO2() { - HAL_UART_Transmit_DMA(uart, txFrame, 9); - HAL_UART_Receive_DMA(uart, rxFrame, 9); -} +bool MHZ19C::ReadCO2(uint16_t& ppm) +{ + if(HAL_UART_Transmit( + uart, + txFrame, + 9, + 100) + != HAL_OK) + { + return false; + } -bool MHZ19C::readCO2(uint16_t &ppm) { - if(rxFrame[0] != 0xFF) return false; + if(HAL_UART_Receive( + uart, + rxFrame, + 9, + 100) + != HAL_OK) + { + return false; + } + + if(rxFrame[0] != 0xFF) + { + return false; + } + + ppm = + (rxFrame[2] << 8) | + rxFrame[3]; - ppm = (rxFrame[2] << 8) | rxFrame[3]; return true; } -void MHZ19C::calibrateZero() { - uint8_t cmd[9] = {0xFF,0x01,0x87,0,0,0,0,0,0}; - cmd[8] = checksum(cmd); - HAL_UART_Transmit(uart, cmd, 9, 100); +void MHZ19C::CalibrateZero() +{ + uint8_t cmd[9] = + { + 0xFF, + 0x01, + 0x87, + 0, + 0, + 0, + 0, + 0, + 0 + }; + + cmd[8] = Checksum(cmd); + + HAL_UART_Transmit( + uart, + cmd, + 9, + 100 + ); } diff --git a/STM32_CO2_NODE/Drivers/MHZ19C/mhz19c.hpp b/STM32_CO2_NODE/Drivers/MHZ19C/mhz19c.hpp index f597b97..09022cd 100644 --- a/STM32_CO2_NODE/Drivers/MHZ19C/mhz19c.hpp +++ b/STM32_CO2_NODE/Drivers/MHZ19C/mhz19c.hpp @@ -1,22 +1,27 @@ #pragma once + #include "stm32f1xx_hal.h" + #include -class MHZ19C { +class MHZ19C +{ public: - MHZ19C(UART_HandleTypeDef* huart); - void init(); - void calibrateZero(); - void requestCO2(); - bool readCO2(uint16_t &ppm); + explicit MHZ19C(UART_HandleTypeDef* huart); + + bool ReadCO2(uint16_t& ppm); + + void CalibrateZero(); private: + UART_HandleTypeDef* uart; uint8_t txFrame[9]; uint8_t rxFrame[9]; - void buildRequest(); - uint8_t checksum(uint8_t* data); + void BuildReadFrame(); + + uint8_t Checksum(uint8_t* data); }; diff --git a/STM32_CO2_NODE/FATFS/App/Tasks/can_task.cpp b/STM32_CO2_NODE/FATFS/App/Tasks/can_task.cpp new file mode 100644 index 0000000..2491a9a --- /dev/null +++ b/STM32_CO2_NODE/FATFS/App/Tasks/can_task.cpp @@ -0,0 +1,30 @@ +#include "co2_data.hpp" +#include "queues.hpp" +#include "can_task.hpp" + +#include "co2_can_protocol.hpp" + +extern "C" +{ +#include "can.h" +} + +extern CAN_HandleTypeDef hcan; + +static CANProtocol canProtocol(&hcan); + +void CANTask_RunOnce() +{ + CO2Data data; + + if(xQueueReceive( + g_canQueue, + &data, + pdMS_TO_TICKS(100)) + == pdTRUE) + { + canProtocol.sendCO2( + data.ppm + ); + } +} diff --git a/STM32_CO2_NODE/FATFS/App/Tasks/can_task.hpp b/STM32_CO2_NODE/FATFS/App/Tasks/can_task.hpp new file mode 100644 index 0000000..9330a35 --- /dev/null +++ b/STM32_CO2_NODE/FATFS/App/Tasks/can_task.hpp @@ -0,0 +1,3 @@ +#pragma once + +void CANTask_RunOnce(); diff --git a/STM32_CO2_NODE/FATFS/App/Tasks/co2_task.cpp b/STM32_CO2_NODE/FATFS/App/Tasks/co2_task.cpp index 62c19fd..ddb8d53 100644 --- a/STM32_CO2_NODE/FATFS/App/Tasks/co2_task.cpp +++ b/STM32_CO2_NODE/FATFS/App/Tasks/co2_task.cpp @@ -1,26 +1,35 @@ #include "co2_task.hpp" + #include "mhz19c.hpp" -#include "queues.hpp" #include "co2_data.hpp" +#include "queues.hpp" -extern MHZ19C sensor; +extern "C" +{ +#include "usart.h" +#include "main.h" +} -void CO2Task_Run() { - uint16_t ppm; +extern UART_HandleTypeDef huart1; - while (1) { - sensor.requestCO2(); - HAL_Delay(100); +static MHZ19C sensor(&huart1); - if (sensor.readCO2(ppm)) { - CO2Data data; - data.ppm = ppm; - data.timestamp = HAL_GetTick(); +void CO2Task_RunOnce() +{ + CO2Data data; + if(sensor.ReadCO2(data.ppm)) + { + data.timestamp = HAL_GetTick(); + + if(g_sdQueue != nullptr) + { xQueueSend(g_sdQueue, &data, 0); - xQueueSend(g_canQueue, &data, 0); } - osDelay(1000); + if(g_canQueue != nullptr) + { + xQueueSend(g_canQueue, &data, 0); + } } } diff --git a/STM32_CO2_NODE/FATFS/App/Tasks/sd_task.cpp b/STM32_CO2_NODE/FATFS/App/Tasks/sd_task.cpp index 29c8983..ce3d576 100644 --- a/STM32_CO2_NODE/FATFS/App/Tasks/sd_task.cpp +++ b/STM32_CO2_NODE/FATFS/App/Tasks/sd_task.cpp @@ -1,17 +1,32 @@ #include "sd_task.hpp" + #include "sdcard.hpp" #include "queues.hpp" +#include "co2_data.hpp" + +#include extern SDCardLogger sd; -void SDTask_Run() { +void SDTask_RunOnce() +{ CO2Data data; - while (1) { - if (xQueueReceive(g_sdQueue, &data, portMAX_DELAY)) { - char line[64]; - sprintf(line, "CO2:%d t:%lu", data.ppm, data.timestamp); - sd.write(line); - } + if(xQueueReceive( + g_sdQueue, + &data, + pdMS_TO_TICKS(100)) + == pdTRUE) + { + char line[64]; + + sprintf( + line, + "CO2:%u t:%lu\r\n", + data.ppm, + data.timestamp + ); + + sd.write(line); } } diff --git a/STM32_CO2_NODE/FATFS/App/Tasks/sd_task.hpp b/STM32_CO2_NODE/FATFS/App/Tasks/sd_task.hpp index 5ee8e21..03f0c7f 100644 --- a/STM32_CO2_NODE/FATFS/App/Tasks/sd_task.hpp +++ b/STM32_CO2_NODE/FATFS/App/Tasks/sd_task.hpp @@ -1,13 +1,3 @@ #pragma once -#include "fatfs.h" -#include -class SDCardLogger { -public: - bool init(); - bool write(const std::string &line); - -private: - FIL file; - FATFS fs; -}; +void SDTask_RunOnce();