距离感应垃圾桶(Wemos D1 开发板实现)
时间:2022-10-04 04:30:00
目录
一、Wemos D1 开发板
1. Wemos D1 的特性
注:在燃烧程序之前,需要在装usb串口驱动
2.Wemos D1 的I/O口腔研究(驱动蜂鸣器)
蜂鸣器模块有三个接口,VCC–3.3V、GND–接地/、I/O低电平触发蜂鸣器。
配置Wemos上的D5口为输出口,输出低电时蜂鸣器响,输出高电时蜂鸣器不响。
代码如下:
void setup() {
pinMode(D5, OUTPUT); // 设置D5引脚是输出引脚 } void loop() {
digitalWrite(D5, HIGH); // 输出高电平,蜂鸣器不响 delay(1000); // 挂起一秒 digitalWrite(D5, LOW); // 输出低电平,蜂鸣器响 delay(1000); // 挂一秒钟(蜂鸣器控制引脚在延迟期间低电平) }
注:Wemos上电后不断执行loop我们的核心控制代码写入函数中的代码loop。setup函数只调用一次,一般用于硬件相关的初始化,如IO口,串口,wifi等。
3.Wemos的串口通信
串口是一种有线传输方式,如usb同样,串口通信可以使计算机和单片机、单片机和单片机相互传输数据。例如,每次点击鼠标时,鼠标都会向计算机发送数据,以实现操作。
实现串口通信的几个函数:
//Serial.begin() ///打开串口,通常放置在setup()函数中。 //原型:Serial.begin(speed),Serial.begin(speed,config) //参数:speed:比特率,一般取9600、115200等。config:默认设置数据位、效验位和停止位SERIAL_8N1表示8个数据位,无校验位,1个停止位。 //返回值:没有。
//Serial.println() //串口输出数据并换行。 //原型:Serial.println(val),Serial.println(val,format) //参数:val:任何数据类型的打印值。format:输出数据格式。 //返回值:返回写入的字节数。
//Serial.available() //判断串口缓冲区的状态,返回从串口缓冲区读取的字节数。 //原型:Serial.available() //参数:没有。 //返回值:可读字节数。
//Serial.read() //读取串口数据,一次读取一个字符,读取后删除已读数据。 //原型:Serial.read() //参数:没有。 //返回值:返回串口缓冲中的第一个可读字节,当没有可读数据时返回-1,整数类型。
蜂鸣器(代码如下)由串口控制:
void setup() {
pinMode(D5, OUTPUT); // 设置D5引脚为输出引脚
Serial.begin(115200); // 初始化串口,设置波特率为115200
Serial.println(“start”); // 测试串口是否启动,启动成功就发送start
}
void loop() {
int cmd;
if ( Serial.available() > 0 ) {
// 检测串口是否有数据
cmd = Serial.read(); // 读取串口数据
if (cmd == 1) {
// 如果读取的数据为1
digitalWrite(D5, LOW); // 蜂鸣器响起
}
else {
digitalWrite(D5, HIGH); // 否则(读取数据非1)蜂鸣器不响
}
}
}
4.Wemos和SG90舵机
SG90舵机,重量13克,角度90度-180度
红色电压 ,棕色底线,橘色型号线
使用舵机需要用到如下servo类函数:
//attach() 连接舵机(自带库仅9/10脚有效)
//write() 角度控制
//writeMicroseconds() 更精准的角度控制(微米级)
//read() 读上一次舵机转动角度
//attached() 检测舵机是否连接控制板上
//detach() 断开舵机连接,使接口(9/10脚)可做PWM输出
测试舵机(代码如下):
#include
#define DuoPin D5 //宏定义D5口
Servo MyDuoJi; //初始化MyDuoJi为Servo类型
void setup() {
MyDuoJi.attach(DuoPin); // 使D5口连接舵机
}
void loop() {
MyDuoJi.write(180); //让舵机旋转180度
delay(1000);
MyDuoJi.write(0); //旋转回0度
delay(1000);
}
5.Wemos与超声波模块
超声波传感器模块上通常有两个超声波元件,一个用于发射,一个用于接收,电路班上有四个引脚:VCC(正极)、Trig(触发)、Echo(回应)、GND(接地)。
HC-SR04主要参数:
- 工作电压与电流: 5V,15mA
- 感应距离: 2-400cm
- 感测角度: 不大于15度
- 被测物的面积: 不要小于50cm^2并且尽量平整
测试超声波模块(代码如下):
#define TrigPin D8
#define EchoPin D2
unsigned long d;
unsigned long ping(){
digitalWrite(TrigPin,HIGH); // 输出高电压
delayMicroseconds(10); // 持续10微秒
digitalWrite(TrigPin,LOW); // 输出低电压
return pulseIn(EchoPin,HIGH); // 从高脉冲发送出去到高脉冲接收的时间(即声波在空气中一来一回的时间)单位微妙
}
void stup(){
pinMode(TrigPin,OUTPUT);
pinMode(EchoPin,INPUT);
Serial.begin(9600); // 打开串口
}
void loop(){
d=ping()/58; // 声波在空气中传播的速度343m/s,也就是29.15微秒/厘米,一来一回除58微秒就可算出距离
Serial.print(d); // 打印出距离
Serial.print("cm");
Serial.println();
delay(1000);
}
二、项目整合
代码如下:
#include
#define DuoPin D5
#define Echo D2
#define Trig D8
Servo MyDuoJi // 定义新的类型名代替已有类型名
//获取超声波时间
long GetTime(){
digitalWrite(Trig,HIGH);
delayMicroseconds(10); // 维持10微妙
digitalWrite(Trig,LOW);
return pulseIn(Echo,HIGH); // 返回echo接收高电平的时间
}
//初始化超声波
void InitChaoSheng(){
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
}
//初始化舵机
void IitDuoJi(){
MyDuoJi.attach(DuoPin); // 将舵机与D5串口连接
}
//初始化串口
void InitChuanKou(){
Serial.begin(115200); // 初始化串口频率
}
void setup() {
InitChaoSheng();
InitDuoJi();
InitChuanKou();
}
void loop() {
long a;
a=GetTime()/58; // 获取超声波测出距离
Serial.println(a); // 串口打印出距离
if(a>10){
MyDuoJi.write(80);
}
if(a<10){
MyDuoJi.write(180);
delay(2000);
}
}
总结
超声波测距实现垃圾桶的开合主要通过Wemos的串口通信,和几个模块(舵机、超声波模块)的配合。