智能垃圾桶

所用模块知识

超声波模块、舵机模块、震动模块

主控芯片:STC89C52RC

1.震动模块

2.蜂鸣器

 

 

3.舵机

 

如下图所示,最便宜的舵机 sg90 ,常用三根或者四根接线,黄色为 PWM 信号控制
用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等
常见的有 0-90° 0-180° 0-360°
向黄色信号线 灌入 ”PWM 信号。
PWM 波的频率不能太高,大约 50HZ ,即周期 =1/ 频率 =1/50=0.02s 20ms 左右
数据:
0.5ms-------------0 度; 2.5% 对应函数中占空比为 250
1.0ms------------45 度; 5.0% 对应函数中占空比为 500
1.5ms------------90 度; 7.5% 对应函数中占空比为 750
2.0ms-----------135 度; 10.0% 对应函数中占空比为 1000
2.5ms-----------180 度; 12.5% 对应函数中占空比为 1250
定时器需要定时 20ms, 关心的单位 0.5ms, 40 个的 0.5ms, 初值 0.5m cnt++
1s = 10ms * 100
20ms = 0.5ms * 40

 编程实现


#include"reg52.h"
#include<intrins.h>

sbit sg_90con=P1^1;
int jd;
int cnt=0;

void Time0Init()
{
	//1.配置定时器0工作模式位16位计时
	TMOD=0x01;
	//2.给初值,定一个10ms出来
	TL0 = 0x33;				//设置定时初始值
	TH0 = 0xFE;
	//3.打开总中断EA;
	EA=1;
	//4.打开定时器0中断
	ET0=1;
	//5.开始计时,定时器”数数“
	TR0=1;
	TF0=0;
}
void Delay300ms()		//@11.0592MHz
{
	unsigned char data i, j, k;

	i = 3;
	j = 26;
	k = 223;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void Delay2000ms()		//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
	Delay300ms();//让硬件稳定一下
	Time0Init();//初始化定时器
	jd=1;//初始角度是0度,0.5ms,溢出1就是0.5,高电平
	cnt=0;
	sg_90con=1;//一开始从高电平开始
	
	//每隔两秒切换一次角度
	while(1)
	{
		jd=4;//135度 2ms高电平
		cnt=0;
		Delay2000ms();
		jd=1;//0度
		cnt=0;
		Delay2000ms();
		
	}
	
}

void Time0Handler() interrupt 1
{
	cnt++;//统计爆表的次数. cnt=1的时候,报表了1
	TL0 = 0x33;				//设置定时初始值
	TH0 = 0xFE;
	
	if(cnt<jd)//控制PWM波
	{
		sg_90con=1;
	}
	else
	{
		sg_90con=0;
	}
	if(cnt==40)//爆表40次,经过了20ms
	{
		cnt=0;
		sg_90con=1;
	}
	
}

4.超声波测距

型号: HC-SR04
接线参考:模块除了两个电源引脚外,还有 TRIG ECHO 引脚,这两个引脚分别接我们开发板的 P1.5
P1.6 端口
//超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度, 计算出模块到前方障碍物的距离。
怎么让它发送波
Trig ,给 Trig 端口至少 10us 的高电平
怎么知道它开始发了
Echo 信号,由低电平跳转到高电平,表示开始发送波
怎么知道接收了返回波
Echo ,由高电平跳转回低电平,表示波回来了
怎么算时间
Echo 引脚维持高电平的时间!
波发出去的那一下,开始启动定时器
波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间
怎么算距离
距离 = 速度 ( 340m/s * 时间 /2

 下面是代码实现:

#include"reg52.h"


//距离小于10cm,D5亮,D6灭,反之相反现象;
sbit D5=P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第7口
sbit D6=P3^6;//根据原理图(电路图),设备变量led2指向P3组IO口的第6口
sbit Trig=P1^5;
sbit Echo=P1^6;

void Delay10us()		//@11.0592MHz
{
	unsigned char data i;

	i = 2;
	while (--i);
}

void Time0Init()
{
	TMOD &=0xF0;		//设置定时器模式
	TMOD |=0x01;
	TH0=0;
	TL0=0;
	//设置定时器0工作模式1,初始值设定0开始数数,不着急启动定时器
}

void startHC()
{
	Trig=0;
	Trig=1;
	Delay10us();
	Trig=0;

}
void Delay200ms()		//@11.0592MHz
{
	unsigned char data i, j, k;


	i = 2;
	j = 103;
	k = 147;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	
	double time;
	double dis;
	
	Time0Init();
	
	while(1)
	{
		Delay200ms();
		//1. Trig ,给Trig端口至少10us的高电平
		startHC();
		//2. echo由低电平跳转到高电平,表示开始发送波
		while(Echo==0);
		//波发出去的那一下,开始启动定时器
		TR0=1;
		//3. 由高电平跳转回低电平,表示波回来了
		while(Echo==1);
		//波回来的那一下,我们开始停止定时器
		TR0=0;
		//4. 计算出中间经过多少时间
		time=(TH0*256+TL0)*1.085;//us为单位
		//5. 距离 = 速度 (340m/s)* 时间/2
		dis=time*0.017;
		if(dis<10)
		{
			D5=0;
			D6=1;
		}
		else
		{
			D5=1;
			D6=0;
		}
		//定时器数据清零,以便下一次测距
		TH0=0;
		TL0=0;
	}
	
}

项目概述

功能描述
检测靠近时,垃圾桶自动开盖并伴随滴一声, 2 秒后关盖
发生震动时,垃圾桶自动开盖并伴随滴一声, 2 秒后关盖
按下按键时,垃圾桶自动开盖并伴随滴一声, 2 秒后关盖
硬件说明
SG90 舵机,超声波模块,震动传感器,蜂鸣器
接线说明
舵机控制口 P1.1 ;超声波 Trig P1.5 ,Echo P1.6 ;蜂鸣器接 P2.0 ; 震动传感器接 P3.2` ( 外部中断0)

编程实现

开发步骤:
1. 舵机和超声波代码整合
舵机用定时器 0
超声波用定时器 1
实现物体靠近后,自动开盖, 2 秒后关盖
2. 查询的方式添加按键控制
3. 查询的方式添加震动控制
4. 使用外部中断 0 配合震动控制
代码:

#include"reg52.h"


//距离小于10cm,D5亮,D6灭,反之相反现象;
sbit D5           =P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第7口
sbit D6           =P3^6;//根据原理图(电路图),设备变量led2指向P3组IO口的第6口
sbit Trig         =P1^5;
sbit Echo         =P1^6;
sbit sg_90con     =P1^1;
sbit vibrate      =P3^2;
sbit beep         =P2^0;
sbit sw1          =P2^1;


int jd;
int jd_bak;
int cnt=0;
int mark_vibrate=0;


void Delay10us()		//@11.0592MHz
{
	unsigned char data i;

	i = 2;
	while (--i);
}
void Time0Init()
{
	//1.配置定时器0工作模式位16位计时
	TMOD=0x01;
	//2.给初值,定一个10ms出来
	TL0 = 0x33;				//设置定时初始值
	TH0 = 0xFE;
	//3.打开总中断EA;
	EA=1;
	//4.打开定时器0中断
	ET0=1;
	//5.开始计时,定时器”数数“
	TR0=1;
	TF0=0;
}
void Time1Init()
{
	TMOD &=0x0F;		//设置定时器模式
	TMOD |=0x10;
	TH1=0;
	TL1=0;
	//设置定时器0工作模式1,初始值设定0开始数数,不着急启动定时器
}

void startHC()
{
	Trig=0;
	Trig=1;
	Delay10us();
	Trig=0;

}
void Delay150ms()		//@11.0592MHz
{
	unsigned char data i, j, k;


	i = 2;
	j = 13;
	k = 237;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



double get_distance()
{
		double time;
	
	//定时器数据清零,以便下一次测距
		TH1=0;
		TL1=0;
		//1. Trig ,给Trig端口至少10us的高电平
		startHC();
		//2. echo由低电平跳转到高电平,表示开始发送波
		while(Echo==0);
		//波发出去的那一下,开始启动定时器
		TR1=1;
		//3. 由高电平跳转回低电平,表示波回来了
		while(Echo==1);
		//波回来的那一下,我们开始停止定时器
		TR1=0;
		//4. 计算出中间经过多少时间
		time=(TH1*256+TL1)*1.085;//us为单位
		//5. 距离 = 速度 (340m/s)* 时间/2
		return (time*0.017);
}

void Delay2000ms()		//@11.0592MHz
{
	unsigned char data i, j, k;


	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void openStatusLight()
{
	D5=0;
	D6=1;
}
void closeStatusLight()
{
	D5=1;
	D6=0;
}
void openDusbin()
{
	char n;
	jd=3;
	
	if(jd_bak!=jd)
	{
		cnt=0;
		beep=0;
		for(n=0;n<2;n++)
		{
			Delay150ms();
		}
		beep=1;
		Delay2000ms();
	}
	jd_bak=jd;
}

void closeDusbin()
{
	jd=1;
	jd_bak=jd;
	cnt=0;
	Delay150ms();
	
}
void EX0_Init()
{
	EX0=1;
	
	IT0=0;
}

void initsg90_0()
{
		jd=1;//初始角度是0度,0.5ms,溢出1就是0.5,高电平
		cnt=0;
		sg_90con=1;//一开始从高电平开始
}

void main()
{
	
	double dis;
	Time0Init();//初始化定时器
	Time1Init();
	EX0_Init();
	
	initsg90_0();
	
	while(1)
	{
		//Delay150ms();
		dis=get_distance();
		if(dis<10||sw1==0||mark_vibrate==1)
		{
			openStatusLight();
			openDusbin();
			mark_vibrate=0;
		}
		else
		{
			closeStatusLight();
			closeDusbin();
			
		}
		
	}
	
}

void Time0Handler() interrupt 1
{
	cnt++;//统计爆表的次数. cnt=1的时候,报表了1
	TL0 = 0x33;				//设置定时初始值
	TH0 = 0xFE;
	
	if(cnt<jd)//控制PWM波
	{
		sg_90con=1;
	}
	else
	{
		sg_90con=0;
	}
	if(cnt==40)//爆表40次,经过了20ms
	{
		cnt=0;
		sg_90con=1;
	}
	
}

void Ex0_Handler() interrupt 0
{
	mark_vibrate=1;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于 Arduino 的智能垃圾桶可以实现自动分类、计数、压缩和报警等功能,提高垃圾处理的效率和环保性。 下面是一个简单的实现步骤: 1. 购买所需材料,如 Arduino 开发板、超声波传感器、舵机、步进电机、LCD 显示屏等。 2. 搭建硬件平台,将超声波传感器和舵机固定在垃圾桶的顶部,用步进电机控制压缩装置,连接 LCD 显示屏以显示垃圾桶状态。 3. 编写 Arduino 代码,利用超声波传感器测量垃圾桶内的垃圾高度,并根据预设的高度阈值控制舵机开启相应的垃圾分类口。 4. 利用步进电机控制垃圾压缩装置,对垃圾进行压缩,节约空间。 5. 利用 LCD 显示屏显示垃圾桶状态,如当前高度、已处理的垃圾数量等,同时当垃圾桶满时,发出报警信号。 总之,基于 Arduino 的智能垃圾桶可以自动分类、计数、压缩和报警,提高垃圾处理的效率和环保性。 ### 回答2: 基于Arduino的智能垃圾桶是一种使用Arduino控制器和传感器技术实现的智能化垃圾桶。它能够自动识别和分类垃圾,提高垃圾分类的准确性和效率。 智能垃圾桶的工作原理是通过内置的传感器监测垃圾桶内的垃圾量和种类。传感器可以检测压力、重量、红外线等不同参数,用来识别和分类不同类型的垃圾。一旦垃圾不断增加,传感器将触发Arduino控制器发送信号,提示人们需要及时清空垃圾桶。此外,垃圾桶还可以通过与智能手机或其他设备的连接,向用户发送垃圾桶清空的提醒。 这种智能垃圾桶的好处是提高垃圾分类的准确性。由于传感器能够识别和分类垃圾,可以确保不同种类的垃圾被正确放置在不同的垃圾桶中,避免了误分类的问题。此外,它还可以提高垃圾分类的效率,减少人们进行垃圾分类的工作量。 此外,基于Arduino的智能垃圾桶还可以实现其他功能。例如,它可以记录垃圾桶的使用情况,帮助人们分析和优化垃圾处理的流程。此外,它还可以配备垃圾压缩装置,将垃圾的体积压缩,减少垃圾桶的换取频率。 综上所述,基于Arduino的智能垃圾桶通过利用传感器和控制器技术,可以实现自动识别和分类垃圾的功能,提高垃圾分类的准确性和效率。它是一种未来发展的趋势,将在改善环境和减少垃圾污染方面发挥重要作用。 ### 回答3: 基于Arduino的智能垃圾桶是一种利用Arduino开发板和传感器技术实现的智能化设备。该垃圾桶能够自动感知垃圾的种类和填充程度,并根据这些信息进行智能管理和处理。 首先,智能垃圾桶配备了各种类型的传感器,如红外传感器、超声波传感器等。这些传感器可以与Arduino开发板连接,并通过数字或模拟信号将数据传输给开发板。传感器可以感知垃圾桶内的垃圾种类和垃圾的填充程度。 其次,Arduino开发板可以根据传感器采集到的数据进行处理和分析。垃圾桶内置的程序可以识别不同种类的垃圾,如可回收物、厨余垃圾和其他垃圾,从而为垃圾分类做出准确的判断。 另外,智能垃圾桶还可以根据垃圾的填充程度进行智能管理。Arduino开发板可以根据传感器采集到的填充程度数据,判断垃圾桶是否已满,并及时发出警报或通知。这有助于垃圾桶及时清理,提高垃圾收集的效率。 最后,智能垃圾桶还可以与其他设备或网络进行连接,实现更智能化的功能。比如,可以将垃圾桶与手机APP或物联网平台连接,实时监测垃圾桶的状态和清理情况,方便管理人员进行远程监控和操作。 总之,基于Arduino的智能垃圾桶利用传感器和Arduino开发板的技术,实现了对垃圾种类和填充程度的智能感知与管理。它的出现可以提高垃圾分类和垃圾收集的效率,有助于实现智能城市建设和环境保护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值