文章目录[隐藏]
一、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
暂无评论