Tôi muốn thu thập tự làm dụng cụ sẽ đo áp suất và nhiệt độ khí quyển. Cảm biến nhiệt độ phải ở xa và chặt, vì nó phải đo nhiệt độ ở một khoảng cách nhất định với thiết bị. Tôi muốn có một thiết bị di động như vậy với phạm vi hoạt động từ -30 ° C đến 50 ° C. Nhưng điều này đòi hỏi tất cả các thành phần có thể làm việc trong phạm vi nhiệt độ này. Các thành phần có thể hoạt động trong phạm vi nhiệt độ mở rộng sẽ đắt hơn và khó mua hơn.
Để thực hiện ước mơ của tôi thành hiện thực, tôi sẽ được hội đồng quản trị giúp đỡ, điều mà tôi đã mô tả trong bài viếtBảng GY-BMP280-3.3 để đo áp suất và nhiệt độ khí quyển».
Từ thực tế, người ta biết rằng trong quá trình lắp ráp và cấu hình điện tử sản phẩm trước khi sản xuất, bạn cần kiểm tra khả năng bảo dưỡng của tất cả các vật liệu và thành phần của từng loại riêng biệt. Nếu không, bạn có thể bị nhầm lẫn sau đó và do đó, sản phẩm điện tử sẽ không hoạt động và sẽ rất khó để tìm ra nguyên nhân của sự cố.
Hãy bắt đầu nào.
Giai đoạn đầu. Cài đặt phần mềm miễn phí trên máy tính của bạn Arduino IDE để viết chương trình (phác thảo), biên dịch chúng và sau đó viết chúng vào vi điều khiển Mega328P được cài đặt trên bảng. Tôi khuyên bạn nên tải xuống phiên bản vỏ của ARDUINO 1.6.5. Tại sao? Ban đầu, dự án ARDUINO là một, bây giờ các nhà phát triển đã phân tán và tiếp tục phát triển hệ thống ARDUINO, nhưng mỗi người theo một cách riêng, với những sắc thái nhỏ. Tôi đã sử dụng phiên bản ARDUINO 1.6.5. Nó nên được cài đặt và thử nghiệm để cộng tác với bo mạch Arduino Uno bằng các ví dụ đơn giản nhất.
Giai đoạn thứ hai. Chúng tôi kiểm tra bảng GY-BMP280-3.3 để đo áp suất và nhiệt độ khí quyển. Chúng tôi lấy 4 dây, chúng tôi kết nối chúng với GY-BMP280-3.3 và Arduino Uno, như trong ảnh và sơ đồ. Đường cong mỏng nhiều màu là dây dẫn.
Hãy bắt đầu kiểm tra bảng GY-BMP280-3.3. Để làm điều này, bạn cần cài đặt thư viện trong Arduino IDE, được viết bởi các lập trình viên làm việc trên trang web. Theo quy định, sau khi cài đặt thư viện trong Arduino IDE, các ví dụ (mẫu) mã xuất hiện. Bằng cách thay đổi một chút mã mẫu, chúng ta có thể biên dịch nó thành dữ liệu mà vi điều khiển hiểu được, sau đó gửi nó đến bộ nhớ của vi điều khiển. Bạn có thể tìm thấy một ví dụ (mẫu) bằng cách chú ý đến hai ảnh màn hình bên dưới.
Sau khi ghi dữ liệu vào bộ vi điều khiển của bo mạch Arduino Uno, nó ngay lập tức bắt đầu thực hiện chương trình (mã) và gửi dữ liệu qua cáp USB đến máy tính mà bo mạch Arduino Uno được kết nối.Và chúng ta có thể thấy kết quả đo của bo mạch GY-BMP280-3.3 trong cửa sổ Arduino IDE, được gọi là màn hình cổng nối tiếp của nhà vua.
Chúng ta có thể thấy kết quả của các phép đo trên bảng GY-BMP280-3.3 trong chương trình Windows Hyper Terminal tiêu chuẩn, sau khi đóng vỏ Arduino Uno và thiết lập một phiên trong chương trình Hyper Terminal. Đó là, chúng ta có thể nhận được kết quả của bảng GY-BMP280-3.3 bằng cách kết nối Arduino Uno với bất kỳ máy tính nào bằng cáp USB nơi cài đặt trình điều khiển cho bo mạch Arduino Uno. Có một số thư viện để làm việc với GY-BMP280-3.3. Tất cả mọi thứ làm việc cho tôi với thư viện. Tệp mà bạn tải xuống từ trang web này sẽ trông như thế này: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Nó cần được đổi tên thành: iarduino_Pressure_BMP.zip. Bây giờ chúng ta cần cài đặt thư viện iarduino_Pressure_BMP trong vỏ Arduino IDE.
Khởi chạy Arduino IDE, đi tới menu Thư viện Phác thảo / Bao gồm Librari / Add.ZIP ... sau đó chọn tệp iarduino_Pressure_BMP.zip và nhấp vào nút Mở. Bạn cũng cần cài đặt các thư viện :. Sau khi cài đặt các thư viện, chúng tôi khởi động lại vỏ Arduino IDE, nghĩa là đóng nó lại và khởi động lại. Sau đó chọn menu Tệp / Mẫu / iarduino Áp suất BMP (cảm biến áp suất) / ví dụ.
Chúng tôi thấy mã trong cửa sổ.
Mã sẽ cần phải được sửa đổi một chút.
Trong dòng thứ năm, xóa hai dấu gạch chéo / // và thêm (0x76) hoặc (0x77) trong dòng thứ mười một. (0x76) là địa chỉ của bảng áp kế. Bảng GY-BMP280-3.3 của tôi được kết nối với bus I2C hóa ra có cùng địa chỉ (0x76). Làm thế nào để tìm ra số thiết bị được kết nối với bus I2C? Bạn sẽ nhận được câu trả lời cho câu hỏi này bằng cách đọc toàn bộ bài viết.
Vì vậy, chúng tôi đã sửa mã trong cửa sổ, bây giờ chúng tôi bắt đầu kiểm tra và biên dịch mã trong menu Phác thảo / Kiểm tra / Biên dịch. Nếu việc xác minh và biên dịch mã thành công, thì trong menu Phác thảo / Tải, chúng tôi bắt đầu ghi chương trình trong Arduino Uno.
Nếu quá trình tải xuống thành công, thì bằng cách mở trình giám sát cổng nối tiếp trong menu: Công cụ / Trình giám sát cổng nối tiếp, chúng ta sẽ thấy dữ liệu được gửi bởi bảng GY-BMP280-3.3.
Trong ảnh chụp màn hình sau đây, kết quả của bảng GY-BMP280-3.3 hoạt động trên máy tính không cài đặt vỏ Arduino IDE. Dữ liệu được nhận bởi chương trình PuTTY.
Đồng thời, một phong vũ biểu aneroid trong phòng thí nghiệm đã được chụp ảnh, được đặt bên cạnh bảng GY-BMP280-3.3. Bằng cách so sánh các bài đọc nhạc cụ, bản thân bạn có thể rút ra kết luận về độ chính xác của bảng GY-BMP280-3.3. Phong vũ biểu Aneroid được chứng nhận bởi phòng thí nghiệm nhà nước.
Giai đoạn thứ ba. Kiểm tra màn hình LCD với mô-đun giao diện I2C. Chúng tôi tìm thấy một màn hình LDC với một mô-đun giao diện kết nối thông qua bus I2C với Arduino UNO.
Chúng tôi kiểm tra hoạt động của nó bằng cách sử dụng các ví dụ từ vỏ Arduino IDE. Nhưng trước đó, chúng tôi xác định địa chỉ của mô-đun giao diện. Mô-đun giao diện của tôi có địa chỉ 0x3F. Tôi đã chèn địa chỉ này vào dòng phác thảo: màn hình LCD LiquidCstall_I2C (0x3F, 16.2);
Tôi đã xác định địa chỉ này bằng cách sử dụng trình quét địa chỉ thiết bị I2C của bản phác thảo mô tả trong.
Tôi đã khởi chạy shell Arduino IDE, từ bài viết tôi đã sao chép mã chương trình và dán cửa sổ Arduino IDE của nó.
Tôi bắt đầu biên dịch, sau đó tôi viết mã cho bảng Arduino UNO, trong đó bảng GY-BMP280-3.3 và màn hình LDC với mô-đun giao diện I2C được kết nối. Sau đó, trong màn hình cổng nối tiếp tôi nhận được kết quả như sau. Mô-đun giao diện của tôi có địa chỉ 0x3F.
Giai đoạn thứ tư. Kiểm tra cảm biến nhiệt độ DS18b20. Chúng tôi kết nối nó như sau.
Thư viện Arduino OneWire để làm việc với cảm biến nhiệt độ DS18b20 đã được cài đặt.
Mở mẫu DS18x20_Tem Nhiệt độ, biên dịch, tải, xem kết quả đo trong màn hình cổng nối tiếp. Nếu mọi thứ hoạt động, tiến hành bước tiếp theo.
Giai đoạn thứ năm. Hội nhà trạm thời tiết trên GY-BMP280-3.3 và Ds18b20.
Chúng tôi lắp ráp thiết bị theo sơ đồ:
Tôi đã nhận được mã cho thiết bị bằng cách kết hợp tất cả các ví dụ thành một và đặt đầu ra trên màn hình hiển thị LDC. Đây là những gì tôi nhận được:
// Không chú ý đến việc triển khai phần mềm của bus I2C: //
// #define pin_SW_SDA 3 // Chỉ định bất kỳ chân Arduino nào hoạt động như một dòng SDA của bus phần mềm I2C.
// #define pin_SW_SCL 9 // Gán bất kỳ chân Arduino nào để hoạt động như một đường SCL cho bus phần mềm I2C.
// Uncomment cho khả năng tương thích với hầu hết các bảng: //
#incolee
#include // Thư viện iarduino sẽ sử dụng các phương thức và chức năng của thư viện Dây.
#include // Thư viện để làm việc LDC loại 1602 trên bus I2C
//
#include // Kết nối thư viện iarduino_Pressure_BMP để hoạt động với BMP180 hoặc BMP280.
cảm biến iarduino_Pressure_BMP (0x76); // Khai báo một đối tượng cảm biến để làm việc với cảm biến áp suất bằng cách sử dụng các chức năng và phương thức của thư viện iarduino_Pressure_BMP.
Màn hình LCD LiquidCstall_I2C (0x3F, 16.2);
DS OneWire (10);
void setup () {
LCD.init ();
LCD.backlight ();
Nối tiếp.begin (9600); // Bắt đầu truyền dữ liệu đến màn hình cổng nối tiếp ở 9600 baud.
độ trễ (1000); // Chúng tôi đang chờ hoàn thành quá độ khi áp dụng điện
cảm biến.begin (73); // Bắt đầu làm việc với cảm biến. Độ cao hiện tại sẽ được lấy là 73 m - chiều cao của thành phố Buzuluk so với mực nước biển
} //
void loop () {
// Đọc dữ liệu và hiển thị: nhiệt độ tính bằng ° C, áp suất tính bằng mm. rt., thay đổi chiều cao so với chỉ định trong chức năng bắt đầu (mặc định 0 mét).
lcd.setCoder (0,0); // xác định điểm đầu ra "P =" trên LDC
lcd.print ("P =");
lcd.print (cảm biến.pressure / 1000.3); // chia giá trị của P do BMP280 phát hành cho 1000 và đặt đầu ra của 3 vị trí thập phân
lcd.setCoder (12.0); // xác định điểm đầu ra "kPa" trên LDC
lcd.print ("kPa");
lcd.setCoder (0,1);
lcd.print ("T =");
lcd.print (cảm biến. Nhiệt độ, 1); // đặt đầu ra của 1 vị trí thập phân
lcd.setCoder (6.1);
// lcd.print ("C");
// lcd.setCoder (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1);
if (sensor.read (1)) {serial.println ((Chuỗi) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tMM.PT.CT, \ t T = "+ cảm biến. Nhiệt độ +" * C, \ t \ t B = "+ cảm biến.altitude +" M. ");}
other {serial.println ("HET OTBETA OT CEHCOPA");}
// Đọc dữ liệu và hiển thị: nhiệt độ tính bằng ° C và áp suất tính bằng Pa, áp suất tính bằng mm. rt., thay đổi chiều cao so với chỉ định trong chức năng bắt đầu (mặc định 0 mét).
if (sensor.read (2)) {serial.println ((Chuỗi) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tPa, \ t \ t T =" + cảm biến.tem Nhiệt độ + "* C, \ t \ t B =" + cảm biến.altitude + "M.");}
other {serial.println ("HET OTBETA OT CEHCOPA");}
byte i;
byte hiện tại = 0;
kiểu byte_s;
dữ liệu byte [12];
byte bổ sung [8];
phao celsius, fahrenheit;
if (! ds.search (addr)) {
Serial.println ("Không có thêm địa chỉ.");
Nối tiếp.println ();
ds.reset_search ();
trì hoãn (250);
trở về
}
Số sê-ri ("ROM =");
cho (i = 0; i & lt; 8; i ++) {
Nối tiếp.write ('');
Serial.print (addr [i], HEX);
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
Serial.println ("CRC không hợp lệ!");
trở về
}
Nối tiếp.println ();
// byte ROM đầu tiên cho biết chip nào
chuyển đổi (addr [0]) {
trường hợp 0x10:
Serial.println ("Chip = DS18S20"); // hoặc DS1820 cũ
loại_s = 1;
phá vỡ;
trường hợp 0x28:
Nối tiếp.println ("Chip = DS18B20");
loại_s = 0;
phá vỡ;
trường hợp 0x22:
Nối tiếp.println ("Chip = DS1822");
loại_s = 0;
phá vỡ;
mặc định
Serial.println ("Thiết bị không phải là thiết bị gia đình DS18x20.");
trở về
}
DS.reset ();
ds.select (addr);
DS.write (0x44, 1); // bắt đầu chuyển đổi, với sức mạnh ký sinh ở cuối
độ trễ (1000); // có thể 750ms là đủ, có thể không
// chúng ta có thể thực hiện một DS.depower () tại đây, nhưng việc thiết lập lại sẽ giải quyết nó.
hiện tại = ds.reset ();
ds.select (addr);
DS.write (0xBE); // Đọc Scratchpad
Serial.print ("Dữ liệu =");
Serial.print (hiện tại, HEX);
Số sê-ri ("");
for (i = 0; i & lt; 9; i ++) {// chúng ta cần 9 byte
dữ liệu [i] = ds.read ();
Serial.print (dữ liệu [i], HEX);
Số sê-ri ("");
}
Số sê-ri ("CRC =");
Serial.print (OneWire :: crc8 (dữ liệu, 8), HEX);
Nối tiếp.println ();
// Chuyển đổi dữ liệu sang nhiệt độ thực tế
// vì kết quả là số nguyên có chữ ký 16 bit, nên nó
// được lưu trữ thành loại "int16_t", luôn là 16 bit
// ngay cả khi được biên dịch trên bộ xử lý 32 bit.
int16_t raw = (dữ liệu [1] & lt; & lt; 8) | dữ liệu [0];
if (type_s) {
nguyên = thô & lt; & lt; 3; // Độ phân giải 9 bit mặc định
if (dữ liệu [7] == 0x10) {
// "vẫn còn" cho độ phân giải 12 bit đầy đủ
raw = (raw & amp; 0xFFF0) + 12 - dữ liệu [6];
}
} khác {
byte cfg = (dữ liệu [4] & amp; 0x60);
// ở độ phân giải thấp hơn, các bit thấp không được xác định, vì vậy hãy để chúng không
if (cfg == 0x00) raw = raw & amp; ~ 7; // độ phân giải 9 bit, 93,75 ms
khác nếu (cfg == 0x20) raw = raw & amp; ~ 3; // độ phân giải 10 bit, 187,5 ms
khác nếu (cfg == 0x40) raw = raw & amp; ~ 1; // độ phân giải 11 bit, 375 ms
//// mặc định là độ phân giải 12 bit, thời gian chuyển đổi 750 ms
}
celsius = (float) thô / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print ("Nhiệt độ =");
Nối tiếp.print (celsius);
Số sê-ri ("Celsius,");
Nối tiếp.print (fahrenheit);
Serial.println ("Fahrenheit");
lcd.setCoder (8.1); // xác định điểm đầu ra "Tds =" trên LDC
lcd.print ("Tds =");
LCD.print (celsius, 1);
độ trễ (3000);
}
Đây là những gì tôi nhận được:
Bảng GY-BMP280-3.3 tạo áp lực trong pascal, không thuận tiện lắm. Tôi không thể giải quyết vấn đề làm thế nào để tạo dữ liệu áp suất đầu ra của bảng GY-BMP280-3.3 tính bằng kilopascals. Tôi đã giải quyết vấn đề này trong dòng đầu ra của màn hình LDC.
lcd.print (cảm biến.pressure / 1000.3); // chia giá trị của P do BMP280 phát hành cho 1000 và đặt đầu ra của 3 vị trí thập phân
Bảng GY-BMP280-3.3 cũng cung cấp các giá trị độ cao.
cảm biến.begin (73); // Bắt đầu làm việc với cảm biến. Độ cao hiện tại sẽ được lấy là 73 m - chiều cao của thành phố Buzuluk so với mực nước biển
Nếu bạn sẽ thư giãn trên biển và thay đổi cảm biến trên mạng.begin (73); trên "cảm biến.begin (0);" trong mã, sau đó biên dịch và lưu chương trình vào trạm thời tiết gia đình trên GY-BMP280-3.3 và Ds18b20, và tạo đầu ra chiều cao cho màn hình LDC, bạn cũng sẽ có được một máy đo độ cao.
// lcd.setCoder (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1); // In các giá trị chiều cao tính bằng mét với một chữ số thập phân
Nguồn được cung cấp cho mạch trong phiên bản của tôi thông qua cáp USB. Bạn có thể sử dụng bộ chuyển đổi xung tăng áp thấp 5V / 600 mA và trạm thời tiết của bạn sẽ trở thành di động. Loại cung cấp năng lượng này được mô tả tốt trong bài viết.
Biên soạn thành công!