基于WemosD1的智能垃圾桶

it2023-03-04  83

1.项目成果展示

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); }

(2)该项目发展

其实还可以加几个模块,比如ESP8266,语音模块,可以写个手机APP控制,后面有时间更新语音控制及手机APP控制。

 

 

最新回复(0)