สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
เราเจอโครงการต่างๆ ที่ต้องการการตรวจสอบอุณหภูมิ ความดัน และความชื้น ดังนั้นเราจึงตระหนักดีว่าพารามิเตอร์เหล่านี้มีบทบาทสำคัญในการประมาณประสิทธิภาพการทำงานของระบบในสภาวะบรรยากาศต่างๆ ทั้งในระดับอุตสาหกรรมและระบบส่วนบุคคล อุณหภูมิ ความชื้น และระดับความกดอากาศที่เหมาะสมเป็นสิ่งจำเป็นสำหรับประสิทธิภาพของระบบที่เพียงพอ
นี่คือเหตุผลที่เราจัดทำบทแนะนำที่สมบูรณ์เกี่ยวกับเซ็นเซอร์นี้ ในบทช่วยสอนนี้ เราจะอธิบายการทำงานของเซ็นเซอร์ความชื้น ความดัน และอุณหภูมิ BME280 พร้อมโฟตอนอนุภาค
ขั้นตอนที่ 1: การสำรวจ BME280
ภาคอิเล็กทรอนิกส์ได้ก้าวไปอีกขั้นด้วยเซ็นเซอร์ BME280 เซ็นเซอร์สิ่งแวดล้อมพร้อมอุณหภูมิ ความดันบรรยากาศ และความชื้น! เซ็นเซอร์นี้เหมาะอย่างยิ่งสำหรับการตรวจจับสภาพอากาศ/สิ่งแวดล้อมทุกประเภท และยังใช้ใน I2C ได้อีกด้วย
เซ็นเซอร์ความเที่ยงตรงสูง BME280 นี้เป็นโซลูชันการตรวจจับที่ดีที่สุดสำหรับการวัดความชื้นด้วยความแม่นยำ ±3% ความดันบรรยากาศที่มีความแม่นยำสัมบูรณ์ ±1 hPa และอุณหภูมิที่มีความแม่นยำ ±1.0°C เนื่องจากความดันเปลี่ยนแปลงไปตามระดับความสูง และการวัดความดันนั้นดีมาก คุณจึงสามารถใช้เป็นเครื่องวัดระยะสูงที่มีความแม่นยำ ±1 เมตรหรือดีกว่าได้! เซ็นเซอร์อุณหภูมิได้รับการปรับให้เหมาะสมสำหรับเสียงรบกวนต่ำสุดและความละเอียดสูงสุด และใช้สำหรับชดเชยอุณหภูมิของ เซ็นเซอร์ความดันและยังสามารถใช้สำหรับการประมาณอุณหภูมิแวดล้อม การวัดด้วย BME280 สามารถทำได้โดยผู้ใช้หรือดำเนินการเป็นระยะๆ
เอกสารข้อมูล: คลิกเพื่อดูตัวอย่างหรือดาวน์โหลดเอกสารข้อมูลของเซ็นเซอร์ BME280
ขั้นตอนที่ 2: รายการข้อกำหนดฮาร์ดแวร์
เราใช้ Dcube Store Parts ทั้งหมดเพราะว่ามันใช้งานง่าย และบางอย่างเกี่ยวกับทุกสิ่งที่ลงตัวพอดีบนตารางเซนติเมตรก็ทำให้เราก้าวต่อไปได้จริงๆ คุณสามารถใช้อะไรก็ได้ที่คุณต้องการ แต่แผนภาพการเดินสายจะถือว่าคุณกำลังใช้ชิ้นส่วนเหล่านี้
- BME280 เซนเซอร์ I²C โมดูลขนาดเล็ก
- I²C Shield สำหรับอนุภาคโฟตอน
- อนุภาคโฟตอน
- สายเคเบิล I²C
- อะแดปเตอร์ไฟฟ้า
ขั้นตอนที่ 3: การเชื่อมต่อ
ส่วนเชื่อมต่อโดยทั่วไปจะอธิบายการเชื่อมต่อสายไฟที่จำเป็นระหว่างเซ็นเซอร์กับโฟตอนของอนุภาค ตรวจสอบให้แน่ใจว่าการเชื่อมต่อถูกต้องเป็นสิ่งจำเป็นพื้นฐานในขณะที่ทำงานกับระบบใด ๆ สำหรับเอาต์พุตที่ต้องการ ดังนั้น การเชื่อมต่อที่จำเป็นมีดังนี้:
BME280 จะทำงานบน I2C นี่คือตัวอย่างไดอะแกรมการเดินสาย ซึ่งสาธิตวิธีเชื่อมต่อแต่ละอินเทอร์เฟซของเซ็นเซอร์ เมื่อแกะกล่อง บอร์ดได้รับการกำหนดค่าสำหรับอินเทอร์เฟซ I2C ดังนั้น เราขอแนะนำให้ใช้อินเทอร์เฟซนี้หากคุณไม่เชื่อเรื่องพระเจ้า สิ่งที่คุณต้องมีคือสี่สาย! ต้องใช้พิน Vcc, Gnd, SCL และ SDA เพียงสี่การเชื่อมต่อเท่านั้น และเชื่อมต่อด้วยสายเคเบิล I2C การเชื่อมต่อเหล่านี้แสดงให้เห็นในภาพด้านบน
ขั้นตอนที่ 4: รหัสตรวจสอบอุณหภูมิ ความดัน และความชื้น
โค้ดเวอร์ชันใหม่ทั้งหมดที่เราจะใช้เพื่อเรียกใช้มีให้ที่นี่
ในขณะที่ใช้โมดูลเซ็นเซอร์กับ Arduino เราได้รวมไลบรารี application.h และ spark_wiring_i2c.h "application.h" และไลบรารี spark_wiring_i2c.h มีฟังก์ชันที่อำนวยความสะดวกในการสื่อสาร i2c ระหว่างเซ็นเซอร์และอนุภาค
คลิกที่นี่เพื่อเปิดหน้าเว็บสำหรับการตรวจสอบอุปกรณ์
อัปโหลดรหัสไปยังกระดานของคุณและควรเริ่มทำงาน! ข้อมูลทั้งหมดสามารถรับได้จากหน้าเว็บดังแสดงในภาพ
รหัสมีให้ด้านล่าง:
// เผยแพร่โดยให้สิทธิ์ใช้งานตามเจตจำนงเสรี// ใช้แบบใดก็ได้ที่คุณต้องการ ไม่ว่าจะมีกำไรหรือให้เปล่า โดยให้เหมาะสมกับใบอนุญาตของงานที่เกี่ยวข้อง // BME280 // รหัสนี้ออกแบบมาเพื่อทำงานกับ BME280_I2CS I2C Mini Module ที่มีจำหน่ายจาก ControlEverything.com #include #include // ที่อยู่ BME280 I2C คือ 0x76 (108) #define Addr 0x76 double cTemp = 0, fTemp = 0, ความดัน = 0, ความชื้น = 0; การตั้งค่าเป็นโมฆะ () {// ตั้งค่าตัวแปร Particle.variable ("i2cdevice", "BME280"); บทความ.ตัวแปร("cTemp", cTemp); Particle.variable("fTemp", fTemp); Particle.variable("ความดัน", ความดัน); Particle.variable("ความชื้น", ความชื้น); // เริ่มต้นการสื่อสาร I2C เป็น MASTER Wire.begin(); // เริ่มต้นการสื่อสารแบบอนุกรม ตั้งค่าอัตรารับส่งข้อมูล = 9600 Serial.begin(9600); ล่าช้า (300); } วงเป็นโมฆะ () { unsigned int b1 [24]; ข้อมูล int ที่ไม่ได้ลงนาม[8]; int dig_H1 = 0; สำหรับ (int i = 0; i <24; i ++) { // เริ่ม I2C Transmission Wire.beginTransmission (Addr); // เลือก data register Wire.write((136+i)); // หยุด I2C Transmission Wire.endTransmission(); // ขอข้อมูล 1 ไบต์ Wire.requestFrom(Addr, 1); // อ่านข้อมูล 24 ไบต์ if(Wire.available() == 1) { b1 = Wire.read(); } } // แปลงข้อมูล // ค่าสัมประสิทธิ์อุณหภูมิ int dig_T1 = (b1[0] & 0xff) + ((b1[1] & 0xff) * 256); int dig_T2 = b1[2] + (b1[3] * 256); int dig_T3 = b1[4] + (b1[5] * 256); // ค่าสัมประสิทธิ์ความดัน int dig_P1 = (b1[6] & 0xff) + ((b1[7] & 0xff) * 256); int dig_P2 = b1[8] + (b1[9] * 256); int dig_P3 = b1 [10] + (b1 [11] * 256); int dig_P4 = b1 [12] + (b1 [13] * 256); int dig_P5 = b1[14] + (b1[15] * 256); int dig_P6 = b1 [16] + (b1 [17] * 256); int dig_P7 = b1 [18] + (b1 [19] * 256); int dig_P8 = b1[20] + (b1[21] * 256); int dig_P9 = b1[22] + (b1[23] * 256); สำหรับ (int i = 0; i <7; i ++) { // เริ่ม I2C Transmission Wire.beginTransmission (Addr); // เลือก data register Wire.write((225+i)); // หยุด I2C Transmission Wire.endTransmission(); // ขอข้อมูล 1 ไบต์ Wire.requestFrom(Addr, 1); // อ่านข้อมูล 7 ไบต์ if(Wire.available() == 1) { b1 = Wire.read(); } } // แปลงข้อมูล // ค่าสัมประสิทธิ์ความชื้น int dig_H2 = b1[0] + (b1[1] * 256); int dig_H3 = b1 [2] & 0xFF; int dig_H4 = (b1[3] * 16) + (b1[4] & 0xF); int dig_H5 = (b1[4] / 16) + (b1[5] * 16); int dig_H6 = b1[6]; // เริ่ม I2C Transmission Wire.beginTransmission(Addr); // เลือกการลงทะเบียนข้อมูล Wire.write(161); // หยุด I2C Transmission Wire.endTransmission(); // ขอข้อมูล 1 ไบต์ Wire.requestFrom(Addr, 1); // อ่านข้อมูล 1 ไบต์ if(Wire.available() == 1) { dig_H1 = Wire.read(); } // เริ่ม I2C Transmission Wire.beginTransmission(Addr); // เลือกควบคุมความชื้นลงทะเบียน Wire.write(0xF2); // ความชื้นเหนืออัตราการสุ่มตัวอย่าง = 1 Wire.write(0x01); // หยุด I2C Transmission Wire.endTransmission(); // เริ่ม I2C Transmission Wire.beginTransmission(Addr); // เลือกการลงทะเบียนการวัดการควบคุม Wire.write(0xF4); // โหมดปกติ อุณหภูมิ และความดันเหนืออัตราการสุ่มตัวอย่าง = 1 Wire.write(0x27); // หยุด I2C Transmission Wire.endTransmission(); // เริ่ม I2C Transmission Wire.beginTransmission(Addr); // เลือก config register Wire.write(0xF5); // เวลาสแตนด์บาย = 1000ms Wire.write (0xA0); // หยุด I2C Transmission Wire.endTransmission(); สำหรับ (int i = 0; i <8; i ++) { // เริ่ม I2C Transmission Wire.beginTransmission (Addr); // เลือก data register Wire.write((247+i)); // หยุด I2C Transmission Wire.endTransmission(); // ขอข้อมูล 1 ไบต์ Wire.requestFrom(Addr, 1); // อ่านข้อมูล 8 ไบต์ if(Wire.available() == 1) { data = Wire.read(); } } // แปลงข้อมูลความดันและอุณหภูมิเป็นแบบยาว 19 บิต adc_p = (((long)(data[0] & 0xFF) * 65536) + ((long)(data[1] & 0xFF) * 256) + (ยาว)(ข้อมูล[2] & 0xF0)) / 16; adc_t แบบยาว = (((long)(data[3] & 0xFF) * 65536) + ((long)(data[4] & 0xFF) * 256) + (long)(data[5] & 0xF0)) / 16; // แปลงข้อมูลความชื้นแบบยาว adc_h = ((long)(data[6] & 0xFF) * 256 + (long)(data[7] & 0xFF)); // การคำนวณออฟเซ็ตอุณหภูมิ double var1 = (((double)adc_t) / 16384.0 - ((double)dig_T1) / 1024.0) * ((double)dig_T2); double var2 = ((((double)adc_t) / 131072.0 - ((double)dig_T1) / 8192.0) * (((double)adc_t)/131072.0 - ((double)dig_T1)/8192.0)) * ((สองเท่า) dig_T3); double t_fine = (ยาว)(var1 + var2); cTemp สองเท่า = (var1 + var2) / 5120.0; fTemp สองเท่า = cTemp * 1.8 + 32; // การคำนวณออฟเซ็ตแรงดัน var1 = ((สองเท่า)t_fine / 2.0) - 64000.0; var2 = var1 * var1 * ((สองเท่า)dig_P6) / 32768.0; var2 = var2 + var1 * ((สองเท่า)dig_P5) * 2.0; var2 = (var2 / 4.0) + (((สองเท่า)dig_P4) * 65536.0); var1 = (((สองเท่า) dig_P3) * var1 * var1 / 524288.0 + ((สองเท่า) dig_P2) * var1) / 524288.0; var1 = (1.0 + var1 / 32768.0) * ((สองเท่า) dig_P1); p สองเท่า = 1048576.0 - (สองเท่า)adc_p; p = (p - (var2 / 4096.0)) * 6250.0 / var1; var1 = ((สองเท่า) dig_P9) * p * p / 2147483648.0; var2 = p * ((สองเท่า) dig_P8) / 32768.0; แรงดันสองเท่า = (p + (var1 + var2 + ((สองเท่า)dig_P7)) / 16.0) / 100; // การคำนวณชดเชยความชื้น double var_H = (((double)t_fine) - 76800.0); var_H = (adc_h - (dig_H4 * 64.0 + dig_H5 / 16384.0 * var_H)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * var_H * (1.0 + dig_H3 / 67108864.0 * var_H))); ความชื้นสองเท่า = var_H * (1.0 - dig_H1 * var_H / 524288.0); ถ้า (ความชื้น> 100.0) { ความชื้น = 100.0; } อื่น ๆ ถ้า (ความชื้น < 0.0) { ความชื้น = 0.0; } // ส่งออกข้อมูลไปยังแดชบอร์ด Particle.publish("Temperature in Celsius: ", String(cTemp)); Particle.publish("อุณหภูมิในฟาเรนไฮต์: ", สตริง (fTemp)); Particle.publish("Pressure: ", String(pressure)); Particle.publish("ความชื้นสัมพัทธ์: ", สตริง(ความชื้น)); ล่าช้า (1000); }
ขั้นตอนที่ 5: การใช้งาน:
BME280 เซ็นเซอร์อุณหภูมิ ความดัน และความชื้นสัมพัทธ์มีการใช้งานในอุตสาหกรรมต่างๆ เช่น การตรวจสอบอุณหภูมิ การป้องกันความร้อนต่อพ่วงคอมพิวเตอร์ การตรวจสอบความดันในอุตสาหกรรม เรายังได้นำเซ็นเซอร์นี้ไปใช้กับการใช้งานสถานีตรวจอากาศ และระบบตรวจสอบเรือนกระจกด้วย
แอปพลิเคชันอื่นอาจรวมถึง:
- การรับรู้บริบทเช่น การตรวจจับผิวหนัง การตรวจจับการเปลี่ยนแปลงห้อง
- การตรวจสอบสมรรถภาพทางกาย / ความเป็นอยู่ที่ดี - คำเตือนเกี่ยวกับความแห้งหรืออุณหภูมิสูง
- การวัดปริมาตรและการไหลของอากาศ
- ระบบควบคุมอัตโนมัติภายในบ้าน
- ควบคุมความร้อน การระบายอากาศ เครื่องปรับอากาศ (HVAC)
- อินเทอร์เน็ตของสิ่งต่างๆ
- การเพิ่มประสิทธิภาพของ GPS (เช่น การปรับปรุงเวลาในการแก้ไข การคำนวณที่เสียไป การตรวจจับความชัน)
- ระบบนำทางในร่ม (เปลี่ยนการตรวจจับพื้น, การตรวจจับลิฟต์)
- การใช้งานการนำทางกลางแจ้ง สันทนาการ และกีฬา
- พยากรณ์อากาศ.
- ตัวบ่งชี้ความเร็วแนวตั้ง (ความเร็วขึ้น/จม)..
ขั้นตอนที่ 6: วิดีโอสอน
ดูวิดีโอบทแนะนำของเราเพื่อทำตามขั้นตอนทั้งหมดในการเชื่อมต่อและทำโปรเจ็กต์ให้เสร็จ
คอยติดตามการเชื่อมต่อและบล็อกการทำงานของเซ็นเซอร์อื่น ๆ