WeMos下實現垃圾桶感應開蓋、保持、合蓋

2020-10-03 12:01:27

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助檔案


前言

通過WeMos D1開發板、SG90舵機、超聲波模組、蜂鳴器,實現垃圾箱蓋子的自動開合。

一、專案軟硬體平臺及開發環境

1.硬體平臺

在這裡插入圖片描述
特性
1.基於ESP-8266EX
2.Arduino相容,使用rduino IDE來程式設計
3.11 x I/O 引腳
4.1 x ADC 引腳(輸入範圍0-3.3V)
5.板載5V 1A開關電源(高輸入電壓24V)
工作中:
和stm32模組開發類似,整合度高
STM32方案也更經濟便宜

在這裡插入圖片描述

2.軟體平臺

在這裡插入圖片描述

3.安裝USB轉串列埠驅動

在這裡插入圖片描述

4.新增支援,使得WeMos可以在ArduiNo下連線

在這裡插入圖片描述
4.1檢查是否連線完成
在這裡插入圖片描述

二、驅動演示

1.蜂鳴器

在這裡插入圖片描述
//基礎控制:蜂鳴器叫喚和不叫喚
void setup()
{
pinMode(D5, OUTPUT); //設定引腳為輸出引腳
}

void loop()
{
digitalWrite(D5, HIGH); // 輸出高電平,蜂鳴器閉嘴
delay(1000); //這一秒內都得閉嘴
digitalWrite

2.Wemos串列埠通訊

串列埠有關的函數:
在這裡插入圖片描述
串列埠與wemos的簡單通訊:
在這裡插入圖片描述
在這裡插入圖片描述
串列埠控制蜂鳴器程式碼:
#define BEEP D5

void setup() {
Serial.begin(115200); //初始化串列埠,設定波特率為115200
pinMode(BEEP, OUTPUT); //設定引腳為輸出引腳
digitalWrite(BEEP, HIGH); // 上電不讓蜂鳴器響起
}

void loop()
{
int cmd;
if ( Serial.available() > 0 )
{ //檢測串列埠是否有資料
cmd = Serial.read(); // 讀取串列埠資料
Serial.println(cmd);
if (cmd == 1) { //如果讀取的資料是1
digitalWrite(BEEP, LOW); // 蜂鳴器響起
}
else
{
digitalWrite(BEEP, HIGH); // 否則(讀取資料非1)蜂鳴器不響
}
}
}

3. SG90舵機

3.1舵機引數及其呼叫函數
在這裡插入圖片描述
在這裡插入圖片描述
3.2舵機開蓋測試
#include<Servo.h> //標頭檔案為Servo

#define DUOPIN D5 //把引腳D5命名為DUOPIN

Servo SG90; //把Servo類函數命名為SG90,為C++程式碼。

void setup() {
SG90.attach(DUOPIN);//呼叫attach函數,連線舵機,即連線引腳DUOPIN
}

void loop() {
SG90.write(0);//控制舵機轉到0°位置
delay(1000);//延時1秒
SG90.write(90);//控制舵機轉到90°位置
delay(1000);
}

4.超聲波測距

HC-SR04超聲波識別模組介紹
在這裡插入圖片描述
在這裡插入圖片描述
超聲波測距程式設計實現(距離小於10觸發蜂鳴器發出聲音):
#define Echo D2
#define Trig D8
#define BEEP D5

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

return pulseIn(Echo,HIGH);
}

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

void initBeep()
{
pinMode(BEEP,OUTPUT);
digitalWrite(BEEP,HIGH);
}

void setup()
{
initChaoShengBo();
initBeep();
Serial.begin(115200);
}

void loop()
{
//獲取距離
long dis;
dis = getTime()/58;
Serial.print(dis);
Serial.println(「cm」);
if(dis < 10)
{
digitalWrite(BEEP,LOW);
}
else
{
digitalWrite(BEEP,HIGH);
}
delay(500);
}
在這裡插入圖片描述

5.蜂鳴器

在這裡插入圖片描述
在這裡插入圖片描述
void setup() {
pinMode(D5, OUTPUT); //設定D5為輸出埠
}

void loop() {//上電後不斷執行loop函數中的程式碼,應將核心控制程式碼寫入loop
//HIGH,LOW經過了宏定義
digitalWrite(D5, HIGH); // 輸出高電平,蜂鳴器閉嘴
delay(1000); //單位為ms,這一秒內都得閉嘴
digitalWrite(D5, LOW); //輸出低電平,蜂鳴器吼起來
delay(1000); //吼一秒(延時期間,蜂鳴器控制引腳屬於低電平)
}

5.1通過串列埠控制蜂鳴器的響與不響

void setup() {
Serial.begin(115200); //串列埠通訊,首先設定波特率
pinMode(D5,OUTPUT); //將D5設定為輸出狀態
digitalWrite(D5,HIGH); //另D5輸出高電平,一上電使得蜂鳴器不響
}

void loop() {

if(Serial.available()>0){ //如果串列埠來資料了

if(Serial.read()== 1){ //而且到來的資料是數位1
  
  Serial.println("DEE!!!"); 
  digitalWrite(D5,LOW); //D5輸出低電平,讓蜂鳴器響
  }
  
  else{
    Serial.println("HUSH~"); 
     digitalWrite(D5,HIGH);//D5輸出低電平,讓蜂鳴器不響
  }
}

}

三、程式碼實現

1.相關函數

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

2.程式碼整合

#include<Servo.h>
#define Trig D8
#define Echo D2
#define duoji D5
Servo myduoji;
long init_chaoshengbo()
{
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
}
long gettime()
{
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
return pulseIn(Echo, HIGH);
}
void setup()
{
init_chaoshengbo();
myduoji.attach(duoji);
pinMode(duoji, OUTPUT);
}
void loop()
{
long dis;
dis = gettime() / 58;
if (dis < 10)
{
myduoji.write(160);
}
else
{
myduoji.write(30);
}
}

總結

製作完成後可通過移動電源供電使用,當垃圾桶前部指定範圍內出現物體時,桶蓋自動開啟,此時可以將物品放入桶內,延時一定時間後,桶蓋自動關閉。若垃圾桶前部指定範圍內始終有物體存在,桶蓋將保持開啟狀態。