参考:基于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){ //而且到来的数据是数字1Serial.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命名为DUOPINServo 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函数,连接舵机,即连接引脚DUOPINSerial.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 D8long 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厘米,物距=声波路程/2Serial.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函数,连接舵机,即连接引脚DUOPINSerial.begin(115200);//用到了串口通信
}void loop() {long distance;distance=getTime()/58;//因为经过29.15微秒,超声波走过1厘米,物距=声波路程/2if(distance<10){SG90.write(0);//控制舵机转到0°位置delay(2000);//延时两秒}else SG90.write(90);//控制舵机转到90°位置}