【Proteus仿真】【Arduino单片机】基于物联网新能源电动车检测系统设计

文章目录


一、功能简介

本项目使用Proteus8仿真Arduino单片机控制器,使用LCD1602液晶显示模块、WIFI模块、蜂鸣器、LED按键、ADC、DS18B20温度传感器等。

主要功能:

系统运行后,LCD1602显示温度、电量、电压、电流值;电量0-99%,电压0-5V,电流0-5A;

可通过WIFI将检测数据传输至终端显示;

可通过按键K3进入阈值设置模式,K3键用于切换选择温度/电量/电压/电流阈值,

K1和K2用于调节对应阈值,K4用于确定并返回主界面。

当温度超限,报警指示亮,蜂鸣器报警;

当电量过低,报警指示,蜂鸣器报警;

当电压或电流过低,报警指示亮,蜂鸣器报警;

当出现报警时,WIFI会将报警信息发送到终端显示。


二、软件设计

c 复制代码
/*
作者:嗨小易(QQ技术交流群:570487280)

*/


//系统数据显示
void sys_data_show(void)
{
	u8 buf[5];
	static u8 i=0;

	while(1)
	{
		//正常模式显示
		if(sys_ctrl.mode==0)
		{
			//温度显示
			lcd1602_show_nums(5,0,sys_ctrl.temp,2,0);
			//电量显示
			lcd1602_show_nums(13,0,sys_ctrl.power,2,0);
			//电压显示
			buf[0]=sys_ctrl.vol/10+0x30;
			buf[1]='.';
			buf[2]=sys_ctrl.vol%10+0x30;
			buf[3]='\0';
			lcd1602_show_string(2,1,buf);
			//电流显示
			buf[0]=sys_ctrl.cur/10+0x30;
			buf[1]='.';
			buf[2]=sys_ctrl.cur%10+0x30;
			buf[3]='\0';
			lcd1602_show_string(12,1,buf);
			
			//WIFI传输数据,温度、电量、电压和电流
			i++;
			if(i%50==0)	
			{
				UART_SendString("\r\n温度:");
				buf[0]=sys_ctrl.temp/10+0x30;
				buf[1]=sys_ctrl.temp%10+0x30;
				buf[2]='\0';
				UART_SendString(buf);
				UART_SendString("°C\r\n");

				UART_SendString("电量:");
				buf[0]=sys_ctrl.power/10+0x30;
				buf[1]=sys_ctrl.power%10+0x30;
				buf[2]='\0';
				UART_SendString(buf);
				UART_SendString("%\r\n");

				UART_SendString("电压:");
				buf[0]=sys_ctrl.vol/10+0x30;
				buf[1]='.';
				buf[2]=sys_ctrl.vol%10+0x30;
				buf[3]='\0';
				UART_SendString(buf);
				UART_SendString("V\r\n");

				UART_SendString("电流:");
				buf[0]=sys_ctrl.cur/10+0x30;
				buf[1]='.';
				buf[2]=sys_ctrl.cur%10+0x30;
				buf[3]='\0';
				UART_SendString(buf);
				UART_SendString("A\r\n");	
			}
		}
		//阈值设置显示
		else
		{
			//温度阈值显示
			lcd1602_show_nums(4,0,sys_ctrl.temph,2,0);
			//电量阈值显示
			lcd1602_show_nums(13,0,sys_ctrl.powerl,2,0);
			//电压阈值显示
			buf[0]=sys_ctrl.voll/10+0x30;
			buf[1]='.';
			buf[2]=sys_ctrl.voll%10+0x30;
			buf[3]='\0';
			lcd1602_show_string(3,1,buf);
			//电流阈值显示
			buf[0]=sys_ctrl.curl/10+0x30;
			buf[1]='.';
			buf[2]=sys_ctrl.curl%10+0x30;
			buf[3]='\0';
			lcd1602_show_string(12,1,buf);

			//阈值设定,数据位置闪烁
			switch(sys_ctrl.mode)
			{
				case 1://温度
					lcd1602_show_string(4,0,"  ");
					delay_ms(100);
					lcd1602_show_nums(4,0,sys_ctrl.temph,2,0);
					break;
				case 2://电量
					lcd1602_show_string(13,0,"  ");
					delay_ms(100);
					lcd1602_show_nums(13,0,sys_ctrl.powerl,2,0);
					break;
				case 3://电压
					lcd1602_show_string(3,1,"   ");
					delay_ms(100);
					buf[0]=sys_ctrl.voll/10+0x30;
					buf[1]='.';
					buf[2]=sys_ctrl.voll%10+0x30;
					buf[3]='\0';
					lcd1602_show_string(3,1,buf);
					break;
				case 4://电流
					lcd1602_show_string(12,1,"   ");
					delay_ms(100);
					buf[0]=sys_ctrl.curl/10+0x30;
					buf[1]='.';
					buf[2]=sys_ctrl.curl%10+0x30;
					buf[3]='\0';
					lcd1602_show_string(12,1,buf);
					break;	
			}
		}

		break;			
	}
}

//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	static u8 oneflag=0;

	key=key_scan(0);
	//模式设置
	if(key==KEY3_PRESS)
	{
		sys_ctrl.mode++;
		if(sys_ctrl.mode>4)sys_ctrl.mode=1;
		if(oneflag==0)
		{
			oneflag=1;
			_parm_set_show();//系统参数设置显示
		}
	}
	if(sys_ctrl.mode!=0)
	{
		//在设置模式下,加
		if(key==KEY1_PRESS)
		{	
			switch(sys_ctrl.mode)
			{
				case 1://温度 
					sys_ctrl.temph++;
					if(sys_ctrl.temph>99)sys_ctrl.temph=0;
					break;
				case 2://电量 
					sys_ctrl.powerl++;
					if(sys_ctrl.powerl>99)sys_ctrl.powerl=0;
					break;
				case 3://电压 
					sys_ctrl.voll++;
					if(sys_ctrl.voll>50)sys_ctrl.voll=0;
					break;
				case 4://电流 
					sys_ctrl.curl++;
					if(sys_ctrl.curl>50)sys_ctrl.curl=0;
					break;
			}				
		}
		//在设置模式下,减
		else if(key==KEY2_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 1://温度 
					sys_ctrl.temph--;
					if(sys_ctrl.temph<0)sys_ctrl.temph=99;
					break;
				case 2://电量 
					sys_ctrl.powerl--;
					if(sys_ctrl.powerl<0)sys_ctrl.powerl=99;
					break;
				case 3://电压 
					sys_ctrl.voll--;
					if(sys_ctrl.voll<0)sys_ctrl.voll=50;
					break;
				case 4://电流 
					sys_ctrl.curl--;
					if(sys_ctrl.curl<0)sys_ctrl.curl=50;
					break;
			}
		}
		//确定
		else if(key==KEY4_PRESS)
		{
			sys_ctrl.mode=0;
			oneflag=0;
			sys_open_show();//系统开机界面显示		
		}	
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	static u8 wdoneflag=0;
	static u8 dloneflag=0;
	static u8 dydloneflag=0;

	//正常工作模式下
	if(sys_ctrl.mode==0)
	{
		//温度高于上限,指示灯亮,蜂鸣器报警
		if(sys_ctrl.temp>sys_ctrl.temph)
		{
			LED_WD=0;
			beep_alarm(10,1000);
			UART_SendString("\r\n温度高...\r\n");
			wdoneflag=1;
		}
		else
		{
			LED_WD=1;
			if(wdoneflag==1)
			{
				wdoneflag=0;	
				UART_SendString("\r\n温度OK\r\n");
			}
		}
		//电量低于阈值,指示灯亮,蜂鸣器报警
		if(sys_ctrl.power<sys_ctrl.powerl)
		{
			LED_DL=0;
			beep_alarm(10,1000);
			UART_SendString("\r\n电量低...\r\n");
			dloneflag=1;
		}
		else
		{
			LED_DL=1;
			if(dloneflag==1)
			{
				dloneflag=0;	
				UART_SendString("\r\n电量OK\r\n");
			}
		}
		//电压或电流低于阈值,指示灯亮,蜂鸣器报警
		if(sys_ctrl.vol<sys_ctrl.voll || sys_ctrl.cur<sys_ctrl.curl)
		{
			LED_DYDL=0;
			beep_alarm(10,1000);
			UART_SendString("\r\n电压电流低...\r\n");
			dydloneflag=1;	
		}
		else 
		{
			LED_DYDL=1;
			if(dydloneflag==1)
			{
				dydloneflag=0;	
				UART_SendString("\r\n电压电流OK\r\n");
			}
		}			
	}		
}

三、实验现象

B站演示视频:https://space.bilibili.com/444388619




联系作者

视频地址:https://space.bilibili.com/444388619/video

专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

相关推荐
lingzhilab6 小时前
零知派——STM32驱动摇杆+PCA9685实现4路360°舵机线性速度控制与自动演示
stm32·单片机·嵌入式硬件
不脱发的程序猿7 小时前
嵌入式软件工程师,怎么把 AI 工具用顺手?
人工智能·单片机·嵌入式硬件·嵌入式
平凡灵感码头7 小时前
芯片合封是个嘛?
单片机·嵌入式硬件
珠海西格电力8 小时前
零碳园区的碳排放指标计算的实操步骤
大数据·运维·人工智能·物联网·能源
gscsded9 小时前
C2000 GPIO 配置笔记
单片机
Sakuyu434689 小时前
STM32基础
stm32·单片机·嵌入式硬件
gscsded10 小时前
C2000 CPU Timer 学习笔记
单片机
iCxhust11 小时前
AD0808调试笔记
笔记·单片机·嵌入式硬件·操作系统·微机原理·8088单板机
木子单片机11 小时前
基于51单片机的步进电机调速系统设计
单片机·嵌入式硬件·51单片机·keil
三易串口屏13 小时前
实验10 物理按键实验
单片机·51单片机·串口屏·串口协议·uart 通信·嵌入式 ui