本文章講解使用NodeMcu開發板讀取DHT11、DHT22、SHTC3這三個溫溼度傳感器的數據併發送至串口。各傳感器我都寫了使用第三方庫和不用第三方庫的例程。
ESP8266開發環境搭建教程:https://blog.zeruns.tech/archives/526.html
文中所用到傳感器購買地址在文章最下面。
DHT11
DHT11是一款有已校準數字信號輸出的溫溼度傳感器。 其精度溼度±5%RH, 溫度±2℃,量程溼度20-90%RH, 溫度050℃。**精度不高,但價格低廉。**DHT11使用單總線通信。供電電壓3.35V。
使用DHT庫
使用DHT sensor library
庫(需自己安裝,安裝教程在上面的ESP8266開發環境搭建教程中)來直接讀取DHT11的數據。
#include <DHT.h> //調用DHT庫
DHT dht(D1,DHT11); //設置Data引腳所接IO口和傳感器類型
void setup(){ //初始化函數,只在程序開始時運行一次
Serial.begin(115200); //設置串口波特率
dht.begin();
}
//https://blog.zeruns.tech
void loop() {
delay(1000); //延時1000毫秒
float RH = dht.readHumidity(); //讀取溼度數據
float T = dht.readTemperature();//讀取溫度數據
Serial.print("Humidity:"); //向串口打印 Humidity:
Serial.print(RH); //向串口打印溼度數據
Serial.print("%");
Serial.print(" Temperature:");
Serial.print(T); //向串口打印溫度數據
Serial.println("C");
Serial.println("https://blog.zeruns.tech");
}
不使用庫
通過閱讀DHT11的數據手冊自己編寫程序讀取數據。
DHT11數據手冊:http://go.zeruns.tech/G
#define data D1 //DHT11的Data引腳(2Pin)接到NodeMcu開發板的D1引腳
unsigned char i; //無符號8位整型變量
float RH,T; //單精度浮點數(32位長度)
byte RH_H,RH_L,T_H,T_L,sum,check; //字節變量,二進制數
void setup() { //初始化函數,只在程序開始時運行一次
Serial.begin(115200); //設置串口波特率
}
void loop() { //循環函數,運行完初始化函數後不斷循環運行這個函數
delay(1000); //延時1000毫秒
DHT11(); //獲取溫溼度數據
Serial.print("Humidity:"); //向串口打印 Humidity:
Serial.print(RH); //向串口打印溼度數據
Serial.print("%");
Serial.print(" Temperature:");
Serial.print(T); //向串口打印溫度數據
Serial.println("C");
Serial.println("https://blog.zeruns.tech");
}
void DHT11()
{
RH_H=0,RH_L=0,T_H=0,T_L=0,sum=0,check=0;
pinMode(data,OUTPUT); //設置IO口爲輸出模式
digitalWrite(data,1); //設置IO口輸出高電平
delay(10); //延時10毫秒
digitalWrite(data,0); //設置IO口輸出低電平
delay(25); //延時25毫秒
digitalWrite(data,1); //設置IO口輸出高電平
pinMode(data,INPUT); //設置IO口爲輸入模式
delayMicroseconds(30); //延時30微秒
if(!digitalRead(data)) //判斷IO口輸入電平是否低電平
{//https://blog.zeruns.tech
while(!digitalRead(data)); //一直循環至輸入爲高電平
while(digitalRead(data)); //一直循環至輸入爲低電平
for(i=0;i<8;i++) //循環執行8次
{
while(!digitalRead(data));//一直循環至輸入爲高電平
delayMicroseconds(28); //延時28微秒
if(digitalRead(data)){ //判斷IO口輸入電平是否高電平
bitWrite(RH_H, 7-i, 1); //在二進制變量RH_H的第7-i位(從右數起)寫入1
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(RH_L, 7-i, 1);
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(T_H, 7-i, 1);
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(T_L, 7-i, 1);
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(check, 7-i, 1);
while(digitalRead(data));
}
}
}
sum=RH_H + RH_L + T_H + T_L;
byte sum_temp=0;
//讀取sum的末8位寫入sum_temp
for(i=0;i<8;i++){
bitWrite(sum_temp,i,bitRead(sum,i));
}//https://blog.zeruns.tech
if(check==sum_temp){ //校驗數據
RH=RH_H+float(RH_L)/10;
T=T_H+float(T_L)/10;
}
}
效果圖
DHT22(AM2302)
DHT22(AM2302)是一款有已校準數字信號輸出的溫溼度傳感器。 其精度溼度±2%RH, 溫度±0.5℃,量程溼度0-100%RH, 溫度-4080℃,分辨率都爲0.1。**精度較高,且價格不貴。**DHT22使用單總線通信。供電電壓3.35V。
使用DHT庫
使用DHT sensor library
庫來直接讀取DHT22的數據。
#include <DHT.h> //調用DHT庫
DHT dht(D1,DHT22); //設置Data引腳所接IO口和傳感器類型
void setup(){ //初始化函數,只在程序開始時運行一次
Serial.begin(115200); //設置串口波特率
dht.begin();
}
//https://blog.zeruns.tech
void loop() {
delay(1000); //延時1000毫秒
float RH = dht.readHumidity(); //讀取溼度數據
float T = dht.readTemperature();//讀取溫度數據
Serial.print("Humidity:"); //向串口打印 Humidity:
Serial.print(RH); //向串口打印溼度數據
Serial.print("%");
Serial.print(" Temperature:");
Serial.print(T); //向串口打印溫度數據
Serial.println("C");
Serial.println("https://blog.zeruns.tech");
}
不使用庫
通過閱讀DHT22的數據手冊自己編寫程序讀取數據。
DHT22數據手冊:http://go.zeruns.tech/H
#define data D1 //DHT22的Data引腳(2Pin)接到NodeMcu開發板的D1引腳
unsigned char i; //無符號8位整型變量
float RH,T; //單精度浮點數(32位長度)
byte RH_H,RH_L,T_H,T_L,sum,check; //字節變量,二進制數
void setup() { //初始化函數,只在程序開始時運行一次
Serial.begin(115200); //設置串口波特率
}
void loop() { //循環函數,運行完初始化函數後不斷循環運行這個函數
delay(1000); //延時1000毫秒
DHT11(); //獲取溫溼度數據
Serial.print("Humidity:"); //向串口打印 Humidity:
Serial.print(RH); //向串口打印溼度數據
Serial.print("%");
Serial.print(" Temperature:");
Serial.print(T); //向串口打印溫度數據
Serial.println("C");
Serial.println("https://blog.zeruns.tech");
}
void DHT11()
{
RH_H=0,RH_L=0,T_H=0,T_L=0,sum=0,check=0;
pinMode(data,OUTPUT); //設置IO口爲輸出模式
digitalWrite(data,1); //設置IO口輸出高電平
delay(10); //延時10毫秒
digitalWrite(data,0); //設置IO口輸出低電平
delay(25); //延時25毫秒
digitalWrite(data,1); //設置IO口輸出高電平
pinMode(data,INPUT); //設置IO口爲輸入模式
delayMicroseconds(30); //延時30微秒
if(!digitalRead(data)) //判斷IO口輸入電平是否低電平
{//https://blog.zeruns.tech
while(!digitalRead(data)); //一直循環至輸入爲高電平
while(digitalRead(data)); //一直循環至輸入爲低電平
for(i=0;i<8;i++) //循環執行8次
{
while(!digitalRead(data));//一直循環至輸入爲高電平
delayMicroseconds(28); //延時28微秒
if(digitalRead(data)){ //判斷IO口輸入電平是否高電平
bitWrite(RH_H, 7-i, 1); //在二進制變量RH_H的第7-i位(從右數起)寫入1
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(RH_L, 7-i, 1);
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(T_H, 7-i, 1);
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(T_L, 7-i, 1);
while(digitalRead(data));
}
}
for(i=0;i<8;i++)
{
while(!digitalRead(data));
delayMicroseconds(28);
if(digitalRead(data)){
bitWrite(check, 7-i, 1);
while(digitalRead(data));
}
}
}
sum=RH_H + RH_L + T_H + T_L;
byte sum_temp=0;
//讀取sum的末8位寫入sum_temp
for(i=0;i<8;i++){
bitWrite(sum_temp,i,bitRead(sum,i));
}//https://blog.zeruns.tech
if(check==sum_temp){
if(bitRead(RH_H,7)==1){ //判斷溫度是否零下
T=-(float(T_H<<8)+float(T_L))/10;
}else{
T=(float(T_H<<8)+float(T_L))/10;
}
RH=(float(RH_H<<8)+float(RH_L))/10;
}
}
效果圖
SHTC3
SHTC3是一款有已校準數字信號輸出的溫溼度傳感器。 其精度溼度±2%RH, 溫度±0.2℃,量程溼度0-100%RH, 溫度-40125℃,分辨率都爲0.01。**精度高,且價格也較便宜,但資料太少了。**SHTC3使用I2C(IIC)通信。供電電壓1.623.6V。
SHTC3數據手冊:http://go.zeruns.tech/I
使用Wire(I2C)庫
使用Wire庫來與SHTC3通信讀取數據。
/* https://blog.zeruns.tech
* 連接方式
* SHTC3 開發板
* SCL SCL(NodeMcu開發板是D1)
* SDA SDA(NodeMcu開發板是D2)
*/
#include <Wire.h>
#define SHTC3_ADDRESS 0x70 //定義SHTC3的I2C器件地址爲0x70
float T,RH;
void setup() { //初始化函數,只在程序開始時運行一次
Serial.begin(115200); //設置串口波特率
Wire.begin(); //初始化爲I2C主機
}
void loop() { //循環函數,運行完初始化函數後不斷循環運行這個函數
delay(1000); //延時1000毫秒
SHTC3(); //獲取溫溼度數據
Serial.print("Humidity:"); //向串口打印 Humidity:
Serial.print(RH); //向串口打印溼度數據
Serial.print("%");
Serial.print(" Temperature:");
Serial.print(T); //向串口打印溫度數據
Serial.println("C");
Serial.println("https://blog.zeruns.tech");
}
void SHTC3(){ //獲取溫溼度數據
Wire.beginTransmission(SHTC3_ADDRESS); //根據地址0x70,開始向I2C的從機進行傳輸。
Wire.write(byte(0xE0)); //發送寫入指令
Wire.endTransmission(); //停止向從機傳輸
Wire.beginTransmission(SHTC3_ADDRESS);
Wire.write(byte(0x35)); //發送喚醒指令的高位部分
Wire.write(byte(0x17)); //發送喚醒指令的低位部分
Wire.endTransmission();
delayMicroseconds(300); //延時300微秒
Wire.beginTransmission(SHTC3_ADDRESS);
Wire.write(byte(0xE0));
Wire.endTransmission();
Wire.beginTransmission(SHTC3_ADDRESS);
Wire.write(byte(0x7C)); //發送採集指令的高位部分
Wire.write(byte(0xA2)); //發送採集指令的低位部分
Wire.endTransmission();
Wire.beginTransmission(SHTC3_ADDRESS);
Wire.write(byte(0xE1)); //發送讀取指令
Wire.endTransmission();
Wire.requestFrom(SHTC3_ADDRESS,6); //向從機請求數據
uint16_t T_temp,RH_temp,T_CRC,RH_CRC;
if (2 <= Wire.available()) {
T_temp = Wire.read(); //接收溫度高位數據
T_temp = T_temp << 8; //左移8位
T_temp |= Wire.read(); //左移8位後的溫度高位數據與接收到的溫度低位數據進行按位或運算
T_CRC = Wire.read(); //接收CRC校驗碼
if(SHTC3_CRC_CHECK(T_temp,T_CRC)){ //校驗數據
T =float(T_temp) * 175 / 65536 - 45; //計算出溫度
}
}//https://blog.zeruns.tech
if (2 <= Wire.available()) {
RH_temp = Wire.read(); //接收溼度高位數據
RH_temp = RH_temp << 8; //左移8位
RH_temp |= Wire.read(); //左移8位後的溼度高位數據與接收到的溼度低位數據進行按位或運算
RH_CRC = Wire.read();
if(SHTC3_CRC_CHECK(RH_temp,RH_CRC)){
RH =float(RH_temp) * 100 / 65536;
}
}
}
//https://blog.zeruns.tech
uint8_t SHTC3_CRC_CHECK(uint16_t DAT,uint8_t CRC_DAT) //SHTC3的CRC校驗
{
uint8_t i,t,temp;
uint8_t CRC_BYTE;
CRC_BYTE = 0xFF;
temp = (DAT>>8) & 0xFF;
for(t = 0;t < 2;t ++)
{
CRC_BYTE ^= temp;
for(i = 0;i < 8;i ++)
{
if(CRC_BYTE & 0x80)
{
CRC_BYTE <<= 1;
CRC_BYTE ^= 0x31;
}else{
CRC_BYTE <<= 1;
}
}
if(t == 0)
{
temp = DAT & 0xFF;
}
}//https://blog.zeruns.tech
if(CRC_BYTE == CRC_DAT)
{
temp = 1;
}else{
temp = 0;
}
return temp;
}
使用SHTC3庫
先安裝SparkFun SHTC3
庫。
/* https://blog.zeruns.tech
* 連接方式
* SHTC3 開發板
* SCL SCL(NodeMcu開發板是D1)
* SDA SDA(NodeMcu開發板是D2)
*/
#include <SparkFun_SHTC3.h>
SHTC3 mySHTC3;
void setup(){ //初始化函數,只在程序開始時運行一次
Serial.begin(115200); //設置串口波特率
while(Serial == false){}; //等待串行連接啓動
Wire.begin(); //初始化Wire(IIC)庫
unsigned char i=0;
errorDecoder(mySHTC3.begin());// To start the sensor you must call "begin()", the default settings use Wire (default Arduino I2C port)
}
//https://blog.zeruns.tech
void loop() {
float RH,T;
delay(1000); //延時1000毫秒
SHTC3_Status_TypeDef result = mySHTC3.update();
if(mySHTC3.lastStatus == SHTC3_Status_Nominal) //判斷SHTC3狀態是否正常
{
RH = mySHTC3.toPercent(); //讀取溼度數據
T = mySHTC3.toDegC(); //讀取溫度數據
}else{
Serial.print("Update failed, error: ");
errorDecoder(mySHTC3.lastStatus); //輸出錯誤原因
Serial.println();
}
Serial.print("Humidity:"); //向串口打印 Humidity:
Serial.print(RH); //向串口打印溼度數據
Serial.print("%");
Serial.print(" Temperature:");
Serial.print(T); //向串口打印溫度數據
Serial.println("C");
Serial.println("https://blog.zeruns.tech");
}
void errorDecoder(SHTC3_Status_TypeDef message) // The errorDecoder function prints "SHTC3_Status_TypeDef" resultsin a human-friendly way
{
switch(message)
{
case SHTC3_Status_Nominal : Serial.print("Nominal"); break;
case SHTC3_Status_Error : Serial.print("Error"); break;
case SHTC3_Status_CRC_Fail : Serial.print("CRC Fail"); break;
default : Serial.print("Unknown return code"); break;
}
}
效果圖
傳感器購買
**DHT11:**複製$Lk3h1Mx8UTO$
打開手機淘寶立即下單
**DHT22:**複製$kr2T1MxkUKY$
打開手機淘寶立即下單
**SHTC3:**複製$UD4D1Mx6N3R$
打開手機淘寶立即下單
推薦閱讀:
- 高性價比和便宜的VPS/雲服務器推薦:https://blog.zeruns.tech/archives/383.html
- 搭建內網穿透服務器,帶Web面板:https://blog.zeruns.tech/archives/397.html
- 使用Cloudreve自建網盤:https://blog.zeruns.tech/archives/515.html
- 怎樣搭建個人博客:https://blog.zeruns.tech/archives/218.html
- 學生優惠權益大全:https://blog.zeruns.tech/archives/321.html
- 分享個能賺錢的小遊戲給大家:https://blog.zeruns.tech/archives/472.html