如何做一個自動化感應垃圾桶

簡介

  • 上面的視頻就是製作成型的感應式垃圾桶,手靠近感應器的時候,就可以自動開蓋大概一秒,自動再蓋上,它的用處可大了,比如:用來喝水,用來泡麪或者用來當筆筒,總之垃圾桶能幹的事情,它一樣都幹不了??????
  • 來合個影 感應式垃圾桶

緣起

  • 哈哈哈,看到抖音使用樹莓派、單片機等等小玩意,製作好玩的東西,於是決定在家也玩一玩破板子,破感應器,破垃圾桶,破蜂鳴器製作一個感應垃圾桶。必須要在無聊的生活中自己找尋樂趣!!!

硬件簡介

超聲波感應器

  • 前面兩個圓柱形的東西就是一個超聲波感應器,一個是發射口,一個是接收口,基本工作原理就是發射口發射超聲波,另一個口會接受反射回來的超聲波,然後根據聲速以及時間來計算前方障礙物,也就是我們的手,距離垃圾桶有多遠,我們通過編寫程序來設置,多少多少距離內開蓋,超過多少距離關蓋。

Arduino電路板

  • 垃圾桶後面沾了一塊電路板,這塊電路板就是控制的核心,我們的程序要燒錄的地方,給了垃圾桶以大腦才能完成任務。這塊板子是Ardunio平臺的,上面有很多接口,用於供電,傳輸信號等等,上個圖 Ardunio電路板

實現原理

  • 基本到這裏就介紹完硬件了,下面來介紹程序實現,我感覺沒啥興趣的基本到這裏就看完了,總之兩個字,NB!!!!
  • 先上完整代碼,這個項目是使用C語言實現的,平臺是Ardunio平臺,要引入它的實現包
#include<Servo.h>

#define DuoPIN D5
#define Echo D2
#define Trig D8

Servo myDuoJi;
long getTime(){
  digitalWrite(Trig,HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig,LOW);

  return pulseIn(Echo,HIGH);
}

void initChaoShengBo(){
  pinMode(Echo,INPUT);
  pinMode(Trig,OUTPUT);
}

void setup(){
  initChaoShengBo();
  myDuoJi.attach(DuoPIN);
  Serial.begin(115200);
}
void loop(){
  long dis;
  dis = getTime()/58;
  ` 1
  if(dis<10){43RFGUYT6
    myDuoJi.write(70);
    delay(700);
    myDuoJi.write(90);
    delay(1000);
    myDuoJi.write(100);
    delay(1140);
    myDuoJi.write(90);
  }else{
    myDuoJi.write(90);  
  }
}

  • 然後我們逐一解析

1.啓動函數

  • 先引入Ardunio平臺下馬達機給我們提供的工具包,裏面是一些綁定上硬件驅動的函數集合
#include<Servo.h>
  • 再看setup()函數,這個函數是程序運行的開始,作用就是初始化板子,也就是做準備工作,啥都準備好了,開始下一個函數loop(),這裏都是業務邏輯
void setup(){
  initChaoShengBo();
  myDuoJi.attach(DuoPIN);
  Serial.begin(115200);
}
  • 第一行初始化超聲波感應器initChaoShengBo
void initChaoShengBo(){
  pinMode(Echo,INPUT);
  pinMode(Trig,OUTPUT);
}
  • 基本意思就是綁定接口(也就是感應器上的的端口是什麼意思),Echo口作爲輸入端,Trig口作爲輸出端
  • 然後myDuoJi.attach(DuoPIN)的意思就是旋轉馬達接口綁定到DuoPIN這個口
#define DuoPIN D5
#define Echo D2
#define Trig D8

Servo myDuoJi;
  • 從上面看出來就是電路板的接口D5綁定馬達的接口,D2綁定到感應器的輸出接口,D8綁定到感應器的觸發接口。在下面一行就是初始化一個Servo實例(對象)

2.業務邏輯

  • 然後板子在執行完setup函數之後,會無線循環業務邏輯,也就是不斷執行loop函數
void loop(){
  long dis;
  dis = getTime()/58;
  ` 1
  if(dis<10){43RFGUYT6
    myDuoJi.write(70);
    delay(700);
    myDuoJi.write(90);
    delay(1000);
    myDuoJi.write(100);
    delay(1140);
    myDuoJi.write(90);
  }else{
    myDuoJi.write(90);  
  }
}
  • 先定義一個long型變量用力保存接收感應距離,然後下一行getTime函數就是用來返回發送到接收超聲波的時間間隔,然後除以58即爲距離,至於58怎麼來的,自己算吧,聲音在空氣中的傳播速度約爲340m/s,換算一下就好了。哦,對了前面返回的時間的單位是微秒。
  • 距離小於10cm,馬達機開始旋轉0.7秒,速度是20

這裏就是要說明一下,write裏面的參數是速度的意思,90代表靜止不動,0代表順時針全速選裝,180代表逆時針全速旋轉,數值離90越遠,代表速度越快,比如參數100就是指以(100-90)的速度逆時針旋轉。

  • 然後delay函數代表停頓多少毫秒,後面就是蓋蓋了,else語句就是距離大於10,馬達一直停止

OK講完了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章