硬件材料:
Wemos D1、SG90舵機、HC-SR04、杜邦線若干、蜂鳴器3.3V(可有可無)
軟件材料:
arduino IDE編譯器、USB轉串口驅動
Wemos D1:
特性:
- 基于ESP-8266EX及arduino做的一個融合
- arduino兼容,使用arduino IDE編程
- 11個IO口
- 一個ADC轉換引腳(輸入范圍0~3.3V),ADC通常用在光照的采集或者人體的模擬量轉換的應用。本項目沒有使用該功能。
- 板載5V1A開關電源,集成度高。
arduino IDE:
優點:集成很多開發庫,如串口、網絡,SG90等各種硬開發接口,迅速開發,自帶串口調試工具。
缺點:程序編譯速度慢。
注意:本次使用的單片機是Wemos D1,若在開發板里找不到Wemos D1就要在開發板管理器中下載,搜索D1就可以看到ESP8266了,然后安裝即可。
蜂鳴器:
低電平觸發,也就是將蜂鳴器的IO口設置為輸出端口,IO口輸出高電平不響,IO口輸出低電平響。
驅動蜂鳴器滴滴響:
void setup() {//這個函數里放的是初始化的內容,程序只跑一次pinMode(D5,OUTPUT);//初始化蜂鳴器的IO口為輸出模式
}void loop() {digitalWrite(D5,LOW);//輸出低電平,蜂鳴器響delay(1000);//延時1000ms=1sdigitalWrite(D5,HIGH);//輸出高電平,蜂鳴器不響delay(1000);//延時1000ms=1s
}
SG90舵機:
- 紅色電壓線
- 棕色地線
- 橙色信號線
- 無負載速度:0.12s/60度(4.8V)
- 堵轉扭矩:1.2~1.4公斤/厘米(4.8V)
- 工作電壓:4.8~6V
HC-SR04超聲波模塊:
- 超聲波傳感器上面通常帶有兩個超聲波元器件,一個用于發射,一個用于接收。電路板上有4個引腳:VCC(正極)、Trig(觸發)、Echo(回應)、GND(接地)。
- 工作電壓與電流:5V、15mA
- 感測距離:2~400cm
- 感應角度:不大于15度
- 在超聲波模塊的觸發腳位輸入10微妙以上的高電位,即可以發射超聲波,發射超聲波以后,與接收到傳回的超聲波之前,響應位呈現高電位。因此,程序可以從“響應”腳位的高電位脈沖持續時間,換算出被測物體的距離。
超聲波部分代碼:
#define Echo D2
#define Trig D8
int getTime()//超聲波發生函數
{digitalWrite(Trig,HIGH);delayMicroseconds(10);//延時10usdigitalWrite(Trig,LOW);return pulseIn(Echo,HIGH);//計算某個引腳高電平持續的時間,單位是us
}
void initChaoShengBo()//超聲波初始化函數
{pinMode(Echo,INPUT);//設置Echo引腳為輸入引腳pinMode(Trig,OUTPUT);//設置Trig引腳為輸出引腳
}
void setup() {//這個函數里放的是初始化的內容,程序只跑一次Serial.begin(9600);initChaoShengBo();//在初始化中調用超聲波初始化函數
}void loop() {int dis;//超聲波測試的距離dis=getTime()/58;//計算距離Serial.print(dis);Serial.println("cm");delay(500);
}
/*
dis=getTime()/58;
關于距離除以58的說明:
波在空氣中傳播的速度是:343米每秒,也就是343000厘米每秒。根據公式1000000us=1s得0.0343厘米/微妙,再換一個角度,1/(0.0343厘米/微妙)即:29.15微妙/厘米,表示1厘米就是29.15微妙。但是聲波走過的距離是二倍,所以除以58就是實際距離。
*/
SG90舵機部分控制代碼:
#include <Servo.h>
#define DuoPin D5//將D5紅定義為DuoServo myDuoJi;//這是舵機的一個類
void setup() {//這個函數里放的是初始化的內容,程序只跑一次Serial.begin(115200);myDuoJi.attach(DuoPin);//將舵機連接到D5這個引腳
}void loop() {myDuoJi.write();//里面的參數是想要旋轉的度數0~180
}
Wemos D1和PC串口通信:
void setup() {//這個函數里放的是初始化的內容,程序只跑一次Serial.begin(115200);
}void loop() {Serial.println("hello!");//單片機向電腦發送hello!
}Serial.begin();
描述:開啟串口。
原型:Serial.begin(speed);Serial.begin(speed,config);speed:波特率,一般取值9600、115200。(就相當于人說話的語速,通信時要保持波特率一至)config:設置數據位、停止位和校驗位。默認SERIAL_8N1表示8個數據位,無校驗位,1個停止位。
返回值:無Serial.println()
描述:串口輸出數據并換行
原型:Serial.println(val)val:打印的值,任意數據類型Serial.available()
描述:判斷串口緩沖區的狀態,返回串口緩沖區讀取的字節數
原型:Serial.available()
參數:無
返回值:可讀取的字節數。Serial.read()
描述:讀取串口數據,一次讀一個字符,讀完后刪除已讀數據
原型:Serial.read()
參數:無
返回值:返回串口緩存中第一個可讀字節,當沒有可讀數據時返回-1,整數類型
代碼綜合實現效果:
#include <Servo.h>
#define DuoPin 4
#define Echo D2
#define Trig D8
Servo myduoji;
int getTime()//超聲波發生函數
{digitalWrite(Trig,HIGH);delayMicroseconds(10);//延時10usdigitalWrite(Trig,LOW);return pulseIn(Echo,HIGH);//計算某個引腳高電平持續的時間,單位是us
}
void initChaoShengBo()//超聲波初始化函數
{pinMode(Echo,INPUT);//設置Echo引腳為輸入引腳pinMode(Trig,OUTPUT);//設置Trig引腳為輸出引腳
}
void setup()
{initChaoShengBo();myduoji.attach(DuoPin);//連接舵機Serial.begin(115200);//確定串口的波特率myduoji.write(98);
}void loop()
{int dis;dis=getTime()/58;//計算手與超聲波的距離Serial.println(dis);delay(500);if (dis<10) {myduoji.write(98);delay(1000);}else{myduoji.write(180);}
}