สารบัญ:

ไลบรารีสำหรับ BMP280 และ BME280: 7 ขั้นตอน
ไลบรารีสำหรับ BMP280 และ BME280: 7 ขั้นตอน

วีดีโอ: ไลบรารีสำหรับ BMP280 และ BME280: 7 ขั้นตอน

วีดีโอ: ไลบรารีสำหรับ BMP280 และ BME280: 7 ขั้นตอน
วีดีโอ: How to use BME280 sensor with Arduino (Humidity, Temperature, Barometric Pressure, and Altimeter) 2024, กรกฎาคม
Anonim
ห้องสมุดสำหรับ BMP280 และ BME280
ห้องสมุดสำหรับ BMP280 และ BME280
ห้องสมุดสำหรับ BMP280 และ BME280
ห้องสมุดสำหรับ BMP280 และ BME280
ห้องสมุดสำหรับ BMP280 และ BME280
ห้องสมุดสำหรับ BMP280 และ BME280

บทนำ

ฉันไม่ได้ตั้งใจจะเขียนห้องสมุดนี้ มัน "เกิดขึ้น" เป็นผลข้างเคียงของโครงการที่ฉันเริ่มซึ่งใช้ BMP280 โครงการนั้นยังไม่เสร็จ แต่ฉันคิดว่าห้องสมุดพร้อมที่จะแบ่งปันกับผู้อื่น ต่อมาฉันจำเป็นต้องใช้ BME280 ซึ่งเพิ่มการวัดความชื้นให้กับความดันและความสามารถด้านอุณหภูมิของ BMP280 BME280 "เข้ากันได้กับรุ่นเก่า" กับ BMP280 นั่นคือการลงทะเบียนทั้งหมดและขั้นตอนที่จำเป็นในการอ่านความดันและอุณหภูมิจาก BME280 จะเหมือนกับที่ใช้ใน BMP280 มีการลงทะเบียนและขั้นตอนเพิ่มเติมที่จำเป็นในการอ่านค่าความชื้น ใช้ได้กับ BME280 เท่านั้น สิ่งนี้ทำให้เกิดคำถาม หนึ่งไลบรารีสำหรับทั้งสอง หรือสองไลบรารีที่แยกจากกัน ฮาร์ดแวร์สำหรับอุปกรณ์ทั้งสองประเภทสามารถใช้แทนกันได้อย่างสมบูรณ์ แม้แต่โมดูลจำนวนมากที่จำหน่าย (เช่นบน Ebay และ AliExpress) ก็มีป้ายกำกับว่า BME/P280 หากต้องการทราบว่าเป็นประเภทใด คุณต้องดูที่การเขียน (ตัวย่อ) บนตัวเซ็นเซอร์เอง หรือทดสอบไบต์ ID ของอุปกรณ์ ฉันตัดสินใจที่จะไปห้องสมุดเดียว ดูเหมือนว่าจะได้ผลดี

คำติชม โดยเฉพาะข้อเสนอแนะสำหรับการปรับปรุง จะได้รับการชื่นชม

คุณสมบัติและความสามารถของห้องสมุด

ไลบรารีเป็นซอฟต์แวร์ชิ้นหนึ่งที่มี Application Programming Interface (API) สำหรับโปรแกรมเมอร์เพื่อใช้ความสามารถของอุปกรณ์ โดยไม่จำเป็นต้องจัดการกับรายละเอียดที่ละเอียดทั้งหมด เป็นที่พึงปรารถนา API ควรจะง่ายสำหรับผู้เริ่มต้นโดยมีข้อกำหนดง่ายๆ ในการเริ่มต้น ในขณะเดียวกันก็ให้การใช้ประโยชน์จากความสามารถของอุปกรณ์อย่างเต็มที่ ห้องสมุดควรปฏิบัติตามหลักเกณฑ์เฉพาะใดๆ จากผู้ผลิตอุปกรณ์ ตลอดจนแนวปฏิบัติที่ดีของซอฟต์แวร์ทั่วไป ฉันพยายามที่จะบรรลุสิ่งเหล่านี้ทั้งหมด เมื่อเริ่มต้นด้วย BMP280 ฉันพบไลบรารี่ที่แตกต่างกัน 3 แห่ง: Adafruit_BMP280; Seeed_BMP280; และอีกอันหนึ่งเรียกว่า BMP280 จากผู้ผลิตอุปกรณ์ ทั้ง Adafruit และ Seeed ไม่ได้ให้ความสามารถเพิ่มเติม แม้ว่าจะทำงานได้ดีและใช้งานง่ายสำหรับแอปพลิเคชันพื้นฐาน ฉันไม่สามารถคิดได้ว่าจะใช้อุปกรณ์ที่ผลิตโดยผู้ผลิตอุปกรณ์ (Bosch Sensortec) ได้อย่างไร นี่อาจเป็นข้อบกพร่องของฉันมากกว่าของพวกเขา อย่างไรก็ตาม ไลบรารี่ซับซ้อนกว่าอีกสองไลบรารีมาก ฉันไม่พบคำแนะนำหรือตัวอย่างการใช้งานใดๆ (ในเวลาต่อมา ฉันพบตัวอย่างอยู่ในไฟล์ "bmp280_support.c" อย่างไรก็ตาม สิ่งเหล่านี้ไม่เป็นประโยชน์กับฉันเป็นพิเศษ)

จากปัจจัยเหล่านี้ ฉันจึงตัดสินใจเขียนไลบรารีของตัวเองสำหรับ BMP280

เมื่อดูสถานการณ์ห้องสมุดสำหรับ BME280 ฉันพบห้องสมุดแยกต่างหาก Adafruit_BME280, Seed_BME280 และอีกห้องสมุดหนึ่ง BME280_MOD-1022 ที่เขียนโดย Embedded Adventures ไม่มีฟังก์ชันใดที่รวมฟังก์ชันสำหรับ BMP280 ในไลบรารีที่สามารถใช้ BME280 ได้ ไม่มีอุปกรณ์ใดที่สนับสนุนความสามารถของอุปกรณ์ในการจัดเก็บข้อมูลสองสามบิตอย่างชัดเจนในขณะที่อุปกรณ์และไมโครโปรเซสเซอร์ที่ควบคุมอยู่ในโหมดสลีป (ความสามารถนี้ปรากฏชัดในแผ่นข้อมูลและรองรับในไลบรารีที่ฉันเขียนและอธิบายไว้ที่นี่)

ไลบรารีที่รวมกันควรรองรับความสามารถทั้งหมดของ BME280 แต่เมื่อใช้กับ BMP280 ไม่ควรกำหนดโอเวอร์เฮดจากฟังก์ชันที่ไม่ได้ใช้ ประโยชน์ของไลบรารีแบบรวม ได้แก่ ไฟล์ไลบรารีที่ต้องจัดการน้อยลง อุปกรณ์ต่างๆ ที่ผสมผสานกันในโปรเจ็กต์เดียวกันได้ง่าย และการเปลี่ยนแปลงที่ง่ายขึ้นสำหรับการบำรุงรักษาหรืออัปเกรดซึ่งต้องทำในที่เดียวแทนที่จะเป็นสองแห่ง สิ่งเหล่านี้อาจค่อนข้างน้อย แม้จะไม่มีนัยสำคัญ แต่ …

ความสามารถของอุปกรณ์

BMP280 และ BME280 เป็นอุปกรณ์ยึดพื้นผิวที่มีขนาดประมาณ 5 มม. และสูง 1 มม. มีแผ่นอินเตอร์เฟส 8 แผ่น รวมถึงแผ่นจ่ายไฟแยก 2 แผ่นและแผ่นกราวด์สองแผ่น มีจำหน่ายบนอีเบย์เป็นโมดูลโดยนำพิน 4 หรือ 6 อันออกมา โมดูล 4 พินมีที่อยู่ I2C คงที่และไม่สามารถกำหนดค่าให้ใช้โปรโตคอล SPI ได้

โมดูล 6 พินหรืออุปกรณ์เปล่าสามารถใช้กับโปรโตคอล I2C หรือ SPI ในโหมด I2C สามารถมีที่อยู่ได้สองแห่ง โดยเชื่อมต่อพิน SDO กับกราวด์ (สำหรับที่อยู่ฐาน = 0x76) หรือกับ Vdd (สำหรับที่อยู่ฐาน +1 = 0x77) ในโหมด SPI มีการจัดเรียงตามปกติของ 1 นาฬิกา 2 ข้อมูล (หนึ่งรายการสำหรับแต่ละทิศทาง) และพินการเลือกอุปกรณ์ (CS)

ห้องสมุดที่ฉันเขียนและอธิบายที่นี่รองรับเฉพาะ I2C เท่านั้น ไลบรารี Adafruit_BMP280 และ BME_MOD-1022 รองรับทั้ง i2C และ SPI

สามารถดาวน์โหลดห้องสมุดได้ที่นี่:

github.com/farmerkeith/BMP280-library

ขั้นตอนที่ 1: การตั้งค่าฮาร์ดแวร์

การตั้งค่าฮาร์ดแวร์
การตั้งค่าฮาร์ดแวร์

ก่อนที่ไลบรารีจะมีประโยชน์ จำเป็นต้องเชื่อมต่อไมโครคอนโทรลเลอร์กับ BMP280 (หรือกับสองตัวนี้หากต้องการ)

ฉันใช้ WeMos D1 mini pro ดังนั้นฉันจะแสดงการเชื่อมต่อของมัน ไมโครคอนโทรลเลอร์อื่นๆ จะคล้ายกัน คุณเพียงแค่ต้องเชื่อมต่อพิน SDA และ SCL อย่างถูกต้อง

ในกรณีของ WeMos D1 mini pro การเชื่อมต่อมีดังนี้:

ฟังก์ชัน WeMos พิน BMP280 พิน Notes

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominal 3.3V Ground GND การควบคุมที่อยู่ SDO Ground หรือ Vdd I2C เลือก CSB Vdd (GND เลือก SPI)

โปรดทราบว่าพิน SDO บนโมดูล MP280 บางรุ่นจะมีป้ายกำกับว่า SDD และพิน Vdd อาจมีป้ายกำกับว่า VCC หมายเหตุ: เส้น SDA และ SCL ควรมีตัวต้านทานแบบดึงขึ้นระหว่างเส้นกับพิน Vin โดยปกติค่า 4.7K ควรจะใช้ได้ โมดูล BMP280 และ BME280 บางตัวมีตัวต้านทานแบบดึงขึ้น 10K รวมอยู่ในโมดูล (ซึ่งไม่ใช่แนวปฏิบัติที่ดี เนื่องจากการวางอุปกรณ์หลายตัวบนบัส I2C อาจโหลดมากเกินไป) อย่างไรก็ตาม การใช้โมดูล BME/P280 2 โมดูลแต่ละโมดูลที่มีตัวต้านทาน 10K ไม่ควรเป็นปัญหาในทางปฏิบัติ ตราบใดที่มีอุปกรณ์อื่นๆ ไม่มากเกินไปบนบัสเดียวกันและมีตัวต้านทานแบบดึงขึ้นด้วย

เมื่อคุณเชื่อมต่อฮาร์ดแวร์แล้ว คุณสามารถตรวจสอบได้อย่างง่ายดายว่าอุปกรณ์ของคุณเป็น BMP280 หรือ BME280 โดยการเรียกใช้ภาพร่าง I2CScan_ID ซึ่งคุณสามารถหาได้ที่นี่:

คุณสามารถตรวจสอบได้ว่าคุณมี BMP280 หรือ BME280 หรือไม่โดยดูที่ตัวอุปกรณ์ ฉันพบว่าจำเป็นต้องใช้ไมโครสโคปแบบดิจิทัลในการทำเช่นนี้ แต่ถ้าสายตาของคุณดีมาก คุณก็สามารถทำได้โดยไม่ต้องใช้เครื่องช่วยใดๆ มีการพิมพ์สองบรรทัดบนตัวเครื่อง กุญแจสำคัญคืออักษรตัวแรกในบรรทัดที่สอง ซึ่งในกรณีของอุปกรณ์ BMP280 จะเป็นตัว "K" และในกรณีของอุปกรณ์ BME280 จะเป็นตัว "U"

ขั้นตอนที่ 2: APIs ให้บริการโดย Library

APIs ให้บริการโดย Library
APIs ให้บริการโดย Library
APIs ให้บริการโดย Library
APIs ให้บริการโดย Library

รวมถึงห้องสมุดในแบบร่าง

ห้องสมุดรวมอยู่ในภาพร่างในวิธีมาตรฐานโดยใช้คำสั่ง

#รวม "farmerkeith_BMP280.h"

คำสั่งนี้จะต้องรวมอยู่ในส่วนต้นของร่างก่อนที่จะเริ่มฟังก์ชัน setup()

การสร้างวัตถุซอฟต์แวร์ BME หรือ BMP

มี 3 ระดับสำหรับการสร้างวัตถุซอฟต์แวร์ BMP280 ง่ายสุดก็แค่

bme280 ชื่อวัตถุ; หรือ bmp280 objectName;

ตัวอย่างเช่น BMP280 bmp0;

สิ่งนี้สร้างอ็อบเจ็กต์ซอฟต์แวร์ที่มีที่อยู่เริ่มต้นเป็น 0x76 (เช่น สำหรับ SDO ที่เชื่อมต่อกับกราวด์)

ระดับถัดไปสำหรับการสร้างวัตถุซอฟต์แวร์ BME280 หรือ BMP280 มีพารามิเตอร์เป็น 0 หรือ 1 ดังนี้:

bme280 objectNameA(0);

bmp280 objectNameB(1);

พารามิเตอร์ (0 หรือ 1) ถูกเพิ่มไปยังที่อยู่ฐาน I2C เพื่อให้สามารถใช้อุปกรณ์ BME280 หรือ BMP280 สองเครื่องบนบัส I2C เดียวกันได้ (รวมถึงอย่างใดอย่างหนึ่ง)

ระดับที่สามสำหรับการสร้างวัตถุซอฟต์แวร์ BME หรือ BMP280 มีพารามิเตอร์สองตัว พารามิเตอร์แรก ซึ่งก็คือ 0 หรือ 1 นั้นมีไว้สำหรับที่อยู่ เช่นเดียวกับกรณีก่อนหน้า พารามิเตอร์ที่สองควบคุมการพิมพ์ดีบัก หากตั้งค่าเป็น 1 แต่ละธุรกรรมที่มีอ็อบเจ็กต์ซอฟต์แวร์จะส่งผลให้เกิดเอาต์พุต Serial.print ซึ่งช่วยให้โปรแกรมเมอร์สามารถดูรายละเอียดของธุรกรรมได้ ตัวอย่างเช่น:

bmp280 objectNameB(1, 1);

หากพารามิเตอร์การพิมพ์ดีบักถูกตั้งค่าเป็น 0 อ็อบเจ็กต์ซอฟต์แวร์จะเปลี่ยนกลับเป็นการทำงานปกติ (ไม่มีการพิมพ์)

คำสั่งหรือคำสั่งนี้ต้องรวมไว้หลัง #include และก่อนฟังก์ชัน setup()

การเริ่มต้นวัตถุซอฟต์แวร์ BME หรือ BMP

ก่อนใช้งาน จำเป็นต้องอ่านพารามิเตอร์การปรับเทียบจากอุปกรณ์ และกำหนดค่าสำหรับโหมดการวัด การสุ่มตัวอย่างเกิน และการตั้งค่าตัวกรองที่เหมาะสม

สำหรับการเริ่มต้นวัตถุประสงค์ทั่วไปอย่างง่าย คำสั่งคือ:

objectName.begin();

Begin() เวอร์ชันนี้อ่านพารามิเตอร์การสอบเทียบจากอุปกรณ์และตั้งค่า osrs_t=7 (การวัดอุณหภูมิ 16 ครั้ง), osrs_p=7 (การวัดความดัน 16 ครั้ง), โหมด=3 (ต่อเนื่อง, ปกติ), t_sb=0 (0.5 ms sleep ระหว่าง ชุดการวัด), filter=0 (K=1, ดังนั้นไม่มีการกรอง) และ spiw_en=0 (ปิดใช้งาน SPI ดังนั้นให้ใช้ I2C) ในกรณีของ BME280 มีพารามิเตอร์พิเศษ osrs_h=7 สำหรับการวัดความชื้น 16 ครั้ง

มีรุ่นอื่นของ begin() ที่ใช้พารามิเตอร์ทั้งหก (หรือ 7) ตัว เทียบเท่ากับข้อความข้างต้นคือ

objectName.begin(7, 7, 3, 0, 0, 0); // osrs_t, osrs_p, โหมด, t_sb, ตัวกรอง, spiw_en

หรือ objectName.begin(7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, โหมด, t_sb, ตัวกรอง, spiw_en, osrs_h

รายการรหัสทั้งหมดและความหมายอยู่ในแผ่นข้อมูล BME280 และ BMP280 และในความคิดเห็นในไฟล์.cpp ในไลบรารี

การวัดอุณหภูมิและความดันอย่างง่าย

วิธีการวัดอุณหภูมิที่ง่ายที่สุดคือ

อุณหภูมิสองเท่า = objectName.readTemperature (); //วัดอุณหภูมิ

ในการรับการวัดแรงดันวิธีที่ง่ายที่สุดคือ

ความดันสองเท่า = objectName.readPressure (); // วัดความดัน

วิธีการวัดความชื้นที่ง่ายที่สุดคือ

ความชื้นสองเท่า = objectName.readHumidity (); // วัดความชื้น (BME280 เท่านั้น)

เพื่อให้ได้ทั้งอุณหภูมิและความดัน สองข้อความข้างต้นสามารถใช้ทีละคำได้ แต่มีอีกทางเลือกหนึ่งคือ:

อุณหภูมิสองเท่า

ความดันสองเท่า = objectName.readPressure (อุณหภูมิ); // วัดความดันและอุณหภูมิ

คำสั่งนี้อ่านข้อมูลจากอุปกรณ์ BME280 หรือ BMP280 เพียงครั้งเดียว และส่งคืนทั้งอุณหภูมิและความดัน นี่เป็นการใช้บัส I2C อย่างมีประสิทธิภาพมากกว่าเล็กน้อย และทำให้แน่ใจได้ว่าค่าที่อ่านได้ทั้งสองค่านั้นสอดคล้องกับรอบการวัดเดียวกัน

สำหรับ BME 280 คำสั่งรวมที่ได้รับทั้งสามค่า (ความชื้น อุณหภูมิ และความดัน) คือ:

อุณหภูมิสองเท่า, ความดัน; ความชื้นสองเท่า = objectName.readHumidity (อุณหภูมิ, ความดัน); // วัดความชื้น ความดัน และอุณหภูมิ

คำสั่งนี้อ่านข้อมูลจากอุปกรณ์ BMP280 เพียงครั้งเดียว และคืนค่าทั้งสามค่า นี่เป็นการใช้บัส I2C อย่างมีประสิทธิภาพมากกว่าเล็กน้อย และทำให้แน่ใจได้ว่าค่าที่อ่านได้ทั้งสามค่านั้นสอดคล้องกับรอบการวัดเดียวกัน โปรดทราบว่าชื่อของตัวแปรสามารถเปลี่ยนเป็นอะไรก็ได้ที่ผู้ใช้ชอบ แต่ลำดับของตัวแปรนั้นคงที่ อุณหภูมิต้องมาก่อน และความกดดันตามมาเป็นอันดับสอง

กรณีการใช้งานเหล่านี้ครอบคลุมในตัวอย่างสเก็ตช์ที่มาพร้อมกับไลบรารี ได้แก่ basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino และ basicHumidityAndTemperatureAndPressure.ino

การวัดอุณหภูมิและความดันที่ซับซ้อนยิ่งขึ้น

แม้ว่าชุดข้อความข้างต้นจะใช้งานได้โดยไม่มีปัญหา แต่ก็มีประเด็นสองสามข้อ:

  1. อุปกรณ์ทำงานอย่างต่อเนื่อง ดังนั้นจึงใช้พลังงานในระดับสูงสุด หากพลังงานมาจากแบตเตอรี่อาจจำเป็นต้องลดสิ่งนี้ลง
  2. เนื่องจากการใช้พลังงาน อุปกรณ์จะร้อนขึ้น ดังนั้นอุณหภูมิที่วัดได้จะสูงกว่าอุณหภูมิแวดล้อม ฉันจะอธิบายเพิ่มเติมในขั้นตอนต่อไป

ผลลัพธ์ที่ใช้พลังงานน้อยลงและให้อุณหภูมิที่ใกล้เคียงกับสภาพแวดล้อมมากขึ้น สามารถรับได้โดยใช้ start() กับพารามิเตอร์ที่ทำให้เข้าสู่โหมดสลีป (เช่น mode=0) ตัวอย่างเช่น:

objectName.begin(1, 1, 0, 0, 0, 0[, 1]); // osrs_t, osrs_p, โหมด, t_sb, ตัวกรอง, spiw_en [, osrs_h]

จากนั้นเมื่อต้องการวัด ให้ปลุกอุปกรณ์ด้วยคำสั่งการกำหนดค่าเพื่อลงทะเบียน F2 (หากจำเป็น) และ F4 ที่ตั้งค่าที่เหมาะสมของ osrs_h, osrs_t และ osrs_p plus mode=1 (โหมดถ่ายภาพเดี่ยว) ตัวอย่างเช่น:

[objectName.updateF2Control(1);] // osrs_h - ไม่จำเป็นสำหรับ BMP280

// และไม่จำเป็นสำหรับ BME280 หากไม่มีการเปลี่ยนแปลงจำนวนการวัด // จากค่าที่ระบุใน begin() objectName.updateF4Control(1, 1, 1); // osrs_t, osrs_p, โหมด

เมื่อปลุกอุปกรณ์ขึ้นมา อุปกรณ์จะเริ่มวัด แต่ผลลัพธ์จะไม่สามารถใช้ได้ในบางมิลลิวินาที - อย่างน้อย 4 ms อาจสูงถึง 70 ms หรือมากกว่า ขึ้นอยู่กับจำนวนการวัดที่ระบุ หากส่งคำสั่งอ่านทันที อุปกรณ์จะส่งกลับค่าจากการวัดครั้งก่อน ซึ่งอาจเป็นที่ยอมรับได้ในบางแอปพลิเคชัน แต่ในกรณีส่วนใหญ่ อาจเป็นการดีกว่าที่จะรอจนกว่าจะมีการวัดใหม่

ความล่าช้านี้สามารถทำได้หลายวิธี

  1. รอเวลาที่กำหนดเพื่อให้ครอบคลุมความล่าช้าที่คาดหวังนานที่สุด
  2. รอระยะเวลาที่คำนวณจากเวลาในการวัดสูงสุดต่อการวัด (เช่น 2.3 มิลลิวินาที) คูณด้วยจำนวนการวัด บวกค่าโสหุ้ย บวกด้วยมาร์จิ้น
  3. รอระยะเวลาที่สั้นกว่าที่คำนวณตามข้างต้น แต่ใช้เวลาวัดเล็กน้อย (เช่น 2 มิลลิวินาที) บวกค่าโสหุ้ย จากนั้นเริ่มตรวจสอบบิต "ฉันกำลังวัด" ในการลงทะเบียนสถานะ เมื่อบิตสถานะอ่านค่า 0 (เช่น ไม่ได้วัด) ให้อ่านค่าอุณหภูมิและความดัน
  4. เริ่มตรวจสอบสถานะการลงทะเบียนทันที และรับค่าอุณหภูมิและความดันที่อ่านได้เมื่อบิตสถานะอ่านค่า 0

ฉันจะแสดงตัวอย่างวิธีหนึ่งในการทำสิ่งนี้ในภายหลัง

การดำเนินการลงทะเบียนการกำหนดค่า

ในการทำให้สิ่งนี้เกิดขึ้น เราจำเป็นต้องมีเครื่องมือหลายอย่างที่ฉันยังไม่ได้แนะนำ พวกเขาคือ:

ไบต์ readRegister(reg)

เป็นโมฆะ updateRegister (reg, ค่า)

แต่ละคำสั่งเหล่านี้มีคำสั่งที่ได้รับมาหลายคำสั่งในไลบรารี ซึ่งทำให้ซอฟต์แวร์สำหรับการดำเนินการเฉพาะง่ายขึ้นเล็กน้อย

ตัวอย่าง powerSaverPressureAndTemperature.ino ใช้วิธีที่ 3 บรรทัดของรหัสที่ทำการตรวจสอบซ้ำคือ

ในขณะที่ (bmp0.readRegister(0xF3)>>3); // วนซ้ำจนถึง F3bit 3 ==0

โปรดทราบว่าแบบร่างนี้มีไว้สำหรับไมโครคอนโทรลเลอร์ ESP8266 ฉันใช้ WeMos D1 mini pro ภาพร่างจะไม่ทำงานกับไมโครคอนโทรลเลอร์ Atmega ซึ่งมีคำแนะนำในการนอนหลับต่างกัน ภาพสเก็ตช์นี้ใช้คำสั่งอื่นๆ อีกหลายคำสั่ง ดังนั้นผมจะแนะนำคำสั่งทั้งหมดก่อนที่จะอธิบายภาพสเก็ตช์นั้นในรายละเอียดเพิ่มเติม

เมื่อไมโครคอนโทรลเลอร์กำลังนอนหลับควบคู่ไปกับเซ็นเซอร์ BMP280 การกำหนดค่าเซ็นเซอร์สำหรับการวัดที่ต้องการสามารถทำได้ในคำสั่ง start() โดยใช้พารามิเตอร์ 6 ตัว อย่างไรก็ตาม หากไมโครคอนโทรลเลอร์ไม่ได้หลับ แต่เซ็นเซอร์อยู่ เมื่อทำการวัด จะต้องปลุกเซ็นเซอร์และบอกการกำหนดค่าการวัด สามารถทำได้โดยตรงกับ

updateRegister(reg, ค่า)

แต่ง่ายกว่าเล็กน้อยด้วยคำสั่งสามคำสั่งต่อไปนี้:

updateF2Control(osrs_h); // BME280 เท่านั้น

updateF4Control(osrs_t, osrs_p, โหมด); updateF5Config(t_sb, ตัวกรอง, spi3W_en);

หลังจากการวัดเสร็จสิ้น หากโหมดที่ใช้เป็นแบบ Single shot (โหมดบังคับ) อุปกรณ์จะกลับสู่โหมดสลีปโดยอัตโนมัติ อย่างไรก็ตาม หากชุดการวัดเกี่ยวข้องกับการวัดหลายครั้งโดยใช้โหมดต่อเนื่อง (ปกติ) BMP280 จะต้องกลับสู่โหมดสลีป ซึ่งสามารถทำได้ด้วยคำสั่งใดคำสั่งหนึ่งจากสองคำสั่งต่อไปนี้:

อัปเดตF4Control16xSleep();

updateF4ControlSleep(ค่า);

ทั้งสองตั้งค่าบิตโหมดเป็น 00 (เช่นโหมดสลีป) อย่างไรก็ตามชุดแรกตั้งค่า osrs_t และ osrs_p เป็น 111 (เช่นการวัด 16 รายการ) ในขณะที่ชุดที่สองเก็บ 6 บิตที่ต่ำจาก "ค่า" เป็นบิต 7:2 ของการลงทะเบียน 0xF4

ในทำนองเดียวกัน คำสั่งต่อไปนี้จะเก็บ "ค่า" หกบิตที่ต่ำลงในบิต 7:2 ของการลงทะเบียน 0xF5

updateF5ConfigSleep(ค่า);

การใช้คำสั่งหลังเหล่านี้ช่วยให้สามารถจัดเก็บข้อมูล 12 บิตในการลงทะเบียน BMP280 F4 และ F5 อย่างน้อยในกรณีของ ESP8266 เมื่อไมโครคอนโทรลเลอร์ตื่นขึ้นหลังจากช่วงเวลาพักเครื่อง ไมโครคอนโทรลเลอร์จะเริ่มทำงานที่จุดเริ่มต้นของร่างภาพโดยไม่ทราบสถานะก่อนคำสั่งสลีป ในการจัดเก็บความรู้เกี่ยวกับสถานะก่อนคำสั่งสลีป สามารถจัดเก็บข้อมูลในหน่วยความจำแฟลช โดยใช้ฟังก์ชัน EEPROM หรือโดยการเขียนไฟล์โดยใช้ SPIFFS อย่างไรก็ตาม หน่วยความจำแฟลชมีข้อ จำกัด ของจำนวนรอบการเขียนที่ 10, 000 ถึง 100, 000 ซึ่งหมายความว่าหากไมโครคอนโทรลเลอร์เข้าสู่รอบการนอนหลับและตื่นทุกๆสองสามวินาทีอาจเกินการเขียนหน่วยความจำที่อนุญาต จำกัดในไม่กี่เดือน การจัดเก็บข้อมูลสองสามบิตใน BMP280 นั้นไม่มีข้อจำกัดดังกล่าว

ข้อมูลที่เก็บไว้ในรีจิสเตอร์ F4 และ F5 สามารถกู้คืนได้เมื่อไมโครคอนโทรลเลอร์ตื่นขึ้นโดยใช้คำสั่ง

readF4Sleep();

readF5Sleep();

ฟังก์ชันเหล่านี้อ่านรีจิสเตอร์ที่เกี่ยวข้อง เลื่อนเนื้อหาเพื่อลบ 2 LSB และคืนค่า 6 บิตที่เหลือ ฟังก์ชันเหล่านี้ใช้ในตัวอย่างร่าง powerSaverPressureAndTemperatureESP.ino ดังต่อไปนี้:

// อ่านค่าของ EventCounter กลับจาก bmp0

ไบต์ bmp0F4value=bmp0.readF4Sleep(); // 0 ถึง 63 ไบต์ bmp0F5value= bmp0.readF5Sleep(); // 0 ถึง 63 eventCounter= bmp0F5value*64+bmp0F4value; // 0 ถึง 4095

ฟังก์ชันเหล่านี้อ่านรีจิสเตอร์ที่เกี่ยวข้อง เลื่อนเนื้อหาเพื่อลบ 2 LSB และคืนค่า 6 บิตที่เหลือ ฟังก์ชันเหล่านี้ใช้ในตัวอย่างร่าง powerSaverPressureAndTemperature.ino ดังนี้:

// อ่านค่าของ EventCounter กลับจาก bmp1

ไบต์ bmp1F4value=bmp1.readF4Sleep(); // 0 ถึง 63 ไบต์ bmp1F5value= bmp1.readF5Sleep(); // 0 ถึง 63 eventCounter= bmp1F5value*64+bmp1F4value; // 0 ถึง 4095

ฟังก์ชั่นอุณหภูมิและความดันดิบ

ฟังก์ชัน readTemperature, readPressure และ readHumidity พื้นฐานมีส่วนประกอบสองส่วน ขั้นแรก จะได้รับค่าอุณหภูมิและความดันแบบ raw 20 บิตจาก BME/P280 หรือค่าความชื้นดิบ 16 บิตได้มาจาก BME280 จากนั้นอัลกอริธึมการชดเชยจะใช้เพื่อสร้างค่าเอาต์พุตในหน่วยองศาเซลเซียส hPa หรือ %RH

ไลบรารีมีฟังก์ชันแยกต่างหากสำหรับส่วนประกอบเหล่านี้ เพื่อให้สามารถรับข้อมูลอุณหภูมิ ความดัน และความชื้นดิบ และอาจจัดการด้วยวิธีใดวิธีหนึ่ง มีอัลกอริธึมในการหาอุณหภูมิ ความดัน และความชื้นจากค่าดิบเหล่านี้ด้วย ในไลบรารีอัลกอริธึมเหล่านี้ถูกใช้งานโดยใช้เลขทศนิยมสองเท่า ทำงานได้ดีบน ESP8266 ซึ่งเป็นโปรเซสเซอร์ 32 บิตและใช้ 64 บิตสำหรับตัวแปรโฟลต "สองเท่า" การทำให้ฟังก์ชันเหล่านี้สามารถเข้าถึงได้อาจเป็นประโยชน์สำหรับการประเมินและอาจเปลี่ยนแปลงการคำนวณสำหรับแพลตฟอร์มอื่นๆ

ฟังก์ชั่นเหล่านี้คือ:

readRawPressure (อุณหภูมิดิบ); // อ่านข้อมูลแรงดันดิบและอุณหภูมิจาก BME/P280readRawHumidity (rawTemperature, rawPressure); // อ่านข้อมูลความชื้น อุณหภูมิ และความดันดิบจาก BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (ความชื้นดิบ, t_fine)

อาร์กิวเมนต์ "t-fine" ของฟังก์ชันเหล่านี้มีค่าพอที่จะอธิบาย อัลกอริธึมการชดเชยความดันและความชื้นมีทั้งส่วนประกอบที่ขึ้นอยู่กับอุณหภูมิ ซึ่งทำได้ผ่านตัวแปร t_fine ฟังก์ชัน calcTemperature เขียนค่าเป็น t_fine ตามลอจิกอัลกอริธึมการชดเชยอุณหภูมิ ซึ่งจากนั้นใช้เป็นอินพุตใน calcPressure และ calcHumidity

ตัวอย่างของการใช้ฟังก์ชันเหล่านี้สามารถพบได้ในตัวอย่างภาพร่าง rawPressureAndTemperature.ino และในโค้ดสำหรับฟังก์ชัน readHumidity() ในไฟล์.cpp ของไลบรารี

ระดับความสูงและความดันระดับน้ำทะเล

มีความสัมพันธ์ที่ทราบกันดีระหว่างความกดอากาศและระดับความสูง สภาพอากาศยังมีอิทธิพลต่อแรงกดดัน เมื่อองค์กรสภาพอากาศเผยแพร่ข้อมูลความกดอากาศ พวกเขามักจะปรับข้อมูลสำหรับระดับความสูง ดังนั้น "แผนภูมิสรุป" จึงแสดงไอโซบาร์ (เส้นความกดอากาศคงที่) ที่ได้มาตรฐานถึงระดับน้ำทะเลปานกลาง จริงๆ แล้ว มี 3 ค่าในความสัมพันธ์นี้ และการรู้ว่าสองค่านั้นทำให้เกิดค่าที่สาม 3 ค่าคือ:

  • ความสูงเหนือระดับน้ำทะเล
  • ความกดอากาศจริงที่ระดับความสูงนั้น
  • ความกดอากาศเทียบเท่าที่ระดับน้ำทะเล (เคร่งครัดมากขึ้น ระดับน้ำทะเลปานกลาง เพราะระดับน้ำทะเลในทันทีเปลี่ยนแปลงตลอดเวลา)

ไลบรารีนี้มีฟังก์ชันสองอย่างสำหรับความสัมพันธ์นี้ ดังนี้:

calcAltitude (ความดัน, seaLevelhPa);

calcNormalisedPressure (ความดัน ความสูง);

นอกจากนี้ยังมีเวอร์ชันแบบง่าย ซึ่งถือว่าความดันระดับน้ำทะเลมาตรฐานที่ 1013.15 hPa

calcAltitude (ความดัน); // มาตรฐาน seaLevelPressure ถือว่า

ขั้นตอนที่ 3: รายละเอียดอุปกรณ์ BMP280

รายละเอียดอุปกรณ์ BMP280
รายละเอียดอุปกรณ์ BMP280

ความสามารถของฮาร์ดแวร์

BMP280 มีข้อมูลการกำหนดค่า 2 ไบต์ (ที่อยู่ที่ลงทะเบียน 0xF4 และ 0xF5) ซึ่งใช้เพื่อควบคุมตัวเลือกการวัดและเอาต์พุตข้อมูลหลายรายการ นอกจากนี้ยังให้ข้อมูลสถานะ 2 บิตและพารามิเตอร์การสอบเทียบ 24 ไบต์ซึ่งใช้ในการแปลงค่าอุณหภูมิและความดันดิบเป็นหน่วยอุณหภูมิและความดันทั่วไป BME280 มีข้อมูลเพิ่มเติมดังนี้:

  • ข้อมูลการกำหนดค่าเพิ่มเติม 1 ไบต์ที่ที่อยู่ลงทะเบียน 0xF2 ใช้เพื่อควบคุมการวัดความชื้นหลายรายการ
  • 8 ไบต์พิเศษของพารามิเตอร์การสอบเทียบที่ใช้ในการแปลงค่าความชื้นดิบเป็นเปอร์เซ็นต์ความชื้นสัมพัทธ์

อุณหภูมิ ความดัน และการลงทะเบียนสถานะสำหรับ BME280 จะเหมือนกับ BMP280 โดยมีข้อยกเว้นเล็กน้อยดังนี้:

  • บิต "ID" ของ BME280 ถูกตั้งค่าเป็น 0x60 ดังนั้นจึงสามารถแยกแยะได้จาก BMP280 ซึ่งอาจเป็น 0x56, 0x57 หรือ 0x58
  • การควบคุมเวลาพักเครื่อง (t_sb) มีการเปลี่ยนแปลงเพื่อให้ BMP280 เป็นเวลานานสองครั้ง (2000 ms และ 4000 ms) ถูกแทนที่ใน BME280 ด้วยเวลาสั้น ๆ 10 ms และ 20 ms เวลาพักเครื่องสูงสุดใน BME280 คือ 1,000 ms
  • ใน BME280 ค่าดิบของอุณหภูมิและความดันจะเป็น 20 บิตเสมอหากใช้การกรอง การใช้ค่า 16 ถึง 19 บิตจำกัดเฉพาะกรณีที่ไม่มีการกรอง (เช่น filter=0)

อุณหภูมิและความดันเป็นค่า 20 บิตแต่ละค่า ซึ่งจำเป็นต้องแปลงเป็นอุณหภูมิและความดันทั่วไปโดยใช้อัลกอริธึมที่ค่อนข้างซับซ้อนโดยใช้พารามิเตอร์การสอบเทียบ 3 16 บิตสำหรับอุณหภูมิ และพารามิเตอร์การสอบเทียบ 9 16 บิต บวกกับอุณหภูมิสำหรับความดัน ความละเอียดของการวัดอุณหภูมิคือ 0.0003 องศาเซลเซียสสำหรับการเปลี่ยนแปลงบิตที่มีนัยสำคัญน้อยที่สุด (การอ่านข้อมูล 20 บิต) เพิ่มขึ้นเป็น 0.0046 องศาเซลเซียสหากใช้การอ่านข้อมูลแบบ 16 บิต

ความชื้นเป็นค่า 16 บิตซึ่งจำเป็นต้องแปลงเป็นความชื้นสัมพัทธ์ผ่านอัลกอริธึมที่ซับซ้อนอื่นโดยใช้พารามิเตอร์การสอบเทียบ 6 ตัวซึ่งผสมกันระหว่าง 8, 12 และ 16 บิต

แผ่นข้อมูลแสดงความแม่นยำสัมบูรณ์ของการอ่านค่าอุณหภูมิที่ +-0.5 C ที่ 25 C และ +-1 C ในช่วง 0 ถึง 65 C

ความละเอียดของการวัดความดันคือ 0.15 Pascals (เช่น 0.0015 hectoPascals) ที่ความละเอียด 20 บิต หรือ 2.5 Pascals ที่ความละเอียด 16 บิต ค่าความดันดิบจะได้รับผลกระทบจากอุณหภูมิ ดังนั้นประมาณ 25 องศาเซลเซียส อุณหภูมิที่เพิ่มขึ้น 1 องศาเซลเซียสจะทำให้ความดันที่วัดได้ลดลง 24 ปาสกาล ความไวต่ออุณหภูมิถูกนำมาพิจารณาในอัลกอริธึมการสอบเทียบ ดังนั้นค่าแรงดันที่ส่งควรแม่นยำที่อุณหภูมิต่างกัน

แผ่นข้อมูลแสดงความแม่นยำแน่นอนของการอ่านค่าความดันเป็น +-1 hPa สำหรับอุณหภูมิระหว่าง 0 C ถึง 65 C

ความแม่นยำของความชื้นแสดงไว้ในแผ่นข้อมูลเป็น +-3% RH และ +-1% ฮิสเทรีซิส

มันทำงานอย่างไร

ข้อมูลการสอบเทียบอุณหภูมิและความดัน 24 ไบต์ และในกรณีของ BME280 จะต้องอ่านข้อมูลการสอบเทียบความชื้น 8 ไบต์จากอุปกรณ์และเก็บไว้ในตัวแปร ข้อมูลเหล่านี้ได้รับการตั้งโปรแกรมแยกกันในอุปกรณ์ในโรงงาน ดังนั้นอุปกรณ์ต่างๆ จึงมีค่าต่างกัน - อย่างน้อยก็สำหรับพารามิเตอร์บางตัว BME/P280 สามารถอยู่ในสถานะใดสถานะหนึ่งจากสองสถานะ ในสถานะหนึ่งคือการวัด ในอีกสถานะหนึ่งกำลังรอ (นอน)

สถานะใดสามารถตรวจสอบได้โดยดูที่บิต 3 ของ register 0xF3

ผลลัพธ์ของการวัดล่าสุดสามารถรับได้ตลอดเวลาโดยการอ่านค่าข้อมูลที่เกี่ยวข้อง ไม่ว่าอุปกรณ์จะอยู่ในโหมดสลีปหรือกำลังวัด

นอกจากนี้ยังมีสองวิธีในการใช้งาน BME/P280 หนึ่งคือโหมดต่อเนื่อง (เรียกว่าโหมดปกติในแผ่นข้อมูล) ซึ่งวนซ้ำระหว่างสถานะการวัดและสถานะการนอนหลับ ในโหมดนี้ อุปกรณ์จะทำการวัดค่าหนึ่ง จากนั้นเข้าสู่โหมดสลีป จากนั้นตื่นขึ้นเพื่อวัดค่าชุดอื่น เป็นต้น จำนวนการวัดแต่ละรายการและระยะเวลาของส่วนสลีปของรอบสามารถควบคุมได้ทั้งหมดผ่านการลงทะเบียนการกำหนดค่า

อีกวิธีหนึ่งในการใช้งาน BME/P280 คือโหมด Single Shot (เรียกว่าโหมดบังคับในแผ่นข้อมูล) ในโหมดนี้ อุปกรณ์จะถูกปลุกจากโหมดสลีปโดยคำสั่งให้วัด จากนั้นจะทำชุดการวัด จากนั้นกลับสู่โหมดสลีป จำนวนการวัดแต่ละรายการในชุดควบคุมในคำสั่งการกำหนดค่าที่ปลุกอุปกรณ์

ใน BMP280 หากมีการวัดค่าเพียงครั้งเดียว ระบบจะเติม 16 บิตที่สำคัญที่สุดในค่า และบิตที่มีนัยสำคัญน้อยที่สุดสี่บิตในการอ่านค่าจะเป็นศูนย์ทั้งหมด จำนวนการวัดสามารถตั้งค่าเป็น 1, 2, 4, 8 หรือ 16 และเมื่อจำนวนการวัดเพิ่มขึ้น จำนวนบิตที่เติมด้วยข้อมูลจะเพิ่มขึ้น ดังนั้นด้วยการวัด 16 รายการทั้งหมด 20 บิตจึงถูกเติมด้วยข้อมูลการวัด แผ่นข้อมูลอ้างถึงกระบวนการนี้เป็นการสุ่มตัวอย่างมากเกินไป

ใน BME280 จะใช้การจัดเรียงแบบเดียวกันตราบใดที่ผลลัพธ์ไม่ถูกกรอง หากใช้การกรอง ค่าจะเป็น 20 บิตเสมอ โดยไม่คำนึงถึงจำนวนการวัดในแต่ละรอบการวัด

การวัดแต่ละครั้งใช้เวลาประมาณ 2 มิลลิวินาที (ค่าปกติ ค่าสูงสุดคือ 2.3 ms) เพิ่มค่าโสหุ้ยคงที่ประมาณ 2 มิลลิวินาที (โดยปกติน้อยกว่าเล็กน้อย) หมายความว่าลำดับการวัด ซึ่งอาจประกอบด้วยการวัดแต่ละรายการตั้งแต่ 1 ถึง 32 รายการ อาจใช้เวลาตั้งแต่ 4 มิลลิวินาที ถึง 66 มิลลิวินาที

เอกสารข้อมูลมีชุดค่าผสมที่แนะนำสำหรับการสุ่มตัวอย่างอุณหภูมิและแรงดันเกินสำหรับการใช้งานต่างๆ

การลงทะเบียนควบคุมการกำหนดค่า

รีจิสเตอร์ควบคุมคอนฟิกูเรชันสองตัวใน BMP280 อยู่ที่รีจิสเตอร์แอดเดรส 0xF4 และ 0xF5 และจับคู่กับค่าควบคุมคอนฟิกูเรชัน 6 ค่า 0xF4 ประกอบด้วย:

  • 3 บิต osrs_t (วัดอุณหภูมิ 0, 1, 2, 4, 8 หรือ 16 ครั้ง);
  • 3 บิต osrs_p (วัดความดัน 0, 1, 2, 4, 8 หรือ 16 ครั้ง); และ
  • โหมด 2 บิต (สลีป บังคับ (เช่น ช็อตเดียว) ปกติ (เช่น ต่อเนื่อง)

0xF5 ประกอบด้วย:

  • 3 บิต t_sb (เวลาสแตนด์บาย 0.5ms ถึง 4000 ms);
  • ตัวกรอง 3 บิต (ดูด้านล่าง); และ
  • 1 บิต spiw_en ซึ่งเลือก SPI หรือ I2C

พารามิเตอร์ตัวกรองจะควบคุมประเภทของอัลกอริธึมการสลายแบบเอ็กซ์โปเนนเชียลหรือตัวกรอง Infinite Impulse Response (IIR) ที่ใช้กับค่าการวัดแรงดันและอุณหภูมิดิบ (แต่ไม่ใช้กับค่าความชื้น) สมการจะได้รับในแผ่นข้อมูล การนำเสนออีกอย่างคือ:

ค่า (n) = ค่า (n-1) * (K-1)/K + การวัด (n) / K

โดยที่ (n) ระบุการวัดล่าสุดและค่าเอาต์พุต และ K คือพารามิเตอร์ตัวกรอง พารามิเตอร์ตัวกรอง K และสามารถตั้งค่าเป็น 1, 2, 4, 8 หรือ 16 หากตั้งค่า K เป็น 1 สมการจะกลายเป็นค่า (n) = การวัด (n) การเข้ารหัสของพารามิเตอร์ตัวกรองคือ:

  • ตัวกรอง = 000, K=1
  • ตัวกรอง = 001, K=2
  • ตัวกรอง = 010, K=4
  • ตัวกรอง = 011, K=8
  • ตัวกรอง = 1xx, K=16

BME 280 เพิ่มการลงทะเบียนการควบคุมการกำหนดค่าเพิ่มเติมที่ที่อยู่ 0xF2, "ctrl_hum" ด้วยพารามิเตอร์ 3 บิตเดียว osrs_h (วัดความชื้น 0, 1, 2, 4, 8 หรือ 16 ครั้ง)

ขั้นตอนที่ 4: การวัดและกำหนดเวลาการอ่าน

ฉันวางแผนที่จะเพิ่มสิ่งนี้ในภายหลัง โดยแสดงระยะเวลาของคำสั่งและการตอบสนองของการวัด

Iddt - กระแสที่วัดอุณหภูมิ ค่าปกติ 325 uA

Iddp - กระแสที่วัดแรงดัน ค่าปกติ 720 uA สูงสุด 1120 uA

Iddsb - ปัจจุบันอยู่ในโหมดสแตนด์บาย ค่าปกติ 0.2 uA สูงสุด 0.5 uA

Iddsl - ปัจจุบันอยู่ในโหมดสลีป ค่าปกติ 0.1 uA สูงสุด 0.3 uA

ขั้นตอนที่ 5: แนวทางซอฟต์แวร์

แนวทางซอฟต์แวร์
แนวทางซอฟต์แวร์
แนวทางซอฟต์แวร์
แนวทางซอฟต์แวร์

โหมดถ่ายต่อเนื่อง I2C

แผ่นข้อมูล BMP280 ให้คำแนะนำเกี่ยวกับการอ่านข้อมูล (ส่วนที่ 3.9) มันบอกว่า "ขอแนะนำอย่างยิ่งให้ใช้การอ่านแบบต่อเนื่องและไม่ได้ระบุทุกการลงทะเบียนทีละรายการ ซึ่งจะช่วยป้องกันการผสมผสานของไบต์ที่เป็นของการวัดที่แตกต่างกัน และลดการรับส่งข้อมูลของอินเทอร์เฟซ" ไม่มีคำแนะนำเกี่ยวกับการอ่านค่าพารามิเตอร์การชดเชย/การสอบเทียบ สันนิษฐานว่าสิ่งเหล่านี้ไม่ใช่ปัญหาเพราะเป็นแบบคงที่และไม่เปลี่ยนแปลง

ไลบรารีนี้อ่านค่าที่ต่อเนื่องกันทั้งหมดในการดำเนินการอ่านครั้งเดียว - 24 ไบต์ในกรณีของพารามิเตอร์การชดเชยอุณหภูมิและความดัน, 6 ไบต์สำหรับอุณหภูมิและความดันรวมกัน และ 8 ไบต์สำหรับความชื้น อุณหภูมิ และความดันรวมกัน เมื่อตรวจสอบอุณหภูมิเพียงอย่างเดียว จะอ่านได้เพียง 3 ไบต์

การใช้มาโคร (#define เป็นต้น)

ไม่มีมาโครในไลบรารีนี้นอกเหนือจากมาโคร "include guard" ของไลบรารีปกติซึ่งป้องกันการทำซ้ำ

ค่าคงที่ทั้งหมดถูกกำหนดโดยใช้คีย์เวิร์ด const และการพิมพ์ดีบักจะถูกควบคุมด้วยฟังก์ชัน C มาตรฐาน

เป็นที่มาของความไม่แน่นอนบางอย่างสำหรับฉัน แต่คำแนะนำที่ฉันได้รับจากการอ่านโพสต์มากมายในหัวข้อนี้คือการใช้ #define สำหรับการประกาศค่าคงที่ (อย่างน้อย) และ (อาจ) การควบคุมการพิมพ์ดีบักนั้นไม่จำเป็นและไม่พึงปรารถนา

กรณีสำหรับการใช้ const มากกว่า #define ค่อนข้างชัดเจน - const ใช้ทรัพยากรเดียวกันกับ #define (นั่นคือไม่มี) และค่าผลลัพธ์จะเป็นไปตามกฎการกำหนดขอบเขต ซึ่งจะช่วยลดโอกาสเกิดข้อผิดพลาด

กรณีสำหรับการควบคุมการพิมพ์ดีบักนั้นมีความชัดเจนน้อยกว่าเล็กน้อย เนื่องจากวิธีที่ฉันทำนั้นหมายความว่าโค้ดสุดท้ายมีตรรกะสำหรับคำสั่งการพิมพ์ดีบัก แม้ว่าจะไม่เคยใช้เลยก็ตาม หากจะใช้ไลบรารีในโปรเจ็กต์ขนาดใหญ่บนไมโครคอนโทรลเลอร์ที่มีหน่วยความจำจำกัดมาก นี่อาจเป็นปัญหาได้ เนื่องจากการพัฒนาของฉันอยู่บน ESP8266 ที่มีหน่วยความจำแฟลชขนาดใหญ่ จึงไม่เป็นปัญหาสำหรับฉัน

ขั้นตอนที่ 6: ประสิทธิภาพอุณหภูมิ

ฉันวางแผนที่จะเพิ่มสิ่งนี้ในภายหลัง

ขั้นตอนที่ 7: ประสิทธิภาพแรงดัน

ฉันวางแผนที่จะเพิ่มสิ่งนี้ในภายหลัง

แนะนำ: