wemos实现智能垃圾桶
一、编写代码前硬件准备与编译环境介绍
(1)硬件:wemoeD1芯片
(2)超声波
(3)蜂鸣器
(4)软件平台介绍:Arduino
二、接线
(1)wemos图解
(2)让蜂鸣器叫
1.蜂鸣器与wemos接线
(蜂鸣器的)VCC—— (wemos的)3.3v
(蜂鸣器的)GND—— (wemos的)GND
(蜂鸣器的)IO—— (wemos的)D5
(注释:——为接线符号,接线时有无线模块的那一侧朝向自己。)
三根线插完之后,最后用USB线让wemos与电脑相连。
图为接通状态
2.安装驱动
wemos与电脑连接之后,为USB转串口安装驱动,否则电脑识别不了芯片。
(1)安装驱动软件
1.CH341SER.EXE
下载地址:http://www.wch.cn/downloads/CH341SER_EXE.html
下载完点击安装即可
如果安装之后还是识别不了,就安装pl2303
下载地址:http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=225&pcid=41
点击红色区域即可下载。
三、编写蜂鸣器代码
(1)打开Arduino
首先要配置才能支持wemos:
点击上方的工具,点击板,选择wemosD1,紧接着鼠标放在工具下面的端口,会自动的显示COM端口,点击COM端口号即可
(2)让蜂鸣器响与不响
D5输出低电平——响
D5输出高电平——不响
让蜂鸣器一直响:
void setup() {
pinMode(D5,OUTPUT);//1.设置D5为输出引脚
}
void loop() {
digitalWrite(D5,LOW);//2.低电频响
}
核心的代码要写得到loop里面,因为通电之后,首先执行的是loop里面的代码,不断的执行D5=LOW。
setup函数只调用一次,一般用于硬件相关的初始化,例如:IO口,串口,WIFI等。
让蜂鸣器响一会儿,不响一会儿
void setup() {
pinMode(D5,OUTPUT);//设置为输出引脚
}
void loop() {
digitalWrite(D5,LOW);//低电频响
delay(1000);//1000毫秒等于一秒,响一秒
digitalWrite(D5,HIGH);//高电频不响
delay(1000);//不响一秒
}
四、通过串口来实现蜂鸣器响与不响
1. 一些函数的认知:
Serial.begin() 初始化串口
描述:开启串口,通常置于setup()函数中
原型:
1.Serial.begin(speed)
2.Serial.begin(speed,config)
参数:
1.speed:波特率,一般取值9600,115200等
2.config:设置数据位,校验位和停止位。
返回值:无
Serial.println()
描述:串口输出数据并换行
原型:
(1)Serial.println(val)
(2)Serial.println(val,format)
参数:
val:打印的值,任意数据类型
config:输出的数据格式
返回值:返回写入的字节数
void setup() {
Serial.begin(115200);//初始化串口为115200
}
void loop() {
Serial.println("helloworld");//串口输出数据
}
编写完代码,点击上传按钮,等待上传成功,则就写入成功,如下图:
2.wemos通过串口告诉电脑信息
(1)下载工具: 串口调试助手
下址地址:
http://www.ddooo.com/softdown/172410.htm
(2) 打开串口调试助手,设置波特率为115200,端口号设置为之前Arduino设置的COM号,我所设置的COM号为COM5。设置完以上配置,紧接着点击打开串口按钮,接收区就会显示在Arduino平台上打印helloworld的信息了,在疯狂的刷屏。如下图
到这里串口的发送就实现了。
五、通过电脑发送数据给wemos
1. 一些函数的认知:
Serial.available()
描述:判断串口缓冲区的状态,返回从串口缓冲区读取的字节数
返回值:可读取的字节数。
Serial.read()
描述:读取串口数据,一次读一个字符,读完后删除已读数据。
返回值:返回串口缓存中第一个可读字节,当没有可读数据时返回-1,为整数类型。
打开串口调试助手点击十六进制发送
通过输入命令来判断输出命令
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);//初始化串口为115200
}
void loop() {
int cmd;
// put your main code here, to run repeatedly:
if(Serial.available()>0)//串口来数据
{
cmd=Serial.read();//读取数据
if(cmd==5)
{
Serial.println("wo hen shuai");//如果等于5打印我很帅
}
else
{
Serial.println("wo bu shuai");//否则打印不帅
}
}
}
六、通过串口控制蜂鸣器响与不响
#define BBEP D5//设置BEEP 为D5引脚,以后要改变插线只要改变一个D5这个地方就行
void setup() {
Serial.begin(115200);
pinMode(BBEP,OUTPUT);//设置D5为输出引脚
digitalWrite(BBEP,HIGH);//刚接入电源输出高电平不让蜂鸣器响
}
void loop() {
int cmd;
if(Serial.available()>0)//串口来数据
{
cmd=Serial.read();//读取数据
if(cmd==1)
{
Serial.println(cmd);//收到1的时候,cmd发回给电脑
digitalWrite(BBEP,LOW);//并且cmd==1的时候输出低电平让蜂鸣器响起来,
}
else
{
Serial.println(cmd);
digitalWrite(BBEP,HIGH);//否则输出高电平蜂鸣器不响
}
}
}
运行程序并且打开串口助手,在收发区输入1或0,对蜂鸣器进行控制
让蜂鸣器响
让蜂鸣器不响
七、 通过wemos控制SG90舵机
SG90舵机的GND连接到wemos的GND(哪个GND都可以)
SG90舵机的PWM为信号线(橘色)连接到连接到wemos的D5
SG90舵机的5V连接到连接到wemos的3.3v
(备注)SG90舵机:红色的为正极,棕色的为负极,橙色为信号线
八、wemos控制SG90舵机
(一)舵机连接并且让舵机转动(实现1秒前为0度,1秒后为180度)
#include <Servo.h>
#define DuoPIN D5 //1.舵机的引脚
Servo myDuoJi; //2.设置舵机的类
void setup() {
myDuoJi.attach(DuoPIN);//3.舵机的连接
}
void loop() {
myDuoJi.write(90);//4.初始为0度
delay(1000);// 5. 1s以后
myDuoJi.write(180);
delay(1000);//7、1s以后为180度
}
(二)通过串口进行开盖和关盖
#include <Servo.h>
#define DuoPIN D5 //1.舵机的引脚
Servo myDuoJi; //2.设置舵机的类(Servo 后面的名字自己起的)
void setup() {
myDuoJi.attach(DuoPIN);//3.(1)舵机的连接
Serial.begin(115200);//4.(2)开启串口
}
void loop() {
int cmd;
if(Serial.available()>0)//(3)串口是否有数据
{
cmd=Serial.read();//(4)读取指令
if(cmd==1)
{
myDuoJi.write(90);//(5)开盖
}
if(cmd==0)
{
myDuoJi.write(180);//(6)关盖
}
}
}
接着打开串口调试助手设置波特率为115200,点击十六进制发送,在发送区中输入1或者0再点击手动发送进行开关盖。
注释:servo.h库文件,它是Arduino控制舵机的标准库之一。
九、超声波测距
#define Echo D2
//1.定义两个引脚
#define Trig D8
long getTime()//四:波在空气中运行的时间
{
digitalWrite(Trig,HIGH);
delayMicroseconds(10); //10微秒高电平
digitalWrite(Trig,LOW);//10微秒后低电平
return pulseIn(Echo,HIGH);//获取时间
}
void initChaoShengBo()//二、初始化引脚
{
pinMode(Echo,INPUT);//1.定义输入引脚
pinMode(Trig,OUTPUT);//2..定义输出引脚
}
void setup() {
initChaoShengBo();//一、初始化超声波
Serial.begin(115200);//启动串口
}
void loop() {//三、
long dis;//定义距离
dis = getTime()/58;
Serial.print(dis);//获取距离
Serial.println(“cm”);//打印距离
delay(500);//每隔500ms打印一次距离
}
十、超声波与蜂鸣器连接
#define Echo D2
//1.定义两个引脚
#define Trig D8
#define BEEP D5 //蜂鸣器
long getTime()//四:波在空气中运行的时间
{
digitalWrite(Trig,HIGH);
delayMicroseconds(10); //10微秒高电平
digitalWrite(Trig,LOW);//10微秒后低电平
return pulseIn(Echo,HIGH);//获取时间
}
void initChaoShengBo()//二、
{
pinMode(Echo,INPUT);//1.定义输入引脚
pinMode(Trig,OUTPUT);//2..定义输出引脚
}
void setup() {
initChaoShengBo();//一、初始化超声波
pinMode(BEEP,OUTPUT);//五、给蜂鸣器供电
digitalWrite(BEEP,HIGH);//六、防止蜂鸣器刚通电的时候叫
Serial.begin(115200);//启动串口
}
void loop() {//三、
long dis;
dis = getTime()/58;
Serial.print(dis);//获取距离
Serial.println("cm");//打印距离
if(dis<10)//七、
{
digitalWrite(BEEP,LOW);//小于10cm发声
}
else
{
digitalWrite(BEEP,HIGH);
}
delay(1000);//每隔一秒打印一次距离
}
十一、代码整合
#include <Servo.h>
#define DuoPIN D5 //1.舵机的引脚
#define Echo D2//1.定义两个引脚
#define Trig D8
Servo myDuoJi;
long getTime()//波在空气中运行的时间
{
digitalWrite(Trig,HIGH);
delayMicroseconds(10); //10微秒高电平
digitalWrite(Trig,LOW);//10微秒后低电平
return pulseIn(Echo,HIGH);//获取时间
}
void initChaoShengBo()//超声波的初始化
{
pinMode(Echo,INPUT);//定义输入引脚
pinMode(Trig,OUTPUT);//定义输出引脚
}
void setup() {//1.一上电调用setup函数一次
initChaoShengBo();//2.超声波的初始化
myDuoJi.attach(DuoPIN);//3.舵机的连接
Serial.begin(115200);//没用到,但作为调试
}
void loop() {//4.不断的获取距离
long dis;
dis = getTime()/58;
if(dis<=10)
{
myDuoJi.write(90);//5.小于10cm转90开盖
delay(1000);//6. 2秒的延时
}
else
{
myDuoJi.write(180);//7.关盖转180
}
}
——@上官可编程