Arduino智能垃圾桶

Arduino智能垃圾桶

    • 硬件准备
    • 工作原理
    • 接线方式
    • 代码
    • 实物
    • 补充 舵机和超声波 调试
      • 舵机
      • 超声波传感器

这个小项目是基于Arduino设计的一款感应式智能开盖垃圾桶这个项目只要一点C语言的基础,懂得一点点物联网知识就可以,是一个刚入行物联网值得练手的小项目。


硬件准备

  • Arduino UNO
  • HC-SR04超声波模块
  • SG90舵机
  • 杜邦线若干


工作原理

当手靠近垃圾桶时,超声波传感器测出两者之间的距离,距离小于设定的阈值,舵机转动,垃圾桶盖打开。


接线方式

Arduino 5V GND 引脚5 引脚8 引脚2
舵机 VCC(红) GND(黑/褐) 信号线(白/黄)
超声波传感器 VCC GND Trig Echo


代码

#include
#define Trig 8
#define Echo 2
#define DuoPIN 5
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;
 if(dis <10){
     
        myDuoJi.write(90);
        delay(1500);
      }
  else{
     
          myDuoJi.write(180);
        }
  
 
}


实物

Arduino智能垃圾桶_第1张图片



补充 舵机和超声波 调试

舵机


接线

Arduino 5V GND 引脚5
舵机 VCC(红) GND(黑/褐) 信号线(白/黄)

舵机代码调试

#include
#define DuoPIN 5
Servo myDuoJi;
void setup() {
     
  
  myDuoJi.attach(DuoPIN);
  Serial.begin(115200);
}

void loop() {
     
  int cmd;
  if(Serial.available()>0){
     
    cmd = Serial.read();
    if(cmd == 1){
     
        myDuoJi.write(90);
      }
      if(cmd == 0){
     
          myDuoJi.write(180);
        }
    }
  
}


通过串口工具调试舵机的转动角度
输入 0 或者输入 1 来控制舵机的转动(调整合适的角度)



超声波传感器

接线方式

Arduino 5V GND 引脚8 引脚2
超声波传感器 VCC GND Trig Echo


代码
#define Trig 8
#define Echo 2
#define BEEP 5
long gettime()
{
     
    // 产生一个10us的高脉冲去触发TrigPin
    digitalWrite(Trig,HIGH);
    delayMicroseconds(10);
    digitalWrite(Trig,LOW);
    
    return  pulseIn(Echo,HIGH);
  }
void initChaoShengBo()
{
     
    pinMode(Echo,INPUT);
    pinMode(Trig,OUTPUT);
  }
void setup() {
     
  initChaoShengBo();
  pinMode(BEEP,OUTPUT);
  digitalWrite(BEEP,HIGH);
  Serial.begin(115200);//波特率设置为115200

}

void loop() {
     
  //获取距离
  long dis;
  dis = gettime()/58;// 检测脉冲宽度,并计算出距离
  Serial.print(dis);
  Serial.println("cm");
  if(dis<10){
     
      digitalWrite(BEEP,LOW);
    }
    else{
     
      digitalWrite(BEEP,HIGH);
      }
  delay(500);
}


通过串口工具的可以接收到超声波测的距离



为什么接收到的脉冲信号要除以58得到距离?


distance_cm=(us)/58

声音在干燥、摄氏 20度的空气中的传播速度大约为343米/秒,合34,300厘米/秒。
或者,我们作一下单位换算,34,300除以1,000,000厘米/微秒。
即为:0.0343厘米/微秒
再换一个角度,1/(0.0343 厘米/微秒)

即:29.15 微秒/厘米。
这就意味着,每291.5微秒表示10CM的距离。1厘米就是29.15微秒。
但是发送后到接收到回波,声音走过的是2倍的距离呀。
所以实际距离就是1厘米,对应58.3微秒。
实际上整个测距过程是测的发出声波到收到回波的时间,你的程序里的第一个distance实际上是时间us。
所以换成距离cm,要除以58。当然除以58.3可能更精确


Arduino智能垃圾桶_第2张图片

你可能感兴趣的:(笔记,arduino,物联网,嵌入式)