初识嵌入式之WeMos D1超声波感应开盖垃圾桶

目录

硬件平台介绍:WeMos D1

开发环境介绍:ARDUINO开发环境

 WeMos的IO口测试:驱动蜂鸣器

蜂鸣器

 接线

 由于该芯片基于串口连接------安装串口驱动

开发环境配置

选择端口

让蜂鸣器叫起来

WeMos的串口通信

串口调试小助手

串口通信函数编程

/*初始化函数*/

/*串口发送函数*/

/*有数据到来函数*/

/*串口发送函数*/

通过串口发送函数来发送、接受数据

垃圾桶连接

超声波模块

SG90舵机

 接线说明

servo类函数的用法

舵机角度测试

串口控制舵机转动

超声波模块测距

代码实现


(所使用到的资源已上传至我的资源中免费下载)

硬件平台介绍:WeMos D1

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第1张图片 WeMso D1

特性:

1.基于ESP-8266EX。

2.ARDUINO兼容,使用RDUINO IDE编程。

3.11*I/O口引脚。

4.1*ADC引脚(输入范围0~3.3V)

5.板载5V1A开关电源(高输入电压24V)

工作中:

与STM32模块开发类似,集成度高,方案便宜。


开发环境介绍:ARDUINO开发环境

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第2张图片 ARDUINO开发环境

与KEIL对比

优点:集成了很多开发库如串口、网络、SG90等,各种硬件开发接口,迅捷开发自带串口调试工具。

缺点:程序编译速度慢。

(无脑下一步即可)


 WeMos的IO口测试:驱动蜂鸣器

蜂鸣器

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第3张图片 蜂鸣器模块

GND ------ WeMos:GND

I/O    ------ WeMos:D5

VCC ------ WeMos:3.3V

 接线

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第4张图片

 由于该芯片基于串口连接------安装串口驱动

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第5张图片

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第6张图片

(无脑下一步即可)

蜂鸣器响:1.D5配置为输出端口。2.D5输出低电平。

蜂鸣器不响:1.D5配置成输出端口。2.D5输出高电平。

开发环境配置

选择:文件--->首选项--->修改字体大小

选择:工具--->板--->WeMos D1

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第7张图片

选择端口

若此时未插入板子则端口处无法选定,当硬件接入电脑后在 工具--->端口 中选择新的端口例COM3

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第8张图片

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第9张图片

 此时给硬件上传一个空程序,蜂鸣器此时并未发出声响,若提示 espcomm_open failed 则重新插拔硬件连接线即可。

让蜂鸣器叫起来

void setup() {
//setup函数只调用一次,一般用于硬件相关的初始化,比如IO口,串口,wifi等
  pinMode(D5,OUTPUT);//设置D5为输出引脚
}

void loop() {
//Wemos同Arduino,上电后不断执行loop函数中的代码,我们核心控制代码写入loop
  digitalWrite(D5,LOW);//给D5引脚赋低电压蜂鸣器响
  delay(1000);//一秒后
  digitalWrite(D5,HIGH);//给D5引脚赋高电压蜂鸣器不响
  delay(1000);//一秒后  
}

 上传代码后就可以实现蜂鸣器响一秒停一秒的效果了。

WeMos的串口通信

串口调试小助手

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第10张图片

串口通信有什么用?

电脑和单片机之间,单片机和单片机之间都可以互相传输数据,串口就是一个有线的传输方式。

串口通信函数编程

/*初始化函数*/

Serial.begin()//开启串口,通常置于setup函数中。

用法:Serial.begin(speed)

           Serial.begin(speed,config)

参数:speed:波特率,一般取值9600,115200等。  config:设置数据位、校验位、停止位。默认为SERIAL_8N1表示8个数据位,无校验位,一个停止位。

无返回值。

/*串口发送函数*/

Serial.println()//串口输出数据并且换行。

用法:Serial.println(val)

          Serial.println(val,format)

参数:val:打印的值,任意数据类型。   config:输出的数据格式。

返回写入的字节数。

/*有数据到来函数*/

Serial.available()//判断串口缓冲区状态,返回从串口缓冲区读取的字节数。

用法:Serial.available()      无参数。       返回值:可读取的字节数。

/*串口发送函数*/

Serial.read()//读取串口数据,一次读一个字符,读完后删除已读数据。

用法:Serial.read()   无参数。    

返回值:返回串口缓存中第一可读字节,没有时返回-1,整数类型。

通过串口发送函数来发送、接受数据

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第11张图片

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第12张图片

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第13张图片

 初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第14张图片

 此处选择十六进制发送,输入数字5 或者其它 数字 字符 点击发送,即可看到相应返回结果。

注:在进行代码上传时,一定要关闭串口。

void setup() {
  Serial.begin(115200);//初始化串口号
  pinMode(D5,OUTPUT);//初始化蜂鸣器
  digitalWrite(D5,HIGH);//初始化时给D5赋高电平,让蜂鸣器不响
}

void loop() {
  int cmd;
  if(Serial.available()>0){//如果串口接收到数据,则执行
    cmd = Serial.read();//读取串口数据
    if(cmd == 1){//如果读取到的串口数据等于1
      Serial.println(cmd);//串口输出数据
      digitalWrite(D5,LOW);//蜂鸣器响
      }else{
        Serial.println(cmd);//串口输出数据
        digitalWrite(D5,HIGH);//蜂鸣器不响
        }
    }
}
//此时若在调试助手中输入1并发送,则蜂鸣器会响,输入其它则不响。

垃圾桶连接

超声波模块

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第15张图片 超声波模块

超声波传感器模块上有两个超声波元器件一个用来发射一个用来接收。有四个引脚VCC(正极)、Trig(触发)、Echo(回应)、GND(接地)

工作电压电流:5V、15mA

感测距离:2~400cm

感测角度:不大于15°

具备温度补偿电路

       在超声波模块的触发脚位输入10微秒以上的高电位,即可发射超声波,发射超声波之后,与接收到传回的超声波之前,响应脚位呈现高电位。因此程序可以从响应脚位的高电位脉冲持续时间,换算出与被测物体间的距离。

SG90舵机

初识嵌入式之WeMos D1超声波感应开盖垃圾桶_第16张图片 SG90舵机

红色:电压线

棕色:地线

橙线:信号线

工作电压:3.3V~6V

旋转角度:90°!~-180°

 接线说明

超声波 WeMos D1
VCC(正极) 5V
GND(接地) GND
Echo(回应) D2......
Trig(触发)

D8......

SG90舵机 WeMos D1
红线(正极) 3.5V~5V
灰色(接地) GND
橘色(信号线控制转动角度) D5......

servo类函数的用法

attach 连接舵机(自带库仅D9/D10脚有效)
write 角度控制
writeMicroseconds() 更精准的角度控制(微秒级)
read() 读上一次舵机转动的角度
attached() 检查舵机能否连接到控制板上
detach() 断开舵机连接,使接口(D9/D10)可做PWM输出

舵机角度测试

// 舵机的测试
#include //引入Servo类的头文件
#define DuoPIN D5

Servo myDuoji;//创建servo类
void setup() {
  myDuoji.attach(DuoPIN);//调用attach函数:连接舵机
  //初始化D5引脚来连接舵机
}

void loop() {
  /* write函数:舵机的角度控制  */
  myDuoji.write(0);//0°
  delay(1000);//一秒后
  myDuoji.write(90);
  delay(1000);//一秒后
}

串口控制舵机转动

#include   
#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)关盖
           }
    }
}

超声波模块测距

#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打印一次距离
}

代码实现

#include   
#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
           }
   
}

--------上官可编程

你可能感兴趣的:(嵌入式,单片机,c语言,嵌入式硬件)