0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 基于Arduino的智能移动保湿器
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:4分
🧿 选题指导, 项目分享:
https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md
1 简介
基于Arduino开发板的智能移动保湿器,可以实时检测室内温湿度的变化并显示。该保湿器可根据检测到的室内湿度与设定值(该阈值可修改)进行比较,自动启动加湿操作并提示,相比以往的家用保湿器,实现了智能化。还具有移动避障等功能。而传统的保湿器基本上都是固定式的,这样只能在局部进行加湿,而对于室内整体的湿度上却没有改善,即容易造成局部湿度过高,且其它区域干燥无变化,因而,移动避障的设计克服了该缺点,具有更好的适应性。同时二次开发性强,还可以集成多种功能。目前市场上暂无该类产品,所以可以增加类似扫地机器人的清扫功能,向家用服务机器人迈进一步。
2 主要器件
-
Arduino开发板
-
SDAH01温湿度传感器
-
Mini空气加湿与继电器模块
-
LCD1602显示屏
-
L298N驱动模块与直流电机
-
红外与超声避障模块
-
实时检测室内温湿度的变化并显示
-
根据检测到的室内湿度与设定值(该阈值可修改)进行比较,自动启动加湿操作
-
具有移动避障等功能,而传统的保湿器基本上都是固定式的
3 实现效果
4 设计原理
硬件设计
主控制器:Arduino开发板
该开发板有数字、模拟输入输出接口以及支持I2C,串行等多种通讯模式,本次设计开发板由9V镍氢电池供电,采用I2C协议与温湿度传感器通讯,并通过数字模拟检测控制其余各模块。
环境检测传感器
IDT公司的SDAH01温湿度传感器,具有±1.5%的相对湿度 (RH) 精度误差,快速 RH 响应时间,0.01% RH的分辨率以及平均1.0μA的低功耗;
Mini空气加湿与继电器模块
专用微孔雾化片和振荡电路组成加湿模块,采用5V直流供电,为了保证驱动功率,由Arduino的5V电源供电并由数字I/O给继电器信号从而实现对加湿模块的控制。
LCD1602显示屏
实时显示温湿度变化,并通过电位器调节背光亮度;
L298N驱动模块与直流电机
L298N模块可隔离控制部分与驱动电路,且L298N驱动能力远高于Arduino,驱动模块使用9V镍氢电池直接供电,Arduino只需输出PWM脉冲信号到L298N驱动模块中,从而实现对移动速度的无级调节,最终达到移动加湿,保持室内湿度均匀的目的。
红外与超声避障模块
在物体进入红外光电开关与超声测距模块的检测范围内时,可以输出数字(红外)与模拟信号(超声)到Arduino中,进行条件判断并输出相应的控制信号到电机驱动电路中,例如控制电机的转向,实现避障功能。
相关原理图
软件设计
本项目采用Arduino自带IDE进行编程,C语言编程;
程序运行流程
1. 超声及红外避障检测;
2. 若障碍物进入避障范围内时,执行避障操作,停止并根据不同方位传感器的输入信号可进行停止,后退,左转或直接向左后方及右后方转向;
3. 同步进行温湿度检测及保湿操作,通过I2C协议读取传感器的温湿度值,并把该值通过LCD1602进行显示,同时把湿度值与预先设定的30%RH进行比较,若当前室内湿度值小于湿度值,则给继电器输出信号,启动振荡器进行加湿操作;
4. 程序结束,循环执行。
5 部分核心代码
#include#includeLiquidCrystal lcd(12, 11, 10, 13, 8, 7);//设置LCD1602接口#define ADDRESS_HUMIDITY 0x44//定义温湿度传感器高低位变量byte humidity_high = 0;byte humidity_low = 0;byte tempature_high = 0;byte tempature_low = 0;int humidity_temp,tempature_temp;double humidity,tempature;//定义振荡加湿器控制输出int humidifer=1;//定义控制电机的PWM脉冲输出int INA = 3;int INB = 5;int INC = 6;int IND = 9;//定义超声测距的控制接口const int TrigPin = 2;const int EchoPin = 4;double distance;//定义电机初始速度int low_motor_speed=80;int high_motor_speed=160;int motor_speed=100;//定义红外光电传感器输入接口int left_infrared_detect=A0;int right_infrared_detect=A1;int left_infrared=0;int right_infrared=0; //程序初始化void setup() {pinMode(INA,OUTPUT);pinMode(INB,OUTPUT);pinMode(INC,OUTPUT);pinMode(IND,OUTPUT);pinMode(humidifer,OUTPUT);pinMode(TrigPin, OUTPUT);// 要检测引脚上输入的脉冲宽度,需要先设置为输入状态pinMode(EchoPin, INPUT);Wire.begin();lcd.begin(16,2);lcd.clear(); //清屏delay(500); //延时1000ms}void loop() {//超声传感器检测// 产生一个10us的高脉冲去触发TrigPindigitalWrite(TrigPin, LOW);delayMicroseconds(2);digitalWrite(TrigPin, HIGH);delayMicroseconds(10);digitalWrite(TrigPin, LOW);// 检测脉冲宽度,并计算出距离//delayMicroseconds(2);distance = pulseIn(EchoPin, HIGH) / 58.00;//检测到避障传感器输入,进行避障动作if(infrared()){stopmove();if(left_infrared<100&&right_infrared>900){negative_left();delay(500);}else if(left_infrared>900&&right_infrared<100){negative_right();delay(500);} else {negative();delay(1000);left();delay(500);}}else if(distance<12){negative();delay(500);left();delay(500);}elsepositive();//调用温湿度检测显示函数HUMIDITY();}void positive()//前进{digitalWrite(INA,LOW);analogWrite(INB,motor_speed);analogWrite(INC,motor_speed);digitalWrite(IND,LOW);}void negative()//后退{analogWrite(INA,motor_speed);digitalWrite(INB,LOW);digitalWrite(INC,LOW);analogWrite(IND,motor_speed);}void right()//右转{digitalWrite(INA,LOW);analogWrite(INB,motor_speed);digitalWrite(INC,LOW);digitalWrite(IND,LOW);}void left()//左转{digitalWrite(INA,LOW);digitalWrite(INB,LOW);analogWrite(INC,motor_speed);digitalWrite(IND,LOW);}void stopmove()//停止{digitalWrite(INA,LOW);digitalWrite(INB,LOW);digitalWrite(INC,LOW);digitalWrite(IND,LOW);}void negative_left()//向左后方倒退{analogWrite(INA,low_motor_speed);digitalWrite(INB,LOW);digitalWrite(INC,LOW);analogWrite(IND,high_motor_speed);}void negative_right()//向右后方倒退{analogWrite(INA,high_motor_speed);digitalWrite(INB,LOW);digitalWrite(INC,LOW);analogWrite(IND,low_motor_speed);}void HUMIDITY()//温湿度检测{//HS300x传感器与Arduino通过I2C协议通讯Wire.beginTransmission(ADDRESS_HUMIDITY); Wire.endTransmission(); delay(200);Wire.requestFrom(ADDRESS_HUMIDITY,20);humidity_high = Wire.read();humidity_low = Wire.read();tempature_high = Wire.read();tempature_low = Wire.read();//数据转换humidity_temp=((humidity_high<<8)|humidity_low)&0x3fff;tempature_temp=((tempature_high<<6)|tempature_low>>2)&0xfffc;humidity=humidity_temp/(pow(2,14)-1)*100.0*10;tempature=(tempature_temp/(pow(2,14)-1)*165-40)*10;//LCD1602屏显示温湿度lcd.setCursor(0, 0) ; //设置光标位置为第1行第1个位置lcd.print("IDT Humi=");lcd.print((int)humidity/10);//显示整数部分lcd.print(".");lcd.print((int)humidity%10);//显示小数部分lcd.print("%RH");lcd.setCursor(0, 1) ;lcd.print("IDT Temp=");lcd.print((int)tempature/10);//显示整数部分lcd.print(".");lcd.print((int)tempature%10);//显示小数部分lcd.print((char)223);lcd.print("C");if(humidity<300)digitalWrite(humidifer,LOW);elsedigitalWrite(humidifer,HIGH);}int infrared()//红外光电检测{left_infrared=analogRead(left_infrared_detect);right_infrared=analogRead(right_infrared_detect);if(left_infrared<100||right_infrared<100)return 1;elsereturn 0;}