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

news2024/11/26 4:54:06

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

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

主要功能:
系统运行后,LCD1602显示温度、电量、电压、电流值;电量0-99%,电压0-5V,电流0-5A;
可通过WIFI将检测数据传输至终端显示;
可通过按键K3进入阈值设置模式,K3键用于切换选择温度/电量/电压/电流阈值,
K1和K2用于调节对应阈值,K4用于确定并返回主界面。
当温度超限,报警指示亮,蜂鸣器报警;
当电量过低,报警指示,蜂鸣器报警;
当电压或电流过低,报警指示亮,蜂鸣器报警;
当出现报警时,WIFI会将报警信息发送到终端显示。


二、软件设计

/*
作者:嗨小易(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设计,视频分享,技术交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1849223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外星人Alienware m15R7 原厂Windows11系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

JavaFX 下拉框

组合框允许用户选择几个选项之一。用户可以滚动到下拉列表。组合框可以是可编辑和不可编辑的。 创建组合框 以下代码将选项列表包装到ObservableList中&#xff0c;然后使用observable列表实例化ComboBox类。 ObservableList<String> options FXCollections.observab…

区块链媒体发布推广秘籍大揭秘-华媒舍

区块链技术迅猛发展&#xff0c;成为全球瞩目的热门领域。随之而来的是区块链媒体的兴起&#xff0c;成为传播和推广区块链知识、项目和应用的重要平台。本文将揭示区块链媒体发布推广的秘籍&#xff0c;为读者深入了解该领域提供详尽科普介绍。 一、什么是区块链媒体&#xff…

Docker:安装RediSearch全文搜索

1、简述 在本文中&#xff0c;我们将介绍如何使用Docker快速、简便地安装RediSearch&#xff0c;Redis的全文搜索模块。RediSearch提供了高效的全文搜索功能&#xff0c;通过Docker安装&#xff0c;可以轻松地在任何环境中部署和管理RediSearch。 官网地址&#xff1a;https:/…

18.cobra框架了解

目录 概述举例安装实践实践 概述 github cobra cobra 快速的实现一个命令行客户端&#xff0c;命令行解析工具。 cobra 中的主要概念 -Commands 表示执行运作-Args 执行参数-Flags 这些运作的标识符 举例 git clone 命令 git clone https://github.com/spf13/cobra.git -…

白嫖游戏指南,Epic喜加二:《Freshly Frosted》《Rumble Club》

前言 Epic喜加二&#xff1a;《Freshly Frosted》《Rumble Club》《Freshly Frosted》简介&#xff1a; 《Rumble Club》简介&#xff1a; 前言 接下来有时间会分享一些游戏相关可以白嫖的资源&#xff0c;包括游戏本体、游戏素材资源等等。 有需要的小伙伴可以关注这个专栏&…

文件批量改名利器:一键实现文件名中字母统一转为大写,让文件管理更高效有序!

在日常工作和生活中&#xff0c;我们经常会遇到需要批量重命名文件的情况。尤其是当文件名中包含字母时&#xff0c;如果希望将所有字母统一更改为大写&#xff0c;传统的逐个修改方式无疑会耗费大量时间。不过&#xff0c;有了高效的文件批量改名工具&#xff0c;这一难题将迎…

【C++】平衡二叉树(AVL树)的实现

目录 一、AVL树的概念二、AVL树的实现1、AVL树的定义2. 平衡二叉树的插入2.1 按照二叉排序树的方式插入并更新平衡因子2.2 AVL树的旋转2.2.1 新节点插入较高左子树的左侧&#xff08;LL平衡旋转&#xff09;2.2.2 新节点插入较高右子树的右侧&#xff08;RR平衡旋转&#xff09…

【计算机毕业设计】204基于微信小程序疫情期间学生请假与销假系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

windows使用curl命令出现乱码的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

第3章 小功能大用处-发布订阅

Redis提供了基于“发布/订阅”模式的消息机制&#xff0c;此种模式下&#xff0c;消息发布者和订阅者不进行直接通信&#xff0c;发布者客户端向指定的频道&#xff08;channel&#xff09;发布消息&#xff0c;订阅该频道的每个客户端都可以收到该消息。 命令&#xff1a;Red…

【CPP】插入排序、希尔排序

目录 1.插入排序1.1直接插入排序简介代码分析 1.2直接插入对比冒泡排序简介代码对比分析(直接插入排序与冒泡的复杂度效率区别) 1.3希尔排序简介代码分析 1.插入排序 基本思想&#xff1a;把一个待排数字按照关键码值插入到一个有序序列中&#xff0c;得到一个新的有序序列。 …

高校新闻头条系统

摘 要 随着互联网技术的快速发展&#xff0c;网络几乎成为了人们搜集信息和交流沟通最方便、快捷的通道&#xff0c;科技创新一直在影响着人们的生活&#xff0c;人们的衣食住行也在不断变化&#xff0c;与此同时&#xff0c;也大大改变了人们获取信息的方式&#xff0c;人们获…

甘肃旅游服务平台的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;公告信息管理&#xff0c;景点管理&#xff0c;酒店管理&#xff0c;基础数据管理&#xff0c;美食管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0…

kafka第二篇——主题创建,主题分区副本分配策略

目录 主题创建 引入 回顾主题&#xff0c;分区&#xff0c;副本关系 代码 主题分区副本分配策略 底层逻辑分析 主题创建 引入 为啥才开始在idea上跑代码&#xff0c;topic都没创建出来&#xff0c;就直接跑出来了? 这是因为AutoTopicCreationManger参数可以自动创建主题…

首个AI高考全卷评测结果出分,大模型“考生”表现如何?

内容提要 大部分大模型“考生”语文、英语科目表现良好&#xff0c;但在数学方面还有待加强。阅卷老师点评&#xff0c;在语文科目上&#xff0c;对于语言中的一些“潜台词”&#xff0c;大模型尚无法完全理解。在数学科目上&#xff0c;大模型的主观题回答相对凌乱&#xff0…

关于运用人工智能帮助自己实现英语能力的有效提升?

# 实验报告 ## 实验目的 - 描述实验的目标&#xff1a;自己可以知道&#xff0c;自己的ai学习方法是否可以有效帮助自己实现自己的学习提升。 预期结果&#xff1a;在自己利用科技对于自己进行学习的过程中&#xff0c;自己的成长速度应该是一个幂指数的增长 ## 文献回顾 根据…

LabVIEW开发电机故障监测系统

开发了一套基于LabVIEW的智能电机故障监测系统&#xff0c;通过实时监测和分析电机运行参数&#xff0c;实现故障预测和诊断。系统集成了振动传感器、温度传感器、数据采集模块和分析模块&#xff0c;利用RS-485通信总线和Modbus协议确保数据的高精度实时传输&#xff0c;故障预…

Bootloader -- U-Boot 介绍

Bootloader -- U-Boot 介绍 1 介绍1.1 概述1.2 知名 BootloaderLILO (Linux Loader)GRUB (GNU GRand Unified Bootloader)LoadlinROLO (Rockbox Loader)EtherbootLinuxBIOS (现在叫 coreboot)BLOBU-BootRedBoot 1.3 BootLoader 和 Monitor 区别1.4 U-Boot 的源码结构1.5 U-Boot…

Keil MDK生成LIB库以及使用LIB库

一.keil下lib静态库的使用具有以下优点&#xff1a; 1.封装源代码&#xff0c;对外不开放&#xff0c;提高保密性。 2.将标准功能函数封装成库&#xff0c;提高代码的复用性。 3.使用库开发&#xff0c;简化开发流程&#xff0c;提高开发效率。 4.系统调用库函数&#xff0…