完成了WIFI连接,MQTT订阅发布,光照监测,温湿度数据,继电器控制
This commit is contained in:
146
main/main.c
Executable file
146
main/main.c
Executable file
@@ -0,0 +1,146 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
#include "esp_check.h"
|
||||
#include "esp_log.h"
|
||||
#include "wifi-connect.h" // 包含 Wi-Fi 配网模块头文件(提供 Wi-Fi 连接状态查询和初始化接口)
|
||||
#include "agri_env.h" // 包含农业环境模块头文件(提供 MQTT 功能接口)
|
||||
#include "bh1750_use.h" // 包含 BH1750 封装接口
|
||||
#include <dht.h>
|
||||
#include "driver/gpio.h"
|
||||
#include "relay_ctrl.h" // 包含继电器控制模块头文件(提供继电器控制接口)
|
||||
|
||||
static const char *TAG = "main";
|
||||
|
||||
// 等待 Wi-Fi 连接成功,超时后返回当前连接状态
|
||||
static bool wait_for_wifi_connected(TickType_t timeout_ticks)
|
||||
{
|
||||
const TickType_t start_ticks = xTaskGetTickCount();
|
||||
while ((xTaskGetTickCount() - start_ticks) < timeout_ticks)
|
||||
{
|
||||
if (wifi_connect_get_status() == WIFI_CONNECT_STATUS_CONNECTED)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(200));
|
||||
}
|
||||
return wifi_connect_get_status() == WIFI_CONNECT_STATUS_CONNECTED;
|
||||
}
|
||||
|
||||
// 根据 menuconfig 中的选择定义传感器类型常量
|
||||
#if defined(CONFIG_EXAMPLE_TYPE_DHT11)
|
||||
#define SENSOR_TYPE DHT_TYPE_DHT11
|
||||
#elif defined(CONFIG_EXAMPLE_TYPE_AM2301)
|
||||
#define SENSOR_TYPE DHT_TYPE_AM2301
|
||||
#elif defined(CONFIG_EXAMPLE_TYPE_SI7021)
|
||||
#define SENSOR_TYPE DHT_TYPE_SI7021
|
||||
#else
|
||||
#error "未在 menuconfig 中选择任何 DHT 传感器类型!"
|
||||
#endif
|
||||
|
||||
void dht_test(void *pvParameters)
|
||||
{
|
||||
float temperature, humidity;
|
||||
const gpio_num_t dht_gpio = (gpio_num_t)CONFIG_EXAMPLE_DATA_GPIO;
|
||||
uint32_t timeout_count = 0;
|
||||
|
||||
ESP_LOGI(TAG, "正在启动 DHT 测试任务,引脚: GPIO%d", dht_gpio);
|
||||
ESP_LOGI(TAG, "使用的传感器类型: %d (0:DHT11, 1:AM2301, 2:SI7021)", SENSOR_TYPE);
|
||||
|
||||
// 传感器上电后先等待稳定,避免首读超时
|
||||
vTaskDelay(pdMS_TO_TICKS(1500));
|
||||
|
||||
#ifdef CONFIG_EXAMPLE_INTERNAL_PULLUP
|
||||
gpio_set_pull_mode(dht_gpio, GPIO_PULLUP_ONLY);
|
||||
#endif
|
||||
|
||||
while (1)
|
||||
{
|
||||
esp_err_t res = ESP_FAIL;
|
||||
for (int attempt = 1; attempt <= 3; ++attempt)
|
||||
{
|
||||
res = dht_read_float_data(SENSOR_TYPE, dht_gpio, &humidity, &temperature);
|
||||
if (res == ESP_OK)
|
||||
{
|
||||
break;
|
||||
}
|
||||
// 给总线一点恢复时间,再重试
|
||||
vTaskDelay(pdMS_TO_TICKS(200));
|
||||
}
|
||||
|
||||
if (res == ESP_OK)
|
||||
{
|
||||
timeout_count = 0;
|
||||
ESP_LOGI(TAG, "湿度: %.1f%% 温度: %.1f°C", humidity, temperature);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (res == ESP_ERR_TIMEOUT)
|
||||
{
|
||||
timeout_count++;
|
||||
}
|
||||
ESP_LOGW(TAG, "读取失败: %s", esp_err_to_name(res));
|
||||
|
||||
if (timeout_count >= 3)
|
||||
{
|
||||
ESP_LOGW(TAG, "DHT 连续超时,建议检查: 1) DATA 线上拉电阻(4.7k~10k) 2) 传感器供电与地线 3) 是否更换为 GPIO2/3 等普通 IO");
|
||||
timeout_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
vTaskDelay(pdMS_TO_TICKS(2000));
|
||||
}
|
||||
}
|
||||
|
||||
void app_main(void)
|
||||
{
|
||||
ESP_ERROR_CHECK(wifi_connect_init()); // 初始化 Wi-Fi 配网模块
|
||||
ESP_ERROR_CHECK(bh1750_user_init()); // 初始化光照传感器
|
||||
|
||||
ESP_ERROR_CHECK(relay_ctrl_init(GPIO_NUM_6, GPIO_NUM_7, true)); //
|
||||
|
||||
vTaskDelay(pdMS_TO_TICKS(2000)); // 等待系统稳定
|
||||
|
||||
|
||||
if (wait_for_wifi_connected(pdMS_TO_TICKS(60000)))
|
||||
{
|
||||
esp_err_t err = agri_env_mqtt_start();
|
||||
if (err != ESP_OK)
|
||||
{
|
||||
ESP_LOGW(TAG, "MQTT 启动失败: %s", esp_err_to_name(err));
|
||||
}
|
||||
|
||||
// 测试读取光照数据
|
||||
float lux;
|
||||
if (bh1750_user_read(&lux) == ESP_OK)
|
||||
{
|
||||
ESP_LOGI(TAG, "测试读取光照强度: %.2f Lux", lux);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ESP_LOGW(TAG, "Wi-Fi 连接超时,暂时跳过 MQTT 启动");
|
||||
}
|
||||
|
||||
// 启动 DHT 传感器测试任务
|
||||
if (xTaskCreate(dht_test, "dht_test", 2048, NULL, 5, NULL) != pdPASS)
|
||||
{
|
||||
ESP_LOGE(TAG, "创建 DHT 任务失败");
|
||||
}
|
||||
|
||||
// 启动一个心跳任务
|
||||
while (1)
|
||||
{
|
||||
ESP_LOGI(TAG, "系统心跳...");
|
||||
// 测试读取光照数据
|
||||
float lux;
|
||||
if (bh1750_user_read(&lux) == ESP_OK)
|
||||
{
|
||||
ESP_LOGI(TAG, "测试读取光照强度: %.2f Lux", lux);
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(10000));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user