最近自創(chuàng)的項目結題了,就順手將相關的技術細節(jié)記錄一下,也給需要做自創(chuàng)的同學提供一個簡單的可復制的小項目
智能垃圾桶的選型
通過充分考慮實際生活場景,加入了IP65級別防水設計,可以滿足大多數需要場景,此外采用升壓和可充電電池,踐行環(huán)保理念,實現(xiàn)長續(xù)航和低碳設計,采用金屬齒輪舵機充分考慮長期使用,可以實現(xiàn)一年以上的使用,加入物聯(lián)網模塊,實現(xiàn)智能交互
防水紫外線燈帶?
UNO主板
ESP8266
可充電電池(12500)
升壓模塊(自己選就行)
超聲波模塊(SR04)
金屬齒輪舵機(MGS90)
12V繼電器
研究現(xiàn)狀:
?? 市面上現(xiàn)階段智能垃圾桶成本相對較為高昂,此外智能化程度不高,難以作為將來物聯(lián)網的智能家居的一部分。此外市場上沒有智能開蓋的桌面垃圾桶,開蓋多半是按壓式,非常不便捷
?? 隨著生活水平的提高,人們更加追求干凈、健康、綠色的生活方式。
研究趨勢:
???????????? 智能化
?提高人們生活舒適精致度
? 以低成本實現(xiàn)需求
???? 實用耐用好用
研究意義:
增強大學生的創(chuàng)新意識和創(chuàng)新能力
增強我們的機械設計制造的動手能力
實現(xiàn)對生活廢棄物的病菌消殺
為生活中的衛(wèi)生健康提供保障。
項目簡介:本裝置通過紫外線等消毒方式對攜帶病毒的生活廢棄物進行一定程度的消殺,從而大大降低清潔人員和拾荒者的感染概率,省財省力省時,減輕人們除了防疫以外的其它生活負擔,對當前社會現(xiàn)狀具有一定的實用性及創(chuàng)新性。同時充分考慮紫外線對人眼的刺激,做了開蓋前自動關燈處理,考慮到紫外線燈長時間工作會產生較大熱量,設計了照明和休息時長。
實施方案:
通過超聲傳感器實現(xiàn)位置距離的準確獲取,從而實現(xiàn)對用戶狀態(tài)的信息精確判別
通過設計的電路實現(xiàn)對于紫外線燈和舵機的精確控制,并留存狀態(tài)標志位,使得可以無線智能控制
?
網絡安全方面,使用加密網絡控制MQTT協(xié)議,只有知道特定密鑰才可以訪問,并且適配了圖形化控制界面,接入專門軟件”點燈blinker”,任何用戶只要獲得分享權限就可以使用
充分的可拓展性和共享性,專門的密鑰可以通過手機號共享,且可以接入小愛同學等AI助手
運行邏輯:本次設計采用了雙機通信技術,實現(xiàn)了較好的WIFI通信效果,其中UNO作為主機,ESP8266作為從機
?本裝置做到在實現(xiàn)感應開蓋,殺毒滅菌的智能邏輯和靈敏基礎上,實現(xiàn)wifi互聯(lián),從而實現(xiàn)遠程開蓋,通過利用紫外線等裝置,定時自動消殺廢棄物,對生活垃圾進行預消毒工作。實現(xiàn)物聯(lián)網,互聯(lián)網與垃圾桶的融合創(chuàng)新。
?
具體代碼
ESP8266(上)和UNOR3(下)文章來源:http://www.zghlxwxcb.cn/news/detail-773713.html
#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按鍵即會執(zhí)行該函數
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 高電平 ,則燈熄滅狀態(tài)
pinMode(PASSIO, OUTPUT);
digitalWrite(PASSIO, LOW); // 初始化 2 低電平 ,則燈熄滅狀態(tài)
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback);
Button2.attach(button2_callback);
//小愛同學務必在回調函數中反饋該控制狀態(tài)
BlinkerMIOT.attachPowerState(miotPowerState);//注冊回調函數
// BlinkerMIOT.attachQuery(miotQuery);
}
void loop()
{
Blinker.run();
}
/*程序說明:基于UNO 本程序通過超聲波判斷距離實現(xiàn)舵機角度變化 并且通過定時器實現(xiàn)掃描超聲波 實現(xiàn)閉蓋時進行紫外線消殺(每工作10分鐘休息10分鐘) 單位cm*/
//當您使用Servo庫時,開發(fā)板的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 變量)也是優(yōu)先使用 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;
}
}
}
如果對于接線有疑問可以留言咨詢。文章來源地址http://www.zghlxwxcb.cn/news/detail-773713.html
到了這里,關于手把手教你做一個物聯(lián)網垃圾桶(ARDUINO ESP8266)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!