距离感应垃圾桶(Wemos D1 开发板实现)


一、Wemos D1 开发板

1. Wemos D1 的特性

  • 基于ESP-8266EX
  • Arduino兼容,使用Arduino IDE来编程
  • 11个I/O引脚
  • 1个ADC引脚(输入范围0-3.3V)
  • 板载5V 1A开关电源(高输入电压24V)

注:在烧程序前需要在电脑上安装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<Servo.h>
#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<Servo.h>
#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的串口通信,和几个模块(舵机、超声波模块)的配合。

版权声明:本文为CSDN博主「浅夏,,」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43660337/article/details/122972800


一、Wemos D1 开发板

1. Wemos D1 的特性

  • 基于ESP-8266EX
  • Arduino兼容,使用Arduino IDE来编程
  • 11个I/O引脚
  • 1个ADC引脚(输入范围0-3.3V)
  • 板载5V 1A开关电源(高输入电压24V)

注:在烧程序前需要在电脑上安装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<Servo.h>
#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<Servo.h>
#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的串口通信,和几个模块(舵机、超声波模块)的配合。

版权声明:本文为CSDN博主「浅夏,,」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43660337/article/details/122972800

生成海报
点赞 0

浅夏,,

我还没有学会写个人说明!

暂无评论

相关推荐

单片机开发项目全局变量太多怎么管理?

大家好,我是无际。 最近有几个小伙伴反映说自己写程序感觉很乱,不知道怎么去规划,想到什么就写什么,全局变量满天飞,代码一多就出现好多问题。 而且如果自己写的程序不加注释的

CMSIS/FreeRTOS中队列(Queue)的使用

在有流式数据处理的嵌入式系统中,队列(Queue)是几乎必然被使用的工具,但大多数开发板提供的FreeRTOS例程是不包含队列的,要使用还要自己研究。这次我的样例把串口收到的数据按字节塞入队列&#xff