硬件材料:
Wemos D1、SG90舵机、HC-SR04、杜邦线若干、蜂鸣器3.3V(可有可无)
软件材料:
arduino IDE编译器、USB转串口驱动
Wemos D1:
特性:
- 基于ESP-8266EX及arduino做的一个融合
- arduino兼容,使用arduino IDE编程
- 11个IO口
- 一个ADC转换引脚(输入范围0~3.3V),ADC通常用在光照的采集或者人体的模拟量转换的应用。本项目没有使用该功能。
- 板载5V1A开关电源,集成度高。
arduino IDE:
优点:集成很多开发库,如串口、网络,SG90等各种硬开发接口,迅速开发,自带串口调试工具。
缺点:程序编译速度慢。
注意:本次使用的单片机是Wemos D1,若在开发板里找不到Wemos D1就要在开发板管理器中下载,搜索D1就可以看到ESP8266了,然后安装即可。
蜂鸣器:
低电平触发,也就是将蜂鸣器的IO口设置为输出端口,IO口输出高电平不响,IO口输出低电平响。
驱动蜂鸣器滴滴响:
void setup() {//这个函数里放的是初始化的内容,程序只跑一次pinMode(D5,OUTPUT);//初始化蜂鸣器的IO口为输出模式
}void loop() {digitalWrite(D5,LOW);//输出低电平,蜂鸣器响delay(1000);//延时1000ms=1sdigitalWrite(D5,HIGH);//输出高电平,蜂鸣器不响delay(1000);//延时1000ms=1s
}
SG90舵机:
- 红色电压线
- 棕色地线
- 橙色信号线
- 无负载速度:0.12s/60度(4.8V)
- 堵转扭矩:1.2~1.4公斤/厘米(4.8V)
- 工作电压:4.8~6V
HC-SR04超声波模块:
- 超声波传感器上面通常带有两个超声波元器件,一个用于发射,一个用于接收。电路板上有4个引脚:VCC(正极)、Trig(触发)、Echo(回应)、GND(接地)。
- 工作电压与电流:5V、15mA
- 感测距离:2~400cm
- 感应角度:不大于15度
- 在超声波模块的触发脚位输入10微妙以上的高电位,即可以发射超声波,发射超声波以后,与接收到传回的超声波之前,响应位呈现高电位。因此,程序可以从“响应”脚位的高电位脉冲持续时间,换算出被测物体的距离。
超声波部分代码:
#define Echo D2
#define Trig D8
int getTime()//超声波发生函数
{digitalWrite(Trig,HIGH);delayMicroseconds(10);//延时10usdigitalWrite(Trig,LOW);return pulseIn(Echo,HIGH);//计算某个引脚高电平持续的时间,单位是us
}
void initChaoShengBo()//超声波初始化函数
{pinMode(Echo,INPUT);//设置Echo引脚为输入引脚pinMode(Trig,OUTPUT);//设置Trig引脚为输出引脚
}
void setup() {//这个函数里放的是初始化的内容,程序只跑一次Serial.begin(9600);initChaoShengBo();//在初始化中调用超声波初始化函数
}void loop() {int dis;//超声波测试的距离dis=getTime()/58;//计算距离Serial.print(dis);Serial.println("cm");delay(500);
}
/*
dis=getTime()/58;
关于距离除以58的说明:
波在空气中传播的速度是:343米每秒,也就是343000厘米每秒。根据公式1000000us=1s得0.0343厘米/微妙,再换一个角度,1/(0.0343厘米/微妙)即:29.15微妙/厘米,表示1厘米就是29.15微妙。但是声波走过的距离是二倍,所以除以58就是实际距离。
*/
SG90舵机部分控制代码:
#include <Servo.h>
#define DuoPin D5//将D5红定义为DuoServo myDuoJi;//这是舵机的一个类
void setup() {//这个函数里放的是初始化的内容,程序只跑一次Serial.begin(115200);myDuoJi.attach(DuoPin);//将舵机连接到D5这个引脚
}void loop() {myDuoJi.write();//里面的参数是想要旋转的度数0~180
}
Wemos D1和PC串口通信:
void setup() {//这个函数里放的是初始化的内容,程序只跑一次Serial.begin(115200);
}void loop() {Serial.println("hello!");//单片机向电脑发送hello!
}Serial.begin();
描述:开启串口。
原型:Serial.begin(speed);Serial.begin(speed,config);speed:波特率,一般取值9600、115200。(就相当于人说话的语速,通信时要保持波特率一至)config:设置数据位、停止位和校验位。默认SERIAL_8N1表示8个数据位,无校验位,1个停止位。
返回值:无Serial.println()
描述:串口输出数据并换行
原型:Serial.println(val)val:打印的值,任意数据类型Serial.available()
描述:判断串口缓冲区的状态,返回串口缓冲区读取的字节数
原型:Serial.available()
参数:无
返回值:可读取的字节数。Serial.read()
描述:读取串口数据,一次读一个字符,读完后删除已读数据
原型:Serial.read()
参数:无
返回值:返回串口缓存中第一个可读字节,当没有可读数据时返回-1,整数类型
代码综合实现效果:
#include <Servo.h>
#define DuoPin 4
#define Echo D2
#define Trig D8
Servo myduoji;
int getTime()//超声波发生函数
{digitalWrite(Trig,HIGH);delayMicroseconds(10);//延时10usdigitalWrite(Trig,LOW);return pulseIn(Echo,HIGH);//计算某个引脚高电平持续的时间,单位是us
}
void initChaoShengBo()//超声波初始化函数
{pinMode(Echo,INPUT);//设置Echo引脚为输入引脚pinMode(Trig,OUTPUT);//设置Trig引脚为输出引脚
}
void setup()
{initChaoShengBo();myduoji.attach(DuoPin);//连接舵机Serial.begin(115200);//确定串口的波特率myduoji.write(98);
}void loop()
{int dis;dis=getTime()/58;//计算手与超声波的距离Serial.println(dis);delay(500);if (dis<10) {myduoji.write(98);delay(1000);}else{myduoji.write(180);}
}