使用Arduino ESP8266手把手教你制作物联网垃圾桶

最近自创的项目结题了,就顺手将相关的技术细节记录一下,也给需要做自创的同学提供一个简单的可复制的小项目

智能垃圾桶的选型

通过充分考虑实际生活场景,加入了IP65级别防水设计,可以满足大多数需要场景,此外采用升压和可充电电池,践行环保理念,实现长续航和低碳设计,采用金属齿轮舵机充分考虑长期使用,可以实现一年以上的使用,加入物联网模块,实现智能交互

防水紫外线灯带 

UNO主板

ESP8266

可充电电池(12500)

升压模块(自己选就行)

超声波模块(SR04)

金属齿轮舵机(MGS90)

12V继电器

研究现状:

   市面上现阶段智能垃圾桶成本相对较为高昂,此外智能化程度不高,难以作为将来物联网的智能家居的一部分此外市场上没有智能开盖的桌面垃圾桶,开盖多半是按压式,非常不便捷

   随着生活水平的提高,人们更加追求干净、健康、绿色的生活方式。

研究趋势:

             智能化

 提高人们生活舒适精致度

  以低成本实现需求

     实用耐用好用

研究意义:

增强大学生的创新意识和创新能力

增强我们的机械设计制造的动手能力

实现对生活废弃物的病菌消杀

为生活中的卫生健康提供保障。

项目简介:本装置通过紫外线等消毒方式对携带病毒的生活废弃物进行一定程度的消杀,从而大大降低清洁人员和拾荒者的感染概率,省财省力省时,减轻人们除了防疫以外的其它生活负担,对当前社会现状具有一定的实用性及创新性。同时充分考虑紫外线对人眼的刺激,做了开盖前自动关灯处理,考虑到紫外线灯长时间工作会产生较大热量,设计了照明和休息时长。

实施方案:

通过超声传感器实现位置距离的准确获取,从而实现对用户状态的信息精确判别

通过设计的电路实现对于紫外线灯和舵机的精确控制,并留存状态标志位,使得可以无线智能控制

 

网络安全方面,使用加密网络控制MQTT协议,只有知道特定密钥才可以访问,并且适配了图形化控制界面,接入专门软件点灯blinker”,任何用户只要获得分享权限就可以使用

充分的可拓展性和共享性,专门的密钥可以通过手机号共享,且可以接入小爱同学等AI助手

运行逻辑:本次设计采用了双机通信技术,实现了较好的WIFI通信效果,其中UNO作为主机,ESP8266作为从机

 本装置做到在实现感应开盖,杀毒灭菌的智能逻辑和灵敏基础上,实现wifi互联,从而实现远程开盖,通过利用紫外线等装置,定时自动消杀废弃物,对生活垃圾进行预消毒工作。实现物联网,互联网与垃圾桶的融合创新

 

具体代码

ESP8266(上)和UNOR3(下)

#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT//支持小爱同学
#define BLINKER_WITHOUT_SSL      //非SSL加密通信接入,省堆栈  
#include <Blinker.h>

#define LED  LED_BUILTIN  // 板子上的灯 
#define PASSIO  2  // 板子上的io2
char auth[] = "4a633cdd91eb"; // blinker app提供的秘钥
char ssid[] = "小琮的Xiaomi 13 Pro";// wifi 名字
char pswd[] = "23456789";// wifi 密码

bool wsState;
uint8_t wsMode = BLINKER_CMD_MIOT_DAY;
// 新建组件对象
BlinkerButton Button1("btn-abc");//注意:要和APP组件’数据键名’一致
BlinkerButton Button2("btn-open");//注意:要和APP组件’数据键名’一致
// 按下BlinkerAPP按键即会执行该函数
void button1_callback(const String & state) {
 BLINKER_LOG("get button state: ", state);
 digitalWrite(LED, !digitalRead(LED));
 Blinker.vibrate();
}
 void button2_callback(const String & state)
{
    digitalWrite(PASSIO, !digitalRead(PASSIO));
    BLINKER_LOG("get button state: ", state);
    Button1.icon("icon_2");
    Button1.color("#FFFFFF");
    Button1.text("一直开盖");
    Button1.print("on");
}

//小爱电源类回调
void miotPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
        digitalWrite(LED_BUILTIN, LOW);       
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
    }
    else if (state == BLINKER_CMD_OFF) {
        digitalWrite(LED_BUILTIN, HIGH);
        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();
    }
}

void setup() {
 // 初始化串口,并开启调试信息,调试用可以删除
 Serial.begin(115200); 
 BLINKER_DEBUG.stream(Serial);
 // 初始化IO
 pinMode(LED_BUILTIN, OUTPUT); 
 digitalWrite(LED_BUILTIN, HIGH); // 初始化 led 高电平 ,则灯熄灭状态
 pinMode(PASSIO, OUTPUT); 
 digitalWrite(PASSIO, LOW); // 初始化 2 低电平 ,则灯熄灭状态
 // 初始化blinker
 Blinker.begin(auth, ssid, pswd);
 Button1.attach(button1_callback);
 Button2.attach(button2_callback);

 //小爱同学务必在回调函数中反馈该控制状态 
 BlinkerMIOT.attachPowerState(miotPowerState);//注册回调函数
// BlinkerMIOT.attachQuery(miotQuery);
} 
void loop()
{
  Blinker.run();

}
/*程序说明:基于UNO 本程序通过超声波判断距离实现舵机角度变化 并且通过定时器实现扫描超声波 实现闭盖时进行紫外线消杀(每工作10分钟休息10分钟) 单位cm*/
//当您使用Servo库时,开发板的9号和10号引脚的PWM功能是无法使用的。
/*注意事项:
(1)如果你使用了 MsTimer2 库, 则 pin11 和 pin3 就不能再用做 PWM 输出了! 因为该 pin3 和 pin11 的 PWM 是靠 timer2 帮忙的! (tone()也是)
(2)注意 Servo.h 库与 TimerOne 都是使用内部定时器 timer1 会影响pin 9, pin 10 的 PWM
(3)tone() 使用 timer2 定时器; 若使用 Tone 库的 Tone 对象(Tone 变量)也是优先使用 timer2 定时器,若用两个 Tone 变量则 timer1 也会被用掉, 用三个 Tone 则连控制 millis( )的 timer0 也会被用掉。
(4)别忘了, timer0 负责帮忙控制 pin 5 和 pin 6 的 PWM 输出。只要不去改变 timer 的 Prescaler 就不会影响其控制的 PWM pin, 但MsTimer2 库与 tone( )都会改变 Prescaler ! !*/
#include <Servo.h>            //加载文件库
#include <MsTimer2.h>  //没安装的自己安装

#define limit_distance 15     //宏定义感应距离单位cm
#define uvcpin  10 //紫外线灯控制引脚(正)
#define worktime 600 //工作时间 单位10ms
#define resttime 600 //休息时间 单位10ms
#define pospin 9 //舵机引脚
#define posclose 120
int pos = 0; //舵机角度
Servo myservo; //设置伺服对象
const int trigpin = 2;  //超声波输出
const int echopin = 3;  //超声波输入
int posflag = 0; //判断盖子是否开启
int uvcflag = 0; //判断uvc是否开启
int uvctimeflag = 0; //判断uvc休息时间
volatile int pastflag = 0;//用于扫描后传递超声波距离比较信息
long int uvctime = 0; 
long int uvcnotime = 0;
volatile float distance; 

void scanTimer()//中断函数
{
  distance = 0;
  digitalWrite(trigpin,LOW);
  delayMicroseconds(2);
  digitalWrite(trigpin,HIGH);
  delayMicroseconds(10);
  digitalWrite(trigpin,LOW);
  distance = pulseIn(echopin,HIGH)/59.70;
  delay(10);  // 前面为超声波检测程序
  if(distance < limit_distance)
  {
     pastflag = 1;
  }
  else pastflag = 0;
}

void poscontrol()
{
  while(pastflag == 1) //判断距离确定是否开关
  {
    digitalWrite(uvcpin,LOW);
    myservo.write(posclose);
    delay(1000);	
    posflag = 1;
  } 
  if(posflag == 1)
  {
    for (pos = posclose; pos >= 0; pos -= 1)
    {
        myservo.write(pos);
        delay(15); 					
    }
    delay(100);
    posflag = 0;
  }
} 

void setup() {
  pinMode(trigpin,OUTPUT);
  pinMode(uvcpin,OUTPUT);
  pinMode(echopin,INPUT);
  myservo.attach(pospin, 500, 2500); //修正脉冲宽度
  myservo.write(0);//每次开启自动关闭盖子
  delay(500);
  scanTimer(); //每次启动先扫描一下
  MsTimer2::set(300, scanTimer); //设置中断,每1000ms进入一次中断服务程序 scanTimer()
  MsTimer2::start(); //开始计时_开启定时器中
}

void loop() {
  if(pastflag == 1)
  {
    poscontrol();  //调用舵机函数
   pastflag = 0;  //清除标志位
 }
  if(posflag == 0 && pastflag == 0)
  {
      digitalWrite(uvcpin,HIGH);
      uvcflag = 1;
  }
  else
  {
    uvcflag = 0;
    digitalWrite(uvcpin,LOW);
  }
  //每工作10分钟休息10分钟
  if(uvcflag == 1 && uvctimeflag == 0)
  {
    uvctime++;
    delay(10);
    if(uvctime >= worktime)
    {
      uvctime = 0;
      uvctimeflag = 1;
      digitalWrite(uvcpin,LOW);
      //break;
    }
    
  }
  if(uvctimeflag = 1 && pastflag == 0)
  {
    uvcnotime++;
    delay(10);
    if(uvcnotime >= resttime)
    {
      uvcnotime = 0;
      uvctimeflag = 0;
      digitalWrite(uvcpin,HIGH);
      //break;
    }
  }
} 

如果对于接线有疑问可以留言咨询。

物联沃分享整理
物联沃-IOTWORD物联网 » 使用Arduino ESP8266手把手教你制作物联网垃圾桶

发表回复