ฉันต้องการสะสม ทำมันเอง เครื่องมือที่จะวัดความดันบรรยากาศและอุณหภูมิ เซ็นเซอร์วัดอุณหภูมิจะต้องอยู่ในระยะไกลและแน่นเพราะจะต้องวัดอุณหภูมิในระยะที่แน่นอนจากอุปกรณ์ ฉันต้องการมีอุปกรณ์พกพาที่มีช่วงการทำงานตั้งแต่ -30 ° C ถึง 50 ° C แต่สิ่งนี้ต้องการให้ส่วนประกอบทั้งหมดสามารถทำงานได้ในช่วงอุณหภูมินี้ ส่วนประกอบที่สามารถทำงานในช่วงอุณหภูมิที่กว้างขึ้นนั้นมีราคาแพงกว่าและเป็นการยากที่จะซื้อ
เพื่อเติมเต็มความฝันของฉันให้เป็นจริงฉันจะได้รับการช่วยเหลือจากกระดานซึ่งฉันได้อธิบายไว้ในบทความ“บอร์ด GY-BMP280-3.3 สำหรับการวัดความดันบรรยากาศและอุณหภูมิ».
จากการปฏิบัติเป็นที่รู้กันว่าในระหว่างการประกอบและการกำหนดค่า อิเล็กทรอนิกส์ ผลิตภัณฑ์ก่อนการผลิตคุณต้องตรวจสอบความสามารถในการให้บริการของวัสดุและส่วนประกอบทั้งหมดของแต่ละผลิตภัณฑ์แยกกัน มิฉะนั้นคุณอาจสับสนในภายหลังและเป็นผลให้ผลิตภัณฑ์อิเล็กทรอนิกส์จะไม่ทำงานและมันจะยากมากที่จะหาสาเหตุของความผิดปกติ
เริ่มกันเลย
ขั้นตอนแรก. ติดตั้งเชลล์ซอฟต์แวร์ฟรีบนคอมพิวเตอร์ของคุณ Arduino IDE สำหรับการเขียนโปรแกรม (ภาพร่าง) รวบรวมและเขียนลงในไมโครคอนโทรลเลอร์ Mega328P ที่ติดตั้งบนกระดาน ฉันแนะนำให้คุณดาวน์โหลดเวอร์ชัน shell ของ ARDUINO 1.6.5 ทำไม? ในขั้นต้นโครงการ ARDUINO เป็นโครงการหนึ่งตอนนี้ผู้พัฒนาได้แยกย้ายกันไปและพัฒนาระบบ ARDUINO ต่อไป แต่แต่ละโครงการมีวิธีการของตัวเองแตกต่างกันเล็กน้อย ฉันใช้เวอร์ชัน ARDUINO 1.6.5 มันควรจะติดตั้งและทดสอบสำหรับการทำงานร่วมกับบอร์ด Arduino Uno โดยใช้ตัวอย่างที่ง่ายที่สุด
ขั้นตอนที่สอง. เราตรวจสอบบอร์ด GY-BMP280-3.3 สำหรับวัดความดันบรรยากาศและอุณหภูมิ เราใช้สายไฟ 4 เส้นเชื่อมต่อ GY-BMP280-3.3 และ Arduino Uno ดังแสดงในรูปและแผนภาพ เส้นโค้งหลายสีหลายเส้นเป็นตัวนำ
เริ่มตรวจสอบบอร์ด GY-BMP280-3.3 ในการทำเช่นนี้คุณต้องติดตั้งไลบรารีใน Arduino IDE ซึ่งเขียนโดยโปรแกรมเมอร์ที่ทำงานบนไซต์ ตามกฎแล้วหลังจากติดตั้งไลบรารีใน Arduino IDE แล้วตัวอย่าง (ตัวอย่าง) ของรหัสจะปรากฏขึ้น โดยการเปลี่ยนรหัสตัวอย่างเล็กน้อยเราสามารถรวบรวมเป็นข้อมูลที่ไมโครคอนโทรลเลอร์เข้าใจแล้วส่งไปยังหน่วยความจำของไมโครคอนโทรลเลอร์ คุณสามารถค้นหาตัวอย่าง (ตัวอย่าง) โดยให้ความสนใจกับภาพถ่ายหน้าจอสองภาพด้านล่าง
หลังจากเขียนข้อมูลไปยังไมโครคอนโทรลเลอร์ของบอร์ด Arduino Uno มันจะเริ่มต้นรันโปรแกรม (รหัส) และส่งข้อมูลผ่านสาย USB ไปยังคอมพิวเตอร์ที่บอร์ด Arduino Uno เชื่อมต่ออยู่และเราสามารถเห็นผลการวัดของคณะกรรมการ GY-BMP280-3.3 ในหน้าต่าง Arduino IDE เรียกว่า "พอร์ตอนุกรมจอภาพ"
เราสามารถเห็นผลการวัดบนบอร์ด GY-BMP280-3.3 ในโปรแกรม Windows Hyper Terminal มาตรฐานหลังจากปิด Arduino Uno shell และตั้งค่าเซสชันในโปรแกรม Hyper Terminal นั่นคือเราสามารถรับผลลัพธ์ของบอร์ด GY-BMP280-3.3 ได้โดยเชื่อมต่อ Arduino Uno กับคอมพิวเตอร์ใด ๆ ด้วยสาย USB ที่ติดตั้งไดรเวอร์สำหรับบอร์ด Arduino Uno มีห้องสมุดหลายแห่งสำหรับการทำงานกับ GY-BMP280-3.3 ทุกอย่างทำงานกับฉันด้วยห้องสมุด ไฟล์ที่คุณดาวน์โหลดจากไซต์นี้จะมีลักษณะดังนี้: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip จำเป็นต้องเปลี่ยนชื่อเป็น: iarduino_Pressure_BMP.zip ตอนนี้เราจำเป็นต้องติดตั้งไลบรารี iarduino_Pressure_BMP ใน Arduino IDE shell
เปิดตัว Arduino IDE ไปที่เมนู Sketch / Include Librari / Add.ZIP Library ... จากนั้นเลือกไฟล์ iarduino_Pressure_BMP.zip และคลิกปุ่ม Open คุณต้องติดตั้งไลบรารี:,. หลังจากติดตั้งไลบรารีเรารีบูท Arduino IDE เชลล์นั่นคือปิดและเริ่มต้นอีกครั้ง จากนั้นเลือกเมนูไฟล์ / ตัวอย่าง / iarduino Pressure BMP (เซ็นเซอร์ความดัน) / ตัวอย่าง
เราเห็นรหัสในหน้าต่าง
รหัสจะต้องมีการแก้ไขเล็กน้อย
ในบรรทัดที่ห้าให้ลบเครื่องหมายสแลชสองตัว“ //” และเพิ่ม (0x76) หรือ (0x77) ในบรรทัดที่สิบเอ็ด (0x76) เป็นที่อยู่ของบอร์ดบารอมิเตอร์ บอร์ด GY-BMP280-3.3 ของฉันเชื่อมต่อกับบัส I2C ปรากฏว่ามีที่อยู่เดียวกัน (0x76) จะทราบจำนวนของอุปกรณ์ที่เชื่อมต่อกับบัส I2C ได้อย่างไร? คุณจะได้รับคำตอบสำหรับคำถามนี้โดยอ่านบทความเต็ม
ดังนั้นเราแก้ไขรหัสในหน้าต่างตอนนี้เราเริ่มตรวจสอบและรวบรวมรหัสในเมนู Sketch / Check / Compile หากการตรวจสอบและการรวบรวมรหัสสำเร็จในเมนู Sketch / Load เราจะเริ่มการบันทึกโปรแกรมใน Arduino Uno
หากการดาวน์โหลดสำเร็จแล้วด้วยการเปิดมอนิเตอร์พอร์ตอนุกรมในเมนู: เครื่องมือ / การตรวจสอบพอร์ตอนุกรมเราจะเห็นข้อมูลที่ส่งโดยบอร์ด GY-BMP280-3.3
ในภาพหน้าจอต่อไปนี้ผลลัพธ์ของบอร์ด GY-BMP280-3.3 ที่ทำงานบนคอมพิวเตอร์ที่ไม่ได้ติดตั้ง Arduino IDE shell รับข้อมูลโดยโปรแกรม PuTTY
ในขณะเดียวกันบารอมิเตอร์แอนรอยด์ในห้องปฏิบัติการก็ถูกถ่ายภาพซึ่งตั้งอยู่ติดกับบอร์ด GY-BMP280-3.3 ด้วยการเปรียบเทียบการอ่านค่าเครื่องมือคุณสามารถสรุปข้อสรุปเกี่ยวกับความแม่นยำของบอร์ด GY-BMP280-3.3 บารอมิเตอร์แบบแอนลอยด์ได้รับการรับรองโดยห้องปฏิบัติการของรัฐ
ขั้นตอนที่สาม. การตรวจสอบจอแสดงผล LCD ด้วยโมดูลอินเตอร์เฟส I2C เราพบจอแสดงผล LDC พร้อมโมดูลอินเตอร์เฟสที่เชื่อมต่อผ่าน I2C บัสไปยัง Arduino UNO
เราตรวจสอบการทำงานโดยใช้ตัวอย่างจากเปลือก IDE Arduino แต่ก่อนหน้านั้นเราจะกำหนดที่อยู่ของโมดูลอินเตอร์เฟส โมดูลส่วนต่อประสานของฉันมีที่อยู่ 0x3F ฉันใส่ที่อยู่นี้ลงในบรรทัดร่าง: LiquidCrystal_I2C lcd (0x3F, 16.2);
ฉันระบุที่อยู่นี้โดยใช้ร่าง“ เครื่องสแกนที่อยู่อุปกรณ์ I2C” ร่างที่อธิบายไว้ใน
ฉันเปิดตัวเปลือก Arduino IDE จากบทความที่ฉันคัดลอกรหัสโปรแกรมและวางหน้าต่าง Arduino IDE
ฉันเริ่มการรวบรวมจากนั้นฉันก็เขียนรหัสไปยังบอร์ด Arduino UNO ซึ่งบอร์ด GY-BMP280-3.3 และจอแสดงผล LDC พร้อมโมดูลเชื่อมต่อ I2C เชื่อมต่อ จากนั้นในการตรวจสอบพอร์ตอนุกรมฉันได้รับผลดังต่อไปนี้ โมดูลส่วนต่อประสานของฉันมีที่อยู่ 0x3F
ขั้นตอนที่สี่. ตรวจสอบเซ็นเซอร์อุณหภูมิ DS18b20 เราเชื่อมต่อมันดังนี้
ห้องสมุด OneWire Arduino สำหรับการทำงานกับเซ็นเซอร์อุณหภูมิ DS18b20 ได้รับการติดตั้งแล้ว
เปิดตัวอย่างอุณหภูมิ DS18x20_Temile รวบรวมโหลดดูผลการวัดในมอนิเตอร์พอร์ตอนุกรม หากทุกอย่างใช้งานได้ให้ทำตามขั้นตอนต่อไป
ขั้นตอนที่ห้า. การชุมนุม บ้าน สถานีตรวจอากาศบน GY-BMP280-3.3 และ Ds18b20
เรารวบรวมอุปกรณ์ตามแบบแผน:
ฉันได้รับรหัสสำหรับอุปกรณ์โดยการรวมตัวอย่างทั้งหมดเป็นหนึ่งและตั้งค่าผลลัพธ์บนหน้าจอแสดงผล LDC นี่คือสิ่งที่ฉันได้รับ:
// Uncomment สำหรับการติดตั้งซอฟต์แวร์ของบัส I2C: //
// #define pin_SW_SDA 3 // กำหนดหมุด Arduino ใด ๆ ให้ทำงานเป็นสาย SDA ของบัสซอฟต์แวร์ I2C
// #define pin_SW_SCL 9 // กำหนดหมุด Arduino ใด ๆ เพื่อใช้เป็นสาย SCL ไปยังซอฟต์แวร์บัส I2C
// Uncomment สำหรับความเข้ากันได้กับบอร์ดส่วนใหญ่: //
#include
#include // ห้องสมุด iarduino จะใช้วิธีการและฟังก์ชั่นของห้องสมุดลวด
#include // Library สำหรับการทำงาน LDC ประเภท 1602 บน I2C บัส
//
#include // เชื่อมต่อไลบรารี iarduino_Pressure_BMP เพื่อทำงานกับ BMP180 หรือ BMP280
เซ็นเซอร์ iarduino_Pressure_BMP (0x76); // ประกาศวัตถุเซ็นเซอร์สำหรับการทำงานกับเซ็นเซอร์ความดันโดยใช้ฟังก์ชั่นและวิธีการของห้องสมุด iarduino_Pressure_BMP
LiquidCrystal_I2C lcd (0x3F, 16.2);
OneWire ds (10);
การตั้งค่าเป็นโมฆะ () {
lcd.init ();
lcd.backlight ();
Serial.begin (9600); // เริ่มต้นการถ่ายโอนข้อมูลไปยังมอนิเตอร์พอร์ตอนุกรมที่ 9600 baud
ล่าช้า (1,000); // เรากำลังรอความสมบูรณ์ของสภาวะชั่วคราวเมื่อใช้พลังงาน
sensor.begin (73); // เริ่มต้นทำงานกับเซ็นเซอร์ ระดับความสูงปัจจุบันจะอยู่ที่ 73 ม. - ความสูงของเมือง Buzuluk เหนือระดับน้ำทะเล
} //
void loop () {
// อ่านข้อมูลและหน้าจอ: อุณหภูมิเป็น° C, ความดันเป็นมิลลิเมตร rt. เปลี่ยนความสูงเทียบกับที่ระบุในฟังก์ชั่นเริ่มต้น (ค่าเริ่มต้น 0 เมตร)
lcd.setCursor (0,0); // กำหนดจุดส่งออก "P =" บน LDC
lcd.print ("P =");
lcd.print (เซ็นเซอร์ความดัน / 1000.3); // หารค่าของ P ที่ออกโดย BMP280 ด้วย 1,000 และตั้งค่าเอาต์พุตทศนิยม 3 ตำแหน่ง
lcd.setCursor (12.0); // กำหนดจุดส่งออก "kPa" บน LDC
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("T =");
lcd.print (เซ็นเซอร์อุณหภูมิ 1); // ตั้งค่าเอาต์พุตทศนิยม 1 ตำแหน่ง
lcd.setCursor (6.1);
// lcd.print ("C");
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1);
if (sensor.read (1)) {Serial.println ((สตริง) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tMM.PT.CT, \ t T = "+ sensor.temperature +" * C, \ t \ t B = "+ sensor.altitude +" M. ");}
อื่น {Serial.println ("HET OTBETA OT CEHCOPA");}
// อ่านข้อมูลและจอแสดงผล: อุณหภูมิเป็น° C และความดันเป็น Pa, ความดันเป็นมิลลิเมตร rt. เปลี่ยนความสูงเทียบกับที่ระบุในฟังก์ชั่นเริ่มต้น (ค่าเริ่มต้น 0 เมตร)
if (sensor.read (2)) {Serial.println ((สตริง) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tPa, \ t \ t T =" + เซ็นเซอร์อุณหภูมิ + "* C, \ t \ t B =" + sensor.altitude + "M. ");}
อื่น {Serial.println ("HET OTBETA OT CEHCOPA");}
ไบต์ฉัน
ไบต์ปัจจุบัน = 0;
ไบต์ type_s;
ข้อมูลไบต์ [12];
ไบต์ addr [8];
เซลเซียสลอยฟาเรนไฮต์;
if (! ds.search (addr)) {
Serial.println ("ไม่มีที่อยู่อีกต่อไป");
อนุกรม. println ();
ds.reset_search ();
ล่าช้า (250);
กลับ;
}
Serial.print ("ROM =");
สำหรับ (i = 0; i & lt; 8; i ++) {
Serial.write ('');
Serial.print (addr [i], HEX);
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
Serial.println ("CRC ไม่ถูกต้อง!");
กลับ;
}
อนุกรม. println ();
// ไบต์แรกของ ROM ระบุว่าชิปตัวใด
สวิตช์ (addr [0]) {
กรณี 0x10:
Serial.println ("ชิป = DS18S20"); // หรือ DS1820 เก่า
type_s = 1;
ทำลาย;
กรณี 0x28:
Serial.println ("ชิป = DS18B20");
type_s = 0;
ทำลาย;
กรณี 0x22:
Serial.println ("ชิป = DS1822");
type_s = 0;
ทำลาย;
เริ่มต้น:
Serial.println ("อุปกรณ์ไม่ใช่อุปกรณ์ตระกูล DS18x20");
กลับ;
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // เริ่มต้นการแปลงโดยเปิดการใช้งานปรสิต
ล่าช้า (1,000); // บางที 750ms ก็เพียงพอแล้วอาจจะไม่
// เราอาจทำ ds.depower () ที่นี่ แต่การรีเซ็ตจะดูแล
ปัจจุบัน = ds.reset ();
ds.select (addr);
ds.write (0xBE); // อ่าน Scratchpad
Serial.print ("Data =");
Serial.print (ปัจจุบัน HEX);
Serial.print ("");
สำหรับ (i = 0; i & lt; 9; i ++) {// เราต้องการ 9 ไบต์
data [i] = ds.read ();
Serial.print (data [i], HEX);
Serial.print ("");
}
Serial.print ("CRC =");
Serial.print (OneWire :: crc8 (data, 8), HEX);
อนุกรม. println ();
// แปลงข้อมูลเป็นอุณหภูมิจริง
// เนื่องจากผลลัพธ์เป็นเลขจำนวนเต็ม 16 บิตที่ควรจะเป็น
// ถูกเก็บไว้ในประเภท "int16_t" ซึ่งเป็น 16 บิตเสมอ
// แม้ในขณะที่คอมไพล์บนโปรเซสเซอร์ 32 บิต
int16_t raw = (data [1] & lt; & lt; 8) | ข้อมูล [0];
ถ้า (type_s) {
raw = raw & lt; & lt; 3; // ความละเอียด 9 บิตเริ่มต้น
if (data [7] == 0x10) {
// "จำนวนที่เหลืออยู่" ให้ความละเอียดเต็ม 12 บิต
raw = (raw & amp; 0xFFF0) + 12 - ข้อมูล [6];
}
} อื่น {
ไบต์ cfg = (ข้อมูล [4] & amp; 0x60);
// ที่ความละเอียดต่ำบิตต่ำจะไม่ถูกกำหนดดังนั้นให้เป็นศูนย์
ถ้า (cfg == 0x00) raw = raw & amp; ~ 7; // ความละเอียด 9 บิต 93.75 ms
อื่นถ้า (cfg == 0x20) raw = raw & amp; ~ 3; // ความละเอียด 10 บิต 187.5 ms
อื่นถ้า (cfg == 0x40) raw = raw & amp; ~ 1; // ความละเอียด 11 บิต, 375 ms
//// ค่าเริ่มต้นคือความละเอียด 12 บิตเวลาแปลง 750 ms
}
เซลเซียส = (ลอย) ดิบ / 16.0;
fahrenheit = เซลเซียส * 1.8 + 32.0;
Serial.print ("อุณหภูมิ =");
Serial.print (เซลเซียส);
Serial.print ("เซลเซียส");
Serial.print (ฟาเรนไฮต์);
Serial.println ("ฟาเรนไฮต์");
lcd.setCursor (8.1); // กำหนดจุดส่งออก "Tds =" บน LDC
lcd.print ("Tds =");
lcd.print (เซลเซียส 1);
ล่าช้า (3000);
}
นี่คือสิ่งที่ฉันได้รับ:
บอร์ด GY-BMP280-3.3 ให้ความดันเป็นปาสคาลซึ่งไม่สะดวกมาก ฉันไม่สามารถแก้ปัญหาวิธีทำให้ GY-BMP280-3.3 ข้อมูลแรงดันเอาท์พุทบอร์ดเป็นกิโล ฉันแก้ไขปัญหานี้ในบรรทัดเอาต์พุตของจอแสดงผล LDC
lcd.print (เซ็นเซอร์ความดัน / 1000.3); // หารค่าของ P ที่ออกโดย BMP280 ด้วย 1,000 และตั้งค่าเอาต์พุตทศนิยม 3 ตำแหน่ง
บอร์ด GY-BMP280-3.3 ยังให้ค่าความสูง
sensor.begin (73); // เริ่มต้นทำงานกับเซ็นเซอร์ ระดับความสูงปัจจุบันจะอยู่ที่ 73 ม. - ความสูงของเมือง Buzuluk เหนือระดับน้ำทะเล
หากคุณจะผ่อนคลายในทะเลและเปลี่ยน“ sensor.begin (73);” ใน "sensor.begin (0);" ในรหัสจากนั้นรวบรวมและบันทึกโปรแกรมไปยังสถานีตรวจอากาศที่บ้านใน GY-BMP280-3.3 และ Ds18b20 และสร้างเอาต์พุตความสูงไปยังจอแสดงผล LDC คุณจะได้รับเครื่องวัดระยะสูงด้วย
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1); // พิมพ์ค่าความสูงเป็นเมตรด้วยทศนิยมหนึ่งตำแหน่ง
กำลังไฟจ่ายให้กับวงจรในเวอร์ชั่นของฉันผ่านสาย USB คุณสามารถใช้ตัวแปลงพัลส์เพิ่มแรงดันไฟฟ้าต่ำ 5V / 600 mA และสถานีอากาศของคุณจะกลายเป็นแบบพกพา แหล่งจ่ายไฟประเภทนี้ได้รับการอธิบายอย่างดีใน บทความ.
การรวบรวมสำเร็จ!