» อิเล็กทรอนิกส์ » Arduino »สถานีตรวจอากาศที่บ้านใน GY-BMP280-3.3 และ Ds18b20

สถานีตรวจอากาศที่บ้านใน GY-BMP280-3.3 และ Ds18b20


ฉันต้องการสะสม ทำมันเอง เครื่องมือที่จะวัดความดันบรรยากาศและอุณหภูมิ เซ็นเซอร์วัดอุณหภูมิจะต้องอยู่ในระยะไกลและแน่นเพราะจะต้องวัดอุณหภูมิในระยะที่แน่นอนจากอุปกรณ์ ฉันต้องการมีอุปกรณ์พกพาที่มีช่วงการทำงานตั้งแต่ -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
สถานีตรวจอากาศที่บ้านใน GY-BMP280-3.3 และ Ds18b20

เราตรวจสอบการทำงานโดยใช้ตัวอย่างจากเปลือก 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 และสถานีอากาศของคุณจะกลายเป็นแบบพกพา แหล่งจ่ายไฟประเภทนี้ได้รับการอธิบายอย่างดีใน บทความ.

การรวบรวมสำเร็จ!
5
8.8
6.3

เพิ่มความคิดเห็น

    • รอยยิ้มรอยยิ้มxaxaตกลงdontknowyahooNea
      นายรอยขีดข่วนคนโง่ใช่ใช่ใช่ก้าวร้าวลับ
      ขอโทษเต้นdance2dance3ให้อภัยช่วยเหลือเครื่องดื่ม
      หยุดเพื่อนดีgoodgoodนกหวีดหน้ามืดตามัวลิ้น
      ควันการตบมือเครย์ประกาศเป็นขี้ปากดอน t_mentionดาวน์โหลด
      ความร้อนโมโหlaugh1ภาคตะวันออกเฉียงเหนือประชุมmoskingเชิงลบ
      not_iข้าวโพดคั่วลงโทษอ่านทำให้ตกใจกลัวค้นหา
      ยั่วยุthank_youนี้to_clueumnikรุนแรงเห็นด้วย
      ไม่ดีbeeeblack_eyeblum3หน้าแดงโม้ความเบื่อ
      เซ็นเซอร์การหยอกล้อsecret2ขู่ชัยชนะYusun_bespectacled
      shokrespektฮ่า ๆprevedยินดีต้อนรับkrutoyya_za
      ya_dobryiผู้ช่วยne_huliganne_othodiFLUDห้ามใกล้

เราแนะนำให้คุณอ่าน:

มอบให้กับสมาร์ทโฟน ...