求智能垃圾桶编程代码-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 835|回复: 1

[未解决] 求智能垃圾桶编程代码

[复制链接]
发表于 2022-1-21 00:22 | 显示全部楼层 |阅读模式
求大佬解答
很急!!

还有一个SG90舵机

还有一个SG90舵机
发表于 2022-1-21 23:46 | 显示全部楼层

超声波测距模块制作自动开盖的垃圾桶

本帖最后由 topdog 于 2022-1-22 09:06 编辑

还缺一个垃圾桶、三组机械连杆和一个舵机呀!
超声波测距模块HC04装配于垃圾桶正面中部,人走到20厘米处,垃圾桶盖子打开。舵机安装在垃圾桶内侧上口延中部,带动一组动力连杆开合盖子,左右各两个支撑连杆分散盖子的重量。

接线注意的事项:
舵机选择可以控制180度的,舵机接线有三根线,信号线连到第4管脚,正极线接5V,负极线接GND。
舵机接线 (2).png


超声波测距模块HC04,Trig接第2管脚,Echo接第3管脚,正极线接5V,负极线接GND。

原理如下图:

(1)超声波发射器(trig pin)发出高频声音(40 kHz)。
(2)声音在空气中传播。如果它找到一个对象,它会返回到模块。
(3)超声波接收器(echo pin)接收反射的声音(回声)。

how-ultrasonic-sensor-works-01.png


信号从发射到接收之间的时间允许我们计算到一个物体的距离。这是可能的,因为我们知道声音在空气中的速度。在20ºC (68ºF)条件下,音速在空气中的速度每秒343m。这是公式:
到对象的距离 = ((声音在空气中的速度)*echo测得高电平持续时间)/2
声音在空气中的速度的常量计算:343m/s = 0.0343 cm/uS = 1/29.1 cm/uS
如果需要换算成英寸: 13503.9in/s = 0.0135in/uS = 1/74in/uS

程序如下:
[pre]#include <Servo.h>

volatile unsigned int Distance = 0;
const int TrigPin = 2;
const int EchoPin = 3;
const int ServoPin = 4;

Servo myservo;

int checkdistance() {
  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);
  int distance = pulseIn(EchoPin, HIGH) / 58.2;    // 29.1*2=58.2 等式右侧有一个小数是float类型,左侧是int类型,赋值时会自动取整int类型,此处直接赋值58或者59也OK
  return distance;
}

void setup() {
  Serial.begin(9600);
  myservo.attach(ServoPin);
}

void loop() {
  Distance = checkdistance();
  //Serial.println(Distance);

  if (Distance <= 20 ) {
    myservo.write(90);
    delay(200);
  } else {
    myservo.write(0);
  }
}[/pre]
当然也可以使用new ping库
[pre]#include <NewPing.h>
#include <Servo.h>

const int TRIGGER_PIN = 2;
const int ECHO_PIN  =   3 ;
const int ServoPin  =   4 ;
const int MAX_DISTANCE = 200;
unsigned int Distance;

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
Servo myservo;

void setup() {
  Serial.begin(9600);
  myservo.attach(ServoPin);
}

void loop() {
  delay(50);     // ping之间等待50ms(大约20 ping /sec)。29ms应该是ping之间的最短延迟。
  Distance = sonar.ping_cm();
  //Serial.println(Distance);
  if (Distance <= 20 ) {
    myservo.write(90);
    delay(200);
  } else {
    myservo.write(0);
  }
}[/pre]
(完)

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 15:38 , Processed in 0.078217 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表