许昌专业做企业网站的网站建设 武讯科技
2026/1/13 23:33:31 网站建设 项目流程
许昌专业做企业网站的,网站建设 武讯科技,制作外贸网站模板,某旅行社网站建设论文目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 ​ 七、包含内容 项目分享 一、前言 项目成品图片#xff1a; 哔哩哔哩视频链接#xff1a; https://www.bilibili.com/video/BV1fs2WBjE2r/…目录一、前言二、项目简介1.功能详解2.主要器件三、原理图设计四、PCB硬件设计PCB图五、程序设计六、实验效果 ​七、包含内容项目分享一、前言项目成品图片哔哩哔哩视频链接https://www.bilibili.com/video/BV1fs2WBjE2r/?spm_id_from333.1387.homepage.video_card.clickvd_source199aed5297a00e80e1faf7e270afe8d7资料分享见文末二、项目简介1.功能详解基于STM32的智能光伏发电系统功能如下环境采集通过电压传感器检测光伏板的电压从而计算出输出电流、功率通过DS18B20温度检测模块检测当前温度显示功能显示电压、电流、功率、光伏板转化率和温度模式切换通过按键可以切换手动模式和自动模式自动模式自动模式下如果电压、电流或者温度超过了阈值则进行声光报警并且关闭电源继电器开关手动模式手动模式下可通过按键控制光伏发电继电器和蜂鸣器报警阈值调节通过按键可设置温湿度阈值电压阈值、电流阈值机智云APP通过机智云APP可接收环境信息数据和控制指令下发可以调节阈值2.主要器件STM32F103C8T6最小系统板OLED显示屏4针IIC协议电压传感器DS18B20温度传感器ESP8266-01SWIFI模块光伏发电板继电器有源蜂鸣器LED灯三、原理图设计四、PCB硬件设计PCB图五、程序设计#include stm32f10x.h // STM32F10x系列MCU核心头文件 #include led.h // LED驱动头文件 #include beep.h // 蜂鸣器驱动头文件 #include usart.h // 串口1驱动头文件PC通信 #include delay.h // 延时函数头文件 #include oled.h // OLED显示屏驱动头文件 #include key.h // 按键驱动头文件 #include Modules.h // 模块核心头文件传感器、阈值、驱动器结构体定义 #include adcx.h // ADC采集驱动头文件 #include flash.h // Flash存储驱动头文件 #include usart2.h // 串口2驱动头文件蓝牙通信 #include usart3.h // 串口3驱动头文件语音模块通信 #include voltage.h // 光伏电压/电流采集头文件 #include ds18b20.h // DS18B20温度传感器驱动头文件 #include string.h // 字符串处理标准库头文件 #include relay.h // 继电器驱动头文件 #include timer.h // 定时器通用头文件 #include TIM3.h // 定时器3驱动头文件 #include TIM2.h // 定时器2驱动头文件 #include gizwits_product.h // 机智云产品相关头文件数据点定义 #include gizwits_protocol.h // 机智云协议头文件WiFi配网、数据通信 /****************异方辰电子工作室****************** STM32 *文件 STM32智能光伏发电系统 *版本 V1.0 *日期 2025.12.03 *MCU STM32F103C8T6 *接口 见代码 *BILIBILI 异方辰电子 *小红书 异方辰电子 *CSDN 异方辰电子 *授权IP 辰哥单片机设计、异方辰、YFC电子、北海单片机设计 **********************BEGIN***********************/ #define KEY_Long1 11 // 按键1长按标识值 #define KEY_Long3 33 // 按键3长按标识值WiFi Airlink配网 #define KEY4_Long 44 // 按键4长按标识值WiFi SoftAP配网 #define KEY_1 1 // 按键1短按标识值模式切换 #define KEY_2 2 // 按键2短按标识值菜单切换/光标移动 #define KEY_3 3 // 按键3短按标识值参数增加/设备开启 #define KEY_4 4 // 按键4短按标识值参数减少/设备关闭 #define FLASH_START_ADDR 0x0801f000 // Flash阈值存储起始地址STM32F103C8T6 Flash尾部区域 // 将float类型拆分为高16位uint16_t #define FLOAT_TO_U16_HIGH(f) ( (uint16_t)( ( *(uint32_t*)f ) 16 ) ) // 将float类型拆分为低16位uint16_t #define FLOAT_TO_U16_LOW(f) ( (uint16_t)( *(uint32_t*)f ) ) // 全局变量定义 extern SensorModules sensorData; // 传感器数据结构体存储温度、光伏电压/电流/功率/转换率 extern SensorThresholdValue Sensorthreshold; // 传感器阈值结构体存储温度、电压、电流阈值 extern DriveModules driveData; // 驱动器状态结构体存储LED、蜂鸣器、继电器开关状态 uint8_t mode 1; // 系统模式1自动模式2手动模式3设置模式默认自动模式 u8 dakai; // 串口3通信传递变量 u8 Flag_dakai; // 串口3接收完成标志位 uint8_t is_secondary_menu 0; // 二级菜单标志位0一级菜单1二级菜单 uint8_t secondary_pos 1; // 二级菜单光标位置 uint8_t secondary_type 0; // 二级菜单类型 //float pa0_voltage 0.0f; uint8_t count_m 1; // 手动模式菜单计数 uint8_t count_s 1; // 设置模式菜单计数 extern unsigned char p[16]; // 温度显示字符串缓冲区 uint8_t last_mode 0; // 上一次系统模式用于模式切换时清屏刷新显示 extern dataPoint_t currentDataPoint; /** * brief 主函数系统初始化、主循环逻辑 * param 无 * retval int返回值实际无意义符合C语言标准 */ int main(void) { SystemInit(); // 配置系统时钟为72MHzSTM32F103C8T6最大支持时钟 delay_init(72); // 初始化延时函数基于72MHz系统时钟 ADCX_Init(); // 初始化ADC用于光伏电压/电流采集 LED_Init(); // 初始化LED指示灯 BEEP_Init(); // 初始化蜂鸣器报警 BEEP_OFF; // 初始状态蜂鸣器关闭 USART1_Config(); // 初始化串口1与PC通信用于调试日志输出 USART2_Config(); // 初始化串口2与蓝牙模块通信用于机智云数据交互 USART3_Config(); // 初始化串口3与语音模块通信预留扩展 Key_Init(); // 初始化按键模式切换、参数调整 DS18B20_Init(); // 初始化DS18B20温度传感器 OLED_Init(); // 初始化OLED显示屏 RELAY_Init(); // 初始化继电器控制灯光/负载 OLED_Clear(); // OLED清屏初始状态清空显示 // 从Flash读取阈值上电加载掉电保存的阈值 delay_ms(100); // 延时100ms确保Flash稳定 FLASH_ReadThreshold(); TIM2_Init(72-1,1000-1); // 初始化定时器22ms定时中断用于系统滴答计数 TIM3_Int_Init(1000-1,72-1); // 初始化定时器31ms定时中断用于按键扫描/数据刷新 // 状态管理静态变量主循环中保持状态 static uint32_t last_sensor_time 0; // 传感器扫描时间戳控制扫描频率 static uint32_t last_display_time 0; // 显示刷新时间戳控制显示频率 // 阈值合法性校验若Flash中阈值超出合理范围初始化默认阈值并写入Flash if (Sensorthreshold.tempValue 20 || Sensorthreshold.tempValue 50 || Sensorthreshold.pv_voltageValue 1.0f || Sensorthreshold.pv_voltageValue 5.0f || Sensorthreshold.pv_currentValue 10 || Sensorthreshold.pv_currentValue 50) { // 初始化默认阈值 Sensorthreshold.tempValue 30; // 温度默认阈值30℃ float default_volt 3.0f; // 电压默认阈值3.0V临时变量避免字面量直接赋值 Sensorthreshold.pv_voltageValue default_volt; // 电压阈值赋值 Sensorthreshold.pv_currentValue 30; // 电流默认阈值30mA // 将默认阈值拆分为高16位低16位用于Flash存储 uint16_t volt_high FLOAT_TO_U16_HIGH(default_volt); uint16_t volt_low FLOAT_TO_U16_LOW(default_volt); // 写入默认阈值到Flash FLASH_W(FLASH_START_ADDR, 30, volt_high, volt_low); FLASH_Unlock(); FLASH_ProgramHalfWord(FLASH_START_ADDR 6, 30); FLASH_Lock(); } userInit(); // 机智云用户初始化数据点初始化等 gizwitsInit(); // 机智云协议初始化WiFi配网、数据通信初始化 delay_ms(500); // 延时500ms确保机智云初始化完成 printf(Start \n); // 打印系统启动日志串口1 while (1) // 主循环无限循环处理系统所有逻辑 { // 仅自动模式下支持WiFi配网长按触发 if(mode AUTO_MODE) { if(KeyNum KEY3_Long) // 按键3长按进入WiFi Airlink配网模式 { KeyNum 0; // 清空键值避免重复触发 gizwitsSetMode(WIFI_AIRLINK_MODE); // 设置机智云为Airlink配网模式 OLED_ShowString(90, 16, Al, 16, 1); // 在OLED显示Airlink配网标识 } else if(KeyNum KEY4_Long) // 按键4长按进入WiFi SoftAP配网模式 { KeyNum 0; // 清空键值避免重复触发 gizwitsSetMode(WIFI_SOFTAP_MODE); // 设置机智云为SoftAP配网模式 OLED_ShowString(90, 16, AP, 16, 1); // 在OLED显示SoftAP配网标识 } } // 优先处理按键和通信 // USART2_ProcessCmd(); // 串口2命令处理预留暂未实现 // 获取当前系统时间基于定时器2滴答计数 uint32_t current_time delay_get_tick(); // 控制传感器扫描频率每200ms扫描一次 if(current_time - last_sensor_time 100) // 100个定时器2滴答 100*2ms200ms { SensorScan(); // 扫描传感器获取最新温度、光伏电压/电流/功率数据 Update_Display_Parts(); // 拆分传感器数据为整数小数部分用于OLED显示 last_sensor_time current_time; // 更新传感器扫描时间戳 } // 立即处理按键模式切换、参数调整等 uint8_t current_key_num KeyNum; // 保存当前按键值避免被后续逻辑修改 // 模式切换按键处理仅响应模式切换相关按键 if(current_key_num ! 0) { switch(mode) { case AUTO_MODE: // 当前为自动模式 if(current_key_num KEY_1) // 按键1短按切换到手动模式 { mode MANUAL_MODE; count_m 1; // 手动模式菜单页码重置为1灯光控制 // 切换到手动模式时关闭LED和蜂鸣器 driveData.LED_Flag 0; driveData.BEEP_Flag 0; driveData.RELAY_Flag 0; KeyNum 0; // 清空按键标识 } else if(current_key_num KEY_Long1) // 按键1长按切换到设置模式 { mode SETTINGS_MODE; count_s 1; // 设置模式菜单页码重置为1温度阈值 KeyNum 0; // 清空按键标识 } break; case MANUAL_MODE: // 当前为手动模式 if(current_key_num KEY_1) // 按键1短按切换到自动模式 { mode AUTO_MODE; KeyNum 0; // 清空按键标识 } break; case SETTINGS_MODE: // 当前为设置模式 // 设置模式内部按键在模式处理中单独处理 break; } } // 模式切换时清屏并刷新菜单 if(last_mode ! mode) { OLED_Clear(); // 清屏避免不同模式菜单重叠 // 绘制新模式的固定菜单标题 switch(mode) { case AUTO_MODE: OLED_autoPage1(); // 绘制自动模式第一页固定菜单 break; case MANUAL_MODE: OLED_manualPage1(); // 绘制手动模式第一页固定菜单 break; case SETTINGS_MODE: OLED_settingsPage1(); // 绘制设置模式第一页固定菜单 break; } OLED_Refresh(); // 立即刷新OLED显示 last_mode mode; // 更新上一次模式为当前模式 } // 各模式核心逻辑处理 switch(mode) { case AUTO_MODE: // 自动模式 // 显示传感器动态数据 SensorDataDisplay1(); // 显示温度、电压、电流、功率、转换率 AutoControl(); // 自动控制LED、蜂鸣器、继电器 Control_Manager(); // 执行驱动器控制硬件操作 break; case MANUAL_MODE: // 手动模式 { static uint8_t manual_page_initialized 0; // 手动模式页面初始化标志 static uint8_t last_manual_count 0; // 上一次手动模式菜单页码 static uint8_t last_LED_Flag 0; // 上一次LED状态 static uint8_t last_BEEP_Flag 0; // 上一次蜂鸣器状态 static uint8_t force_refresh 0; // 强制刷新标志模式切换时使用 // 模式切换到手动模式时初始化状态 if(last_mode ! mode) { manual_page_initialized 0; last_manual_count 0; last_LED_Flag driveData.LED_Flag; last_BEEP_Flag driveData.BEEP_Flag; force_refresh 1; // 设置强制刷新标志 count_m 1; // 光标默认选中灯光控制 // 初始状态关闭LED和蜂鸣器 driveData.LED_Flag 0; driveData.BEEP_Flag 0; } uint8_t current_manual_count SetManual(); // 获取当前手动模式菜单页码 // 检测设备状态是否变化变化则需要刷新显示 uint8_t need_refresh 0; if(driveData.LED_Flag ! last_LED_Flag || driveData.BEEP_Flag ! last_BEEP_Flag) { need_refresh 1; last_LED_Flag driveData.LED_Flag; // 更新LED状态 last_BEEP_Flag driveData.BEEP_Flag; // 更新蜂鸣器状态 } // 页面未初始化、页码变化、设备状态变化或强制刷新时重绘页面 if(!manual_page_initialized || current_manual_count ! last_manual_count || need_refresh || force_refresh) { OLED_manualPage1(); // 绘制固定菜单标题 OLED_manualOption(current_manual_count); // 显示当前光标位置 ManualSettingsDisplay1(); // 显示设备状态开/关 manual_page_initialized 1; // 标记页面已初始化 last_manual_count current_manual_count; // 更新上一次页码 force_refresh 0; // 清除强制刷新标志 OLED_Refresh(); // 强制刷新显示 } // 处理手动模式按键控制设备开关 if(current_key_num ! 0) { ManualControl(current_manual_count); // 执行手动控制逻辑 OLED_manualPage1(); // 重绘固定菜单标题 OLED_manualOption(current_manual_count); // 重绘光标 ManualSettingsDisplay1(); // 重绘设备状态 OLED_Refresh(); // 按键操作后立即刷新显示 KeyNum 0; // 清空按键标识 } // 确保显示内容始终正确冗余绘制避免显示异常 OLED_manualPage1(); // 绘制固定菜单标题 OLED_manualOption(current_manual_count); // 显示光标 ManualSettingsDisplay1(); // 显示设备状态 Control_Manager(); // 执行驱动器控制硬件操作 break; } case SETTINGS_MODE: // 设置模式 { static uint8_t is_threshold_page_inited 0; // 设置模式页面初始化标志 uint8_t curr_count_s SetSelection(); // 获取当前设置模式菜单页码 // 处理设置模式内部按键修改阈值、返回自动模式 if(current_key_num ! 0) { if (is_secondary_menu 1) // 处于二级菜单预留扩展 { // 二级菜单按键处理暂未实现 if (current_key_num KEY_2 || current_key_num KEY_3 || current_key_num KEY_4) { OLED_Refresh(); // 刷新显示 KeyNum 0; // 清空按键标识 } else if (current_key_num KEY_1) // 按键1短按返回一级菜单 { is_secondary_menu 0; secondary_pos 1; OLED_Clear(); // 清屏 OLED_settingsPage1(); // 重绘一级菜单标题 SettingsThresholdDisplay1(); // 重绘阈值数值 OLED_settingsOption(curr_count_s); // 重绘光标 OLED_Refresh(); // 刷新显示 KeyNum 0; // 清空按键标识 } } else // 处于一级菜单 { if (current_key_num KEY_3 || current_key_num KEY_4) // 按键3/4修改阈值 { ThresholdSettings(curr_count_s); // 执行阈值修改逻辑 SettingsThresholdDisplay1(); // 重绘修改后的阈值 OLED_Refresh(); // 刷新显示 KeyNum 0; // 清空按键标识 } else if (current_key_num KEY_1) // 按键1短按返回自动模式 { mode AUTO_MODE; is_threshold_page_inited 0; // 重置页面初始化标志 // 将修改后的阈值写入Flash掉电保存 uint16_t volt_high FLOAT_TO_U16_HIGH(Sensorthreshold.pv_voltageValue); uint16_t volt_low FLOAT_TO_U16_LOW(Sensorthreshold.pv_voltageValue); FLASH_W(FLASH_START_ADDR, (uint16_t)Sensorthreshold.tempValue, volt_high, volt_low); FLASH_Unlock(); FLASH_ProgramHalfWord(FLASH_START_ADDR 6, Sensorthreshold.pv_currentValue); FLASH_Lock(); KeyNum 0; // 清空按键标识 } } } // 正常显示逻辑一级菜单 if (is_secondary_menu 1) { // 二级菜单显示暂未实现 } else { // 一级菜单显示 if (curr_count_s 1 curr_count_s 4) // 页码在有效范围内 { if (is_threshold_page_inited 0) // 页面未初始化 { OLED_settingsPage1(); // 绘制固定菜单标题 is_threshold_page_inited 1; // 标记页面已初始化 } } OLED_settingsOption(curr_count_s); // 显示当前光标 SettingsThresholdDisplay1(); // 显示阈值数值 } break; } } // 控制OLED显示刷新频率每50ms刷新一次 if(current_time - last_display_time 25) // 25个定时器2滴答 25*2ms50ms { OLED_Refresh(); // 刷新OLED显示 last_display_time current_time; // 更新显示刷新时间戳 } // 机智云用户逻辑处理数据同步、配网状态处理等 userHandle(); // 机智云协议处理与云端通信、数据点上报/下发 gizwitsHandle((dataPoint_t *)currentDataPoint); } }六、实验效果七、包含内容项目分享

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询