Chế tạo cân điện tử bằng cảm biến trọng lượng (Loadcell) với Arduino
Bạn đang có một ý tưởng chế tạo cân điện tử sử dụng cảm biến trọng lượng (Loadcell) và Arduino. Thì bài hướng dẫn này dành cho bạn, với việc kết hợp giữa cảm biến Loadcell và module chuyển đổi ADC HX711, các bạn có thể đo chính xác trọng lượng của các đồ vật. Qua đó để trực quan hơn, mình sẽ sử dụng một màn hình LCD 16×2 I2C để hiển thị các thông số đo được.
Linh kiện cần thiết cho dự án
TÊN LINH KIỆN | SỐ LƯỢNG | NƠI BÁN |
Arduino Nano | 1 | Shopee | Cytron |
Cảm biến trọng lượng Loadcell 5kg | 1 | Shopee | Cytron |
Mạch chuyển đổi ADC 24-bit LoadCell HX711 | 1 | Shopee | Cytron |
Màn hình LCD 16×2 | 1 | Shopee | Cytron |
Module I2C Arduino | 1 | Shopee | Cytron |
Dây cắm | 10-20 | Shopee | Cytron |
Breadboard | 1 | Shopee | Cytron |
Tổng quan về cảm biến trọng lượng
Cảm biến LoadCell
Cảm biến trọng lượng, hay còn gọi là LoadCell, là cảm biến được sử dụng để đo lực tác động lên một đối tượng. Nó thường được sử dụng để đo lường trọng lượng hoặc lực kéo, và được áp dụng trong nhiều lĩnh vực khác nhau như cân điện tử, thiết bị y tế, tự động hóa công nghiệp, và nghiên cứu khoa học.
Mạch Chuyển Đổi ADC 24bit Loadcell HX711
Mạch chuyển đổi ADC 24-bit LoadCell HX711 là một module được sử dụng để kết nối và đọc giá trị từ các cảm biến trọng lượng (LoadCell) thông qua giao tiếp truyền thông. HX711 là một IC chuyển đổi analog-to-digital có độ phân giải cao, được thiết kế đặc biệt để đọc giá trị trọng lượng từ LoadCell một cách chính xác và ổn định.
Mạch HX711 có khả năng chuyển đổi tín hiệu analog từ LoadCell thành tín hiệu kỹ thuật số dễ dàng xử lý bằng vi điều khiển hoặc các vi mạch logic khác. Nó sử dụng phương pháp chia mức áp dựa trên nguyên tắc cầu Wheatstone để đo giá trị trọng lượng. Tín hiệu đọc được từ HX711 có độ phân giải cao lên đến 24-bit, cho phép đo lường chính xác và chi tiết của trọng lượng.
Sơ đồ đấu nối cảm biến trọng lượng với Arduino
Sơ đồ đấu nối Arduino Nano với LoadCell HX711:
Arduino | LoadCell HX711 |
5V | VCC |
GND | GND |
D4 | DT |
D5 | SCK |
Sơ đồ đấu nối Arduino Nano với màn hình LCD 16×2 I2C:
Arduino | Màn hình LCD 16×2 I2C |
5V | VCC |
GND | GND |
A4/SDA | SDA |
A5/SCL | SCL |
Code cảm biến trọng lượng
Đoạn code bên dưới cho phép Arduino đọc giá trị trọng lượng từ cảm biến LoadCell thông qua module HX711 và hiển thị kết quả lên màn hình LCD 16×2 I2C. Nó cũng có tích hợp chức năng cân bù (tare) và kiểm tra giới hạn trọng lượng.
//Arduino Digital Weight Scale HX711 Load Cell Module #include <HX711_ADC.h> // https://github.com/olkal/HX711_ADC #include <Wire.h> #include <LiquidCrystal_I2C.h> // LiquidCrystal_I2C library HX711_ADC LoadCell(4, 5); // dt pin, sck pin LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD HEX address 0x27 int taree = 6; int a = 0; float b = 0; void setup() { pinMode (taree, INPUT_PULLUP); LoadCell.begin(); // start connection to HX711 LoadCell.start(1000); // load cells gets 1000ms of time to stabilize ///////////////////////////////////// LoadCell.setCalFactor(375); // Calibarate your LOAD CELL with 100g weight, and change the value according to readings ///////////////////////////////////// lcd.begin(); // begins connection to the LCD module lcd.backlight(); // turns on the backlight lcd.setCursor(1, 0); // set cursor to first row lcd.print("Digital Scale "); // print out to LCD lcd.setCursor(0, 1); // set cursor to first row lcd.print(" 5KG MAX LOAD "); // print out to LCD delay(3000); lcd.clear(); } void loop() { lcd.setCursor(1, 0); // set cursor to first row lcd.print("Digital Scale "); // print out to LCD LoadCell.update(); // retrieves data from the load cell float i = LoadCell.getData(); // get output value if (i<0) { i = i * (-1); lcd.setCursor(0, 1); lcd.print("-"); lcd.setCursor(8, 1); lcd.print("-"); } else { lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(8, 1); lcd.print(" "); } lcd.setCursor(1, 1); // set cursor to secon row lcd.print(i, 1); // print out the retrieved value to the second row lcd.print("g "); float z = i/28.3495; lcd.setCursor(9, 1); lcd.print(z, 2); lcd.print("oz "); if (i>=5000) { i=0; lcd.setCursor(0, 0); // set cursor to secon row lcd.print(" Over Loaded "); delay(200); } if (digitalRead (taree) == LOW) { lcd.setCursor(0, 1); // set cursor to secon row lcd.print(" Taring... "); LoadCell.start(1000); lcd.setCursor(0, 1); lcd.print(" "); } }
Giải thích Code
//Arduino Digital Weight Scale HX711 Load Cell Module #include <HX711_ADC.h> // https://github.com/olkal/HX711_ADC #include <Wire.h> #include <LiquidCrystal_I2C.h> // LiquidCrystal_I2C library
HX711_ADC.h
: Thư viện để làm việc với module HX711.
Wire.h
: Thư viện I2C cho việc giao tiếp với màn hình LCD 16×2.
LiquidCrystal_I2C.h
: Thư viện để điều khiển màn hình LCD I2C.
HX711_ADC LoadCell(4, 5); // dt pin, sck pin LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD HEX address 0x27
HX711_ADC LoadCell(4, 5)
: Khởi tạo đối tượng LoadCell để tương tác với module HX711. Tham số 4 và 5 là các chân kết nối DT (data) và SCK (clock) của HX711.
LiquidCrystal_I2C lcd(0x27, 16, 2)
: Khởi tạo đối tượng lcd để điều khiển màn hình LCD I2C. Tham số 0x27 (hoặc 0x3F) là địa chỉ I2C của màn hình, 16 và 2 là số cột và số hàng của màn hình.
void setup() { pinMode (taree, INPUT_PULLUP); LoadCell.begin(); // start connection to HX711 LoadCell.start(1000); // load cells gets 1000ms of time to stabilize ///////////////////////////////////// LoadCell.setCalFactor(375); // Calibarate your LOAD CELL with 100g weight, and change the value according to readings ///////////////////////////////////// lcd.begin(); // begins connection to the LCD module lcd.backlight(); // turns on the backlight lcd.setCursor(1, 0); // set cursor to first row lcd.print("Digital Scale "); // print out to LCD lcd.setCursor(0, 1); // set cursor to first row lcd.print(" 5KG MAX LOAD "); // print out to LCD delay(3000); lcd.clear(); }
Thiết lập chân taree (nút cân bù) là INPUT_PULLUP.
Bắt đầu kết nối với module HX711 (LoadCell.begin())
và đợi 1000ms để LoadCell ổn định (LoadCell.start(1000))
.
Thiết lập hệ số hiệu chuẩn (LoadCell.setCalFactor(375))
. Hệ số này phụ thuộc vào calibarate của LoadCell và có thể thay đổi tùy theo đọc giá trị.
Khởi tạo kết nối với màn hình LCD (lcd.begin())
và bật đèn nền (lcd.backlight())
.
In ra màn hình LCD 16×2 thông báo về thiết bị và trọng lượng tối đa có thể đo.
Delay 3 giây và xóa màn hình LCD.
void loop() { lcd.setCursor(1, 0); // set cursor to first row lcd.print("Digital Scale "); // print out to LCD LoadCell.update(); // retrieves data from the load cell float i = LoadCell.getData(); // get output value if (i<0) { i = i * (-1); lcd.setCursor(0, 1); lcd.print("-"); lcd.setCursor(8, 1); lcd.print("-"); } else { lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(8, 1); lcd.print(" "); } lcd.setCursor(1, 1); // set cursor to secon row lcd.print(i, 1); // print out the retrieved value to the second row lcd.print("g "); float z = i/28.3495; lcd.setCursor(9, 1); lcd.print(z, 2); lcd.print("oz "); if (i>=5000) { i=0; lcd.setCursor(0, 0); // set cursor to secon row lcd.print(" Over Loaded "); delay(200); } if (digitalRead (taree) == LOW) { lcd.setCursor(0, 1); // set cursor to secon row lcd.print(" Taring... "); LoadCell.start(1000); lcd.setCursor(0, 1); lcd.print(" "); } }
In ra màn hình LCD thông tin về thiết bị.
Cập nhật giá trị từ LoadCell (LoadCell.update())
và lưu giá trị trong biến i.
Kiểm tra và xử lý nếu giá trị là số âm, in dấu âm trên LCD 16×2.
In giá trị đọc được từ LoadCell lên màn hình LCD I2C.
Tính toán giá trị z (đơn vị ounce) từ giá trị i (đơn vị gram) và hiển thị lên màn hình LCD.
Kiểm tra nếu giá trị i vượt quá giới hạn 5000g, đặt i về 0 và hiển thị thông báo “Over Loaded” lên màn hình LCD.
Kiểm tra nút taree (nút cân bù), nếu được nhấn, hiển thị thông báo “Taring…” lên màn hình LCD, thực hiện lại quá trình taring và xóa thông báo sau khi hoàn thành.
Thư viện HX711 ADC
- Tải thư viện HX711_ADC: https://github.com/olkal/HX711_ADC
Khung in 3D cân điện tử
Khung của cân điện tử này các bạn có thể tải các File in 3D ở đây: