Nó là một cảm biến nhiệt độ có thể lập trình một dây trong tự nhiên. Nó được sử dụng rộng rãi để đo nhiệt độ của các dung dịch hóa học và các chất có trong môi trường cứng. Một trong những lợi thế của việc sử dụng cảm biến này là chúng tôi chỉ yêu cầu một chân duy nhất của bảng Raspberry Pi Pico để truyền dữ liệu. Do đó, việc sử dụng với bộ điều khiển vi mô là vô cùng thuận tiện vì chúng ta có thể đo nhiều nhiệt độ bằng cách sử dụng số lượng chân ít nhất trên bảng phát triển của mình.
Bảng dưới đây cho thấy một số đặc điểm chính của cảm biến ds18b120.
Tính năng |
Giá trị |
---|---|
Điện áp hoạt động |
3V-5V · |
Phạm vi nhiệt độ |
-55 °C đến + 125 °C |
Chính xác |
±0,5 °C |
Độ phân giải đầu ra |
9bit đến 12bit |
Một phiên bản chống nước của cảm biến này cũng có sẵn trên thị trường. Các số liệu sau đây cho thấy sơ đồ chân của các cảm biến DS18B20.
Pin ra khỏi DS18B20 không thấm nước
Sơ đồ sau đây cho thấy sơ đồ chân của cảm biến nhiệt độ DS18B20 bình thường.
Bảng dưới đây liệt kê các cấu hình ghim:
Ghim |
Mô tả:__________ |
---|---|
VCC |
Đây là chân cấp nguồn cho cảm biến. 3.3V cho bảng Raspberry Pi Pico |
Dữ liệu |
Chân này cho giá trị nhiệt độ |
Mặt đất |
Chân này được kết nối với mặt đất |
Chi tiết cấu hình pin DS18B20
Cảm biến nhiệt độ này cũng đi kèm trong một mô-đun gói duy nhất có chứa cảm biến và điện trở kéo lên. Nếu bạn đang sử dụng mô-đun, bạn không cần kết nối điện trở ohm 4.7K bên ngoài. Bởi vì mô-đun đã có một điện trở kéo lên trên tàu.
Cảm biến DS18B20 có thể được cấp nguồn ở hai chế độ khác nhau.
Chế độ bình thường: Cảm biến được cấp nguồn thông qua nguồn bên ngoài thông qua chân VDD và điện trở kéo lên 4.7K ohm.
Chế độ ký sinh trùng: Cảm biến thu được nguồn điện từ đường dữ liệu của chính nó. Do đó, không cần nguồn điện bên ngoài.
Phần này hướng dẫn cách kết nối Raspberry Pi Pico với cảm biến DS18B20 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 DS18B20
Điện trở 4.7k ohm
Mô-đun ESP-01
Dây kết nối
Breadboard
Chúng tôi sẽ cấp nguồn cho cảm biến DS10B20 ở chế độ bình thường. Do đó, chân VCC của nó sẽ được kết nối với chân 3.3V của bảng Raspberry Pi Pico thông qua điện trở 4.7k ohm.
Cảm biến DS18B20 có ba thiết bị đầu cuối mà chúng ta đã thấy ở trên trong sơ đồ chân. Thiết bị đầu cuối đầu tiên được nối đất với bảng Raspberry Pi Pico. Đường dữ liệu của cảm biến, là cực giữa, được kết nối thông qua GP16 thông qua điện trở kéo lên 4.7k-ohm. Chúng tôi cũng có thể chọn bất kỳ chân GPIO nào khác. Thiết bị đầu cuối thứ ba được cung cấp bởi 3.3V từ Raspberry Pi Pico.
Raspberry Pi Pico |
DS18B20 · |
---|---|
GND · |
GND · |
GP16 · |
Dữ liệu |
3.3V |
VCC |
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 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 DS18B20 và ESP-01.
Đối với dự án này, chúng tôi sẽ yêu cầu hai thư viện: ds18x20.py và onewire.py. Sao chép cả hai thư viện này và lưu chúng trong Raspberry Pi Pico của bạn với các tên tệp tương ứng. Mở một tệp mới trong Thonny. Sao chép các thư viện được cung cấp dưới đây. Lưu chúng vào Raspberry Pi Pico với tên ds18x20.py và onewire.py trong thư mục lib.
# DS18x20 temperature sensor driver for MicroPython.
# MIT license; Copyright (c) 2016 Damien P. George
from micropython import const
_CONVERT = const(0x44)
_RD_SCRATCH = const(0xBE)
_WR_SCRATCH = const(0x4E)
class DS18X20:
def __init__(self, onewire):
self.ow = onewire
self.buf = bytearray(9)
def scan(self):
return [rom for rom in self.ow.scan() if rom[0] in (0x10, 0x22, 0x28)]
def convert_temp(self):
self.ow.reset(True)
self.ow.writebyte(self.ow.SKIP_ROM)
self.ow.writebyte(_CONVERT)
def read_scratch(self, rom):
self.ow.reset(True)
self.ow.select_rom(rom)
self.ow.writebyte(_RD_SCRATCH)
self.ow.readinto(self.buf)
if self.ow.crc8(self.buf):
raise Exception("CRC error")
return self.buf
def write_scratch(self, rom, buf):
self.ow.reset(True)
self.ow.select_rom(rom)
self.ow.writebyte(_WR_SCRATCH)
self.ow.write(buf)
def read_temp(self, rom):
buf = self.read_scratch(rom)
if rom[0] == 0x10:
if buf[1]:
t = buf[0] >> 1 | 0x80
t = -((~t + 1) & 0xFF)
else:
t = buf[0] >> 1
return t - 0.25 + (buf[7] - buf[6]) / buf[7]
else:
t = buf[1] << 8 | buf[0]
if t & 0x8000: # sign bit set
t = -((t ^ 0xFFFF) + 1)
return t / 16
# 1-Wire driver for MicroPython
# MIT license; Copyright (c) 2016 Damien P. George
import _onewire as _ow
class OneWireError(Exception):
pass
class OneWire:
SEARCH_ROM = 0xF0
MATCH_ROM = 0x55
SKIP_ROM = 0xCC
def __init__(self, pin):
self.pin = pin
self.pin.init(pin.OPEN_DRAIN, pin.PULL_UP)
def reset(self, required=False):
reset = _ow.reset(self.pin)
if required and not reset:
raise OneWireError
return reset
def readbit(self):
return _ow.readbit(self.pin)
def readbyte(self):
return _ow.readbyte(self.pin)
def readinto(self, buf):
for i in range(len(buf)):
buf[i] = _ow.readbyte(self.pin)
def writebit(self, value):
return _ow.writebit(self.pin, value)
def writebyte(self, value):
return _ow.writebyte(self.pin, value)
def write(self, buf):
for b in buf:
_ow.writebyte(self.pin, b)
def select_rom(self, rom):
self.reset()
self.writebyte(self.MATCH_ROM)
self.write(rom)
def scan(self):
devices = []
diff = 65
rom = False
for i in range(0xFF):
rom, diff = self._search_rom(rom, diff)
if rom:
devices += [rom]
if diff == 0:
break
return devices
def _search_rom(self, l_rom, diff):
if not self.reset():
return None, 0
self.writebyte(self.SEARCH_ROM)
if not l_rom:
l_rom = bytearray(8)
rom = bytearray(8)
next_diff = 0
i = 64
for byte in range(8):
r_b = 0
for bit in range(8):
b = self.readbit()
if self.readbit():
if b: # there are no devices or there is an error on the bus
return None, 0
else:
if not b: # collision, two devices with different bit meaning
if diff > i or ((l_rom[byte] & (1 << bit)) and diff != i):
b = 1
next_diff = i
self.writebit(b)
if b:
r_b |= 1 << bit
i -= 1
rom[byte] = r_b
return rom, next_diff
def crc8(self, data):
return _ow.crc8(data)
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ừ DS18B20 đượ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
Cửa sổ sau sẽ xuất hiện. Nhấp vào nút 'Bắt đầu miễn phí'.
Bây giờ bạn sẽ được chuyển hướng đến cửa sổ tài khoản. Nếu bạn đã có sẵn tài khoản MathWorks, bạn có thể sử dụng tài khoản đó để đăng nhập. Nếu không, bạn sẽ phải tạo một cái mới. Nhấp vào 'Tạo một tài khoản!' để tạo tài khoản MathWorks mới.
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'.
Chúng tôi sẽ bắt đầu bằng cách tạo một kênh mới cho dự án của chúng tôi. Chuyển đến Kênh > Kênh của tôi. Sau đó nhấp vào 'Kênh mới'.
Bạn sẽ được nhắc đặt tên cho kênh của mình. Chúng tôi sẽ đưa ra một tên, một số mô tả và đánh dấu trường đầu tiên. Trong phần này, chúng tôi sẽ hướng dẫn bạn cách phát hành lên một trường duy nhất. Bạn có thể sử dụng bất kỳ tên, mô tả và trường nào theo sở thích của mình. Có tổng cộng tám trường mà chúng tôi có thể thêm vào kênh của mình cùng một lúc. Chúng tôi sẽ đánh dấu vào trường đầu tiên và thêm tên. Nhấp vào 'Lưu kênh' để tiếp tục.
Bây giờ kênh của bạn sẽ được tạo.
Chuyển đến chế độ xem riêng tư và nhấp vào biểu tượng bút chì trên đầu Biểu đồ Trường. Điều này sẽ cho phép chúng tôi tùy chỉnh biểu đồ theo sở thích của chúng tôi. Bạn có thể thêm chi tiết cho phù hợp. Sau khi bạn nhấn nút Lưu, biểu đồ sẽ được cập nhật về cài đặt bạn vừa đặt.
Sau đó, chuyển đến tab khóa API và nhấp vào nó. Bây giờ bạn sẽ có thể truy cập khóa API ghi duy nhất của mình. Lưu nó và giữ nó an toàn vì bạn sẽ cần nó sau này trong mã chương trình.
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, onewire, ds18x20
import utime
from machine import Pin
myHOST = 'api.thingspeak.com'
myPORT = '80'
myAPI = '****************'
print()
print("Machine: \t" + uos.uname()[4])
print("MicroPython: \t" + uos.uname()[3])
ds_pin = machine.Pin(16)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()
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="A1601","123456789104"\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:
print('Found DS devices')
print('Temperature')
ds_sensor.convert_temp()
utime.sleep(1)
for rom in roms:
temperature_Celsius = round(ds_sensor.read_temp(rom), 2)
print(temperature_Celsius)
utime.sleep(3)
print ('!About to send data to thingspeak')
sendData = 'GET /update?api_key='+ myAPI +'&field1='+str(temperature_Celsius)
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)
Mã hoạt động như thế nào?
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 ta 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 DS18B20. 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, nhập một dây và thư viện ds18x20 mà chúng tôi vừa tải lên bảng của mình.
import uos
import machine, onewire, ds18x20
import utime
from machine import Pin
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ẽ tạo một đối tượng của lớp Pin với tên đối tượng là ds_pin và thiết lập GP16 làm chân dòng dữ liệu DS18B20. Phương pháp quét() quét tất cả các cảm biến DS18B20 được kết nối với chân ds_sensor và lưu địa chỉ 64 bit của mỗi cảm biến trong một biến danh sách là "roms". Sau đó, chúng tôi sẽ sử dụng các địa chỉ này để đọc từng địa chỉ từ cảm biến một.
ds_pin = machine.Pin(16)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()
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ẽ nhận được số đọc cảm biến. Chúng ta sẽ gọi đối tượng (ds_sensor) trên phương thức convert_temp() trước khi đọc nhiệt độ từ cảm biến bằng địa chỉ duy nhất của nó. Để đọc nhiệt độ tính bằng độ C, chúng tôi sử dụng quy trình read_temp() trên đối tượng ds_sensor và truyền một địa chỉ được lưu trữ trong danh sách roms. Cảm biến nhiệt độ DS18B20 cung cấp đầu ra dữ liệu ở dạng dữ liệu nổi. Chúng tôi sẽ làm tròn số đọc đến 2 chữ số thập phân và in nó trong thiết bị đầu cuối vỏ Thonny.
while True:
print('Found DS devices')
print('Temperature')
ds_sensor.convert_temp()
utime.sleep(1)
for rom in roms:
temperature_Celsius = round(ds_sensor.read_temp(rom), 2)
print(temperature_Celsius)
utime.sleep(3)
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='+str(temperature_Celsius)
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 trường tương ứng với các giá trị được giữ trong biến 'temperature_Celsius' được chuyển đổi thành một chuỗi.
sendData = 'GET /update?api_key='+ myAPI +'&field1='+str(temperature_Celsius)
Đầ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')