สารบัญ:

วัดความดันด้วย Micro:bit: 5 ขั้นตอน (พร้อมรูปภาพ)
วัดความดันด้วย Micro:bit: 5 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: วัดความดันด้วย Micro:bit: 5 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: วัดความดันด้วย Micro:bit: 5 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: การใช้งานเซนเซอร์วัดความชื้นในดิน Soil Moisture Sensor ร่วมกับบอร์ด micro:bit 2024, กรกฎาคม
Anonim
วัดความดันด้วย Micro:bit
วัดความดันด้วย Micro:bit
วัดความดันด้วย Micro:bit
วัดความดันด้วย Micro:bit

คำแนะนำต่อไปนี้อธิบายอุปกรณ์ที่ง่ายต่อการสร้างและราคาไม่แพงเพื่อทำการวัดแรงดันและสาธิตกฎของ Boyle โดยใช้ micro:bit ร่วมกับเซ็นเซอร์ความดัน/อุณหภูมิ BMP280

ในขณะที่ชุดค่าผสมของเซ็นเซอร์เข็มฉีดยา/ความดันนี้ได้รับการอธิบายไว้แล้วในหนึ่งในคำแนะนำก่อนหน้าของฉัน สำหรับโครงการห้องเรียน

นอกจากนี้ จำนวนคำอธิบายของแอปพลิเคชันที่ใช้ micro:bit ร่วมกับเซ็นเซอร์ที่ขับเคลื่อนด้วย I2C ยังค่อนข้างจำกัด ฉันหวังว่าคำแนะนำนี้อาจเป็นจุดเริ่มต้นสำหรับโครงการอื่น

อุปกรณ์นี้อนุญาตให้ทำการวัดความดันอากาศในเชิงปริมาณ และแสดงผลบนอาร์เรย์ LED micro:bit หรือบนคอมพิวเตอร์ที่เชื่อมต่อ สำหรับในภายหลังโดยใช้จอภาพแบบอนุกรมหรือฟังก์ชันพล็อตเตอร์แบบอนุกรมของ Arduino IDE นอกจากนี้ คุณมีการตอบสนองแบบสัมผัสได้ เนื่องจากคุณจะดันหรือดึงลูกสูบของกระบอกฉีดยาด้วยตัวเอง และด้วยเหตุนี้จึงรู้สึกถึงกำลังที่ต้องการ

โดยค่าเริ่มต้น จอแสดงผลจะให้คุณประเมินความดันโดยตัวบ่งชี้ระดับที่แสดงบนเมทริกซ์ LED พล็อตเตอร์แบบอนุกรมของ Arduino IDE อนุญาตให้ทำเช่นเดียวกัน แต่มีความละเอียดที่ดีกว่ามาก (ดูวิดีโอ) นอกจากนี้ยังมีโซลูชันที่ละเอียดยิ่งขึ้น เช่น ในภาษาการประมวลผล คุณยังสามารถแสดงค่าที่วัดได้อย่างแม่นยำของความดันและอุณหภูมิบนเมทริกซ์ LED หลังจากกดปุ่ม A หรือ B ตามลำดับ แต่จอภาพแบบอนุกรมของ Arduino IDE นั้นเร็วกว่ามาก ทำให้สามารถแสดงค่าได้เกือบเรียลไทม์

ค่าใช้จ่ายทั้งหมดและทักษะทางเทคนิคที่จำเป็นในการสร้างอุปกรณ์นั้นค่อนข้างต่ำ ดังนั้นจึงอาจเป็นโครงการห้องเรียนที่ดีภายใต้การดูแลของครู นอกจากนี้ อุปกรณ์ดังกล่าวยังสามารถเป็นเครื่องมือสำหรับโครงการ STEM โดยเน้นที่ฟิสิกส์ หรือใช้ในโครงการอื่นๆ ที่ต้องการแปลงแรงหรือน้ำหนักเป็นค่าดิจิทัล

หลักการนี้ใช้ในการสร้าง micro:bit dive-o-meter ที่เรียบง่าย ซึ่งเป็นอุปกรณ์วัดว่าคุณดำน้ำลึกแค่ไหน

ภาคผนวก 27 พฤษภาคม 2561:

เนื่องจาก Pimoroni ได้พัฒนาไลบรารี MakeCode สำหรับเซ็นเซอร์ BMP280 ซึ่งทำให้ฉันได้มีโอกาสพัฒนาสคริปต์เพื่อใช้กับอุปกรณ์ที่อธิบายไว้ที่นี่ สคริปต์และไฟล์ HEX ที่เกี่ยวข้องสามารถพบได้ในขั้นตอนสุดท้ายของคำแนะนำนี้ ในการใช้งาน เพียงโหลดไฟล์ HEX ลงใน micro:bit ของคุณ ไม่จำเป็นต้องใช้ซอฟต์แวร์พิเศษ และคุณสามารถใช้โปรแกรมแก้ไข MakeCode ออนไลน์เพื่อแก้ไขสคริปต์ได้

ขั้นตอนที่ 1: วัสดุที่ใช้แล้ว

วัสดุที่ใช้แล้ว
วัสดุที่ใช้แล้ว
วัสดุที่ใช้แล้ว
วัสดุที่ใช้แล้ว
วัสดุที่ใช้แล้ว
วัสดุที่ใช้แล้ว
วัสดุที่ใช้แล้ว
วัสดุที่ใช้แล้ว
  • micro:bit ได้ของฉันจาก Pimoroni - 13.50 GBP
  • ตัวเชื่อมต่อ Kitronic Edge สำหรับ micro:bit - ผ่าน Pimoroni - 5 GBP หมายเหตุ: ตอนนี้ Pimorini มีตัวเชื่อมต่อขอบที่เป็นมิตรกับบอร์ดบอร์ดซึ่งเรียกว่า pin:bit พร้อมหมุดบนพอร์ต I2C
  • แถบส่วนหัว 2 x 2 ขา
  • แบตเตอรี่หรือ LiPo สำหรับ micro:bit (ไม่จำเป็น แต่มีประโยชน์) สายแบตเตอรี่พร้อมสวิตช์ (dito) - Pimoroni
  • สายจัมเปอร์สำหรับเชื่อมต่อเซ็นเซอร์กับขั้วต่อขอบ
  • สายจัมเปอร์ยาว (!) สำหรับเซ็นเซอร์ อย่างน้อยตราบเท่าที่หลอดฉีดยา, f/f หรือ f/m
  • BMP280 เซ็นเซอร์ความดันและอุณหภูมิ - Banggood - 5 US$ สำหรับสามหน่วยช่วงการวัดสำหรับเซ็นเซอร์นี้อยู่ระหว่าง 550 ถึง 1537 hPa
  • กระบอกฉีดยาพลาสติกขนาด 150 มล. พร้อมปะเก็นยาง - Amazon หรือร้านฮาร์ดแวร์และสวน - ประมาณ 2 - 3 US$
  • ปืนกาวร้อน/ปืนกาวร้อน
  • หัวแร้ง
  • คอมพิวเตอร์ที่ติดตั้ง Arduino IDE

ขั้นตอนที่ 2: คำแนะนำในการประกอบ

คำแนะนำการชุมนุม
คำแนะนำการชุมนุม
คำแนะนำการชุมนุม
คำแนะนำการชุมนุม
คำแนะนำการชุมนุม
คำแนะนำการชุมนุม

ประสานส่วนหัวเข้ากับเซ็นเซอร์ BMP280

บัดกรีหัวต่อ 2 ขาสองตัวเข้ากับขั้วต่อพิน 19 และพิน 20 ของขั้วต่อ Edge (ดูภาพ)

เชื่อมต่อ micro:bit กับขั้วต่อ Edge และคอมพิวเตอร์ของคุณ

เตรียมซอฟต์แวร์และ micro:bit ตามที่อธิบายไว้ในคำสั่ง micro:bit ของ Adafruit อ่านอย่างละเอียด

ติดตั้งไลบรารีที่จำเป็นลงใน Arduino IDE

เปิดสคริปต์ BMP280 ที่แนบมาในขั้นตอนต่อมา

เชื่อมต่อเซ็นเซอร์กับขั้วต่อ Edge GND ถึง 0V, VCC ถึง 3V, SCL ถึงพิน 19, SDA ถึงพิน 20

อัปโหลดสคริปต์ไปที่ micro:bit

ตรวจสอบว่าเซ็นเซอร์ให้ข้อมูลที่เหมาะสม ค่าความดันควรอยู่ที่ประมาณ 1,020 hPa ซึ่งแสดงบนจอภาพแบบอนุกรม ในกรณี ตรวจสอบสายเคเบิลและการเชื่อมต่อก่อน จากนั้นจึงติดตั้งซอฟต์แวร์และแก้ไข

ปิด micro:bit ถอดเซ็นเซอร์ออก

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

เชื่อมต่อเซ็นเซอร์กับสายจัมเปอร์ ตรวจสอบว่าการเชื่อมต่อถูกต้องและดี เชื่อมต่อกับไมโคร:บิต

ตรวจสอบว่าเซ็นเซอร์ทำงานอย่างถูกต้อง ดึงสายเคเบิลอย่างระมัดระวัง ย้ายเซ็นเซอร์ไปที่ด้านบนของกระบอกฉีดยา

ใส่ลูกสูบแล้วเคลื่อนไปให้ไกลกว่าตำแหน่งพักที่ต้องการเล็กน้อย (100 มล.)

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

ตรวจสอบอีกครั้งว่าเซ็นเซอร์ทำงาน หากคุณย้ายลูกสูบ ตัวเลขในมอนิเตอร์ซีเรียลและจอแสดงผลของ micro:bit จะเปลี่ยนไป

หากจำเป็น คุณสามารถปรับระดับเสียงในกระบอกฉีดยาได้โดยการบีบใกล้กับปะเก็นและขยับลูกสูบ

ขั้นตอนที่ 3: ทฤษฎีเล็กน้อยและการวัดเชิงปฏิบัติบางส่วน

ทฤษฎีเล็กน้อยและการวัดผลในทางปฏิบัติ
ทฤษฎีเล็กน้อยและการวัดผลในทางปฏิบัติ
ทฤษฎีเล็กน้อยและการวัดผลในทางปฏิบัติ
ทฤษฎีเล็กน้อยและการวัดผลในทางปฏิบัติ

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

ทฤษฎีเบื้องหลัง: ตามกฎของบอยล์ [ปริมาตร * ความดัน] เป็นค่าคงที่ของก๊าซที่อุณหภูมิที่กำหนด

ซึ่งหมายความว่าหากคุณบีบอัดแก๊สในปริมาตรที่กำหนด เช่น ปริมาตรสุดท้ายคือ 1/N เท่าของต้นฉบับ ความดันจะเพิ่มขึ้น N-fold เช่น: P0*V0=P1*V1= cons t สำหรับรายละเอียดเพิ่มเติม โปรดดูบทความ Wikipedia เกี่ยวกับกฎของแก๊ส ที่ระดับน้ำทะเล ความกดอากาศมักจะอยู่ในช่วง 1010 hPa (เฮกโตปาสกาล)

เริ่มจากจุดพักเช่น V0=100 มล. และ P0=1000 hPa การอัดอากาศให้อยู่ที่ประมาณ 66 มล. (เช่น V1 = 2/3 * V0) จะส่งผลให้มีแรงดันประมาณ 1500 hPa (P1= 3/2 ของ P0) การดึงลูกสูบไปที่ 125 มล. (ปริมาตร 4 เท่า) ส่งผลให้เกิดแรงดันประมาณ 800 hPa (แรงดัน 4/5) การวัดที่แม่นยำอย่างน่าอัศจรรย์สำหรับอุปกรณ์ที่เรียบง่ายเช่นนี้

อุปกรณ์นี้ช่วยให้คุณสัมผัสได้โดยตรงว่าต้องใช้แรงมากเพียงใดในการบีบอัดหรือขยายอากาศในปริมาณที่ค่อนข้างน้อยในกระบอกฉีดยา

แต่เรายังสามารถทำการคำนวณและตรวจสอบแบบทดลองได้อีกด้วย สมมติว่าเราอัดอากาศไว้ที่ 1500 hPa ที่ความดันบรรยากาศพื้นฐานที่ 1000 hPa ดังนั้นความแตกต่างของแรงดันคือ 500 hPa หรือ 50,000 Pa สำหรับหลอดฉีดยาของฉัน เส้นผ่านศูนย์กลาง (d) ของลูกสูบจะอยู่ที่ประมาณ 4 ซม. หรือ 0.04 เมตร

ตอนนี้คุณสามารถคำนวณแรงที่จำเป็นในการยึดลูกสูบในตำแหน่งนั้นได้ ให้ P = F/A (ความดันคือแรงหารด้วยพื้นที่) หรือแปลง F = P*A หน่วย SI ของแรงคือ "นิวตัน" N สำหรับความยาว "เมตร" m และ 1 Pa คือ 1N ต่อตารางเมตร สำหรับลูกสูบทรงกลม พื้นที่สามารถคำนวณได้โดยใช้ A = ((d/2)^2)*pi ซึ่งให้ 0.00125 ตารางเมตรสำหรับหลอดฉีดยาของฉัน ดังนั้น

50,000 Pa * 0.00125 m^2 = 63 N.

บนโลก 1 นิวตันมีความสัมพันธ์กับน้ำหนัก 100 กรัม ดังนั้น 63 นิวตันจึงเท่ากับถือน้ำหนัก 6.3 กิโลกรัม

สามารถตรวจสอบได้อย่างง่ายดายโดยใช้เครื่องชั่ง ดันกระบอกฉีดยาด้วยลูกสูบลงบนเครื่องชั่ง จนกว่าจะถึงแรงดันประมาณ 1500 hPa จากนั้นอ่านสเกล หรือกดจนสเกลแสดงประมาณ 6-7 กก. จากนั้นกดปุ่ม "A" แล้วอ่านค่าที่แสดงบนเมทริกซ์ LED ของ micro:bit ผลปรากฏว่า การประมาณค่าจากการคำนวณข้างต้นนั้นไม่เลว ความดันที่สูงกว่า 1500 hPa เล็กน้อยสัมพันธ์กับ "น้ำหนัก" ที่แสดงประมาณ 7 กก. บนมาตราส่วนร่างกาย (ดูภาพ) คุณยังสามารถเปลี่ยนแนวคิดนี้และใช้อุปกรณ์นี้เพื่อสร้างมาตราส่วนดิจิทัลอย่างง่ายตามการวัดแรงดัน

โปรดทราบว่าขีดจำกัดบนสำหรับเซ็นเซอร์อยู่ที่ประมาณ 1540 hPa ดังนั้นจึงไม่สามารถวัดความดันใดๆ ที่สูงกว่าค่านี้ได้ และอาจทำให้เซ็นเซอร์เสียหายได้

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

ขั้นตอนที่ 4: สคริปต์ MicroPython

แนบคุณพบสคริปต์ BMP280 ของฉันสำหรับ micro:bit มันเป็นอนุพันธ์ของสคริปต์ BMP/BME280 ที่ฉันพบในเว็บไซต์ Banggood รวมกับห้องสมุด Microbit ของ Adafruit ตัวเลือกแรกให้คุณใช้เซ็นเซอร์ Banggood เซ็นเซอร์ตัวที่สองช่วยลดความยุ่งยากในการจัดการจอแสดงผล LED ขนาด 5x5 ฉันขอขอบคุณนักพัฒนาของทั้งสอง

ตามค่าเริ่มต้น สคริปต์จะแสดงผลลัพธ์ของการวัดแรงกดใน 5 ขั้นตอนบนจอแสดงผล LED ขนาด 5x5 ของ micro:bit ซึ่งช่วยให้เห็นการเปลี่ยนแปลงได้โดยมีความล่าช้าเล็กน้อย ค่าที่แม่นยำสามารถแสดงแบบคู่ขนานบนจอภาพอนุกรม Arduino IDE หรือแสดงกราฟที่มีรายละเอียดมากขึ้นในพล็อตเตอร์แบบอนุกรมของ Arduino IDE

หากคุณกดปุ่ม A ค่าความดันที่วัดได้จะแสดงบนอาร์เรย์ LED 5x5 ของ micro:bit หากคุณกดปุ่ม B ค่าอุณหภูมิจะปรากฏขึ้น แม้ว่าวิธีนี้จะช่วยให้อ่านข้อมูลได้อย่างแม่นยำ แต่ก็ทำให้รอบการวัดช้าลงอย่างมาก

ฉันแน่ใจว่ามีวิธีที่สวยงามกว่ามากในการเขียนโปรแกรมงานและปรับปรุงสคริปต์ ความช่วยเหลือใด ๆ ยินดีต้อนรับ

#รวมxxx

#รวม Adafruit_Microbit_Matrix microbit; #define BME280_ADDRESS 0x76 ไม่ได้ลงนาม int แบบยาว hum_raw, temp_raw, pres_raw; ลงนาม int ยาว t_fine; uint16_t dig_T1; int16_t dig_T2; int16_t dig_T3; uint16_t dig_P1; int16_t dig_P2; int16_t dig_P3; int16_t dig_P4; int16_t dig_P5; int16_t dig_P6; int16_t dig_P7; int16_t dig_P8; int16_t dig_P9; int8_t dig_H1; int16_t dig_H2; int8_t dig_H3; int16_t dig_H4; int16_t dig_H5; int8_t dig_H6; // คอนเทนเนอร์สำหรับค่าที่วัดได้ int value0; ค่า int1; ค่า int2; ค่า int3; ค่า int4; //------------------------------------------------ -------------------------------------------------- ------------------ โมฆะการตั้งค่า () { uint8_t osrs_t = 1; //การสุ่มตัวอย่างอุณหภูมิเกิน x 1 uint8_t osrs_p = 1; // การสุ่มตัวอย่างแรงดันเกิน x 1 uint8_t osrs_h = 1; //การสุ่มตัวอย่างความชื้นเกิน x 1 โหมด uint8_t = 3; // โหมดปกติ uint8_t t_sb = 5; //Tstandby 1000ms uint8_t filter = 0; //กรองออก uint8_t spi3w_en = 0; ///3-wire SPI ปิดการใช้งาน uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | โหมด; uint8_t config_reg = (t_sb << 5) | (ตัวกรอง << 2) | spi3w_en; uint8_t ctrl_hum_reg = osrs_h; โหมดพิน (PIN_BUTTON_A, อินพุต); โหมดพิน (PIN_BUTTON_B, INPUT); Serial.begin(9600); // Serial.println("อุณหภูมิ [องศา C]"); // Serial.print("\t"); Serial.print("ความดัน [hPa] "); // ส่วนหัว Wire.begin(); writeReg(0xF2, ctrl_hum_reg); writeReg(0xF4, ctrl_meas_reg); writeReg(0xF5, config_reg); readTrim(); // microbit.begin(); // microbit.print("x"); ล่าช้า (1,000); } //---------------------------------------------------------- -------------------------------------------------- -------- วงเป็นโมฆะ () { double temp_act = 0.0, press_act = 0.0, hum_act=0.0; ลงนาม int แบบยาว temp_cal; ไม่ได้ลงนาม int ยาว press_cal, hum_cal; อินท์ N; // ตั้งค่าเกณฑ์สำหรับการแสดงเมทริกซ์ LED ใน hPa double max_0 = 1100; ดับเบิล max_1 = 1230; max_2 สองเท่า = 1360; max_3 สองเท่า = 1490; readData(); temp_cal = calibration_T(temp_raw); press_cal = calibration_P(pres_raw); hum_cal = การสอบเทียบ_H(hum_raw); temp_act = (สองเท่า) temp_cal / 100.0; press_act = (สองเท่า) press_cal / 100.0; hum_act = (สองเท่า) hum_cal / 1024.0; microbit.clear(); //รีเซ็ต LED matrix /* Serial.print ("PRESS: "); Serial.println(press_act); Serial.print(" hPa "); Serial.print("อุณหภูมิ: "); Serial.print("\t"); Serial.println(temp_act); */ if (! digitalRead (PIN_BUTTON_B)) { // การแสดงค่าเป็นตัวเลขล่าช้าในการวัดวงกลม microbit.print ("T: "); microbit.print(temp_act, 1); microbit.print(" 'C"); // Serial.println(""); } มิฉะนั้น if (! digitalRead (PIN_BUTTON_A)) { microbit.print ("P: "); microbit.print(press_act, 0); microbit.print("hPa"); }อื่น{ // แสดงค่าความดันเป็นพิกเซลหรือเส้นในระดับหนึ่ง // 5 ขั้นตอน: 1490 hPa // เกณฑ์ที่กำหนดโดยค่า max_n ถ้า (press_act > max_3){ (N=0); // แถวบน } else if (press_act > max_2){ (N=1); } else if (press_act > max_1){ (N=2); } else if (press_act > max_0){ (N=3); } อื่นๆ { (N=4); // แถวฐาน } // Serial.println(N); // เพื่อวัตถุประสงค์ในการพัฒนา // microbit.print(N); // as Line // microbit.drawLine(N, 0, 0, 4, LED_ON); // เลื่อนค่าไปที่บรรทัดถัดไป value4 = value3; ค่า 3 = ค่า 2; ค่า 2 = ค่า 1; ค่าที่ 1 = ค่า 0; ค่า 0 = ยังไม่มีข้อความ; // วาดภาพ, คอลัมน์ทีละคอลัมน์ microbit.drawPixel(0, value0, LED_ON); // เป็น Pixel: คอลัมน์ แถว 0, 0 มุมบนซ้าย microbit.drawPixel(1, value1, LED_ON); microbit.drawPixel (2, ค่า 2, LED_ON); microbit.drawPixel(3, value3, LED_ON); microbit.drawPixel (4, ค่า 4, LED_ON); } // ส่งข้อมูลไปยังมอนิเตอร์แบบอนุกรมและพล็อตเตอร์แบบอนุกรม // Serial.println(press_act); // ส่งค่าไปยังพอร์ตอนุกรมสำหรับการแสดงตัวเลข เป็นทางเลือก

Serial.print(press_act); // ส่งค่าไปยังพอร์ตอนุกรมสำหรับพล็อตเตอร์

// วาดเส้นตัวบ่งชี้และแก้ไขช่วงที่แสดง Serial.print("\t"); Serial.print(600); Serial.print("\t"); Serial.print(1100), Serial.print("\t"); Serial.println (1600); ล่าช้า(200); // วัดสามครั้งต่อวินาที } //-------------------------------------- -------------------------------------------------- -------------------------------------------------- -- // สิ่งต่อไปนี้เป็นสิ่งจำเป็นสำหรับเซ็นเซอร์ bmp/bme280 เก็บไว้เป็นโมฆะ readTrim() { uint8_t data[32], i=0; // แก้ไข 2014/Wire.beginTransmission (BME280_ADDRESS); Wire.write(0x88); Wire.endTransmission(); Wire.requestFrom(BME280_ADDRESS, 24); // แก้ไข 2014/while(Wire.available()){ data = Wire.read(); ผม++; } Wire.beginTransmission (BME280_ADDRESS); // เพิ่ม 2014/Wire.write(0xA1); // เพิ่ม 2014/Wire.endTransmission(); // เพิ่ม 2014/Wire.requestFrom(BME280_ADDRESS, 1); // เพิ่ม 2014/data = Wire.read(); // เพิ่ม 2014/i++; // เพิ่ม 2014/Wire.beginTransmission(BME280_ADDRESS); Wire.write(0xE1); Wire.endTransmission(); Wire.requestFrom(BME280_ADDRESS, 7); // แก้ไข 2014/while(Wire.available()){ data = Wire.read(); ผม++; } dig_T1 = (ข้อมูล[1] << 8) | ข้อมูล[0]; dig_P1 = (ข้อมูล[7] << 8) | ข้อมูล[6]; dig_P2 = (ข้อมูล[9] << 8) | ข้อมูล[8]; dig_P3 = (ข้อมูล[11]<< 8) | ข้อมูล[10]; dig_P4 = (ข้อมูล[13]<< 8) | ข้อมูล[12]; dig_P5 = (ข้อมูล[15]<< 8) | ข้อมูล[14]; dig_P6 = (ข้อมูล [17]<< 8) | ข้อมูล[16]; dig_P7 = (ข้อมูล [19]<< 8) | ข้อมูล[18]; dig_T2 = (ข้อมูล[3] << 8) | ข้อมูล[2]; dig_T3 = (ข้อมูล[5] << 8) | ข้อมูล[4]; dig_P8 = (ข้อมูล[21]<< 8) | ข้อมูล[20]; dig_P9 = (ข้อมูล[23]<< 8) | ข้อมูล[22]; dig_H1 = ข้อมูล[24]; dig_H2 = (ข้อมูล[26]<< 8) | ข้อมูล[25]; dig_H3 = ข้อมูล[27]; dig_H4 = (ข้อมูล[28]<< 4) | (0x0F & ข้อมูล[29]); dig_H5 = (ข้อมูล[30] 4) & 0x0F); // แก้ไข 2014/dig_H6 = ข้อมูล [31]; // แก้ไข 2014/} เป็นโมฆะ writeReg (uint8_t reg_address, ข้อมูล uint8_t) { Wire.beginTransmission (BME280_ADDRESS); Wire.write(reg_address); Wire.write (ข้อมูล); Wire.endTransmission(); }

เป็นโมฆะ readData()

{ int ผม = 0; ข้อมูล uint32_t[8]; Wire.beginTransmission (BME280_ADDRESS); Wire.write(0xF7); Wire.endTransmission(); Wire.requestFrom(BME280_ADDRESS, 8); ในขณะที่(Wire.available()){ data = Wire.read(); ผม++; } pres_raw = (data[0] << 12) | (ข้อมูล[1] 4); temp_raw = (ข้อมูล[3] << 12) | (ข้อมูล[4] 4); hum_raw = (ข้อมูล[6] << 8) | ข้อมูล[7]; }

เซ็นชื่อแบบยาว int สอบเทียบ_T(เซ็นชื่อแบบยาว int adc_T)

{ ลงนาม int ยาว var1, var2, T; var1 = ((((adc_T >> 3) - ((ลงนาม int แบบยาว)dig_T1 11; var2 = (((((adc_T >> 4) - ((ลงนาม int แบบยาว)dig_T1)) * ((adc_T>>4) - ((ลงนาม int แบบยาว)dig_T1))) >> 12) * ((ลงนาม int แบบยาว) dig_T3)) >> 14; t_fine = var1 + var2; T = (t_fine * 5 + 128) >> 8; ส่งคืน T; } การสอบเทียบ int แบบยาวที่ไม่ได้ลงนาม _P (ลงนามแบบยาว int adc_P) { ลงนามแบบยาว int var1, var2; ไม่ได้ลงชื่อยาว int P; var1 = (((ลงนาม int แบบยาว) t_fine)>>1) - (ลงนาม int แบบยาว) 64000; var2 = (((var1>>2) * (var1>>2)) >> 11) * ((ลงนาม int แบบยาว)dig_P6); var2 = var2 + ((var1*((ลงนาม int แบบยาว)dig_P5))2) +((ลงนาม int แบบยาว)dig_P4)2)*(var1>>2)) >> 13)) >>3) + (((ลงนาม int แบบยาว)dig_P2) * var1)>>1))>> 18; var1 = ((((32768+var1))*((ลงนาม int แบบยาว) dig_P1))>>15); ถ้า (var1 == 0) { กลับ 0; } P = (((unsigned long int)(((signed long int)1048576)-adc_P)-(var2>>12)))*3125; if(P<0x80000000) { P = (P <<1) / ((unsigned long int) var1); } อื่น ๆ { P = (P / (int ยาวที่ไม่ได้ลงนาม) var1) * 2; } var1 = (((ลงนาม int แบบยาว)dig_P9) * ((ลงนาม int แบบยาว)(((P>>3) * (P>>3))>>13)))>>12; var2 = (((ลงนาม int แบบยาว)(P>>2)) * ((ลงนาม int แบบยาว) dig_P8))>>13; P = (unsigned long int)((ลงนาม int แบบยาว)P + ((var1 + var2 + dig_P7) >> 4)); กลับ P; } unsigned long int calibration_H (ลงนาม int แบบยาว adc_H) { ลงนาม int แบบยาว v_x1; v_x1 = (t_fine - ((ลงนาม int แบบยาว)76800)); v_x1 = (((((adc_H << 14)) -(((ลงนาม int แบบยาว)dig_H4) 15) * (((((((v_x1 * ((ลงนาม int แบบยาว)dig_H6)) >> 10) * (((v_x1 * ((ลงนาม int แบบยาว) dig_H3)) >> 11) + ((ลงนาม int แบบยาว) 32768))) >> 10) + ((ลงนาม int แบบยาว)2097152)) * ((ลงนาม int แบบยาว) dig_H2) +8192 >> 14)); v_x1 = (v_x1 - (((((v_x1 >> 15)) * (v_x1 >> 15)) >> 7) * ((ลงนาม int แบบยาว)dig_H1)) >> 4)); v_x1 = (v_x1 419430400 ? 419430400: v_x1); return (ไม่ได้ลงนาม int แบบยาว)(v_x1 >> 12); }

ขั้นตอนที่ 5: สคริปต์ MakeCode/JavaScript

สคริปต์ MakeCode/JavaScript
สคริปต์ MakeCode/JavaScript

Pimoroni เพิ่งเปิดตัว enviro:bit ที่มาพร้อมกับเซ็นเซอร์ความดัน BMP280 เซ็นเซอร์แสง/สี และไมโครโฟน MEMSพวกเขายังมี MicroPython และไลบรารี MakeCode/JavaScript

ฉันใช้ในภายหลังเพื่อเขียนสคริปต์ MakeCode สำหรับเซ็นเซอร์ความดัน ไฟล์ hex ที่เกี่ยวข้องสามารถคัดลอกไปยัง micro:bit ของคุณได้โดยตรง รหัสแสดงอยู่ด้านล่างและอาจแก้ไขได้โดยใช้โปรแกรมแก้ไข MakeCode ออนไลน์

มันเป็นรูปแบบหนึ่งของสคริปต์สำหรับ micro:bit dive-o-meter โดยค่าเริ่มต้นจะแสดงความแตกต่างของแรงดันเป็นกราฟแท่ง การกดปุ่ม A จะกำหนดแรงดันอ้างอิง การกดปุ่ม B จะแสดงความแตกต่างระหว่างแรงดันจริงและแรงดันอ้างอิงในหน่วย hPa

นอกจากเวอร์ชันบาร์โค้ดพื้นฐานแล้ว คุณยังพบเวอร์ชัน "X", เวอร์ชันเป้าเล็ง และเวอร์ชัน "L" เพื่อช่วยให้การอ่านง่ายขึ้น

ให้คอลัมน์ = 0

ให้เหลือ = 0 ให้แถว = 0 ให้ Meter = 0 ให้ Delta = 0 ให้ Ref = 0 ให้ Is = 0 Is = 1012 basic.showLeds(` # # # # # # #… # #. #. # #.. # # # # # # `) Ref = 1180 basic.clearScreen() basic.forever (() => { basic.clearScreen() if (input.buttonIsPressed (Button. A)) { Ref = envirobit.getPressure () basic.showLeds(` #. #. #. #. #. # # # # #. #. #. #. #. # `) basic.pause(1000) } else if (input.buttonIsPressed(Button. B)) { basic.showString ("" + Delta + " hPa") basic.pause (200) basic.clearScreen () } else { Is = envirobit.getPressure () Delta = Is - Ref Meter = Math.abs (เดลต้า) ถ้า (มิเตอร์ >= 400) { แถว = 4 } อื่น ๆ ถ้า (มิเตอร์ >= 300) { แถว = 3 } อื่น ๆ ถ้า (มิเตอร์ >= 200) { แถว = 2 } อื่น ๆ ถ้า (มิเตอร์ >= 100) { แถว = 1 } อื่น { แถว = 0 } เหลือ = เมตร - แถว * 100 ถ้า (คง >= 80) { คอลัมน์ = 4 } อื่น ๆ ถ้า (คง >= 60) { คอลัมน์ = 3 } อื่น ๆ ถ้า (คง >= 40) { คอลัมน์ = 2 } else if (คง >= 20) { คอลัมน์ = 1 } อื่น { คอลัมน์ = 0 } สำหรับ (ให้ ColA = 0; ColA <= คอลัมน์; ColA++) { led.plot (ColA, Row) } basic.pause(500) } })

แนะนำ: