Java教程

基于STM32单片机的WIFI智能电表设计

本文主要是介绍基于STM32单片机的WIFI智能电表设计,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一.硬件方案

本设计由STM32单片机核心板电路、交流电压电流检测模块电路、WIFI模块电路组成。通过电压互感器TV1005M和电流互感器TA1005M分别检测交流电压和交流电流值,手机APP和WiFi模块互联后,可以实时显示交流电压、交流电流、功率和电量实时显示在手机上。当功率超过200W时,继电器自动断开。功率不超过200W时,可以手动控制继电器的开关。手机和WiFi模块连接后,手机上显示计时时间。
主要由STM32单片机核心板、交流电压电流检测模块、WIFI模块、指示灯组成;如图:
在这里插入图片描述

二.设计功能

(1)220V市电经过互感器后产生微弱交流电,经过整流滤波后变为直流,然后通过单片机AD转换,然后换算出实际值。电压电流采集分别使用电压互感器TV1005M和电流互感器TA1005M。
(2)220V市电经过互感器后产生微弱交流电,经过整流滤波后变为直流,然后通过单片机AD转换,然后换算出实际值。电压电流采集分别使用电压互感器TV1005M和电流互感器TA1005M。
(3)当功率超过200W时,继电器自动断开。功率不超过200W时,可以手动控制继电器的开关。
(4)手机APP和设备WiFi模块连接后,手机上显示计时时间。

三.设计原理图

(1)原理图主要采用AD软件进行设计,如图:
在这里插入图片描述

四.软件设计

(1)程序流程图
在这里插入图片描述

(2)主程序源码

int main(void)
 { 
	u16 adcx;
	float temp;
	delay_init();	    	 //延时函数初始化	  
	uart_init(9600);	 	//串口初始化为115200
  TIM3_Int_Init(499,7199);//50ms  	 
	LED_Init();		  		//初始化与LED连接的硬件接口
  LED0=0;
 	Adc_Init();		  		//ADC初始化	    

	RELAY=1; //继电器打开
	relayFlag=1;	//继电器状态标识
	delay_ms(4000); 
	
	printf("AT+CIPMUX=1\r\n");		   //允许链接
	delay_ms(1000);
	printf("AT+CIPSERVER=1,8080\r\n");	   //创建端口号8080
	delay_ms(1000); 
	while(1)
	{
		adcx=Get_Adc_Average(ADC_Channel_1,10);// PA1 交流电压检测口 ad转换10次求平均值
		temp=(float)adcx*(3.3/4096);
		ACvolt=(unsigned int)(temp*303);//*303 互感器计算获取 以及1K电阻 用示波器检测校准得到
		if(ACvolt<15) ACvolt=0;
		
		adcx=Get_Adc_Average(ADC_Channel_2,10);	// PA2                                                       求平均值
		temp=(float)adcx*(3.3/4096);
		if(temp>0.02)
		{
			ACcurrent=(unsigned int)((temp-0.02)*3100);//*3950 互感器计算获取扩大1000倍 以及1K电阻 用示波器检测校准得到 0.02去除波动 防止误判断
		}
		else
		{
				ACcurrent=0;
		}
		if(ACcurrent<50)ACcurrent=0;//滤除电流
		PowerWt=ACvolt*ACcurrent;	 	//功率
		
		if(dealFlag==1)//处理标志
		{
			dealFlag=0;
			PowerQd=(float)PowerWt*1/60.0/60.0+PowerQd;	//累计电量 1表示1s 因为电流扩大了1000倍 因此该处也扩大了1000倍 且此处功率单位为W 除以1000为千瓦 结果为度 1度=1千瓦时
		}
		
		if(times>=9999)
		{times=0;}
		
		if(PowerWt/1000>200)
		{	
			RELAY=0;			//关闭继电器
			relayFlag=0;
		}		

		sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:1",ACvolt,ACcurrent,PowerWt,PowerQd,times);		
		if(relayFlag==1)
		{sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:1",ACvolt,ACcurrent,PowerWt,PowerQd,times);		}//打印数据
		else 
		{sprintf(tabData,"V:%03dA:%05dP:%07luQ:%010.2fT:%04dR:0",ACvolt,ACcurrent,PowerWt,PowerQd,times);		}//打印数据
	
		
		printf("AT+CIPSEND=0,42\r\n");		//发送固定字节数据的at命令
		delay_ms(200);
		printf(tabData);					//发送数据
		delay_ms(200);

		LED0=!LED0;		//数据发送	
		delay_ms(200);		//延时
	}											    
}	

如需资料请关注公众号“单片机实例设计”,首页回复“酒精”获取资料;
在这里插入图片描述加粗样式

这篇关于基于STM32单片机的WIFI智能电表设计的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!