查看: 581|回复: 1

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

[复制链接]

该用户从未签到

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

还有一个SG90舵机

还有一个SG90舵机

签到天数: 438 天

[LV.9]以坛为家II

发表于 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

程序如下:
#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);
  }
}

当然也可以使用new ping库
#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);
  }
}

(完)

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

本版积分规则

热门推荐

Arduino IDE  ESP32 下不能使用中文关键字使我非常郁闷。
Arduino IDE ESP32 下不
Arduino IDE ESP8266 下可以使用中文关键字 Arduino IDE ESP32 下不能使用中文关键
AVR32开发板
AVR32开发板
at32UC3B1128开发板支持很多硬件资源,感兴趣可以在评论区交流
合宙ESP32C3使用TFT_eSPI库操作ST7735s屏幕 (上)
合宙ESP32C3使用TFT_eSPI
TFT_eSPI库升级到2.4.61版本可以完美的支持的合宙ESP32C3操作ST7735s屏幕。合宙ESP32C
blinker物联网教程——4、控制开关灯
blinker物联网教程——4、
简介[hr]在基础教程中,我们用wifiduino做了一系列的控制实验,并了解了传感器和主板
合宙ESP32C3使用TFT_eSPI库操作ST7735s屏幕 (中)
合宙ESP32C3使用TFT_eSPI
TFT_eSPI库里面含有自备字库的制作工具,数字、英文大小写和中文字体采用Unicode编码
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表