设计项目实例26-基于物联网的智能开关电源(BUCK电路、电压电流监测、阿里云、DHT11、继电器)

设计项目实例26-基于物联网的智能开关电源(BUCK电路、电压电流监测、阿里云、DHT11、继电器)

  • 前提说明
  • 需知
    • 项目设计要求
    • 项目提供资料
    • main.c代码
    • 测试视频
    • 项目3D图

前提说明

电子开发合作请私信联系,商业/非商业项目均可洽谈,价格友好,负责可靠。
目前已开发项目三百余单,不限时售后,直到项目完结。
设计项目实例26-基于物联网的智能开关电源(BUCK电路、电压电流监测、阿里云、DHT11、继电器)_第1张图片

需知

对此项目有需求请私信联系我,备注对应项目名称号(非免费,伸手党勿扰,价格公道,售后负责)
所有项目均有个人验证无误后发出,保证不坑害任何一位朋友,个人有接单渠道,不缺钱,随缘分享案例+和有需求的朋友合作。

项目设计要求

先确认一下设计指标:设计名称为基于物联网的智能开关电源,开关电源拓扑为降压拓扑(BUCK电路),输入电压24V直流电,输出0-24V直流电或0-2A电流,输出可选恒压或者恒流。通过ESP01S模块将数据上传至阿里云物联网平台,可远程查看输出数据和控制工作状态。配备DHT11模块检测环境温湿度,过流过压或过温过湿均会通过蜂鸣器报警且自动关闭电源输入。主控选用STM32F103C8T6,屏幕显示用0.96寸的OLED屏幕。供电采用12V电源适配器供电,+24V稳压电源给开关电源电路供电,负载采用可调电阻器消耗能量。

项目提供资料

1、原理图源文件(嘉立创标准版,可导为专业版)

2、PCB源文件(嘉立创标准版,可导为专业版)

3、代码(有注释,规范设计,详情可看我其他单模块设计实例,keil5 MDK)

4、售后(分单资料售卖或售后指导设计两种,不同的价格,优质的服务提供给想设计出来这款作品的朋友们)

main.c代码

int main(void) 
 {
  u8 key;	   
	Delay_Init();                   //延时功能初始化           
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级	
	Usart1_Init(9600);              //串口1功能初始化,波特率9600
	Usart2_Init(115200);            //串口2功能初始化,波特率115200	

	BUCK_PWM_Init();                //BUCK电路初始化,20KHz工作频率,带中断。
	init_boost_PID();               //初始化PID		
	Init_adc();                     //ADC初始化	 
	BEEP_Init();                    //BEEP初始化
	SW_Init( );                     //继电器初始化
	KEY_Init();                     //按键初始化
	DHT11_Init();                   //DHT11模块初始化	 	 
	WiFi_ResetIO_Init();            //初始化WiFi的复位IO
  MQTT_Buff_Init();               //初始化接收,发送,命令数据的 缓冲区 以及各状态参数
	AliIoT_Parameter_Init();	      //初始化连接阿里云IoT平台MQTT服务器的参数		 
	TIM4_Init(300,7200);            //TIM4初始化,定时时间 300*7200*1000/72000000 = 30ms 	 
	OLED_Init();			              //初始化OLED  
	 
	loop:
	SW_ON;                          //断开继电器
	work_mode=1;
	pid_mode=0;
	OLED_Clear();                   //OLED清零 
	qidong_view();                  //启动界面	
	while(1)
	{	
		key=KEY_Scan(0);              //扫描按键
		if(key==SW_PRES)
		{
      work_mode=2;			          //进入到模式选择界面
			moshi_view();
			protect_status=0;
			sw_status=0;
			BEEP_OFF;
			break;
		}
		Delay_Ms(50);
	}	
	while(1)
	{	
		//工作在模式选择界面的时候
		if(work_mode==2)
		{
			key=KEY_Scan(0);//扫描按键			
			if(pid_status==0)
			{
				OLED_ShowString(112,3,"<-",16);
				OLED_ShowString(112,5,"  ",16);
			}
			else
			{
				OLED_ShowString(112,3,"  ",16);
				OLED_ShowString(112,5,"<-",16);				
			}
			
			if(key==SW_PRES)
			{
				work_mode=3;
				if(pid_status==0)hengya_view();//恒压工作界面和模式
				else hengliu_view();//恒流工作界面和模式
			}
		}
		//电压或者电流调节
		else if(work_mode==3)
		{
			key=KEY_Scan(0);
			if(pid_status==0)
			{
				OLED_ShowNum(72,3,Target_V,2,16);
				OLED_ShowNum(96,3,(u16)(Target_V*100)%100,2,16);
			}	
      else if(pid_status==1)
			{
				OLED_ShowNum(72,3,Target_I,2,16);
				OLED_ShowNum(96,3,(u16)(Target_I*100)%100,2,16);				
			}
			if(key==SW_PRES)
			{
				SW_OFF;
				work_mode=4;
				pid_mode=1;
				canshu_view();
			}
		}
		else if(work_mode==4)
		{
			key=KEY_Scan(0);
			DC_P=DC_V*DC_I;
			OLED_ShowNum(72,0,DC_V,2,16);
			OLED_ShowNum(96,0,(u16)(DC_V*100)%100,2,16);	
			OLED_ShowNum(72,2,DC_I,2,16);
			OLED_ShowNum(96,2,(u16)(DC_I*100)%100,2,16);	
			OLED_ShowNum(72,4,DC_P,2,16);
			OLED_ShowNum(96,4,(u16)(DC_P*100)%100,2,16);			  	
			OLED_ShowNum(40,6,Temp,2,16);
      OLED_ShowNum(104,6,Humi,2,16);
      if(key==SW_PRES)
			{
				pid_mode=0;//失能PID
				pid_status=0;//PID工作状态复位为电压环
				goto loop;
			}				
      if((DC_V>V_yuzhi)||(DC_I>I_yuzhi)||(Temp>Temp_yuzhi))
		  {
			  SW_ON;BEEP_ON;
			  protect_status=1;
			  sw_status=0;
			  pid_mode=0;//失能PID
			  pid_status=0;//PID工作状态复位为电压环
			  goto loop;
		  }				
		  else if(global_control==0)
		  {
			  SW_ON;BEEP_OFF;
			  protect_status=1;
			  sw_status=0;
			  pid_mode=0;//失能PID
		  }	
			else
			{
				pid_mode=1;
			  SW_OFF;BEEP_OFF;
			  protect_status=0;
			  sw_status=1;
			}
		}
		if(Connect_flag==1){     
				if(MQTT_TxDataOutPtr != MQTT_TxDataInPtr){                //if成立的话,说明发送缓冲区有数据了
				if((MQTT_TxDataOutPtr[1]==0x10)||((MQTT_TxDataOutPtr[1]==0x82)&&(ConnectPack_flag==1))||(SubcribePack_flag==1)){    
					u1_printf("发送数据:0x%x\r\n",MQTT_TxDataOutPtr[1]);  //串口提示信息
					MQTT_TxData(MQTT_TxDataOutPtr);                       //发送数据
					MQTT_TxDataOutPtr += BUFF_UNIT;                       //指针下移
					if(MQTT_TxDataOutPtr==MQTT_TxDataEndPtr)              //如果指针到缓冲区尾部了
						MQTT_TxDataOutPtr = MQTT_TxDataBuf[0];            //指针归位到缓冲区开头
				} 				
			}//处理发送缓冲区数据的else if分支结尾
			if(MQTT_RxDataOutPtr != MQTT_RxDataInPtr){  //if成立的话,说明接收缓冲区有数据了														
				u1_printf("接收到数据:");
				if((MQTT_RxDataOutPtr[0]==4)&&(MQTT_RxDataOutPtr[1]==0x20)){             			
				    switch(MQTT_RxDataOutPtr[4]){					
						case 0x00 : u1_printf("CONNECT报文成功\r\n");                            //串口输出信息	
								    ConnectPack_flag = 1;                                        //CONNECT报文成功,订阅报文可发
									break;                                                       //跳出分支case 0x00                                              
						case 0x01 : u1_printf("连接已拒绝,不支持的协议版本,准备重启\r\n");     //串口输出信息
									Connect_flag = 0;                                            //Connect_flag置零,重启连接
									break;                                                       //跳出分支case 0x01   
						case 0x02 : u1_printf("连接已拒绝,不合格的客户端标识符,准备重启\r\n"); //串口输出信息
									Connect_flag = 0;                                            //Connect_flag置零,重启连接
									break;                                                       //跳出分支case 0x02 
						case 0x03 : u1_printf("连接已拒绝,服务端不可用,准备重启\r\n");         //串口输出信息
									Connect_flag = 0;                                            //Connect_flag置零,重启连接
									break;                                                       //跳出分支case 0x03
						case 0x04 : u1_printf("连接已拒绝,无效的用户名或密码,准备重启\r\n");   //串口输出信息
									Connect_flag = 0;                                            //Connect_flag置零,重启连接						
									break;                                                       //跳出分支case 0x04
						case 0x05 : u1_printf("连接已拒绝,未授权,准备重启\r\n");               //串口输出信息
									Connect_flag = 0;                                            //Connect_flag置零,重启连接						
									break;                                                       //跳出分支case 0x05 		
						default   : u1_printf("连接已拒绝,未知状态,准备重启\r\n");             //串口输出信息 
									Connect_flag = 0;                                            //Connect_flag置零,重启连接					
									break;                                                       //跳出分支case default 								
					}				
				}			
				else if((MQTT_RxDataOutPtr[0]==5)&&(MQTT_RxDataOutPtr[1]==0x90)){ 
						switch(MQTT_RxDataOutPtr[5]){					
						case 0x00 :
						case 0x01 : u1_printf("订阅成功\r\n");            //串口输出信息
												SubcribePack_flag = 1;                //SubcribePack_flag置1,表示订阅报文成功,其他报文可发送
												Ping_flag = 0;                        //Ping_flag清零
						            ping_count=0;
						            low_speed_status=1;
												high_speed_status=0;
									break;                                //跳出分支                                             
						default   : u1_printf("订阅失败,准备重启\r\n");  //串口输出信息 
												Connect_flag = 0;                     //Connect_flag置零,重启连接
									break;                                //跳出分支 								
					}					
				}
				else if((MQTT_RxDataOutPtr[0]==2)&&(MQTT_RxDataOutPtr[1]==0xD0)){ 
					u1_printf("PING报文回复\r\n"); 		  //串口输出信息 
					if(Ping_flag==1){                     //如果Ping_flag=1,表示第一次发送
						 Ping_flag = 0;    				  //要清除Ping_flag标志
					}else if(Ping_flag>1){ 				  //如果Ping_flag>1,表示是多次发送了,而且是2s间隔的快速发送
						Ping_flag = 0;     				  //要清除Ping_flag标志
						ping_count=0;
						low_speed_status=1;
						high_speed_status=0;
					}				
				}	
				else if((MQTT_RxDataOutPtr[1]==0x30)){ 
					u1_printf("服务器等级0推送\r\n"); 		   //串口输出信息 
					MQTT_DealPushdata_Qs0(MQTT_RxDataOutPtr);  //处理等级0推送数据
				}				
								
				MQTT_RxDataOutPtr += BUFF_UNIT;                     //指针下移
				if(MQTT_RxDataOutPtr==MQTT_RxDataEndPtr)            //如果指针到缓冲区尾部了
					MQTT_RxDataOutPtr = MQTT_RxDataBuf[0];          //指针归位到缓冲区开头                        
			}		
			/*-------------------------------------------------------------*/
			/*                     处理命令缓冲区数据                      */
			/*-------------------------------------------------------------*/
			if(MQTT_CMDOutPtr != MQTT_CMDInPtr)
			{                             //if成立的话,说明命令缓冲区有数据了			
				u1_printf("命令:%s\r\n",&MQTT_CMDOutPtr[1]);                 //串口输出信息
			  if(strstr((char *)MQTT_CMDOutPtr+1,"\"params\":{\"control\":1}"))
				{	           
					global_control=1;                                                         
				}else if(strstr((char *)MQTT_CMDOutPtr+1,"\"params\":{\"control\":0}"))
				{       
					global_control=0;                                                                 
				}	
				
				MQTT_CMDOutPtr += BUFF_UNIT;                             	 //指针下移
				if(MQTT_CMDOutPtr==MQTT_CMDEndPtr)           	             //如果指针到缓冲区尾部了
					MQTT_CMDOutPtr = MQTT_CMDBuf[0];          	             //指针归位到缓冲区开头				
			}//处理命令缓冲区数据的else if分支结尾	
		}//Connect_flag=1的if分支的结尾	
		else{ 
			u1_printf("需要连接服务器\r\n");                 //串口输出信息
			TIM4_ENABLE_status=0;
			ping_count=0;
			low_speed_status=0;
			high_speed_status=0;
			WiFi_RxCounter=0;                                //WiFi接收数据量变量清零                        
			memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);          //清空WiFi接收缓冲区 
			if(WiFi_Connect_IoTServer()==0){   			     //如果WiFi连接云服务器函数返回0,表示正确,进入if
				u1_printf("建立TCP连接成功\r\n");            //串口输出信息
				Connect_flag = 1;                            //Connect_flag置1,表示连接成功	
				WiFi_RxCounter=0;                            //WiFi接收数据量变量清零                        
				memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);      //清空WiFi接收缓冲区 
				MQTT_Buff_ReInit();                          //重新初始化发送缓冲区 
				TIM2_ENABLE_30S();			
			}				
		}	
	}
}



测试视频

通过网盘分享的文件:测试视频.rar
链接: https://pan.baidu.com/s/1Xn-ui0BxD1mdaXn81-IMzA 提取码: wnu9
–来自百度网盘超级会员v6的分享

项目3D图

设计项目实例26-基于物联网的智能开关电源(BUCK电路、电压电流监测、阿里云、DHT11、继电器)_第2张图片

你可能感兴趣的:(物联网,阿里云,嵌入式硬件,stm32)