1、硬件平台介绍WeMos D1
特性:
1.基于ESP-8266EX
2.Arduino兼容,使用Arduino IDE来编程
3.11个I/O引脚
4.1个ADC引脚(输入范围0-3.3V)
5.板载5V 1A开关电源(高输入电压24V)
2、软件平台开发环境介绍
Arduino开发环境,和keil对比
优点:集成很多开发库如串口、网络、SG90等
各种硬件开发接口,迅捷开发
自带串口调试工具
缺点:程序编译速度慢
3、Wemos的I/O口研究–驱动蜂鸣器
VCC–Wemos 3.3V
GND–Wemos GND
I/O ----Wemos D5
蜂鸣器工作特点:
1.响 D5配置成输出端口,D5输出低电平
2.不响 D5配置成输出端口,D5输出高电平
**Arduino开发环境
上电后不断执行loop函数中的代码,我们核心控制代码写入loop
setup函数只调用一次,一般用于硬件相关的初始化,比如IO口,串口,WIFI等。
void setup(){
pinMode(D5, OUTPUT);//设置引脚为输出引脚
}
void loop(){
digitalWrite(D5, LOW);//D5配置成低电平。蜂鸣器响
delay(1000); //延时1秒
digitalWrite(D5, HIGH);//D5配置成高电平。蜂鸣器不响
delay(1000); //延时1秒
}//整体效果,蜂鸣器响一秒,不响一秒。
4、串口通信
1)Serial.begin()
*描述:开启串口,置于setup()函数中,
*原型:Serial.begin(speed)
Serial.begin(speed,config)
*参数:speed,波特率,一般设置为9600,115200
config 设置数据位、校验位和停止位,默认SERIAL_8N1表示8个数据位、无校验位、1个停止位
*返回值:无
2)Serial.println()
*描述:串口输出数据并换行
*原型:Serial.println(val) 例如Serial.println("kangxiansen handsome");
*参数:val打印的值
*返回值:返回写入的字节数
3)Serial.available()
*描述:判断串口缓冲区的状态,返回从串口缓冲区读取的字节数
*原型:Serial.available()
*参数:无
*返回值:可读取的字节数
4)Serial.read()
*描述:读取串口数据,一次读一个字符,读完删除已读数据
*原型:Serial.read()
*参数:无
*返回值:返回串口缓存中第一个可读字节,当没有可读数据时返回-1,整数类型
void setup(){
Serial.begin(115200);//波特率,设置为115200
}
void loop(){
int cmd;
if(Serail.available() > 0){//判断串口缓冲区的状态,有数据来
cmd = Serial.read(); //读取串口数据,串口数据赋值给cmd变量
if(cmd == 1){ //判断cmd变量是否为1
Serial.println("kangxiansen handsome");
}else{
Serial.println("kangxiansen rich");
}
}
}
5、硬件 SG90舵机
硬件资料:
型号 SG90
角度90度 -180度通用
接线红色(正极)—Wemos 3.3V
棕色(GND)—Wemos GND
橙色(信号线)—Wemos D5
技术数据:工作电压4.8V-6V(接线3.3V,可以实现开盖缓慢效果)
#include <Servo.h>
#define DuojiPIN D5 //定义D5端口为DuojiPIN
Servo myDuoJi:
void setup(){
myDuoJi.attach(DuojiPIN);//连接舵机
}
void loop(){
myDuoJi.write(90);//改变舵机角度
delay(1000);
myDuoJi.write(180);
delay(1000);
}
6、超声波测距
硬件资料:
4个引脚:VCC(正极)—Wemos 5V
Trig(触发)-----Wemos D8
Echo(回应)----Wemos D2
GND(接地)-----Wemos GND
工作电压:5V、15mA
感测距离:2-400cm
感测角度:不大于15度
具有温度补偿电路
*程序从“响应”脚位的高电平脉冲持续时间,换算出被测物的距离。
**注意,超声波测距要除以58
声音在干燥、摄氏 20度的空气中的传播速度大约为343米/秒,合34,300厘米/秒,34,300除以1,000,000厘米/微秒即为:0.0343厘米/微秒,再换一个角度,1/(0.0343 厘米/微秒),即:29.15 微秒/厘米,但是发送后到接收到回波,声音走过的是2倍的距离呀。所以实际距离就是1厘米,对应58.3微秒。实际上整个测距过程是测的发出声波到收到回波的时间,你的程序的distance实际上是时间us。所以换成距离cm,要除以58。当然除以58.3可能更精确
#include <Servo.h>
#define DuoJiPIN D5
#define Echo D2
#define Trig D8
Servo myDuoJi;
long getTime(){ //获取发出声波到收到回波的时间
digitalWrite(Trig, HIGH);//触发信号
delayMicroseconds(10); //10微妙方波
digitalWrite(Trig, LOW);
return pulseIn(Echo, HIGH);//返回值:发出声波到收到回波的时间
}
void setup(){ //初始化
pinMode(Echo, INPUT); //超声波初始化
pinMode(Trig, OUTPUT);
myDuoJi.attach(DuoJiPIN);//舵机初始化
}
void loop(){
long dis;
dis = getTime()/58; //发出声波到收到回波的时间,换成距离cm,要除以58
if(dis < 10){ //超声波距离小于10cm就启动舵机
myDuoJi.write(90);//调整舵机角度
delay(2000);
}else{
myDuoJi.write(180);//调整舵机角度
}
}