0
点赞
收藏
分享

微信扫一扫

【基于WemosD1的智能语音垃圾桶】

拾光的Shelly 2022-02-17 阅读 30
单片机c#

2.项目要求
(1).会简单C语言,  了解servo库,  了解SG90舵机 ,知道超声波模块检测距离方法 

(2).自己做一个垃圾桶或者买一个 小型垃圾桶

(3).了解WemosD1芯片 

3.开发环境
arduion-1.6.5

4.SG90舵机
(1).SG90舵机简介

型号    SG90          重量13克               角度  90-180通用
三线对应端口    红色 :正极         棕色:GND      橙色:信号线
无负载速度    0.12秒 /60度(4.8V)
堵转扭矩    1.2~1.4公斤/厘米(4.8V)
使用温度    -30~+60摄氏度
死区设定    7微秒
工作电压    4.8V~6V(3.3V也能用)
(2).servo 函数的用法

attach    连接舵机(自带库仅9/10脚有效)
write    角度控制
writeMircroseconds()    更精确的角度控制(微秒级)
read()    读上一次舵机转动角度
attach()    检查舵机是否连接在控制板上
detach()    断开舵机连接,使接口(9/10)脚可做PWM输出
(3).舵机核心代码(仅供参考)

#define PIN_SERVO D5
Servo myservo;
myservo.attach(PIN_SERVO);
myservo.write(30);
5.超声波模块
(1).模块简介

两个圆圈作用    一个用于发射,一个用于接收
4个引脚    VCC(正极)  Trig(触发)    Echo(响应)  GND(接地)
工作电压电流    5V、15mA
感应距离    2~400cm
感测角度    不大于15度
测试面积    不小于50平方厘米
(2).超声波时序图(自己画的有点丑,还少画了一个脉冲)

 (3).响应测距Demo代码

 
#define Echo D2 //echo(回应)
#define Trig D8 //Trig(触发)
long getTime(){
  digitalWrite(Trig,HIGH);
  delayMicroseconds(10);//发送一个10微秒(us)的脉冲
  digitalWrite(Trig,LOW);
  return pulseIn(Echo,HIGH);
  }
void inintChaoShengBo(){
      pinMode(Echo,INPUT);
      pinMode(Trig,OUTPUT);
  }
void setup() {
    inintChaoShengBo();//超声波模块初始化(引脚初始化)
    Serial.begin(115200);
}
void loop() {
      //获取距离
      long dis;
      dis=getTime()/58;//为什么要除以58?
      Serial.print(dis);//这个是不换行
      Serial.println("cm");//这个输出是换行
      delay(500);
}
6.为什么要除以58?
声音在空气中的传播速度为343m/s,换算成34300cm/m,换算成微秒等于,0.0343cm/us;我们再换一个角度,使其除以1,等于29.15us/cm。

这就意味着每291.5微秒表示10厘米的距离。也就是说每1厘米就是29,15微秒,然后根据超声波发射与返回的原理,也就是发出到接受声波,声音经过的是2倍的距离。

所以实际距离就是1厘米,对应58.3微秒。

但在玩单片机的过程中一般直接除以58,当然为了更加精确,可以除以58.3

7.项目总结
(1).项目完整代码

#include <Servo.h>
#define sg90_PIN D6//定义舵机名
#define Echo D2 //echo(回应)
#define Trig D8 //Trig(触发)
#define BEEP D5
Servo myDuoJi;//定义一个类,可以看做一个结构体
long getTime(){
  digitalWrite(Trig,HIGH);
  delayMicroseconds(10);//发送一个10微秒(us)的脉冲
  digitalWrite(Trig,LOW);
  return pulseIn(Echo,HIGH);
  }
void inintChaoShengBo(){
      pinMode(Echo,INPUT);
      pinMode(Trig,OUTPUT);
  }
void setup() {
  // put your setup code here, to run once:
    inintChaoShengBo();//超声波模块初始化(引脚初始化)
    myDuoJi.attach(sg90_PIN);//完成一个舵机连接
    pinMode(BEEP,OUTPUT);
    digitalWrite(BEEP,HIGH);
    Serial.begin(115200);
}
void loop() {
  // put your main code here, to run repeatedly:
      //获取距离
      long dis;
      dis=getTime()/58;//为什么要除以58
      Serial.print(dis);//这个是不换行
      Serial.println("cm");//这个输出是换行
       if(dis<10){
        myDuoJi.write(0);//控制舵机0度,开盖
        digitalWrite(BEEP,LOW);
        }
       else{
        myDuoJi.write(180);//舵机旋转180度,闭合
        digitalWrite(BEEP,HIGH);
        }
         delay(500);

举报

相关推荐

0 条评论