/* Scheduler include files. */ #include "FreeRTOS.h" #include "task.h" #include "semphr.h" #include "queue.h" /* Standard demo includes. */ #include "TimerDemo.h" #include "QueueOverwrite.h" #include "EventGroupsDemo.h" #include "IntSemTest.h" #include "TaskNotify.h" #include "main.hpp" #include "lwipopts.h" #include "common.hpp" #include "ds18b20.hpp" #include "ZC13.hpp" #include "ZE07CO.hpp" #include "MHZ14B.hpp" #include "HC-12.hpp" #ifndef PICO_DEFAULT_LED_PIN #warning pio/hello_pio example requires a board with a regular LED #define PICO_DEFAULT_LED_PIN 25 #endif void Led_Blinky(void *pvParameters) { (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"); } } void CPU(void *pvParameters) { (void)pvParameters; adc_init(); adc_set_temp_sensor_enabled(true); adc_select_input(4); // Input 4 is the onboard temperature sensor. _printTaskStackHighWaterMark("CPU_"); while (1) { const float conversionFactor = 3.3f / (1 << 12); float adc = (float)adc_read() * conversionFactor; float tempC = 27.0f - (adc - 0.706f) / 0.001721f; printf("CPU temperature %.02f°C %.02f°F\n", tempC, (tempC * 9 / 5 + 32)); char ONBOARD_TEMPERATURE_TEMP[BUFER] = { 0 }; sprintf(ONBOARD_TEMPERATURE_TEMP, "Onboard temperature %.02f°C %.02f°F\n", tempC, (tempC * 9 / 5 + 32)); _HC_12(ONBOARD_TEMPERATURE_TEMP); _printTaskStackHighWaterMark("CPU_"); vTaskDelay(pdMS_TO_TICKS(3000)); // 非阻塞延时 } } int main(void) { stdio_init_all(); sleep_ms(3000); //set_sys_clock_khz(250000, true); if (watchdog_caused_reboot()) { // 判断是否从看门狗启动或者正常启动 printf("Rebooted by Watchdog!\n"); } else { printf("Clean boot\n"); } watchdog_enable(8300, 1); // 8秒检测是否重新加载看门狗计数器. (不更新计数器则重启硬件, 最高8秒) //watchdog_start_tick(12); // 创建队列 xQueue = xQueueCreate(10, sizeof(long)); _HC_12_INIT(); // 创建任务 BaseType_t xReturned; TaskHandle_t CPU_xHandle = NULL; TaskHandle_t Led_Blinky_xHandle = NULL; TaskHandle_t DS18B20_xHandle = NULL; TaskHandle_t CH4_xHandle = NULL; TaskHandle_t CO_xHandle = NULL; TaskHandle_t CO2_xHandle = NULL; // 板载CPU温度 xReturned = xTaskCreate(CPU, "CPU task", 512, NULL, tskIDLE_PRIORITY, &CPU_xHandle); if (xReturned == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) { printf("CPU() Task Error!"); } // 板载LED闪烁 xReturned = xTaskCreate(Led_Blinky, "Blinky task", 512, NULL, tskIDLE_PRIORITY, &Led_Blinky_xHandle); 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) { printf("DS18B20() Task Error!"); } // CH4 xReturned = xTaskCreate(CH4, "CH4 task", 2048, NULL, tskIDLE_PRIORITY, &CH4_xHandle); if (xReturned == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) { printf("CH4() Task Error!"); } // CO xReturned = xTaskCreate(CO, "CO task", 2048, NULL, tskIDLE_PRIORITY, &CO_xHandle); if (xReturned == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) { printf("CO() Task Error!"); } // CO2 xReturned = xTaskCreate(CO2, "CO2 task", 2048, NULL, tskIDLE_PRIORITY, &CO2_xHandle); if (xReturned == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) { printf("CO2() Task Error!"); } vTaskStartScheduler(); while (1) {}; return 0; }