[Arduino IDE] Lập trình STM32F103C8T6 với DHT11 hiển thị LCD

4
3344

Chuẩn bị linh kiện

  • Kit STM32F103C8 BluePill 
  • Cảm biến nhiệt độ độ ẩm DHT11
  • Màn hình LCD16x2
  • Module I2C cho LCD16x2
  • Board cắm

Thông số DHT11:

  • Nguồn: 3 -> 5 VDC.
  • Dòng sử dụng: 2.5mA max (khi truyền dữ liệu).
  • Đo tốt ở độ ẩm 20 to 70%RH với sai số 5%.
  • Đo tốt ở nhiệt độ 0 to 50°C sai số ±2°C.
  • Tần số lấy mẫu tối đa 1Hz (1 giây 1 lần)
  • Kích thước 15mm x 12mm x 5.5mm.
  • 4 chân, khoảng cách chân 2.54mm

Thông số KIT STM32:

  • Vi điều khiển: STM32F103C8T6.
  • Điện áp cấp 5VDC qua cổng Micro USB sẽ được chuyển đổi thành 3.3VDC qua IC nguồn và cấp cho Vi điều khiển chính.
  • Tích hợp sẵn thạch anh 8Mhz.
  • Tích hợp sẵn thạnh anh 32Khz cho các ứng dụng RTC.
  • Ra chân đầy đủ tất cả các GPIO và giao tiếp: CAN, I2C, SPI, UART, USB,…
  • Tích hợp Led trạng thái nguồn, Led PC13, Nút Reset.
  • Kích thước: 53.34 x 15.24mm.

Để sử dụng các loại LCD có driver là HD44780(LCD 1602, LCD 2004, … ), cần có ít nhất 6 chân của MCU kết nối với các chân RS, EN, D7, D6, D5 và D4 để có thể giao tiếp với LCD. Nhưng với module chuyển giao tiếp LCD sang I2C, các bạn chỉ cần 2 chân (SDA và SCL)  của MCU kết nối với 2 chân (SDA và SCL) của module là đã có thể hiển thị thông tin  lên LCD. Ngoài ra có thể điều chỉnh được độ tương phản bởi biến trở gắn trên module.
Lưu ý : các phiên bản cũ địa chỉ của bus i2c là 0X27 , loại mới là 0x3F

Lắp đặt thiết bị

Kết nối module I2C LCD với STM32F103C8T6

I2C LCDSTM32F103C8T6
VCC5V
GNDGND
SDAPB7
SCLPB6

Kết nối cảm biến DHT11 với STM32F103C8T6

DHT11STM32F103C8
VCC5V
GNDGND
DataPA1

Lập trình

Kiểm tra địa chỉ I2C của module I2C LCD

Trên Arduino IDE bạn chọn Tools =>Board =>Generic STM32F103C8 đẻ chọn IC cần dùng

Tiếp theo chọn  Files =>Examples =>Wire =>I2C scanner wire để mở chương trình mẫu quét địa chỉ I2C của ngoại vi

Biên dịch chương trình quét địa chỉ I2C và Upload chương trình xuống STM32F103C8T6. Mở Serial Monitor trong Arduino IDE, ta sẽ thấy kết quả cho địa chỉ I2C như hình dưới đây:

Địa chỉ module I2C cho màn hình 16×2 LCD là (0x27)

Tiếp theo bạn cần chắc chắn rằng đã cài đặt bộ thư viện cho DHT11. Có thể cài thư viện cho DHT11 bằng 2 cách:

  • Cách 1: Trong  Arduino IDE, click vào Sketch trên thanh công cụ chọn Include Library > Manage Libraries. Trong cửa sổ Library Manager bạn click vào Filter your seach để tiềm kiếm thư viện với từ khóa “DHT”, chọn Install để tiến hành cài đặt., chờ cài đặt xong thư viện.
  • Cách 2: Tải file .zip thư viện DHT11 tại https://github.com/adafruit/DHT-sensor-library, giải nén và copy vào thư mục chứa thư viện Arduino trên máy tính của bạn.

Tương tự bạn cũng cần cài bộ thư viện I2C để giao tiếp với module I2C LCD 16×2. File .zip tải xuống tại https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

Code

Include các file Header:

#include <Wire.h>      
#include <LiquidCrystal_I2C.h>  
#include <DHT.h>                    

Khai báo chân dữ liệu cho DHT11:

#define DHTPIN PA1

Định nghĩa tên cảm biến cần dùng:

#define DHTTYPE DHT11

Định nghĩa các thông số cho module I2C+LCD

LiquidCrystal_I2C lcd(0x27, 16, 2); //Địa chỉ I2C là 0x27, LCD 16x02

Khởi tạo cảm biến:

DHT dht(DHTPIN, DHTTYPE);  

Void setup()

Khởi tạo LCD trong void setup ():

lcd.begin();

Bắt đầu nhận giá trị nhiệt độ, độ ẩm của DHT11 trong void setup ():

dht.begin();  

Hiện thị ban đầu cho LCD:

lcd.backlight();     
lcd.setCursor(0,0);
lcd.print("CIRCUIT DIGEST");
lcd.setCursor(0,1);
lcd.print("DHT11 with STM32");
delay(3000);
lcd.clear();

Vòng lặp void loop()

Lấy giá trị nhiệt độ, độ ẩm từ cảm biến:

float h = dht.readHumidity();      
float t = dht.readTemperature();   

Hiern thị kết quả lên LCd16x02:

  lcd.setCursor(0,0);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print("Humid: ");
  lcd.print(h);
  lcd.print(" %");

Toàn bộ Code:

#include <Wire.h>      //Library for using I2C 
#include <LiquidCrystal_I2C.h>  //Library for using I2C type LCD display
#include <DHT.h>                    //Library for using DHT sensor 

#define DHTPIN PA1 

#define DHTTYPE DHT11

LiquidCrystal_I2C lcd(0x27, 16, 2);  //initilize object lcd for class LiquidCrystal_I2C with I2C address of 0x27 and 16x2 type LCD display

DHT dht(DHTPIN, DHTTYPE);     //initilize object dht for class DHT with DHT pin with STM32 and DHT type as DHT11

void setup()
{
  // initialize the LCD
  lcd.begin();
  dht.begin();          //Begins to receive Temperature and humidity values.                        
  lcd.backlight();      // Turn on the blacklight and print a welcome message.
  lcd.setCursor(0,0);
  lcd.print("CIRCUIT DIGEST");
  lcd.setCursor(0,1);
  lcd.print("DHT11 with STM32");
  delay(3000);
  lcd.clear();
}

void loop()
{
  float h = dht.readHumidity();       //Gets Humidity value
  float t = dht.readTemperature();    //Gets Temperature value
  lcd.setCursor(0,0);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print("Humid: ");
  lcd.print(h);
  lcd.print(" %");
}

Kết quả

Tham khảo: https://circuitdigest.com/

4 COMMENTS

  1. You really make it seem so easy with your presentation but I find this topic to be
    actually something which I think I would never understand.
    It seems too complex and extremely broad for me.
    I am looking forward for your next post, I’ll
    try to get the hang of it!

LEAVE A REPLY

Please enter your comment!
Please enter your name here