效果:
(顯示屏內(nèi)容: 序號(hào): 25, 距離:196.74cm, 重量0.095kg, 溫度: 23*C, 濕度:82H)
開發(fā)所需硬件:
1.ESP8266-NodeMCU-Lua-V3 CH340開發(fā)板
2.TFT 1.44寸液晶顯示屏
3.DHT11 溫濕度傳感器
4.HX711 5KG壓力稱重傳感器
5.HC-SR04 超聲波距離傳感器
(開發(fā)工具采用的是Arduino IDE)
接線方法:
運(yùn)行代碼:
//***************HC-SR04超聲波傳感器****************************
const int TrigPin = 3; //SD1/S1 (RX GPIO3)
const int EchoPin = 15; //D8 GPIO15
float duration; //聲波傳輸時(shí)間
float distance; //距離
//****************DHT11溫濕度傳感器*****************************
#include <SimpleDHT.h>
const int DHT11_PIN = D0; //接D0 GPIO16
byte temperature = 0; //溫度
byte humidity = 0; //濕度
String thStr = "null"; //溫濕度字符串
SimpleDHT11 dht11(DHT11_PIN);
//**************HX711壓力稱重**********************************
#include "HX711.h"
const int LOADCELL_DOUT_PIN = D4; // D4 GPIO2
const int LOADCELL_SCK_PIN = 3; // RX GPIO3
HX711 loadcell;
const long LOADCELL_DIVIDER = 604105; //校準(zhǔn)參數(shù), 以kg為單位校準(zhǔn)的,每個(gè)稱重傳感器不一樣,需要自行校準(zhǔn)
float weight = 0; //讀取的重量
//******************1.44寸TFT顯示屏****************************
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#define TFT_CS D1 //D1 GPIO5
#define TFT_RST D2 //D2 GPIO4
#define TFT_DC D3 //D3 GPIO0
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
int i = 0;
void setup() {
Serial.begin(9600); //設(shè)置輸出串口波特率
Serial.println("初始化中...");
pinMode(TrigPin, OUTPUT); //初始超聲波傳感器,設(shè)置trigPin引腳為輸出
pinMode(EchoPin, INPUT); // 設(shè)置echoPin引腳為輸入
delay(500);
tft.initR(INITR_144GREENTAB); //初始1.44寸顯示屏
tft.fillScreen(ST7735_BLACK); //刷屏, 設(shè)置背景黑色
delay(500);
loadcell.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); //初始稱重傳感器
loadcell.set_scale(LOADCELL_DIVIDER);
loadcell.tare(); //毛皮重量
delay(2000);
}
void loop() {
tft.fillScreen(ST7735_BLACK); //刷屏, 重新顯示
printToTFT(20, 10, 1, ST7735_RED, "num: "+String(i)); //打印顯示自增數(shù)字
i++;
delay(500);
distance = getDistance(); //獲取超聲波的距離
printToTFT(20, 20, 1, ST7735_RED, "Distance: "+String(distance,1)+"cm"); //打印顯示距離
delay(500);
weight = getWeight(); //獲取在傳感器上的重物重量
printToTFT(20, 30, 1, ST7735_RED, "Weight: "+String(getWeight(), 3)+"kg"); //打印顯示重量
delay(500); //延時(shí)500ms
thStr = getTemperatureAndHumidity(); //獲取溫濕度傳感器的值
printToTFT(20, 40, 1, ST7735_RED, "T-H: "+thStr); //打印顯示溫濕度
delay(500); //延時(shí)500ms
}
void printToTFT(int x, int y, int textSize, uint16_t color, String text){ //打印到TTF顯示屏的函數(shù)
tft.setCursor(x, y); //設(shè)置光標(biāo)的位置
tft.setTextSize(textSize); //文字大小
tft.setTextColor(color); //文字顏色
tft.print(text); //打印要顯示的內(nèi)容
}
float getWeight(){ //稱重函數(shù), 獲取重量
if (loadcell.wait_ready_timeout(3000)) { //非阻塞模式
return loadcell.get_units(10);
} else {
return weight; //如果延遲3s未獲取到值, 就返回上次成功獲取到的值
}
}
float getDistance(){ //獲取CH-SR04超聲波的距離
digitalWrite(TrigPin, LOW); // Clears the trigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);// Sets the trigPin on HIGH state for 10 ms
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
duration = pulseIn(EchoPin, HIGH); //讀取聲波來(lái)回的時(shí)間
return duration*0.034/2.0; //時(shí)間*聲速 / 2得到距離
}
String getTemperatureAndHumidity(){ //獲取DHT11的溫度和濕度
int waitTime = 0;
while(dht11.read(&temperature, &humidity, NULL) != SimpleDHTErrSuccess){ //如果讀取失敗
delay(100); waitTime+=100; //等待100ms再重新讀取
if(waitTime > 2000 ){ //如果超過(guò)2秒未獲取到
return thStr; //返回上次成功的讀數(shù)值, 避免阻塞
}
}
return String((int)temperature) + "*c " + String((int)humidity) + "H";
}
提示:
^仁唷6ハ肌弯屈!不建議一個(gè)ESP8266連接這么多傳感器穿扳,因?yàn)闀?huì)導(dǎo)致供電不足不穩(wěn)定买置,你也可以少連接一些傳感器移除部分代碼保證穩(wěn)定性。
- 代碼中的庫(kù)文件要正確導(dǎo)入.
- EPS8266不建議使用GPIO6 - GPIO11的引腳, 因?yàn)樗鼈冞B接SD閃存, 但由于引腳不夠用, 所以超聲波傳感器接了一個(gè)S1/SD1引腳, 但是代碼中的GPIO值是3, 由于引腳不夠用甚至稱重傳感器也接了一個(gè)RX引腳, 曲線救國(guó).
參考: Github倉(cāng)庫(kù) 下的案例28-ESP8266-Sensors
(提示: 如果發(fā)現(xiàn)代碼可以優(yōu)化, 歡迎提issue改進(jìn))