【Arduino】基于wemos D1的智能感应垃圾桶

基于wemos D1的智能感应垃圾桶

需要的硬件:wemos,超声波模块(HC—SR04),舵机(sg90),杜邦线若干,小垃圾桶

【Arduino】基于wemos D1的智能感应垃圾桶_第1张图片

文章目录

  • 基于wemos D1的智能感应垃圾桶
    • 1.SG90舵机
      • 1.1基本信息介绍
      • 1.2servo函数用法
      • 1.3核心代码
    • 2.超声波模块
      • 2.1主要参数:
      • 2.2时序图及原理图
      • 2.3核心代码
    • 3.舵机跟超声波的结合,实现智能感应
    • 4.进阶部分
      • 1.加上WiFi联网功能,实现用手机app发送指令来控制
    • 视频展示

1.SG90舵机

1.1基本信息介绍

【Arduino】基于wemos D1的智能感应垃圾桶_第2张图片

型号:SG90 重量13克 角度90度-180度通用
红色电压 粽色地线 橙色是信号线
厂家给出的技术数据: 尺寸:21.5mmX11.8mmX22.7mm重量:9克
无负载速度: 0.12秒/60度(4.8V)
堵转扭矩: 1.2-1.4公斤/厘米(4.8V)
使用温度: -30~~+60摄氏度
死区设定: 7微秒
工作电压: 4.8V-6V

1.2servo函数用法

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

1.3核心代码

#include 		//包含舵机的头文件
#define PIN_SERVO D5	//定义一个舵机引脚
Servo myservo;			//给自己的舵机起一个名字
myservo.attach(PIN_SERVO);//连接舵机
myservo.write(30);		//舵机转动的角度
/*************对舵机的基础控制**************/
#define servo D5  //定义舵机引脚
#include   //调出舵机函数
Servo sssss;//定义一个舵机的名称
void setup() {
  
  sssss.attach(servo);//连接上舵机
  
}

void loop() {
  sssss.write(0);
  delay(1000);
  sssss.write(180);
  delay(1000);
}

2.超声波模块

【Arduino】基于wemos D1的智能感应垃圾桶_第3张图片

超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有4个引脚:VCC(正极)、Trig(触发Echo (回应)、GND (接地),

2.1主要参数:

  • 工作电压与电流: 5V、15mA.
  • 感测距离: 2-400cm
  • 感测角度:不大于15°
  • 被测物的面积不要小于50cm并且尽量平整
  • 具备温度补偿电路

2.2时序图及原理图

在超声波块的触发脚位输入10微秒以上的高电位,即可发射超声波,发射超声波之后,与接收到传回的超声波之前,“响应”脚位呈现高电位。因此,程序可从“响应”脚位的高电位脉冲持续时间,换算出被测物的距离。
【Arduino】基于wemos D1的智能感应垃圾桶_第4张图片
【Arduino】基于wemos D1的智能感应垃圾桶_第5张图片

2.3核心代码

关于距离中除以58的说明:

58也很好理解,声音在干燥、摄氏 20度的空气中的传播速度大约为343米/秒,合34.300厘米/秒。或者,我们作一下单位换算,34300除以1,000,000厘米/微秒。即为: 0.0343厘米/微秒,再换一个角度,1/ (0.0343 厘米/微秒)即: 29.15 微秒/厘米,这就意味着,每291.5微秒表示10CM的距离。1厘米就是29.15微秒。但是发送后到接收到回波,声音走过的是2倍的距离呀。听以实际距离就是1厘米,对应58.3微秒。实际上整个测距过程是测的发出声波到收到回波的时间,你的程序里的第一个distance实际是时间us。所以换成距离cm,要除以58。当然除以58.3可能更确。所以程序中用 pulseln(EcoPin, HIGH)/ 58.00获取测得的距离。

#define Echo D5	//吸收
#define Tirg D6	//发射,,给一个10us的高电平,触发
unsigned long dis;//unsigned的作用是:声明无符号的整数类型。
/**写一个检测高电平触发时间*/
unsigned long init_time()
{
    digitalWrite(Tirg,HIGH);
    delayMicroseconds(10);
    digitalWrite(Tirg,LOW);
    return pulseln(Echo,HIGH);
}

void setup(){
    pinMode(Echo,INPUT);
    pinMode(Tirg,OUTPUT);
    Serial.begin(115200);
}
void loop(){
    /*我感觉这个是换算起来比较麻烦的一个
    dis = init_time()/58;*/
        /还有一种计算方法就是,路程 =时间 * 速度(340m/s),,,2dis = time * 340m/s,这个时间是微秒,所以换算得0.017
    dis = init_time()*0.017;
    Serial.print(dis);
    Serial.println("cm");    //字符要加引号
    delay(1200);//写一个延迟
}

3.舵机跟超声波的结合,实现智能感应

#define Echo D7	//接收
#define Tirg D6	//发射,,给一个10us的高电平,触发
unsigned long dis;//unsigned的作用是:声明无符号的整数类型。
/*************对舵机的基础控制**************/
#define servo D5 						 		 //定义舵机引脚
#include   							 //调出舵机函数
Servo sssss;									//定义一个舵机的名称
/**写一个检测高电平触发时间*/
unsigned long init_time()
{
    digitalWrite(Tirg,HIGH);
    delayMicroseconds(10);
    digitalWrite(Tirg,LOW);
    return pulseIn(Echo,HIGH);
}
/***************************/
void setup(){
    pinMode(Echo,INPUT);
    pinMode(Tirg,OUTPUT);
    sssss.attach(servo);//连接上舵机
    Serial.begin(115200);
}
void loop(){
    dis = init_time()*0.017;
    /*通过串口打印出来显示*/
    Serial.print(dis);
    Serial.println("cm");    //字符要加引号
/**************************************/
    if(dis<10)
    {
       sssss.write(30);
        delay(2000);
        sssss.write(180);
    }else
    {
        sssss.write(180);
    }
    
}

到了此部分呢,本节内容已经结束,但是如果还想在此基础上有所进阶,,可以在试试连上WiFi,用手机端控制垃圾桶的开关,哈哈哈哈,祝你好运!!!

4.进阶部分

1.加上WiFi联网功能,实现用手机app发送指令来控制

#include
/*****WiFi部分******/
char *ssid = "WiFi名称";   //自己家的wifi
char *passwd = "WiFi密码";
int port = 8888; //端口号
WiFiServer server(port); //设置服务器端口号
/*****超声波*******/
#define Echo D7	//吸收
#define Tirg D6	//发射,,给一个10us的高电平,触发
unsigned long dis;//unsigned的作用是:声明无符号的整数类型。
/*************对舵机的基础控制**************/
#define servo D5 						 		 //定义舵机引脚
#include   							 //调出舵机函数
Servo sssss;									//定义一个舵机的名称
/******wiff部分*******/
void init_wifi_sta()
{
    WiFi.mode(WIFI_STA);     //设置STA模式
    WiFi.begin(ssid,passwd); //连接网络
    while(WiFi.status() != WL_CONNECTED)   //等待连接
    {
        Serial.print(".");
        delay(500);
    }
    Serial.println(WiFi.localIP()); //通过串口打印wemos的ip地址
    
}
/**写一个检测超声波高电平触发时间*/
unsigned long init_time()
{
    digitalWrite(Tirg,HIGH);
    delayMicroseconds(10);
    digitalWrite(Tirg,LOW);
    return pulseIn(Echo,HIGH);
}
/***************************/
void setup(){
    pinMode(Echo,INPUT);
    pinMode(Tirg,OUTPUT);
    sssss.attach(servo);//连接上舵机
    Serial.begin(115200);
    init_wifi_sta();   
    server.begin(); // 启动服务器 
}
void loop(){
  char cmd;
    dis = init_time()*0.017;
    /*实际中不需要打印出来也*/
    Serial.print(dis);
    Serial.println("cm");    //字符要加引号
/***********近距离感应部分*************/
    if(dis<10)
    {
       sssss.write(30);
        delay(2000);
        sssss.write(180);
    }else
    {
        sssss.write(180);
    }
    /***********wifi控制部分*********/

  WiFiClient client = server.available(); // 服务器初始化 
  while(client.connected()) // 等待客户端连接
  {
    while(client.available()>0)//有数据到来,类似Serial.available()
    {
        cmd = client.read(); //读取数据
        Serial.print(cmd);
	 switch(cmd){         
        case '1':
        sssss.write(30);
        break;
        case '0':
        sssss.write(180);
        break;
     }

     }
  }
    
}

视频展示

链接:示例视频

你可能感兴趣的:(arduino系列,c语言,单片机,物联网,mcu)