DHT11 / DHT22 là một cảm biến đo độ ẩm và cảm biến nhiệt độ tương đối. Nó cung cấp đầu ra kỹ thuật số được hiệu chỉnh với giao thức 1 dây. Cả hai cảm biến đều không tốn kém. Chúng khá giống nhau với một số khác biệt về thông số kỹ thuật.
DHT22 gần giống với DHT11 nhưng trước đây đo nhiệt độ và độ ẩm với độ chính xác cao hơn và hỗ trợ phạm vi rộng hơn.
Bảng sau liệt kê sự so sánh của cả hai cảm biến DHT
DHT22 · |
DHT11 · |
|
---|---|---|
Nhiệt độ |
-40 đến 80 ºC +/- 0,5ºC |
0 đến 50 ºC +/-2 ºC |
Độ ẩm |
0 đến 100% +/-2% |
20 đến 90% +/-5% |
Độ phân giải |
Độ ẩm: 0.1%Nhiệt độ: 0.1ºC |
Độ ẩm: 1% Nhiệt độ: 1ºC |
Điện áp hoạt động |
3- 6 V DC (nguồn điện trực tiếp có thể từ Raspberry Pi Pico) |
3-5.5 V DC (nguồn điện trực tiếp có thể từ Raspberry Pi Pico) |
Thời gian lấy mẫu |
2 giây |
1 giây |
Đánh giá hiện tại |
$4 đến $10 |
$1 đến $5 |
Kiểu dữ liệu đầu ra |
nổi |
Int |
Sơ đồ chân |
4 chân (giống như DHT11) |
4 chân (giống như DHT22) |
Giá |
5 |
2 |
Như bạn có thể thấy từ bảng so sánh ở trên rằng DHT22 cung cấp phạm vi nhiệt độ và độ phân giải rộng hơn cho nhiệt độ và độ ẩm. Nhưng nó đắt hơn DHT11. Tuy nhiên, DHT11 có thời gian lấy mẫu tốt hơn. Hơn nữa, dải điện áp hoạt động cho cả hai cảm biến gần như và chúng ta có thể cấp nguồn trực tiếp cho các cảm biến này từ các chân nguồn của Raspberry Pi Pico.
Bất kể sự khác biệt ở trên, cả hai cảm biến DHT đều có cùng nguyên lý làm việc và sơ đồ chân giống nhau. Chúng ta có thể sử dụng cùng một tập lệnh MicroPython để đọc các bài đọc về nhiệt độ và độ ẩm bằng cách chọn loại DHT bên trong mã.
Cảm biến DHT được hiệu chuẩn trước. Chúng ta có thể kết nối trực tiếp chúng với Raspberry Pi Pico để có được chỉ số đầu ra của cảm biến. Chúng bao gồm bên trong một cảm biến cảm biến độ ẩm và nhiệt điện trở. Hai thành phần này đo độ ẩm và nhiệt độ.
Hình dưới đây cho thấy sơ đồ sơ đồ chân của cảm biến DHT. Cảm biến DHT bao gồm bốn chân. Nhưng trên các mô-đun DHT chỉ có ba chân tiếp xúc với sơ đồ chân của mô-đun và điện trở kéo lên 10k ohm được kết nối bên trong với chân 2.
Sau đây liệt kê sơ đồ chân của cảm biến DHT và mô tả ngắn gọn của chúng. Số pin bắt đầu từ trái sang phải khi bạn giữ cảm biến từ đầu cuối.
Chân DHT11 / DHT22 |
Kết nối với Raspberry Pi Pico |
---|---|
1 ( VCC) |
3.3V |
2 (Dữ liệu ra) |
Bất kỳ chân GPIO nào của Raspberry Pi Pico cùng với điện trở kéo lên 10k ohm |
3 (NC) |
Không sử dụng |
4 (GND) |
Mặt đất |
Vcc là chân cung cấp điện. Áp dụng điện áp trong phạm vi từ 3,3 V đến 5,0 V cho chân này
Data Out là chân đầu ra kỹ thuật số. Nó gửi giá trị của nhiệt độ và độ ẩm đo được dưới dạng dữ liệu nối tiếp
N/C không được kết nối
GND: Kết nối chân GND
Phần này hướng dẫn cách kết nối Raspberry Pi Pico với cảm biến DHT22 và ESP-01.
Chúng tôi sẽ yêu cầu các thành phần sau:
Quả mâm xôi Pi Pico
Cảm biến DHT22
Điện trở 10K ohm (không bắt buộc nếu sử dụng phiên bản mô-đun của cảm biến)
Mô-đun ESP-01
Dây kết nối
Breadboard
Kết nối DHT22 với Raspberry Pi Pico cùng với điện trở kéo lên 10K ohm.
Chân đầu tiên cho cả hai cảm biến là chân nguồn điện (Vcc). Kết nối nó với chân 3.3 volt của Raspberry Pi Pico.
Dữ liệu ra là chân mà qua đó chúng tôi lấy mẫu nhiệt độ và độ ẩm từ cảm biến DHT. Kết nối chân này với GP16 của Raspberry Pi Pico và cũng kết nối chân dữ liệu với điện trở kéo lên 10k. Nhưng bạn cũng có thể sử dụng bất kỳ chân kỹ thuật số nào của Raspberry Pi Pico.
Một điện trở kéo lên được sử dụng để giữ cho chân dữ liệu cao để giao tiếp thích hợp giữa vi điều khiển và cảm biến. Bạn có thể kiểm tra bảng dữ liệu của DHT11 và DHT22 để biết thêm thông tin về nó. DHT22 còn được biết đến với cái tên AM2302.
Chân thứ ba không được sử dụng
Kết nối chân thứ tư (GND) với chân nối đất của bảng
Các kết nối giữa hai thiết bị mà chúng tôi đang sử dụng có thể được nhìn thấy bên dưới.
DHT22 · |
Raspberry Pi Pico |
---|---|
VCC |
3.3V |
Dữ liệu ra |
GP16 cùng với điện trở 10k ohm |
NC |
– |
GND · |
GND · |
Chúng tôi đã sử dụng các kết nối tương tự như được chỉ định trong bảng trên.
Mô-đun ESP-01 bao gồm 8 chân. Tuy nhiên, chúng tôi sẽ sử dụng 5 chân để kết nối với bảng Pi Pico. Chúng bao gồm các chân VCC, EN, GND, RX và TX. Các chân RX và TX của mô-đun sẽ được kết nối với các chân UART của bảng Pi Pico. Trước tiên chúng ta hãy xem xét các Chân Raspberry Pi Pi UART.
Raspberry Pi Pico chứa hai thiết bị ngoại vi UART giống hệt nhau với các FIFOs 32×8 Tx và 32×12 Rx riêng biệt.
Bảng sau liệt kê các chân GPIO cho cả hai thiết bị ngoại vi UART được tiếp xúc trên sơ đồ chân của bảng phát triển Raspberry Pi Pico.
Chân UART |
Chân GPIO |
---|---|
UART0-TX |
GP0 / GP12 / GP16 |
UART0-RX |
GP1 / GP13 / GP17 |
UART1-TX |
GP4/GP8 |
UART1-RX |
GP5/GP9 |
Đối với hướng dẫn này, chúng tôi sẽ sử dụng chân UART0-TX và RX.
Làm theo sơ đồ kết nối bên dưới để kết nối hai thiết bị.
Raspberry Pi Pico |
ESP-01 · |
---|---|
3.3V |
VCC |
3.3V |
EN |
GND · |
GND · |
GP1 (UART0 RX) |
TX |
GP0 (UART0 TX) |
RX |
Chúng tôi đã sử dụng các kết nối tương tự như được đưa ra trong hai bảng trên. Cả ba thiết bị sẽ được nối đất chung và sẽ được cấp nguồn bằng cùng một chân 3.3V của Raspberry Pi Pico.
Sơ đồ dưới đây cho thấy sơ đồ kết nối của Raspberry Pi Pico với DHT22 và ESP-01.
ThingSpeak là một API mã nguồn mở được sử dụng để lưu trữ hoặc truy xuất dữ liệu bằng giao thức HTTP hoặc MQTT. Điều này diễn ra qua Internet hoặc thông qua mạng LAN. Chúng tôi sẽ sử dụng API này để xuất bản các bài đọc cảm biến từ DHT22 được tích hợp với bảng Raspberry Pi Pico của chúng tôi. Trong ThingSpeak, bạn có thể truy cập dữ liệu của mình từ mọi nơi trên thế giới. Bạn có thể hiển thị dữ liệu của mình theo biểu đồ và đồ thị.
ThingSpeak API được sử dụng miễn phí nhưng chúng ta sẽ phải tạo một Tài khoản MathWorks.
Đầu tiên, hãy truy cập trang web sau: https://thingspeak.com/
Cửa sổ sau sẽ xuất hiện. Nhấp vào nút 'Bắt đầu miễn phí'.
Khi bạn đã đăng nhập thành công, bạn sẽ nhận được thông báo sau:
Nhấp vào 'OK'.
Mở Thonny IDE của bạn và đi tới Tệp > Mới để mở tệp mới. Sao chép mã được cung cấp bên dưới trong tệp đó. Bạn chỉ cần thay thế thông tin đăng nhập mạng và khóa API ThingSpeak của mình.
import uos
import machine
import utime
from machine import Pin
import dht
myHOST = 'api.thingspeak.com'
myPORT = '80'
myAPI = '****************'
print()
print("Machine: \t" + uos.uname()[4])
print("MicroPython: \t" + uos.uname()[3])
sensor = dht.DHT22(Pin(16))
uart0 = machine.UART(0, baudrate=115200)
print(uart0)
def Rx_ESP_Data():
recv=bytes()
while uart0.any()>0:
recv+=uart0.read(1)
res=recv.decode('utf-8')
return res
def Connect_WiFi(cmd, uart=uart0, timeout=3000):
print("CMD: " + cmd)
uart.write(cmd)
utime.sleep(7.0)
Wait_ESP_Rsp(uart, timeout)
print()
def Send_AT_Cmd(cmd, uart=uart0, timeout=3000):
print("CMD: " + cmd)
uart.write(cmd)
Wait_ESP_Rsp(uart, timeout)
print()
def Wait_ESP_Rsp(uart=uart0, timeout=3000):
prvMills = utime.ticks_ms()
resp = b""
while (utime.ticks_ms()-prvMills)<timeout:
if uart.any():
resp = b"".join([resp, uart.read(1)])
print("resp:")
try:
print(resp.decode())
except UnicodeError:
print(resp)
Send_AT_Cmd('AT\r\n') #Test AT startup
Send_AT_Cmd('AT+GMR\r\n') #Check version information
Send_AT_Cmd('AT+CIPSERVER=0\r\n') #Check version information
Send_AT_Cmd('AT+RST\r\n') #Check version information
Send_AT_Cmd('AT+RESTORE\r\n') #Restore Factory Default Settings
Send_AT_Cmd('AT+CWMODE?\r\n') #Query the Wi-Fi mode
Send_AT_Cmd('AT+CWMODE=1\r\n') #Set the Wi-Fi mode = Station mode
Send_AT_Cmd('AT+CWMODE?\r\n') #Query the Wi-Fi mode again
Connect_WiFi('AT+CWJAP="YOUR_SSID","YOUR_PASSWORD"\r\n', timeout=5000) #Connect to AP
Send_AT_Cmd('AT+CIFSR\r\n',timeout=5000) #Obtain the Local IP Address
Send_AT_Cmd('AT+CIPMUX=1\r\n') #Obtain the Local IP Address
utime.sleep(1.0)
print ('Starting connection to ESP8266...')
while True:
sensor.measure()
temp = str(sensor.temperature())
hum = str(sensor.humidity())
print('Temperature: ', temp)
print('Humidity: ', hum)
print ('!About to send data to thingspeak')
sendData = 'GET /update?api_key='+ myAPI +'&field1='+temp +'&field2='+hum
Send_AT_Cmd('AT+CIPSTART=0,\"TCP\",\"'+ myHOST +'\",'+ myPORT+'\r\n')
utime.sleep(1.0)
Send_AT_Cmd('AT+CIPSEND=0,' +str(len(sendData)+4) +'\r\n')
utime.sleep(1.0)
Send_AT_Cmd(sendData +'\r\n')
utime.sleep(4.0)
Send_AT_Cmd('AT+CIPCLOSE=0'+'\r\n') # once file sent, close connection
utime.sleep(4.0)
print ('Data send to thing speak')
Chúng tôi sẽ bắt đầu bằng cách nhập mô-đun máy và mô-đun uos. Chúng tôi cũng sẽ nhập lớp Pin từ mô-đun máy. Điều này là do chúng tôi phải chỉ định chân GPIO được kết nối với chân dữ liệu của cảm biến DHT22. Chúng tôi cũng nhập mô-đun utime để chúng tôi có thể thêm độ trễ giữa các lần đọc của chúng tôi. Ngoài ra, hãy nhập thư viện dht.
import uos
import machine
import utime
from machine import Pin
import dht
Sau đó, chúng tôi sẽ in thông tin về hệ điều hành hiện tại của chúng tôi trong thiết bị đầu cuối Thonny shell. Chúng tôi sẽ uos.uname() và in phiên bản hệ điều hành và phát hành.
print()
print("Machine: \t" + uos.uname()[4])
print("MicroPython: \t" + uos.uname()[3])
Tiếp theo, chúng ta sẽ định nghĩa một đối tượng dht có tên là 'sensor' và gán chân dữ liệu cho nó. Ở đây chúng tôi đang sử dụng cảm biến DHT22 với chân dữ liệu được kết nối tại GP16. Nếu sử dụng DHT11, hãy thay thế 'DHT22' bằng 'DHT11' và thay đổi số pin một cách thích hợp.
sensor = dht.DHT22(Pin(16))
Sau đó, chúng ta sẽ tạo một đối tượng uart bằng cách sử dụng UART() và chỉ định kênh UART làm tham số đầu tiên và tốc độ truyền làm tham số thứ hai. Chúng tôi đang sử dụng UART0 trong trường hợp này với tốc độ truyền 115200 cho giao tiếp uart. ESP8266 có tốc độ truyền mặc định là 115200, do đó chúng tôi sẽ sử dụng cùng một tốc độ truyền ở đây cho giao tiếp Raspberry Pi Pico UART để tạo đồng bộ hóa. Hơn nữa, chúng tôi cũng sẽ in các chi tiết UART trong thiết bị đầu cuối vỏ.
uart0 = machine.UART(0, baudrate=115200)
print(uart0)
Ngoài ra, bao gồm máy chủ ThingSpeak, cổng và ghi khóa API để xuất bản thành công các bài đọc lên API. Đảm bảo thay thế khóa API của bạn ở vị trí được chỉ định bởi ''
myHOST = 'api.thingspeak.com'
myPORT = '80'
myAPI = '****************'
Hàm Connect_WiFi() này được sử dụng để kết nối ESP8266 với WiFi.
def Connect_WiFi(cmd, uart=uart0, timeout=3000):
print("CMD: " + cmd)
uart.write(cmd)
utime.sleep(7.0)
Wait_ESP_Rsp(uart, timeout)
print()
Tiếp theo, chúng ta sẽ định nghĩa ba hàm. Cái đầu tiên là Rx_ESP_Data(). Điều này đọc dữ liệu nối tiếp đang được nhận. Dữ liệu này được giải mã từ định dạng UTF-8 và được trả về.
def Rx_ESP_Data():
recv=bytes()
while uart0.any()>0:
recv+=uart0.read(1)
res=recv.decode('utf-8')
return res
Hàm thứ hai là Send_AT_Cmd(cmd, uart=uart0, timeout=3000). Nó có ba tham số, lệnh AT, kênh UART và thời gian phản hồi. Chức năng này sẽ được sử dụng để nó gửi lệnh AT đến ESP8266 thông qua uart0. Thời gian phản hồi được đặt thành 3 giây.
def Send_AT_Cmd(cmd, uart=uart0, timeout=3000):
print("CMD: " + cmd)
uart.write(cmd)
Wait_ESP_Rsp(uart, timeout)
print()
Hàm Wait_ESP_Rsp(uart=uart0, timeout=3000) đợi 3 giây để nhận được phản hồi từ ESP8266. Sau khi nhận được dữ liệu từ ESP8266, nó nối các byte nhận được và in chúng trên thiết bị đầu cuối shell.
def Wait_ESP_Rsp(uart=uart0, timeout=3000):
prvMills = utime.ticks_ms()
resp = b""
while (utime.ticks_ms()-prvMills)<timeout:
if uart.any():
resp = b"".join([resp, uart.read(1)])
print("resp:")
try:
print(resp.decode())
except UnicodeError:
print(resp)
Bây giờ chúng ta hãy xem xét loạt lệnh AT mà chúng ta sẽ gửi qua UART0 đến ESP8266.
Send_AT_Cmd('AT\r\n') #Test AT startup
Send_AT_Cmd('AT+GMR\r\n') #Check version information
Send_AT_Cmd('AT+CIPSERVER=0\r\n') #Check version information
Send_AT_Cmd('AT+RST\r\n') #Check version information
Send_AT_Cmd('AT+RESTORE\r\n') #Restore Factory Default Settings
Send_AT_Cmd('AT+CWMODE?\r\n') #Query the Wi-Fi mode
Send_AT_Cmd('AT+CWMODE=1\r\n') #Set the Wi-Fi mode = Station mode
Send_AT_Cmd('AT+CWMODE?\r\n') #Query the Wi-Fi mode again
Connect_WiFi('AT+CWJAP="YOUR_SSID","YOUR_PASSWORD"\r\n', timeout=5000) #Connect to AP
Send_AT_Cmd('AT+CIFSR\r\n',timeout=5000) #Obtain the Local IP Address
Send_AT_Cmd('AT+CIPMUX=1\r\n') #Obtain the Local IP Address
utime.sleep(1.0)
Send_AT_Cmd('AT+CIPSERVER=1,80\r\n') #Obtain the Local IP Address
utime.sleep(1.0)
AT: Loại lệnh này được sử dụng để kiểm tra chức năng khởi động của mô-đun WiFi. Phản hồi sẽ ổn, chống lại lệnh này nếu mọi thứ đều ổn.
Send_AT_Cmd('AT\r\n') #Test AT startup
AT + GMR : Loại lệnh AT này được sử dụng để kiểm tra phiên bản lệnh AT và chúng tôi đã sử dụng phiên bản SDK của lệnh AT trong loại mô-đun WIFI này.
Send_AT_Cmd('AT+GMR\r\n') #Check version information
AT + CIPSERVER = 0: Điều này cấu hình ESP8266 làm máy chủ và đặt chế độ là 0, có nghĩa là xóa máy chủ (cần phải làm theo bằng cách khởi động lại)
Send_AT_Cmd('AT+CIPSERVER=0\r\n')
AT + RST: Loại lệnh này được sử dụng để đặt lại mô-đun WiFi khi nó ở trong tình trạng hoạt động. Phản hồi sẽ ổn, khi đặt lại mô-đun.
Send_AT_Cmd('AT+RST\r\n')
AT + RESTORE: Loại lệnh này được sử dụng để khôi phục cài đặt gốc có nghĩa là, khi lệnh này được nhập thì tất cả các tham số sẽ tự động được đặt lại về mặc định của một người.
Send_AT_Cmd('AT+RESTORE\r\n') #Restore Factory Default Settings
AT + CWMODE? : Loại lệnh này được sử dụng để truy vấn chế độ WiFi của ESP8266.
Send_AT_Cmd('AT+CWMODE?\r\n') #Query the WiFi mode
AT + CWMODE = 1 : Điều này đặt chế độ WiFi của ESP8266 trong trường hợp này ở chế độ trạm.
Send_AT_Cmd('AT+CWMODE=1\r\n') #Set the WiFi mode = Station mode
AT + CWJAP = "SSID", "PASSWORD"\r\n', timeout=TIME_ms : Điều này kết nối ESP8266 với một AP có SSID và mật khẩu được cung cấp, Thời gian chờ ở đây là thời gian kết nối lại.
Connect_WiFi('AT+CWJAP="YOUR_SSID","YOUR_PASSWORD"\r\n', timeout=5000) #Connect to AP
AT + CIFSR: Lệnh này lấy địa chỉ IP cục bộ.
Send_AT_Cmd('AT+CIFSR\r\n')
AT + CIPMUX = 1: Lệnh này được sử dụng để kích hoạt nhiều kết nối (tối đa 4)
Send_AT_Cmd('AT+CIPMUX=1\r\n')
AT + CIPSERVER = 1: Lệnh này cấu hình ESP8266 làm máy chủ.
Send_AT_Cmd('AT+CIPSERVER=1,80\r\n')
Bên trong vòng lặp while, trước tiên chúng ta sẽ có được chỉ số nhiệt độ và độ ẩm và lưu nó ở 'nhiệt độ' và 'hum' tương ứng. Chúng tôi sử dụng đối tượng cảm biến trên phương pháp thích hợp, ví dụ: nhiệt độ () để có được chỉ số nhiệt độ tính bằng độ C và độ ẩm để có được giá trị độ ẩm theo tỷ lệ phần trăm. Ngoài ra, chúng tôi cũng chuyển đổi chúng thành các giá trị chuỗi.
while True:
sensor.measure()
temp = str(sensor.temperature())
hum = str(sensor.humidity())
print('Temperature: ', temp)
print('Humidity: ', hum)
Chúng tôi sẽ in các số đọc cảm biến này trong thiết bị đầu cuối vỏ Thonny.
print('Temperature: ', temp)
print('Humidity: ', hum)
Cuối cùng, chúng tôi sẽ gửi các bài đọc cảm biến này đến bảng điều khiển ThingSpeak.
print ('!About to send data to thingspeak')
sendData = 'GET /update?api_key='+ myAPI +'&field1='+temp +'&field2='+hum
Send_AT_Cmd('AT+CIPSTART=0,\"TCP\",\"'+ myHOST +'\",'+ myPORT+'\r\n')
utime.sleep(1.0)
Send_AT_Cmd('AT+CIPSEND=0,' +str(len(sendData)+4) +'\r\n')
utime.sleep(1.0)
Send_AT_Cmd(sendData +'\r\n')
utime.sleep(4.0)
Send_AT_Cmd('AT+CIPCLOSE=0'+'\r\n') # once file sent, close connection
utime.sleep(4.0)
print ('Data send to thing speak')
Chúng ta sẽ tạo một biến 'sendData' chứa yêu cầu GET mà chúng ta sẽ thực hiện cho ThingSpeak để udate các trường tương ứng với các giá trị được giữ trong các biến.
sendData = 'GET /update?api_key='+ myAPI +'&field1='+temp +'&field2='+hum
Đầu tiên, chúng ta đang viết lệnh AT: AT+CIPSTART=0,\"TCP\",\"'+ myHOST +'\",'+ myPORT+'\r\n' Lệnh này được sử dụng để thiết lập kết nối cổng và địa chỉ của cổng.
Tiếp theo sau độ trễ 1 giây, chúng tôi gửi lệnh AT: AT + CIPSEND = 'ID', 'LENGTH' Điều này sẽ đặt độ dài của dữ liệu sẽ được gửi. Nó cho mô-đun WI-FI biết chúng tôi muốn gửi bao nhiêu byte đến máy chủ.
Sau đó, chúng tôi gửi dữ liệu đến ThingSpeak thông qua để được pusblished đến các trường tương ứng của họ.
Sau đó, chúng tôi sẽ đóng nhiều kết nối khi chúng tôi đang gửi lệnh AT: AT + CIPCLOSE = 'ID'.
Send_AT_Cmd('AT+CIPSTART=0,\"TCP\",\"'+ myHOST +'\",'+ myPORT+'\r\n')
utime.sleep(1.0)
Send_AT_Cmd('AT+CIPSEND=0,' +str(len(sendData)+4) +'\r\n')
utime.sleep(1.0)
Send_AT_Cmd(sendData +'\r\n')
utime.sleep(4.0)
Send_AT_Cmd('AT+CIPCLOSE=0'+'\r\n') # once file sent, close connection
utime.sleep(4.0)
print ('Data send to thing speak')
>>> 100+ Mã Sản Phẩm Dây Rút: https://mecsu.vn/san-pham/day-rut-nhua.5op
>>> 1000+ Mã Sản Phẩm Đầu Cosse: https://mecsu.vn/san-pham/dau-cosse.Q1j