如何做一个自动化感应垃圾桶

简介
  • 上面的视频就是制作成型的感应式垃圾桶,手靠近感应器的时候,就可以自动开盖大概一秒,自动再盖上,它的用处可大了,比如:用来喝水,用来泡面或者用来当笔筒,总之垃圾桶能干的事情,它一样都干不了??????
  • 来合个影 如何做一个自动化感应垃圾桶

缘起

  • 哈哈哈,看到抖音使用树莓派、单片机等等小玩意,制作好玩的东西,于是决定在家也玩一玩破板子,破感应器,破垃圾桶,破蜂鸣器制作一个感应垃圾桶。必须要在无聊的生活中自己找寻乐趣!!!

硬件简介

超声波感应器

  • 前面两个圆柱形的东西就是一个超声波感应器,一个是发射口,一个是接收口,基本工作原理就是发射口发射超声波,另一个口会接受反射回来的超声波,然后根据声速以及时间来计算前方障碍物,也就是我们的手,距离垃圾桶有多远,我们通过编写程序来设置,多少多少距离内开盖,超过多少距离关盖。

Arduino电路板

  • 垃圾桶后面沾了一块电路板,这块电路板就是控制的核心,我们的程序要烧录的地方,给了垃圾桶以大脑才能完成任务。这块板子是Ardunio平台的,上面有很多接口,用于供电,传输信号等等,上个图 如何做一个自动化感应垃圾桶

实现原理

  • 基本到这里就介绍完硬件了,下面来介绍程序实现,我感觉没啥兴趣的基本到这里就看完了,总之两个字,NB!!!!
  • 先上完整代码,这个项目是使用C语言实现的,平台是Ardunio平台,要引入它的实现包
#include<Servo.h>

#define DuoPIN D5
#define Echo D2
#define Trig D8

Servo myDuoJi;
long getTime(){
  digitalWrite(Trig,HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig,LOW);

  return pulseIn(Echo,HIGH);
}

void initChaoShengBo(){
  pinMode(Echo,INPUT);
  pinMode(Trig,OUTPUT);
}

void setup(){
  initChaoShengBo();
  myDuoJi.attach(DuoPIN);
  Serial.begin(115200);
}
void loop(){
  long dis;
  dis = getTime()/58;
  ` 1
  if(dis<10){43RFGUYT6
    myDuoJi.write(70);
    delay(700);
    myDuoJi.write(90);
    delay(1000);
    myDuoJi.write(100);
    delay(1140);
    myDuoJi.write(90);
  }else{
    myDuoJi.write(90);  
  }
}

  • 然后我们逐一解析

1.启动函数

  • 先引入Ardunio平台下马达机给我们提供的工具包,里面是一些绑定上硬件驱动的函数集合
#include<Servo.h>
  • 再看setup()函数,这个函数是程序运行的开始,作用就是初始化板子,也就是做准备工作,啥都准备好了,开始下一个函数loop(),这里都是业务逻辑
void setup(){
  initChaoShengBo();
  myDuoJi.attach(DuoPIN);
  Serial.begin(115200);
}
  • 第一行初始化超声波感应器initChaoShengBo
void initChaoShengBo(){
  pinMode(Echo,INPUT);
  pinMode(Trig,OUTPUT);
}
  • 基本意思就是绑定接口(也就是感应器上的的端口是什么意思),Echo口作为输入端,Trig口作为输出端
  • 然后myDuoJi.attach(DuoPIN)的意思就是旋转马达接口绑定到DuoPIN这个口
#define DuoPIN D5
#define Echo D2
#define Trig D8

Servo myDuoJi;
  • 从上面看出来就是电路板的接口D5绑定马达的接口,D2绑定到感应器的输出接口,D8绑定到感应器的触发接口。在下面一行就是初始化一个Servo实例(对象)

2.业务逻辑

  • 然后板子在执行完setup函数之后,会无线循环业务逻辑,也就是不断执行loop函数
void loop(){
  long dis;
  dis = getTime()/58;
  ` 1
  if(dis<10){43RFGUYT6
    myDuoJi.write(70);
    delay(700);
    myDuoJi.write(90);
    delay(1000);
    myDuoJi.write(100);
    delay(1140);
    myDuoJi.write(90);
  }else{
    myDuoJi.write(90);  
  }
}
  • 先定义一个long型变量用力保存接收感应距离,然后下一行getTime函数就是用来返回发送到接收超声波的时间间隔,然后除以58即为距离,至于58怎么来的,自己算吧,声音在空气中的传播速度约为340m/s,换算一下就好了。哦,对了前面返回的时间的单位是微秒。
  • 距离小于10cm,马达机开始旋转0.7秒,速度是20

这里就是要说明一下,write里面的参数是速度的意思,90代表静止不动,0代表顺时针全速选装,180代表逆时针全速旋转,数值离90越远,代表速度越快,比如参数100就是指以(100-90)的速度逆时针旋转。

  • 然后delay函数代表停顿多少毫秒,后面就是盖盖了,else语句就是距离大于10,马达一直停止

OK讲完了