Search Code

Sử dụng ACS712 để hiển thị dòng điện trên LCD1602 hoặc LCD2004 với I2C

Sử dụng ACS712 để hiển thị dòng điện trên LCD1602 hoặc LCD2004 với I2C

Trong hướng dẫn này, chúng ta sẽ học cách sử dụng cảm biến dòng điện Allegro ACS712 để đo cả dòng điện xoay chiều (AC) và một chiều (DC) và hiển thị số đọc trên LCD1602 hoặc LCD2004 sử dụng I2C. Dự án này đặc biệt hữu ích để giám sát dòng điện trong nhiều ứng dụng khác nhau, cung cấp màn hình hiển thị trực quan dữ liệu dòng điện theo thời gian thực. Đến cuối bài, bạn sẽ có một thiết lập hoạt động có thể hiển thị chính xác số đọc dòng điện trên màn hình LCD.

LCD1602-I2C display module with 4 wires

Để làm rõ về cách đấu dây và mã, hãy xem video tại các mốc thời gian được chỉ định (trong video tại 00:00).

Phần cứng được giải thích

Thành phần chính của dự án này là cảm biến dòng điện ACS712, có thể đo mức dòng điện lên đến 30A. Nó hoạt động bằng cách sử dụng hiệu ứng Hall để chuyển đổi dòng điện chạy qua nó thành điện áp đầu ra tỷ lệ thuận. Điện áp đầu ra này có thể được đọc bởi Arduino để tính toán mức dòng điện. Cảm biến có ba chân để kết nối: VCC cho nguồn, GND cho đất và OUT cho tín hiệu điện áp.

Màn hình LCD1602 hoặc LCD2004 kết nối qua I2C, cho phép đấu dây và điều khiển dễ dàng hơn chỉ bằng hai chân dữ liệu (SDA và SCL) ngoài nguồn và đất. Điều này giúp hiển thị số đọc dòng điện một cách đơn giản mà không làm rối mắt việc đấu dây với nhiều kết nối.

Chi tiết từ bảng dữ liệu

Nhà sản xuấtAllegro Microsystems
Số bộ phậnACS712ELCTR-30A-T
Điện áp logic/IO4,5–5,5 V
Điện áp cung cấp5 V
Dòng điện đầu ra (mỗi kênh)30 A
Hướng dẫn tần số PWMKhông áp dụng
Ngưỡng logic đầu vào0,5 V (đầu ra tĩnh)
Sụt áp / RDS(on) / bão hòa1,2 mΩ
Giới hạn nhiệt150 °C tối đa
Kiểu đóng góiTO-220

  • Đảm bảo tản nhiệt thích hợp cho dòng điện trên 20A.
  • Sử dụng cỡ dây phù hợp (12 AWG cho 30A) để tránh quá nhiệt.
  • Kết nối VCC với 5V và GND với đất để hoạt động đúng.
  • Đảm bảo chân OUT được kết nối với chân đầu vào analog trên Arduino (ví dụ: A0).
  • Lưu ý sự khác biệt về độ nhạy của các mẫu ACS712 khác nhau.
  • Sử dụng tụ điện để tách rời như được chỉ định trong bảng dữ liệu.

Hướng dẫn đấu dây

Arduino wiring for Allegro ACS712 current sensor with LCD

Để đấu dây cảm biến dòng điện ACS712 với Arduino và LCD, bắt đầu bằng cách kết nối chân VCC của ACS712 với chân 5V trên Arduino. Tiếp theo, kết nối chân GND của ACS712 với chân đất trên Arduino. Chân OUT của ACS712 nên được kết nối với chân analog A0 trên Arduino, nơi tín hiệu điện áp sẽ được đọc.

Đối với LCD1602 hoặc LCD2004, kết nối chân VCC với chân 5V và chân GND với đất. Chân SDA của LCD nên được kết nối với chân SDA trên Arduino (thường là A4 trên UNO), và chân SCL nên được kết nối với chân SCL trên Arduino (thường là A5 trên UNO). Đảm bảo tất cả các kết nối đều chắc chắn để đảm bảo hoạt động đúng.

Ví dụ mã và hướng dẫn chi tiết

Trong mã, chúng ta định nghĩa chân đầu vào analog để đọc đầu ra cảm biến với #define VIN A0. Điều này cho phép chúng ta dễ dàng tham chiếu đến chân nơi cảm biến được kết nối trong suốt chương trình.

#define VIN A0 // định nghĩa chân A0 của Arduino là đầu vào điện áp (V in)
const float VCC   = 5.0; // điện áp cung cấp từ 4,5 đến 5,5V. Thông thường là 5V.

Tiếp theo, chúng ta thiết lập độ nhạy dựa trên mẫu ACS712 đang sử dụng. Các giá trị độ nhạy được lưu trong một mảng, cho phép truy cập dễ dàng dựa trên lựa chọn mẫu.

const int model = 2; // nhập số mẫu (0, 1 hoặc 2 cho 5A, 20A hoặc 30A)
float sensitivity[] = {0.185, 0.100, 0.066}; // giá trị độ nhạy cho mỗi mẫu

Trong hàm setup(), chúng ta khởi tạo màn hình nối tiếp và màn hình LCD. Điều này cho phép chúng ta xem số đọc dòng điện cả trên LCD và qua màn hình nối tiếp để gỡ lỗi.

void setup() {
    Serial.begin(9600); // khởi tạo màn hình nối tiếp
    lcd.begin(); // khởi tạo LCD
    lcd.backlight(); // bật đèn nền
    lcd.print("Robojax ACS712"); // hiển thị văn bản ban đầu
    delay(2000); // chờ 2 giây
}

Hàm loop() đọc điện áp từ cảm biến, tính toán dòng điện dựa trên độ nhạy và hiển thị kết quả tương ứng. Nếu dòng điện vượt quá giới hạn cắt được chỉ định, nó hiển thị giá trị; nếu không, nó chỉ ra rằng không có dòng điện được phát hiện.

Trình diễn / Điều gì sẽ xảy ra

Khi cấp nguồn cho mạch, LCD sẽ hiển thị "Robojax ACS712" tiếp theo là "Current: " cùng với giá trị dòng điện đo được tính bằng ampe. Nếu dòng điện dưới giới hạn cắt, màn hình sẽ hiển thị "No Current." Hãy cẩn thận khi thử nghiệm với dòng điện cao, vì cảm biến có thể nóng lên (trong video tại 12:00).

Để kiểm tra thiết lập, tăng dần dòng điện qua ACS712 và quan sát các thay đổi trên LCD và màn hình nối tiếp. Đảm bảo rằng dòng điện không vượt quá giới hạn định mức của cảm biến để tránh hư hỏng.

Hình ảnh

Allegro ACS712 DC/AC current sensor with LCD1602/LCD2004 I2C and Arduino code
Allegro ACS712 DC/AC Current sensor with LCD1602/LCD2004 I2C with Arduino Code
LCD1602-I2C display module with 4 wires
LCD1602-I2C display module with 4 wires
LCD1602-I2C display module with 4 wires
LCD1602-I2C display module with 4 wires
ACS712_in_series_with_load
ACS712_in_series_with_load
allegro_ACS712_module-1
allegro_ACS712_module-1
allegro_ACS712_module-2
allegro_ACS712_module-2
allegro_ACS712_module-4
allegro_ACS712_module-4
allegro_ACS712_module-0
allegro_ACS712_module-0
Arduino wiring for Allegro ACS712 current sensor with LCD
Arduino wiring for Allegro ACS712 current sensor with LCD
131-Allegro ACS712 DC/AC current sensor with LCD1602/LCD2004 I2C and Arduino code
Ngôn ngữ: C++
/*
 * 
 * Arduino Sketch for Allegro ACS712 Current Sensor with LCD1602/LCD2004 with I2C 
 * This sensor can measure current at a range of up to 30A.
 * The current is measured and displayed on LCD1602 or LCD2004.
 * The current is also displayed on the Serial monitor (click Tools->Serial monitor).
 * It operates with 5V.
 * Please watch the video instruction and explanation for this code.
 * 
 * Written by Ahmad Shamshiri on July 14, 2018 at 07:02 in Ajax, Ontario, Canada
 * for Robojax.com
 * View the video instruction at https://youtu.be/kzXouSzvcp8
 * This code has been downloaded from Robojax.com
 
  * You must watch the following two videos before you can understand this:
 * 1- Introduction to ACS712 Current Sensor: https://www.youtube.com/watch?v=DVp9k3xu9IQ
 * 2- LCD1602 with I2C display: https://www.youtube.com/watch?v=q9YC_GVHy5A
 */
#define VIN A0 // define the Arduino pin A0 as voltage input (V in)
const float VCC   = 5.0;// supply voltage is from 4.5 to 5.5V. Normally 5V.
const int model = 2;   // enter the model number (see below)

float cutOffLimit = 1.01;// set the current which, below that value, doesn't matter. Or set 0.5

/*
          "ACS712ELCTR-05B-T",// for model use 0
          "ACS712ELCTR-20A-T",// for model use 1
          "ACS712ELCTR-30A-T"// for model use 2  
Sensitivity array is holding the sensitivity of the ACS712
current sensors. Do not change. All values are from page 5 of the data sheet          
*/
float sensitivity[] ={
          0.185,// for ACS712ELCTR-05B-T
          0.100,// for ACS712ELCTR-20A-T
          0.066// for ACS712ELCTR-30A-T
     
         }; 


const float QOV =   0.5 * VCC;// set quiescent Output voltage of 0.5V
float voltage;// internal variable for voltage


// start of settings for LCD1602 with I2C
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
// end of settings for LCD1602 with I2C

void setup() {
    //Robojax.com ACS712 Current Sensor 
    Serial.begin(9600);// initialize serial monitor
    Serial.println("Robojax Tutorial");
    Serial.println("ACS712 Current Sensor");
  // initialize the LCD
  lcd.begin();  
  lcd.backlight();
  lcd.print("Robojax ACS712");
  lcd.setCursor(0,1);
  lcd.print("Demo"); 
  delay(2000);     
}

void loop() {
  

  //Robojax.com ACS712 Current Sensor with LCD1601
  float voltage_raw =   (5.0 / 1023.0)* analogRead(VIN);// Read the voltage from sensor
  voltage =  voltage_raw - QOV + 0.012 ;// 0.000 is a value to make voltage zero when there is no current
  float current = voltage / sensitivity[model];
 
  if(abs(current) > cutOffLimit ){
    Serial.print("V: ");
    Serial.print(voltage,3);// print voltage with 3 decimal places
    Serial.print("V, I: ");
    Serial.print(current,2); // print the current with 2 decimal places
    Serial.println("A");
    //start of loop Robojax code ACS712 with LCD1602 and I2C
    lcd.clear();
    lcd.setCursor (0,0); // set to line 1, char 0  
    lcd.print("Robojax ACS712");
    lcd.setCursor (0,1); // set to line 1, char 0  
    lcd.print("Current: ");
    lcd.setCursor (9,1); // go to start of 2nd line
    lcd.print(current);
    lcd.setCursor (14,1); // go to start of 2nd line
    lcd.print("A");
 
  }else{
    Serial.println("No Current");
    lcd.clear();
    lcd.setCursor (0,0); // set to line 1, char 0 
    lcd.print("No Current");     
  }
  delay(500);
}

Nghĩ bạn có thể cần

Tài nguyên & tài liệu tham khảo

Tập tin📁

Thư viện Arduino (tệp nén)

Bảng dữ liệu (pdf)

Tập tin Fritzing