国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

軟硬件開源項目-智能路燈系統:OneNET云平臺監測+Web網頁控制+代碼詳細分析

朱賀洋 ? 來源:jf_00191030 ? 作者:jf_00191030 ? 2025-08-13 09:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

軟硬件開源項目-智能路燈系統:OneNET云平臺監測+Web網頁控制+代碼解析

智能路燈系統項目下載源碼
本倉庫提供了完整的智能路燈系統項目的源碼,旨在幫助開發者快速搭建和理解智能路燈系統的實現過程。
項目地址:https://gitee.com/zhu-heyang/w55mh32-smart-street-light.git

1 前言

前兩天晚上出去溜達的時候,路過路燈的時候,感覺燈光很強刺的人睜不開眼,而且那么高的亮度一直亮著也不省電,當時我就想要是我來設計路燈的話可能不會這樣設計,如果是我的話一定會加上一個亮度自適應的功能,沒人的時候就亮度低一點有人的時候就更亮一點人走一會才恢復原來的亮度,而且現在物聯網那么發達,應該加上一個遠程控制的功能。于是說干就干,挑硬件時在淘寶上發現了 W55MH32Q 這款開發板,它的性能跟我這個項目的需求特別對得上,然后就選擇了這款開發板,我選它主要有三個原因:
一是自帶以太網功能,無需額外掛載通信模塊,就能穩定運行 MQTT 協議傳輸數據,省去了模塊兼容調試的麻煩,數據傳輸的可靠性也更有保障。
二是接口設計合理,紅外傳感器器和光照傳感器可直接通過標準接口連接,硬件層無需額外電平轉換或隔離電路,適配過程很順暢。
三是集成了串口芯片,無需外接 USB 轉串口模塊,直接通過串口助手就能打印調試信息,對嵌入式開發來說,這種無需外接模塊的調試支持簡直是太方便了。
以此搭建的系統通過紅外和光照傳感器每 5 秒采集一次環境數據,經開發板處理后上傳 OneNET 平臺。自動模式下,光照低于網頁設定閾值時 LED 以 20% 初始亮度開啟(初始亮度可通過網頁端調節),紅外檢測到行人 / 車輛即升至 100%,離開 10 秒后恢復低亮;手動模式支持網頁端直接控制LED燈的開關與亮度。開發板的接口兼容性與網絡穩定性保障了系統精準響應與節能目標。

2 項目環境

2.1 硬件要求

  • W55MH32Q開發板
  • LED燈、光照傳感器、紅外傳感器
  • USB Type-C數據線
  • 路由器

2.2 軟件環境

  • 編譯器:Keil
  • W55MH32驅動庫
  • HBuilder X
  • OneNET云平臺
  • WIZ UartTool串口助手

3 硬件連接和方案

3.1 系統硬件連接

  • LED燈正極連接開發板A0引腳
  • 紅外傳感器數據采樣引腳OUT接開發板A3引腳
  • 光照傳感器數據采樣引腳AO連接開發板A4引腳

3.2 方案圖示

![Alternative Text][1754209011187]

4 MQTT連接OneNET云平臺收發數據流程

4.1 準備階段

注冊賬號在這里不進行贅述,下面我們看如何建立物模型。
創建產品和添加物模型:登錄OneNET物聯網平臺,創建產品并在產品下添加以下物模型功能。
創建設備:在剛剛創建的產品下創建相應設備。

在這里插入圖片描述

4.2 設備詳情

設備詳情:在設備詳情頁中可以查看設備密鑰和產品ID等重要信息。

![Alternative Text][1754444580728]

4.3 Token 密鑰生成

設備與 OneNet 平臺通信時,Token 作為身份憑證用于安全認證。需使用 Token 生成工具:
OneNET Token 生成工具文檔

  1. res 字段:products/{產品id}/devices/{設備名} (使用設備級 Key)。替換 {產品id}{設備名}
  2. et 字段: 訪問過期時間 (Unix 時間戳)。可使用在線轉換工具獲取。
  3. key 字段: 填寫設備的密鑰。
  4. 點擊 generate 生成 Token 密鑰

image.png

4.4 連接、訂閱和發布消息

訂閱主題:$sys/{pid}/{device-name}/thing/property/set
發布主題:$sys/{pid}/{device-name}/thing/property/post
pid是product_id的簡稱,即產品ID。
device-name是設備名稱。
接著我們可以使用上面記錄的連接參數進行連接,當連接成功后,訂閱上面的訂閱主題。并通過發布主題上報物模型數據。
在OneNET平臺,如果產品創建階段選擇的數據格式為OneJSON格式時,接收和發送數據格式都會遵守下面這個格式:

{
  "id": "123",
  "version": "1.0",
  "params": {
  "temperature":"30.5"
  }
}

id:值為"123",這是一個唯一的標識符;params是一個包含設備屬性數據的對象用于上報物模型數據;version:值為 "1.0",表示該消息所遵循的協議版本。

4.5 接收消息處理

接收消息:當接收到消息時,我們只需要按照上面的json格式進行解析,然后進行相應的處理即可。

5 HBuilder X

  • HBuilder X工程下載:
    • 鏈接: https://pan.baidu.com/s/1oIIr3oTnHG-we22AkLQu8w?pwd=6en9
    • 提取碼:6en9
  • 修改步驟:
    1. 下載后導入 HBuilder X
    2. 修改 index.vue 文件:
      • 修改 Token: 替換 const params = {
        author_key: '', //用戶密鑰
        version: '2022-05-01',
        user_id: '', //用戶ID
        } 中的author_key和user_id即可生成用戶 Token。
      • 修改產品 ID 和設備名:url 中替換 product_iddevice_name 參數為實際值。
    3. 修改完畢后即可通過HBuilder X自帶的發行功能對文件進行打包,可打包成網頁或者APP根據需要可自行選擇。

![Alternative Text][1754124884773]

6 主要程序解析

6.1 main.c分析

在主函數中實現以下軟硬件初始化:配置時鐘、串口、定時器,初始化紅外傳感器、光照傳感器和LED燈。
網絡初始化:配置開發板和MQTT客戶端,支持DHCP 動態獲取IP。
數據采集與控制:每5秒采集一次光照強度和監測紅外感應,調用LED燈控制函數。
數據上傳:調用light_control()和do_mqtt()函數將傳感器數據和設備狀態發送到云平臺。

#include "PWM.h"
#include "Timer.h"
#include "adc.h"
#include "bsp_rcc.h"
#include "bsp_tim.h"
#include "bsp_uart.h"
#include "delay.h"
#include "do_mqtt.h"
#include "infrared.h"
#include "light.h"
#include "w55mh32_gpio.h"
#include "wiz_interface.h"
#include "wizchip_conf.h"
#include < stdbool.h >
#include < stdint.h >
#include < stdio.h >
#include < stdlib.h >
#include < string.h >

#define SOCKET_ID 0
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)

/* network information */
wiz_NetInfo default_net_info = {.mac = {0x00, 0x08, 0xdc, 0x12, 0x22, 0x12},
                                .ip = {192, 168, 1, 30},
                                .gw = {192, 168, 1, 1},
                                .sn = {255, 255, 255, 0},
                                .dns = {8, 8, 8, 8},

                                .dhcp = NETINFO_DHCP};

uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0};
static uint8_t mqtt_send_ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0};
static uint8_t mqtt_recv_ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0};

int main(void) {
  /* hardware initialization */
  rcc_clk_config();
  delay_init();

  console_usart_init(115200);

  tim3_init();
  light_init();
  infrared_init();
  pwm_init();
  timer_init();
  ad_init();
  printf("%s MQTT OneNET examplern", _WIZCHIP_ID_);

  /* wiztoe init */
  wiz_toe_init();

  wiz_phy_link_check();

  network_init(ethernet_buf, &default_net_info);

  mqtt_init(SOCKET_ID, mqtt_send_ethernet_buf, mqtt_recv_ethernet_buf);
  while (1) {
    light_control();
    do_mqtt();
  }
}

6.2 do_mqtt.c分析

核心代碼功能:通過MQTT協議實現設備、OneNET云平臺的雙向交互,包括傳感器數據(紅外感應、光照、LED燈狀態)上報及命令下發。

/**
 * @brief 解析JSON格式的控制消息,并根據消息內容控制硬件,最后回復處理結果
 * @param msg 待解析的JSON格式字符串,包含控制指令(如LED開關、模式切換等)
 * @note 該函數使用cJSON庫解析JSON,提取相關控制參數后更新全局變量以控制硬件,
 *       并通過MQTT協議向云平臺回復處理結果
 */
void json_decode(char *msg)
{
    int ret;                         // 函數返回值,用于判斷MQTT發布是否成功
    char replymsg[128] = {0};        // 存儲回復云平臺的JSON格式字符串
    cJSON *id = NULL;                // 指向JSON中"id"字段的cJSON對象(消息標識)
    cJSON *jsondata = NULL;          // 指向解析后的根cJSON對象
    cJSON *params = NULL;            // 指向JSON中"params"字段的cJSON對象(參數集合)
    cJSON *LED = NULL;               // 指向"params"中"LED"字段(LED開關控制
    cJSON *Mode_switch = NULL;       // 指向"params"中"Mode_switch"字段(模式切換控制)
    cJSON *Brightness_set = NULL;    // 指向"params"中"Brightness_set"字段(亮度設置)
    cJSON *light_threshold = NULL;   // 指向"params"中"light_threshold"字段(光感閾值設置)

    // 解析輸入的JSON字符串,生成cJSON對象樹
    jsondata = cJSON_Parse(msg);
    if (jsondata == NULL)
    {
        printf("json parse fail.rn");  // 解析失敗(如格式錯誤),打印錯誤信息
        return;
    }

    // 從根對象中獲取各字段值
    id = cJSON_GetObjectItem(jsondata, "id");                  // 獲取消息標識"id"
    params = cJSON_GetObjectItem(jsondata, "params");          // 獲取參數集合"params"
    LED = cJSON_GetObjectItem(params, "LED");                  // 從params中獲取LED控制參數
    Mode_switch = cJSON_GetObjectItem(params, "Mode_switch");  // 獲取模式切換參數
    Brightness_set = cJSON_GetObjectItem(params, "Brightness_set");  // 獲取亮度設置參數
    light_threshold = cJSON_GetObjectItem(params, "light_threshold");  // 獲取光感閾值參數

    // 根據LED參數控制LED開關(通過PWM占空比實現)
    if (LED != NULL)  // 僅當JSON中包含"LED"字段時處理
    {
        if (LED- >valueint)  // LED值為非0(通常1表示開啟)
        {
            
            g_pwm_DutyCycle = 20;  // 設置PWM占空比為20(LED開啟,亮度20%)
        }
        else  // LED值為0(表示關閉)
        {
            
            g_pwm_DutyCycle = 0;   // PWM占空比設為0(LED關閉)
        }
    }

    // 根據模式切換參數切換工作模式
    if (Mode_switch != NULL)  // 僅當JSON中包含"Mode_switch"字段時處理
    {
        if (Mode_switch- >valueint)  // 模式值為非0(通常1表示自動模式)
        {
            
            g_Modes_witch = 1;  // 更新全局模式變量為自動模式
        }
        else  // 模式值為0(表示手動模式/關閉自動)
        {
            
            g_Modes_witch = 0;    // 更新全局模式變量為手動模式
            g_pwm_DutyCycle = 0;  // 同時關閉LED(手動模式初始狀態)
        }
    }

    // 根據亮度設置參數調整LED亮度
    if (Brightness_set != NULL)  // 僅當JSON中包含"Brightness_set"字段時處理
    {
        if (Brightness_set- >valueint)  // 亮度值有效(非0)
        {
            g_Brightness_set = Brightness_set- >valueint;  // 更新全局亮度設置變量
            g_pwm_DutyCycle = Brightness_set- >valueint;   // 直接設置PWM占空比(控制亮度)
            g_Low_bright = Brightness_set- >valueint;      // 更新低亮度閾值(可能用于自動模式)
        }
    }

    // 根據光感閾值參數設置光感檢測閾值
    if (light_threshold != NULL)  // 僅當JSON中包含"light_threshold"字段時處理
    {
        if (light_threshold- >valueint)  // 閾值有效(非0)
        {
            g_light_thres_low = light_threshold- >valueint;  // 更新全局光感低閾值變量
        }
    }

    // 應用PWM占空比設置(硬件層面更新LED亮度)
    PWM_SetCompare1(g_pwm_DutyCycle);

    // 構建回復云平臺的JSON消息(包含原消息id和成功狀態)
    pubmessage.qos = QOS0;  // 設置MQTT消息的QoS等級為0(最多一次)
    // 格式化回復消息,包含消息標識id和處理結果(200表示成功)
    sprintf(replymsg, "{"id":"%s","code":200,"msg":"success"}", id- >valuestring);
    printf("reply:%srn", replymsg);  // 打印回復消息用于調試

    // 設置MQTT發布消息的負載(內容)及長度
    pubmessage.payload = replymsg;
    pubmessage.payloadlen = strlen(replymsg);

    // 通過MQTT協議發布回復消息到指定主題
    ret = MQTTPublish(&c, mqtt_params.subtopic_reply, &pubmessage);
    if (ret != SUCCESSS)  // 發布失敗
    {
        run_status = MQTT_ERR;  // 更新全局運行狀態為MQTT錯誤
    }
    else  // 發布成功
    {
        // 打印發布成功的信息(主題和消息內容)
        printf("publish:%s,%srnrn", mqtt_params.subtopic_reply, (char *)pubmessage.payload);
    }

    // 釋放cJSON對象樹,避免內存泄漏
    cJSON_Delete(jsondata);
}

/**
 * @brief 生成包含傳感器數據和設備狀態的JSON格式字符串
 * @param json_buf 用于存儲生成的JSON字符串的緩沖區
 * @param buf_len 緩沖區的長度(字節)
 * @return 1 - 生成成功;0 - 生成失敗(參數無效或緩沖區過小)
 * @note 該函數將當前傳感器數據(如光照強度、人體檢測狀態)和設備狀態(如LED開關、模式等)
 *       格式化為JSON字符串,用于上報到云平臺或其他系統
 */
static int generate_sensor_json(char *json_buf, uint16_t buf_len)
{
    // 參數校驗:緩沖區為空或長度不足(最小需256字節,確保能容納JSON結構)
    if (json_buf == NULL || buf_len < 256)
        return 0;

    sprintf(json_buf,
            "{"id":"123","version":"1.0","params":{"
            ""light":{"value":%d},"
            ""induct":{"value":%s},"
            ""LED":{"value":%s},"
            ""Mode_switch":{"value":%s},"
            ""light_threshold":{"value":%d},"
            ""Brightness_set":{"value":%d}"
            "}}",
            g_light_Intensity,                  // 光照強度值(全局變量)
            g_is_Person_Detected ? "true" : "false",  // 人體檢測狀態(全局變量)
            g_pwm_DutyCycle ? "true" : "false",       // LED狀態(通過PWM占空比判斷)
            g_Modes_witch ? "true" : "false",         // 工作模式(全局變量)
            g_light_thres_low,                  // 光感閾值(全局變量)
            g_Brightness_set                    // 亮度設置(全局變量)
           );

    return 1;  // 生成成功
}

6.3 Infraed.c分析

該文件實現紅外傳感器的紅外感應功能,核心如下:
初始化:配置開發板的PA3引腳為上拉輸入模式。
數據讀取:讀取經ADC轉換濾波之后的數據。
功能:實時監測是否有人員及車輛經過。

#include "adc.h"
#include "bsp_uart.h"
#include "infrared.h"
#include "w55mh32_gpio.h"
#include "w55mh32_rcc.h"
#include < stdbool.h >
#include < stdio.h >
#include < string.h >

/**
 * @brief 初始化紅外傳感器(配置PA3為模擬輸入模式)
 * @note 紅外傳感器連接至PA3,復用為ADC輸入通道3
 */
void infrared_init(void) {
  GPIO_InitTypeDef gpio_init_structure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA時鐘

  // 配置PA3為模擬輸入(用于讀取紅外傳感器的模擬信號
  gpio_init_structure.GPIO_Pin = GPIO_Pin_3;
  gpio_init_structure.GPIO_Mode = GPIO_Mode_AIN; // 模擬輸入模式
  GPIO_Init(GPIOA, &gpio_init_structure);
}

/**
 * @brief 獲取紅外傳感器檢測結果(基于濾波后的AD值)
 * @return 1-檢測到物體(AD值< 1500),0-未檢測到物體(AD值≥1500)
 * @note 依賴ADC模塊的濾波功能(AD_FilterProcess),需先初始化ADC
 */
uint16_t infrared_get_data(void) {
  uint16_t temp_data;
  uint16_t temp;

  ad_filter_process();         // 執行AD濾波,獲取穩定值
  temp = ad_filtered_value[0]; // 紅外傳感器對應ADC通道0的濾波后值

  // 根據閾值判斷是否檢測到物體
  if (temp < 1500) {
    temp_data = 1; // 檢測到物體
  } else {
    temp_data = 0; // 未檢測到物體
  }

  return temp_data;
}

/**
 * @brief 讀取紅外傳感器原始AD值(未經過濾波)
 * @return 原始AD采樣值(直接取自ADC原始緩沖區)
 */
uint16_t infrared_read_raw(void) {
  return ad_value[0]; // 紅外傳感器對應ADC通道0的原始值
}

6.4 light.c分析

該文件實現光照傳感器的數據采集及燈光處理功能,核心如下:
初始化配置:使能GPIOA,將 PA4配置為模擬輸入模式。
數據讀取與轉換:函數讀取經ADC轉換濾波之后的數值,通過取倒數并乘以500000的方式,轉換為一個與光照強度成正比的浮點數,能為系統提供實時光照強度數據。
功能實現:自動模式下當光照強度低于設定的光照閾值時自動開啟LED照明,初始亮度設定為20%(初始亮度可通過網頁端調節);當紅外傳感器監測到行人或車輛經過時,LED照明亮度提升至100%,人離開后恢復至20%(10秒后恢復至低亮度),有效實現按需照明并避免資源浪費。在手動控制模式下,網頁可直接設置LED的開關狀態及亮度。亮度調節由網頁端直接下發亮度值指令,無需在設備端中進行額外處理。

#include "PWM.h"
#include "Timer.h"
#include "adc.h"
#include "infrared.h"
#include "light.h"
#include "w55mh32_adc.h"
#include "w55mh32_gpio.h"
#include "w55mh32_rcc.h"
#include < stdbool.h >
#include < stdio.h >

// 燈光控制參數
#define FULL_BRIGHTNESS 100 // 全亮
#define LIGHT_OFF 0         // 關閉燈

/**
 * 全局變量(加g_前綴,注明功能和取值范圍)
 */
uint16_t g_light_intensity; // 全局光照強度
bool g_is_person_detected = false; // 紅外傳感器檢測狀態(true=檢測到人員)
uint16_t g_pwm_duty_cycle = 0; // PWM占空比(0-100,控制LED亮度)
uint16_t g_mode_switch = 1; // 模式選擇(0=手動模式,1=自動模式)

extern uint16_t g_low_bright; // 自動模式下LED低亮度設置(0-100)
extern uint16_t g_light_thres_low; // 光照閾值下限(用于自動模式判斷)

/**
 * 靜態變量(加s_前綴,注明功能)
 */
static bool s_prev_person_state =
    false; // 上一次人體檢測狀態(用于狀態變化判斷)
static bool s_delay_active = false; // 延遲狀態標志(true=處于延遲階段)
static uint32_t s_delay_timer = 0; // 延遲計時器(單位:ms,用于10秒延遲邏輯)

/**
 * @brief 初始化光照傳感器(配置PA4為模擬輸入模式)
 */
void light_init(void) {
  GPIO_InitTypeDef gpio_init_structure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  gpio_init_structure.GPIO_Pin = GPIO_Pin_4;
  gpio_init_structure.GPIO_Mode = GPIO_Mode_AIN; // 模擬輸入模式(用于ADC采樣)
  GPIO_Init(GPIOA, &gpio_init_structure);
}

/**
 * @brief 讀取光照強度(將AD值轉換為物理量)
 * @return 光照強度值(通過AD濾波值計算得到)
 */
float read_light_intensity(void) {
  ad_filter_process();                 // 獲取濾波后的AD值
  uint16_t raw = ad_filtered_value[1]; // 取通道1的濾波后值
  if (raw == 0) {
    raw = 1; // 避免除零錯誤
  }
  return 500000.0f / (float)raw; // 轉換為物理量(公式取決于傳感器特性)
}

/**
 * @brief 讀取光照傳感器原始AD值(未濾波)
 * @return 原始AD值(通道1的實時采樣值)
 */
uint16_t light_read_raw(void) {
  return ad_value[1]; // 直接返回通道1的原始AD值
}

/**
 * @brief 智能燈光控制邏輯
 * @note 自動模式邏輯:
 *       1. 低光照:
 *          - 有人→全亮;無人→延遲10秒后變為微光(微光亮度可調)
 *       2. 高光照→關燈
 *       3. 其他情況→保持當前亮度
 *       手動模式:通過外部指令直接控制,本函數不額外處理
 */
void light_control(void) {
  g_light_intensity = (int)read_light_intensity(); // 更新光照強度
  g_is_person_detected = infrared_get_data();      // 更新人體檢測狀態
  uint16_t light_thres_high = g_light_thres_low + 50; // 光照閾值上限

  if (g_mode_switch) // 自動模式
  {
    // 人離開(從有到無):激活延遲
    if (s_prev_person_state && !g_is_person_detected) {
      s_delay_active = true;
      s_delay_timer = 10000; // 10秒延遲
    }

    // 人到來(從無到有):取消延遲
    if (!s_prev_person_state && g_is_person_detected) {
      s_delay_active = false;
    }

    // 燈光邏輯處理
    if (g_light_intensity <= g_light_thres_low) {
      if (g_is_person_detected) {
        g_pwm_duty_cycle = FULL_BRIGHTNESS; // 有人→全亮
      } else if (s_delay_active) {
        g_pwm_duty_cycle = FULL_BRIGHTNESS; // 延遲期間→保持全亮
      } else {
        g_pwm_duty_cycle = g_low_bright; // 延遲結束→微光
      }
    } else if (g_light_intensity >= light_thres_high && !g_is_person_detected) {
      s_delay_active = false;
      g_pwm_duty_cycle = LIGHT_OFF; // 高光照且無人→關燈
    }
    // 其他情況保持當前亮度
  }
  // 手動模式:通過外部指令控制,無需處理

  s_prev_person_state = g_is_person_detected; // 更新上一次狀態
  pwm_set_compare1(g_pwm_duty_cycle);         // 應用PWM占空比
}

/**
 * @brief TIM2中斷服務函數(處理延遲計時)
 * @note 每1ms觸發一次,減少延遲計時器,為0時結束延遲
 */
void TIM2_IRQHandler(void) {
  if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) {
    if (s_delay_active && s_delay_timer > 0) {
      s_delay_timer--;
      if (s_delay_timer == 0) {
        s_delay_active = false; // 延遲結束
      }
    }
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除中斷標志
  }
}

6.5 PWM.C分析

初始化配置完成之后可通過pwm_set_compare1函數動態修改占空比 ,當compare=0時,LED完全熄滅;compare=100時,LED最亮。

#include "w55mh32_adc.h"
#include "w55mh32_gpio.h"
#include "w55mh32_rcc.h"

/**
 * @brief 初始化PWM模塊(TIM5定時器+PA0引腳)
 * @note 配置步驟:
 * 1. 使能TIM5和GPIOA時鐘
 * 2. 配置PA0為復用推挽輸出(PWM信號輸出)
 * 3. 初始化TIM5:向上計數,周期100(0-99),分頻2160(生成100kHz時鐘)
 * 4. 配置TIM5通道1為PWM1模式,初始占空比0
 * 5. 使能TIM5定時器
 */
void pwm_init(void) {
  // 使能TIM5和GPIOA時鐘
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  // 配置PA0為復用推挽輸出(PWM輸出)
  GPIO_InitTypeDef gpio_init_structure;
  gpio_init_structure.GPIO_Mode = GPIO_Mode_AF_PP;
  gpio_init_structure.GPIO_Pin = GPIO_Pin_0;
  gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &gpio_init_structure);

  // 配置TIM5內部時鐘
  TIM_InternalClockConfig(TIM5);

  // 初始化TIM5時基參數
  TIM_TimeBaseInitTypeDef tim_time_base_init_structure;
  tim_time_base_init_structure.TIM_ClockDivision = TIM_CKD_DIV1;
  tim_time_base_init_structure.TIM_CounterMode = TIM_CounterMode_Up;
  tim_time_base_init_structure.TIM_Period = 100 - 1; // 周期100(0-99)
  tim_time_base_init_structure.TIM_Prescaler =
      2160 - 1; // 分頻2180(216MHz/2160=100kHz)
  tim_time_base_init_structure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM5, &tim_time_base_init_structure);

  // 配置TIM5通道1為PWM模式
  TIM_OCInitTypeDef tim_oc_init_structure;
  TIM_OCStructInit(&tim_oc_init_structure); // 初始化默認參數
  tim_oc_init_structure.TIM_OCMode =
      TIM_OCMode_PWM1; // PWM1模式(計數器< 比較值時輸出有效)
  tim_oc_init_structure.TIM_OCPolarity = TIM_OCPolarity_High; // 有效電平為高
  tim_oc_init_structure.TIM_OutputState = TIM_OutputState_Enable; // 使能輸出
  tim_oc_init_structure.TIM_Pulse = 0; // 初始占空比0
  TIM_OC1Init(TIM5, &tim_oc_init_structure);

  // 使能TIM5定時器
  TIM_Cmd(TIM5, ENABLE);
}

/**
 * @brief 設置TIM5通道1的PWM占空比
 * @param compare:占空比數值(0-100,對應0%-100%)
 * @note 直接修改比較寄存器值,實時更新PWM輸出
 */
void pwm_set_compare1(uint16_t compare){ 
  TIM_SetCompare1(TIM5, compare); 
}

7 功能驗證

程序燒錄完畢,硬件連接完成如下圖

在這里插入圖片描述

1.硬件連接完畢,上電通過串口助手打印如下信息:

在這里插入圖片描述

2.通過串口每5S采集一次數據發送到云平臺,自動模式下當我們遮擋光照傳感器時,光照強度數值越來越小。當光照強度小于設定閾值時LED燈點亮。移除遮擋光照強度大于設定閾值時LED燈熄滅。手動模式下,我們可通過網頁端手動控制LED燈的開關狀態及亮度。

3.自動模式下當光照強度低于設定的光照閾值時,LED 燈自動點亮。此時紅外傳感器檢測到遮擋信號后,LED 燈亮度提升至 100%;移除遮擋后,系統 10 秒后恢復亮度至低亮模式,該模式下 LED 燈亮度可通過網頁端調節。

完整演示視頻鏈接:[https://www.bilibili.com/video/BV1gJtqzVEtD]

8 總結

本系統以 W55MH32Q 開發板為核心控制中樞,集成紅外傳感器、光照傳感器及 LED 照明模塊,通過 MQTT 協議與 OneNET 云平臺構建完整物聯網通信鏈路,最終實現了動態模式切換、遠程控制的智能LED燈控制系統。后續將會依據W55MH32Q芯片制作智能路燈系統的PCB板及其公模外殼,制作完成后我會繼續更新,希望大家捧場,同時感謝大家閱讀,如果有疑問可以在評論區留言,我會進行解答,為你的開發提供幫助。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 開源
    +關注

    關注

    3

    文章

    4203

    瀏覽量

    46125
  • 智能路燈
    +關注

    關注

    7

    文章

    107

    瀏覽量

    23570
  • OneNET
    +關注

    關注

    1

    文章

    53

    瀏覽量

    13913
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    單片機軟硬件聯合仿真解決方案

    現經過測試的軟件部分將會正常工作,這會節省項目后期的大量時間及努力。軟硬件聯合仿真系統由一個硬件執行環境和一個軟件執行環境組成,通常軟件環境和硬件
    發表于 07-17 08:56

    基于SoPC的狀態監測裝置的嵌入式軟硬件協同設計

    趨勢的典型代表。SoPC技術為嵌入式系統設計提供了一種更為方便、靈活和可靠的軟硬件協同實現方式。本文利用基于SoPC的軟硬件協同設計方法實現了水電機組在線監測
    發表于 01-22 16:41

    uboot代碼詳細分析

    [url=]uboot代碼詳細分析[/url]
    發表于 01-29 13:51

    OneNET麒麟座試用申請】基于OneNET平臺的智慧照明控制系統

    項目名稱:基于OneNET平臺的智慧照明控制系統試用計劃:1.現在做的亮化控制系統,接入
    發表于 03-17 18:09

    機友分享 | 機智小程序啟蒙:WebSocket網頁控制

    本案例為機智硬件開發平臺中級應用開發實例,開發者通過使用機智AIoT自助開發平臺、機智Op
    發表于 07-17 15:40

    基于onenet平臺MQTT協議數據采集以及遠程控制的個人總結資料

    基于onenet平臺的環境監測采集以及相應遠程控制的個人總結修改的代碼資料。網絡傳輸協議為MQ
    發表于 04-01 12:33

    詳細分析stm32f10x.h

    每日開講---學習STM32不得不看的剖析(詳細分析stm32f10x.h)摘要: 學習STM32不得不看的剖析(詳細分析stm32f10x.h)。/**這里是STM32比較重要的頭文件*******************************************
    發表于 08-05 07:44

    請問一下怎樣對stm32的啟動代碼進行詳細分析

    請問一下怎樣對stm32的啟動代碼進行詳細分析呢?
    發表于 11-26 07:10

    OpenHarmony輕量系統開發【12】OneNET接入

    /hihope-3861-smart-home-kit12.1 OneNET介紹通常來說,一個物聯網產品應當包括設備、平臺、手機APP。我將在鴻蒙
    發表于 01-26 14:19

    如何對SOA進行軟硬件部署

    車型項目平臺線,負責構建技術中臺。新平臺的開發,技術鏈路往往非常長且復雜,分層的架構設計和軟硬件解耦的方式,可很好的便于進行分層測試與驗證,減少集成測試的壓力,問題發現的更充分,也能
    發表于 06-10 17:23

    單片機測控系統軟硬件平臺技術

    本文探討了一種用于工業測控系統的單片機軟硬件綜合設計方法——軟硬件平臺技術,重點闡述了其基本原理、設計思想、實現方法,并給出了一個單片機測控系統
    發表于 08-13 09:38 ?12次下載

    uboot1-1-6代碼詳細分析

    uboot 1-1-6版本的 代碼詳細分析
    發表于 11-02 11:02 ?25次下載

    智能家居系統軟硬件設計

    針對目前智能家居系統發展中存在的一些弊端,分析智能家居系統的整體設計方案,依托NI公司LabVIEW軟件和ELVIS II
    發表于 12-06 15:08 ?19次下載
    <b class='flag-5'>智能</b>家居<b class='flag-5'>系統</b>的<b class='flag-5'>軟硬件</b>設計

    機房托管費詳細分析

    機房托管費是一個復雜而多變的話題,它受到多種因素的影響,以下是對機房托管費用的詳細分析,主機推薦小編為您整理發布機房托管費詳細分析
    的頭像 發表于 02-28 09:48 ?1366次閱讀

    智能農業監控系統:MQTT阿里平臺監測+內置Web網頁控制+代碼解析

    連接。軟件支持MQTT協議對接阿里,實現數據遠程查看與設備控制;內置Web接口,可實時監測環境數據并動態調整濕度閾值。系統默認濕度低于30
    的頭像 發表于 08-08 11:07 ?1496次閱讀
    <b class='flag-5'>智能</b>農業監控<b class='flag-5'>系統</b>:MQTT阿里<b class='flag-5'>云</b><b class='flag-5'>平臺</b><b class='flag-5'>監測</b>+內置<b class='flag-5'>Web</b><b class='flag-5'>網頁</b><b class='flag-5'>控制</b>+<b class='flag-5'>代碼</b>解析