สารบัญ:
วีดีโอ: แปลงข้อมูล DHT11 โดยใช้ Raspberry Pi และ Arduino UNO: 7 ขั้นตอน
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
คำแนะนำนี้อธิบายวิธีที่ฉันพล็อตข้อมูลเซ็นเซอร์อุณหภูมิ DHT11 โดยใช้ Arduino Uno และ Raspberry Pi ในเซ็นเซอร์อุณหภูมินี้เชื่อมต่อกับ Arduino Uno และ Arduino Uno เชื่อมต่อแบบอนุกรมกับ Raspberry Pi ที่ Raspberry Pi Side ไลบรารี matplotlib, numpy และ drawow ใช้เพื่อพล็อตกราฟ
ขั้นตอนที่ 1: สิ่งที่จำเป็นสำหรับโครงการ
1. ราสเบอร์รี่ปี่
2. Arduino Uno
3. DHT11 เซ็นเซอร์อุณหภูมิ
4. สายจัมเปอร์
5. เขียงหั่นขนม
ขั้นตอนที่ 2: ดาวน์โหลดและติดตั้ง Arduino IDE ใน Raspberry Pi
หมายเหตุ:- คุณสามารถใช้ Arduino IDE ของ windows, Linux หรือ Mac เพื่ออัปโหลดภาพร่างใน Arduino UNO
ขั้นตอนแรกคือการติดตั้ง Arduino IDE สำหรับเบราว์เซอร์ที่เปิดอยู่ใน Raspberry Pi และเปิดลิงก์ที่ระบุด้านล่าง
Arduino IDE ก่อนหน้า
จากนั้นดาวน์โหลดเวอร์ชัน Linux ARM และแตกไฟล์โดยใช้คำสั่ง
tar -xf ชื่อไฟล์
หลังจากแตกไฟล์แล้ว คุณจะเห็นไดเร็กทอรีใหม่ ที่นี่ฉันใช้ arduino-1.8.2 IDE จากนั้นไปที่ไดเร็กทอรีโดยใช้คำสั่ง
cd arduino-1.8.1
ในการรัน Arduino IDE ให้ใช้คำสั่งนี้ในไดเรกทอรี arduino-1.8.2
./arduino
วิธีใช้ห้องสมุด
ในการติดตั้งไลบรารีใด ๆ ใน Arduino เพียงดาวน์โหลดไลบรารีและวางในโฟลเดอร์ arduino 1.8.2 ==> ไลบรารี
หมายเหตุ:- ตรวจสอบให้แน่ใจว่าไม่มี (-) ในโฟลเดอร์ไลบรารีเช่น (เซ็นเซอร์ DHT) หากมี (-) ให้เปลี่ยนชื่อ
เราจะใช้สองไลบรารีในคำสั่งนี้ DHT_Sensor และ Adafruit_Sensor
ขั้นตอนที่ 3: รหัสสำหรับ Arduino
ตอนนี้ให้ python และ Arduino คุยกัน ประการแรกเราต้องการโปรแกรมอย่างง่ายเพื่อให้ Arduino ส่งข้อมูลผ่านพอร์ตอนุกรม โปรแกรมต่อไปนี้เป็นโปรแกรมอย่างง่ายที่จะนับ Arduino และส่งข้อมูลไปยังพอร์ตอนุกรม
รหัส Arduino
#include "DHT.h" float tempC; // ตัวแปรหรืออุณหภูมิค้างใน C float tempF; // ตัวแปรสำหรับเก็บอุณหภูมิในความชื้นลอย F; //ตัวแปรสำหรับอ่านค่าความดัน
#define DHTPIN 7 // พินดิจิทัลที่เราเชื่อมต่ออยู่
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// เริ่มต้นเซ็นเซอร์ DHT
DHT dht (DHTPIN, DHTTYPE);
ถือเป็นโมฆะการตั้งค่า(){Serial.begin(115200); //เปิดเครื่องมอนิเตอร์แบบอนุกรม
dht.begin(); // เริ่มต้น dht }
วงเป็นโมฆะ () {tempC = dht.readTemperature(); // อย่าลืมประกาศตัวแปรของคุณ
ความชื้น = dht.readHumidity(); // อ่านความชื้น
Serial.print(tempC);
Serial.print(", ");
Serial.print(ความชื้น);
Serial.print("\n"); // สำหรับ linedelay ใหม่ (2000); // หยุดระหว่างการอ่าน }
เมื่อร่างแบบร่างแล้ว ให้เลือกบอร์ดและพอร์ตแล้วอัปโหลด
ขั้นตอนที่ 4: ตั้งค่า Raspberry Pi
เมื่ออัปโหลดโค้ดแล้ว ให้ติดตั้งไลบรารี่บางส่วนเพื่อให้เราสามารถพล็อตกราฟของข้อมูลที่มาจาก Arduino Uno ตามลำดับ
1. PySerial เป็นไลบรารีที่ให้การสนับสนุนการเชื่อมต่อแบบอนุกรมผ่านอุปกรณ์ต่างๆ ในการติดตั้งให้ใช้คำสั่ง
Sudo apt-get ติดตั้ง python-serial
2. Numpy คือแพ็คเกจที่กำหนดออบเจ็กต์อาร์เรย์หลายมิติและฟังก์ชันทางคณิตศาสตร์ที่รวดเร็วที่เกี่ยวข้องซึ่งทำงานบนวัตถุนั้น นอกจากนี้ยังมีกิจวัตรง่ายๆ สำหรับพีชคณิตเชิงเส้นและ FFT (การแปลงฟูเรียร์แบบเร็ว) และการสร้างตัวเลขสุ่มที่ซับซ้อน คุณสามารถติดตั้งได้หลายวิธีโดยใช้ apt package หรือ pip ที่นี่ฉันกำลังติดตั้งโดยใช้ pip สำหรับสิ่งนั้นก่อนอื่นเราต้องติดตั้ง pip
sudo apt-get ติดตั้ง python-pip python-dev build-essential
sudo pip ติดตั้ง numpy
หรือถ้าคุณต้องการใช้ apt package
sudo apt ติดตั้ง python-numpy
3. Matplotlib เป็นไลบรารีการพล็อต 2D ซึ่งจัดเตรียม API เชิงวัตถุสำหรับการฝังพล็อตลงในแอปพลิเคชันโดยใช้ชุดเครื่องมือ GUI ทั่วไป เช่น Tkinter, wxPython, Qt หรือ GTK+ ในการติดตั้งให้ใช้คำสั่ง
sudo pip ติดตั้ง matplotlib
หรือ
sudo apt ติดตั้ง python-matplotlib
4. Drawnow มักใช้เพื่อดูผลลัพธ์หลังจากการวนซ้ำแต่ละครั้ง เนื่องจากเราใช้ "imshow" ใน MATLAB ในการติดตั้งให้ใช้คำสั่ง
sudo pip ติดตั้ง drawow
ขั้นตอนที่ 5: Python Scipt
ขั้นตอนต่อไปคือการเขียนสคริปต์หลามเพื่อให้คุณสามารถใช้โปรแกรมแก้ไขใดก็ได้ในการเขียน
1. พล็อตข้อมูลในกราฟเดียว
นำเข้า Serial # นำเข้า Serial Library
นำเข้า numpy # นำเข้า numpy
นำเข้า matplotlib.pyplot เป็น plt #import matplotlib library
จาก drawow นำเข้า *
tempC = #ว่างเปล่า arrayhumidity =
arduino = serial. Serial("/dev/ttyACM0", 115200)
plt.ion () # โหมดโต้ตอบเพื่อพล็อต datacount สด = 0
def makeFig(): #สร้างฟังก์ชันที่ทำให้พล็อตที่เราต้องการ
plt.ylim(20, 30) #Set y ค่าต่ำสุดและสูงสุด
plt.title('Real Time DHT11 Data') #พล็อตชื่อเรื่อง
plt.grid(จริง) #เปิดตาราง
plt.ylabel('Temp C') #Set ylabel
plt.plot(tempC, 'b^-', label='Degree C') #plot อุณหภูมิ
plt.legend(loc='upper right') #วางแผนตำนาน
plt2=plt.twinx() #สร้างแกน y ที่สอง
plt.ylim(50, 70) #กำหนดขีดจำกัดของแกน y ที่สอง
plt2.plot(ความชื้น, 'g*-', label='Humidity') #plot ข้อมูลความดัน
plt2.set_ylabel('ความชื้น') #label แกน y ที่สอง
plt2.ticklabel_format(useOffset=False)
plt2.legend(loc='บนซ้าย')
while True: # while loop ที่วนซ้ำตลอดไป
while (arduino.inWaiting()==0): #รอที่นี่จนกว่าจะมีข้อมูล
ผ่าน #ไม่ทำอะไรเลย
arduinoString = arduino.readline()
dataArray = arduinoString.split(', ') #แยกเป็นอาร์เรย์
อุณหภูมิ = ลอย (dataArray[0])
ฮัม = ลอย (dataArray[1])
tempC.append(ชั่วคราว)
ความชื้นต่อท้าย (ฮัม)
drawow(makeFig)
plt.หยุดชั่วคราว(.000001)
count=count+1 if(count>20): #ใช้เฉพาะ 20 ข้อมูลสุดท้ายหากข้อมูลมากกว่านั้นจะปรากฏขึ้นก่อน
tempC.ป๊อป(0)
ความชื้นป๊อป(0)
2. เพื่อพล็อตความชื้นและอุณหภูมิแยกจากกัน
นำเข้า Serial # นำเข้า Serial Library
นำเข้า numpy # นำเข้า numpy
นำเข้า matplotlib.pyplot เป็น plt #import matplotlib library
จาก drawow นำเข้า *
tempC = #อาร์เรย์ว่างเปล่า
ความชื้น =
arduino = serial. Serial("/dev/ttyACM0", 115200) #พอร์ตอนุกรมที่ Arduino เชื่อมต่อและ Baudrate
plt.ion() #บอก matplotlib ว่าคุณต้องการโหมดโต้ตอบเพื่อพล็อตข้อมูลสด
def CreatePlot(): #สร้างฟังก์ชันที่ทำให้พล็อตที่ต้องการ
plt.subplot(2, 1, 1) #ความสูง ความกว้าง พล็อตแรก
plt.ylim(22, 34) #Set y ค่าต่ำสุดและสูงสุด
plt.title('Real Time DHT11 Data') #พล็อตชื่อเรื่อง
plt.grid(จริง) #เปิดตาราง
plt.ylabel('Temp C') #Set ylabels
plt.plot(tempC, 'b^-', label='Degree C') #plot อุณหภูมิ
plt.legend(loc='upper center') #วางแผนตำนาน
plt.subplot(2, 1, 2) # Height, Width, Second plot
plt.grid(จริง)
plt.ylim(45, 70) #ตั้งค่าขีดจำกัดของแกน y ที่สอง
plt.plot(humidity, 'g*-', label='Humidity (g/m^3)') #plot ข้อมูลความชื้น
plt.ylabel('ความชื้น (g/m^3)') #label แกน y ที่สอง
plt.ticklabel_format(useOffset=False) #เพื่อหยุด autoscale แกน y
plt.legend(loc='upper center')
while True: # while loop ที่วนซ้ำตลอดไป
while (arduino.inWaiting()==0): #รอที่นี่จนกว่าจะมีการส่งผ่านข้อมูล #ไม่ทำอะไรเลย
arduinoString = arduino.readline() #อ่านข้อมูลจากพอร์ตอนุกรม
dataArray = arduinoString.split(', ') #แยกเป็นอาร์เรย์
temp = float(dataArray[0]) #Convert องค์ประกอบแรกเป็นตัวเลขลอยตัวและใส่ temp
hum = float(dataArray[1]) #แปลงองค์ประกอบที่สองเป็นตัวเลขลอยตัวและใส่ hum
tempC.append(temp) #สร้างอาร์เรย์ tempC ของเราโดยต่อท้ายการอ่าน temp
moisture.append(hum) #สร้างอาร์เรย์ความชื้นของเราโดยผนวก hum reading
drawow(สร้างพล็อต)
plt.หยุดชั่วคราว(.000001)
นับ=นับ+1
if(count>20): #ใช้เฉพาะ 20 ข้อมูลสุดท้ายหากข้อมูลมากกว่านั้นจะปรากฏขึ้นก่อน
tempC.pop(0) # เด้งออกองค์ประกอบแรก
ความชื้นป๊อป(0)
ขั้นตอนที่ 6: แผนภาพวงจร
Arduino ==> DHT11
3.3V ==> VCC
GND ==> GND
D7 ==> ออก