参考:基于Wemos的智能感应开盖垃圾桶——日记
作者:9art0
发布时间:2020-09-24 00:40:59
网址:https://blog.csdn.net/GatoWong/article/details/108759063?spm=1001.2014.3001.5501
1.项目软硬件平台及开发环境
1.1.硬件平台
1.2.开发环境
1.3.安装USB转串口驱动
1.4.编辑:使得编程文件仅供Wemos使用
1.5.查看是否编辑完成
2.Wemos玩蜂鸣器
void setup() {
pinMode(D5, OUTPUT); //配置D5为输出端口
}
void loop() {//上电后不断执行loop函数中的代码,应将核心控制代码写入loop
//HIGH,LOW经过了宏定义
digitalWrite(D5, HIGH); // 输出高电平,蜂鸣器闭嘴
delay(1000); //单位为ms,这一秒内都得闭嘴
digitalWrite(D5, LOW); //输出低电平,蜂鸣器吼起来
delay(1000); //吼一秒(延时期间,蜂鸣器控制引脚属于低电平)
}
3.Wemos串口通信(收发)
下面学习Wemos几种函数
Serial——串口。API(Application Programming Interface,应用程序接口)是一些预先定义的函数。在Wemos里,函数经过高度封装。Serial.xxx类似于C++,一点后加函数即可调用。
3.1.初始化函数
3.2.串口发送函数
下面进行两个函数的应用
void setup() {
Serial.begin(115200);
//打开串口,调用begin函数。begin(speed),speed为设置的波特率。
}
void loop() {
Serial.println("You are hansome!!!");
//println,串口输出数据并换行。
}
编码前查看编译环境波特率是否与设定的一致
使用串口调试软件查看Wemos板的输出情况,记得设置软件的波特率与代码设定的一致!
———————————————————————————————————————
3.3.有数据到来函数
3.4.串口读取函数
下面进行两个函数的应用
void setup() {
Serial.begin(115200);
}
void loop() {
if(Serial.available()>0){//判断串口缓冲区状态
if(Serial.read()==6){//读取串口数据
Serial.println("You are handsome!");
}
else {
Serial.println("You are not handsome!");
}
}
}
4.通过串口控制蜂鸣器的响与不响
void setup() {
Serial.begin(115200); //串口通信,首先设置波特率
pinMode(D5,OUTPUT); //将D5设置为输出状态
digitalWrite(D5,HIGH); //另D5输出高电平,一上电使得蜂鸣器不响
}
void loop() {
if(Serial.available()>0){ //如果串口来数据了
if(Serial.read()== 1){ //而且到来的数据是数字1
Serial.println("DEE!!!");
digitalWrite(D5,LOW); //D5输出低电平,让蜂鸣器响
}
else{
Serial.println("HUSH~");
digitalWrite(D5,HIGH);//D5输出低电平,让蜂鸣器不响
}
}
}
5.模块接线
6.SG90舵机开盖调试
6.1.舵机参数及其调用函数
servo库是arduino的舵机函数库
6.2.舵机开盖测试
#include<Servo.h> //头文件为Servo
#define DUOPIN D5 //把引脚D5命名为DUOPIN
Servo SG90; //把Servo类函数命名为SG90,为C++代码。
void setup() {
SG90.attach(DUOPIN);//调用attach函数,连接舵机,即连接引脚DUOPIN
}
void loop() {
SG90.write(0);//控制舵机转到0°位置
delay(1000);//延时1秒
SG90.write(90);//控制舵机转到90°位置
delay(1000);
}
6.3.串口控制舵机开盖
#include<Servo.h> //头文件为Servo
#define DUOPIN D5 //把引脚D5命名为DUOPIN//记得不要加分号
Servo SG90; //把Servo类函数命名为SG90,为C++代码。
void setup() {
SG90.attach(DUOPIN);//调用attach函数,连接舵机,即连接引脚DUOPIN
Serial.begin(115200);
}
void loop() {
if(Serial.available()>0){
if(Serial.read()==1){
SG90.write(0);//控制舵机转到0°位置
}
}
if(Serial.read()==0){
SG90.write(90);//控制舵机转到90°位置
}
}
//别用else,单单用else,会包括除条件以外的所有情况,不会保持开或盖的状态。
//能保持开或者盖的状态的只有不断循环if函数
7.超声波测距
7.1.超声波模块介绍
7.2.超声波模块测距原理
全程耗时为接收模块ECHO的高电平持续时间
结论:超声波走过1厘米的时间为29.15微秒
7.3.超声波测距代码
#define Echo D2
#define Trig D8
long getTime(){ //long是整型
digitalWrite(Trig,HIGH);//Trig输出高电平
delayMicroseconds(10);//维持10微秒
digitalWrite(Trig,LOW);//Trig降为低电平,引起一次脉冲触发
return pulseIn(Echo,HIGH);//返回ECHO处于高电平的时间(获取全程耗时)
}
void setup() {
pinMode(Echo,INPUT);//一开始先回声接收装置打开(进入接收状态input)
pinMode(Trig,OUTPUT);//发射装置打开(给予触发信号,进入待输出状态ouput)
Serial.begin(115200);//用到了串口通信
}
void loop() {
long distance;
distance=getTime()/58;//因为经过29.15微秒,超声波走过1厘米,物距=声波路程/2
Serial.print(distance);//打印物距数值
Serial.println("cm");//打印单位
delay(500);//等500微秒后进行下一次测距
}
8.项目代码整合
#include<Servo.h>
#define Echo D2//把引脚D2命名为Echo//记得不要加分号
#define Trig D8//把引脚D8命名为Trig
#define DUOPIN D5//把引脚D5命名为DUOPIN
Servo SG90; //把Servo类函数命名为SG90,为C++代码。
long getTime(){ //long是整型
digitalWrite(Trig,HIGH);//Trig输出高电平
delayMicroseconds(10);//维持10微秒
digitalWrite(Trig,LOW);//Trig降为低电平,引起一次脉冲触发
return pulseIn(Echo,HIGH);//返回ECHO处于高电平的时间(获取全程耗时)
}
void setup() {
pinMode(Echo,INPUT);//一开始先回声接收装置打开(进入接收状态input)
pinMode(Trig,OUTPUT);//发射装置打开(给予触发信号,进入待输出状态ouput)
SG90.attach(DUOPIN);//调用attach函数,连接舵机,即连接引脚DUOPIN
Serial.begin(115200);//用到了串口通信
}
void loop() {
long distance;
distance=getTime()/58;//因为经过29.15微秒,超声波走过1厘米,物距=声波路程/2
if(distance<10){
SG90.write(0);//控制舵机转到0°位置
delay(2000);//延时两秒
}
else SG90.write(90);//控制舵机转到90°位置
}