手把手教你做一个物联网垃圾桶(ARDUINO ESP8266)_arduino垃圾桶程序

以低成本实现需求

实用耐用好用

研究意义:

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

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

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

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

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

实施方案:

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

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

网络安全方面,使用加密网络控制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)
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/49ec370a46894ad756418474de61b3a6.png)

![img](https://img-blog.csdnimg.cn/img_convert/b27a20fa7477dd5bb51ce38c59a4d81d.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/b7b19e060f4d0042c67e588afaff5d3f.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/722b96c8166d8ccfc2bf89c08e85f0df.png)

![img](https://img-blog.csdnimg.cn/img_convert/aaa52049f51a5e632a4113bd562c8a12.png)

![img](https://img-blog.csdnimg.cn/img_convert/1251c8b1af1a3014dd869a3e2ba65116.png)

![](https://img-blog.csdnimg.cn/img_convert/4e0df031781a02971eed8ac49e2b149a.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


1715743728068)]

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是一个简单的Arduino ESP8266 OTA程序示例: ``` #include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting..."); delay(5000); ESP.restart(); } ArduinoOTA.setHostname("ESP8266-OTA"); ArduinoOTA.onStart([]() { Serial.println("Start"); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); ArduinoOTA.begin(); Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { ArduinoOTA.handle(); } ``` 请注意,这只是一个示例程序,你需要根据自己的需求进行修改。在使用之前,请确保已经安装了“ESP8266WiFi”、“ESP8266mDNS”和“ArduinoOTA”库。同时,你需要将“your_SSID”和“your_PASSWORD”替换为你的WiFi网络的名称和密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值