Hiện thị thời tiết dựa trên Arduino bằng cảm biến BME280 và LCD Nokia 5110
BME280 là cảm biến áp suất khí quyển, nhiệt độ và độ ẩm tương đối của Bosch Sensortec . Trong dự án này, cảm biến BME280 được sử dụng ở chế độ I2C.
LCD Nokia 5110 có độ phân giải 84 x 48 pixel, được sử dụng trong dự án này để hiển thị các giá trị về áp suất, nhiệt độ và độ ẩm.
Yêu cầu phần cứng:
- Board Arduino
- Màn hình LCD Nokia 5110
- Mô-đun cảm biến BME280 với bộ điều chỉnh 3,3V và bộ chuyển đổi mức độ- > Board dữ liệu BME280
- 5 x Điện trở 3,3k ohm
- 5 x Điện trở 2.2k ohm
- Breadboard
- Dây dẫn
Chip BME280 hoạt động với điện áp tối đa 3,6V (dải điện áp cung cấp từ 1,71 đến 3,6V) vì vậy chúng tôi sử dụng bộ điều chỉnh điện áp 3V3 để cung cấp cho nó từ nguồn 5V.
Ngoài ra, nếu chúng tôi làm việc với hệ thống 5V (board phát triển, vi điều khiển) như board Arduino UNO, chúng tôi sẽ sử dụng bộ chuyển đổi mức điện áp (bộ chuyển đổi mức) để chuyển đổi 3.3V (từ chip BME280) thành 5V ( đi đến Arduino) và ngược lại. Bộ dịch mức này dành cho các bus I2C (đồng hồ và dữ liệu).
Trong ví dụ này, tôi đang sử dụng mô-đun BME280 đi kèm với bộ điều chỉnh 3,3V và bộ dịch mức, để nối sẽ dễ dàng hơn!
Hình ảnh sau đây cho thấy sơ đồ mạch dự án.
Lưu ý rằng mô-đun BME280 được hiển thị trong sơ đồ mạch có bộ điều chỉnh 3,3V và bộ dịch mức.
Nói chung, mô-đun BME280 có ít nhất 4 chân vì nó có thể hoạt động ở chế độ SPI hoặc chế độ I2C. Đối với chế độ I2C, chúng ta cần 4 chân: VCC, GND, SDA và SCL trong đó:
- GND (nối đất) được nối với chân Arduino GND
- VCC là chân cung cấp được nối với chân Arduino 5V
- SDA là chân dữ liệu nối tiếp bus I2C, được nối với chân Arduino analog 4 (A4)
- SCL là dòng đồng hồ nối tiếp bus I2C, được nối với chân analog 5 (A5).
Chân LCD Nokia 5110 được nối với board Arduino UNO như sau (mỗi chân được nối qua bộ chia điện áp):
- Chân RST (RESET) được nối với chân Arduino A3
- CE (kích hoạt chip) được nối với chân Arduino A4
- DC (dữ liệu / lệnh ) chân được nối với chân Arduino A5
- DIN (dữ liệu trong) được nối với chân Arduino A6
- CLK (xung) được nối với chân Arduino A7
- VCC và BL được nối với chân Arduino 3V3
- GND được nối với chân GND Arduino.
Bộ chia điện áp được sử dụng để chuyển nguồn Arduino 5V thành 3V vì áp dụng 5V trực tiếp vào bộ điều khiển LCD có thể làm hỏng nó!
CODE
Arduino IDE sau đây yêu cầu 3 thư viện từ Adafbean Industries :
Thư viện đầu tiên là trình điều khiển cho Nokia 5110 LCD (bộ điều khiển PCD8544) có thể được cài đặt từ trình quản lý thư viện Arduino IDE (Sketch —> Include Library —> Manage Libraries, trong hộp tìm kiếm, viết nokia và cài đặt thư viện từ Adafbean).
Thư viện thứ hai là thư viện Adafruit graphics cũng có thể được cài đặt từ trình quản lý thư viện Arduino IDE.
Thư viện thứ ba dành cho cảm biến BME280.
3 thư viện trước đó cũng có thể được cài đặt thủ công, tải về các liên kết dưới:
Adafruit Nokia 5110 LCD library —-> direct link
Adafruit graphics library —-> direct link
Adafruit BME280 Library —-> direct link
Bạn có thể cần cài đặt thư viện Adafruit Unified Sensor nếu chưa cài đặt, liên kết tải xuống ở bên dưới:
Adafruit Unified Sensor library —-> direct link
Sau khi tải xuống, hãy truy cập Arduino IDE —> Sketch —> Include Library —> Add .ZIP Library và duyệt tìm tệp .zip (đã tải xuống trước đó).
Thực hiện tương tự cho các tập tin thư viện khác.
Trong code có tổng cộng 4 thư viện như sau:
#include <SPI.h> // include SPI library#include <Adafruit_GFX.h> // include adafruit graphics library#include <Adafruit_PCD8544.h> // include adafruit PCD8544 (Nokia 5110) library#include <Adafruit_BME280.h> // include adafruit library for BME280 sensor
Nối LCD Nokia 5110 với Arduino được khai báo như dưới đây:
// Nokia 5110 LCD module connections (CLK, DIN, D/C, CS, RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
Giống như mọi thiết bị I2C khác, cảm biến BME280 có địa chỉ bus I2C là 0x76 hoặc 0x77. Địa chỉ này phụ thuộc vào nối của chân SDO (được sử dụng cho chế độ SPI dưới dạng dữ liệu nối tiếp hoặc MISO), nếu chân SDO được nối (trực tiếp hoặc qua điện trở) với VCC (3.3V), địa chỉ sẽ là 0x77 và nếu đó là nối với GND, địa chỉ sẽ là 0x76.
Địa chỉ I2C mặc định của thư viện được xác định là 0x77 và địa chỉ I2C thiết bị của tôi là 0x76.
Trong code, định nghĩa của địa chỉ bus I2C như dưới đây:
// define device I2C address: 0x76 or 0x77 (0x77 is library default address)
#define BME280_I2C_ADDRESS 0x76
Việc khởi tạo cảm biến BME280 được thực hiện bằng cách sử dụng hàm started () trả về 1 nếu OK và 0 nếu có lỗi. Trong code, việc khởi tạo với địa chỉ được xác định trước đó như dưới đây:
bme280.begin(BME280_I2C_ADDRESS)
Đọc các giá trị của nhiệt độ và áp suất được thực hiện như dưới đây:
// get temperature, pressure and altitude from library
float temp = bme280.readTemperature(); // get temperature
float humidity = bme280.readHumidity(); // get humidity in %
float pressure = bme280.readPressure() / 100; // get pressure
Lưu ý rằng thư viện cảm biến BME280 trả về giá trị áp suất theo đơn vị Pa và để chuyển đổi nó thành hPa, chúng tôi sẽ chia nó cho 100.
1 bar = 10000 Pa = 100 hPa. ( 1 hPa = 100 Pa = 1 millibar)
Pa: Pascal
hPa: hectoPascal
Code Arduino đầy đủ:
#include <SPI.h> // include SPI library
#include <Adafruit_GFX.h> // include adafruit graphics library#include <Adafruit_PCD8544.h> // include adafruit PCD8544 (Nokia 5110) library#include <Adafruit_BME280.h> // include adafruit library for BME280 sensor// Nokia 5110 LCD module connections (CLK, DIN, D/C, CS, RST)Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);// define device I2C address: 0x76 or 0x77 (0x77 is library default address)#define BME280_I2C_ADDRESS 0x76Adafruit_BME280 bme280;void setup(){// initialize the displaydisplay.clearDisplay(); // clear the screen and bufferdisplay.begin();// you can change the contrast around to adapt the display// for the best viewing!display.setContrast(50);display.setTextSize(1);display.setTextColor(BLACK, WHITE);if ( !bme280.begin(BME280_I2C_ADDRESS) ){ // connection error!display.setCursor(0, 0);display.println(“Connection”);display.print(“error!”);display.display();while (1); // stay here!}display.setCursor(7, 0);display.print(“TEMPERATURE:”);display.setCursor(16, 16);display.print(“HUMIDITY:”);display.setCursor(16, 33);display.print(“PRESSURE:”);display.display();}// variable declarationchar text[12];// main loopvoid loop(){// get temperature and pressure from libraryfloat temp = bme280.readTemperature(); // get temperature in degree Celsiusfloat humidity = bme280.readHumidity(); // get humidity in %float pressure = bme280.readPressure() / 100; // get pressure in hPa// print data on the LCD screen// 1: print temperaturedisplay.setCursor(15, 8);if(temp >= 0)display.print(‘ ‘);elsedisplay.print(‘-‘);sprintf(text, “%02u.%02u C”, (int)abs(temp), (int)(abs(temp) * 100) % 100);display.print(text);display.drawRect(53, 8, 3, 3, BLACK); // print degree symbol ( ° )// 2: print humiditysprintf(text, “%02u.%02u %%”, (int)humidity, (int)(humidity * 100) % 100);display.setCursor(21, 24);display.print(text);// 3: print pressuresprintf(text, “%04u.%02u hPa”, (int)pressure, (int)((uint32_t)(pressure * 100) % 100));display.setCursor(9, 41);display.print(text);// now update the displaydisplay.display();delay(2000); // wait 2 seconds}// end of code.
Video demo dự án: