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

本文介绍了如何使用WemosD1开发一个智能垃圾桶,包括使用SG90舵机进行角度控制,利用超声波模块进行物体感应,以及添加WiFi功能,通过手机APP远程操控垃圾桶的开关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

在这里插入图片描述

1.SG90舵机

1.1基本信息介绍

在这里插入图片描述

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

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

2.超声波模块

在这里插入图片描述

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

2.1主要参数:

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

2.2时序图及原理图

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

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.h>  							 //调出舵机函数
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<ESP8266WiFi.h>
/*****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.h>  							 //调出舵机函数
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;
     }

     }
  }
    
}

视频展示

链接:示例视频

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘猫.exe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值