37 基于STM32的电压检测WIFI模拟

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于STM32单片机,通过滑动变阻器模拟电压传感器检测电压,通过12864显示显示电压和电压阈值,按键可以控制阈值的增加,并通过串口实时显示相关参数和状态

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

编辑

三、程序编程

#include "stm32f10x.h"#include "usart.h"#include "delay.h"#include "sys.h"#include "led.h"#include "adc.h"#include "key.h"#include "oled.h"#include "code.h"#include "bmp.h"u16 t;  
u16 times=0;
u16 times1 = 0;
u16 times2 = 0;
u8 LsensVal=0;  //将电压传感器的值赋值给LsensVal  PF.7u8 key=0;void Check\_serial\_KEY(void);void Check(void);void serial_port(void);	
 int main(void)
 {	
	 
	 LED_Init();		  	        //初始化与LED连接的硬件接口
   Adc\_Init();   delay\_init();	 KEY\_Init();	 Lsens\_Init();        //初始化电压传感器端口
	 uart\_init(57600);		OLED\_Init();		OLED_ColorTurn(0);//0正常显示,1 反色显示
		OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示	
		printf("开机测试完成!\\r\\n");		OLED\_Clear();		OLED\_Display_Sensitizer();//显示传感器种类
		OLED\_Display\_Welcome();//
		
		printf("开机测试完成!\\r\\n");	  printf("\\r\\n欢迎使用!\\r\\n"); // 初始化完成并测试串口
	 
	 LED0 = 1;
	 LED1 = 0;	 while(1)
	 {		 Check\_serial\_KEY();       //按键控制函数
		  Check();      serial_port();			
			if(LsensVal > dyyz)
			{
				LED0 = 0;
				LED1 = 1;				if(times1 %20 == 1)
				{				printf("电压过高,请注意\\r\\n");
				}
				times1++;
			}			else
			{
				LED0 = 1;
				LED1 = 0;				if(times2 %20 == 1)
				{				printf("电压正常\\r\\n");
				}
				times2++;
			}
		}	 
 } //串口传输函数,并检查void serial_port(){

		
					LsensVal=Lsens\_Get\_Val();  //将电量传感器的值赋值
					for(t=0;t<1;t++)                //Proteus的STM32F103仿真模型只能正确接收第一个字符
					{
						USART1->DR=USART\_RX\_BUF\[t\];						while((USART1->SR&0X40)==0);//等待发送结束
					}					if(times%20 == 1)
					{          printf("DIANYA= %d\\r\\n",LsensVal);					printf("DIANYAYU= %d\\r\\n",dyyz);					delay_ms(10);
					USART\_RX\_STA=0;
					}
					times++;					
				delay_ms(10);
} 
void Check\_serial\_KEY(void){	
	OLED\_Clear\_Down();
	key=KEY_Scan(1);	  //0,不支持连续按;1,支持连续按;
	if(key)
	{						   
		switch(key)
		{				 
			case WKUP_PRES:	// 电压阈值增大

				dyyz++;				break; 

			case KEY1_PRES:	  //电压阈值减少
				dyyz--;				break;																																																								
			default:				break;
		}
	}	else delay_ms(10); 

}void Check(void){
			times++;			if(times%5==0)
			{     
				OLED\_Display\_SensitizerNumber();//显示传感器数值
			}				delay_ms(10);
}

四、实现现象

具体动态效果看B站演示视频:

B站演示视频

基于STM32的电压检测WIFI模拟
B站演示视频

虚拟串口讲解

全部资料(源程序、仿真文件、安装包、演示视频):

百度网盘资料下载%3Ft%3DO83A&pos_id=img-1tQfw6vT-1732950048072)https://pan.baidu.com/s/1tPHt82_tvyGZhqJqhLVcXQ?pwd=p63y

### STM32F103与ESP8266实现电压检测模拟WIFI传输 #### 系统架构概述 STM32F103作为主控芯片负责采集电压信号并通过AD转换获取数值[^1]。随后,通过USART通信接口将数据发送至ESP8266模块,由其完成无线网络连接并将电压数据上传到云端服务器或本地局域网设备。 #### 硬件配置说明 - **STM32F103**: 负责ADC采样以及初步的数据处理工作。 - **ESP8266**: 承担WiFi功能,提供互联网接入能力,并支持TCP/IP协议栈操作。 两者之间采用UART串口通讯方式交换信息,在实际应用中需设置合适的波特率以确保可靠的数据传递效率[^1]。 #### 软件设计思路 ##### ADC部分编程要点 在STM32CubeMX工具下初始化PA0引脚为模拟输入模式用于接收外部电源电压变化情况;编写中断服务程序读取当前瞬时值存储于指定缓冲区等待后续处理过程执行完毕后再继续新一轮测量周期循环往复直至结束条件满足为止。 以下是基于标准外设库版本的一个简单例子展示如何启动单次转换请求: ```c // 初始化函数省略... void Start_ADC_Conversion(void){ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); ADC_Cmd(ADC1, ENABLE); Delay_us(10); // 给予一定延时让模数转换器稳定下来再正式开启扫描动作 ADC_SoftwareStartConvCmd(ADC1, ENABLE); } ``` 当每次触发完成后会自动填充对应寄存器内的最新结果可供查询调用如下所示: ```c uint16_t Get_AD_Value(){ return ADC_GetConversionValue(ADC1); } ``` 以上片段仅适用于连续模式下的快速轮询场景如果希望更加精确控制时间间隔则推荐利用定时器配合DMA通道来构建异步机制从而解放CPU资源专注于其他任务管理之上[^1]. ##### USART 数据交互逻辑 定义好双方约定好的帧格式比如前导符长度固定字节数量表示有效负载区域边界标记等等以便解析端能够准确区分不同种类的消息类别进而采取相应的行动策略. 下面给出一段可能的代码框架用来演示基本原理: ```c #include "usart.h" #define START_BYTE 0xA5 #define END_BYTE 0x5A typedef struct { uint8_t start; float voltage; // 假定浮点型占用四个字节空间 uint8_t checksum; uint8_t end; } __attribute__((packed)) Packet; Packet packet; void Prepare_Packet(float value){ packet.start = START_BYTE; packet.voltage = value; packet.checksum = Calculate_CheckSum((uint8_t*)&packet,sizeof(Packet)-1); packet.end = END_BYTE; } bool Send_Data(uint8_t* buffer,uint16_t size){ HAL_StatusTypeDef status=HAL_UART_Transmit(&huart1,buffer,size,100); return (status==HAL_OK)?true:false; } float Convert_to_Volts(uint16_t raw_adc_value){ const float Vref=3.3f; return ((Vref/4096)*raw_adc_value); } ``` 注意这里假设使用的是HAL驱动层API因此具体细节可能会有所差异请参照官方手册调整适配相应平台环境设定参数列表等内容项[^1]. 最后就是关于esp侧的部分由于篇幅所限无法详尽展开不过大致流程无非也是先建立socket链接然后按照既定规则封装待发包体最终投递给目标地址而已罢了. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值