20.1 C
Hanoi
Thứ Hai, Tháng Mười 18, 2021
Home LẬP TRÌNH VI ĐIỀU KHIỂN ARDUINO Kết nối nhiều màn hình LCD16x02 giao tiếp I2C

Kết nối nhiều màn hình LCD16x02 giao tiếp I2C

Màn hình LCD16x02 giao tiếp I2C

Black IIC/I2C/TWI 16x2 Serial Character LCD Module Display for Arduino w/Library | eBay

In-Depth: Interfacing an I2C LCD with Arduino

Thông số kĩ thuật

  • Điện áp hoạt động: 2.5-6V DC.
  • Hỗ trợ màn hình: LCD1602,1604,2004 (driver HD44780).
  • Giao tiếp: I2C, IC giao tiếp PCF8574 làm trung gian giữa Arduino với LCD1602 8 bit .
  • Địa chỉ mặc định: 0X27 (có thể điều chỉnh bằng ngắn mạch chân A0/A1/A2).
  • Tích hợp Jump chốt để cung cấp đèn cho LCD hoặc ngắt.
  • Tích hợp biến trở xoay điều chỉnh độ tương phản cho LCD.

Để sử dụng màn hình LCD giao tiếp I2C sử dụng Arduino thì ta cần cài đặt thư viện Liquidcrystal_I2C. Tại đây

Các lỗi thường gặp khi sử dụng I2C LCD

  • Hiển thị một dãy ô vuông.
  • Màn hình chỉ in ra một ký tự đầu.
  • Màn hình nhấp nháy.

Các lỗi này chủ yếu là do sai địa chỉ bus, để fix lỗi các bạn thay địa chỉ mặc định là “0x27” thành “0x3F.

Trong trường hợp vẫn không được các bạn fix lỗi bằng cách nạp code tìm địa chỉ bus của I2C.

Sau khi tìm xong các bạn thay địa chỉ vừa tìm được vào vị trí “0x27” là xong.

Giao tiếp I2C LCD Arduino

Module I2C LCD 16×2  Arduino UNO
GND GND
VCC 5V
SDA A4/SDA
SCL A5/SCL

Sơ đồ đấu nối mootjmanf hình LCD1602 I2C

giao tiep i2c lcd 16x2
Sơ đồ đấu nối giao tiếp IC2 với LCD 16×2.

Code quét các device trong một bus I2C

Module I2C PCF8574 hỗ trợ giao tiếp I2C với 7bit địa chỉ, trong đó có 4 bit cố định và 3 bit có thể được người dùng tùy chỉnh có dạng 0 1 0 0 A2 A1 A0. Mặc định, trên module nhà sản xuất để các chân A0, A1, A2 ở mức logic cao nên PCF8574 có địa chỉ là 0x27. Để thay đổi địa chỉ của IC này khi cần, bạn có thể tùy chọn thay đổi các mức logic của 3 chân này bằng cách nối xuống GND (mức thấp) cho các chân  A0, A1, A2.

Kết nối nhiều ngoại vi với IC mở rộng chân PCF8574 - Điện Tử Hello

I2C LCD Backpack - PCF8574 [4585] : Sunrom Electronics

Các bạn có thể tải code tìm địa chỉ bus ở đây. Tải ngay.


  // --------------------------------------
//http://playground.arduino.cc/Main/I2cScanner
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
// Watch Video explainign I2C address: https://www.youtube.com/watch?v=bqMMIbmYJS0
//
 
#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("
I2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found
");
  else
    Serial.println("done
");
 
  delay(5000);           // wait 5 seconds for next scan
} 
First Steps with the Arduino-UNO R3 and NANO | Maker, MakerED, Coding | RFID RC522 Tag-Card Reader with LCD1602-I2C | EDU: Digital CitiZENship, CyberSecurity, eSkills, Modern EDU by Gust MEES

Code chương trình cho 2 màn hình LCD 16×02, kết nối với Arduino


 /*
 * Arduino code for use two or more LCD1602 with I2C with Arduino
 *  Custom function to display float (like 2.45), integer (like 2 or 8) and string
 *  very easily 
 
 * this Arduino sketch makes it possible to use two display at the set time
 * 
* Watch video instruction for this code: https://youtu.be/L6ekl2ABcuY
* * 
 * Written by Ahmad Shamshiri for Robojax.com on Saturday November 17, 2018 
 * at 20:45 in Ajax, Ontario, Canada
 * 
 
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 

#include <Wire.h> // this is part of arduino
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd1(0x3F, 16, 2);// display 1
LiquidCrystal_I2C lcd2(0x26, 16, 2);// display 2


// number settings
const int decimals = 2;// number of decimal places needed to be displayed
const int positions = 5;// total position of numbers including the decimal places

void setup() {
  // initialize the LCD
  lcd1.begin();//initialize LCD1
  lcd2.begin();//initialize LCD2
  lcd1.backlight();// turn the backlight ON for the LCD1
  lcd2.backlight();// turn the backlight ON for the LCD2  
    

  Serial.begin(9600);// initialize serial monitor with 9600 baud

      lcd1.print("Robojax Display");
      lcd1.setCursor(0,1);
      lcd1.print("Display 1"); 
      
      lcd2.print("Robojax Display");
      lcd2.setCursor(0,1);
      lcd2.print("Display 2");     
           
      Serial.println("Robojax Displays"); 
      Serial.println("2 or More");      

  delay(3000);// change this line if you want not to wait
  lcd1.clear();// clearn screen 1
  lcd2.clear();// clearn screen 2  
}

void loop() {
  // Robojax.com multiple LCD1602 I2C display

  int age = 31;
  int days= age * 365;
  float weight = 4.84;
  float voltage = 22.1;
  

      lcdDisplay(1, 0, "Age: ", intToStr(age), " years"); // print "Age: 31 years" to line 1 of display 1
      lcdDisplay(1, 1, "Days: ", intToStr(days), " days");// print "Days: 11351 days" to line 2 of display 1   

      lcdDisplay(2, 0, "Weight: ", floatToStr(weight), " kg");//print "Weight: 2.84 kg" t line 1 of display 2
      lcdDisplay(2, 1, "Voltage: ", floatToStr(voltage), "V");// print "Voltage 22.10V" to line 2 of display 2  
                  
      Serial.println("Age: ");Serial.print(age); Serial.print(" years");  
      Serial.println("Days: ");Serial.print(days); Serial.print(" days");
    Serial.println("====");  
          
 delay(50); // wait for 200 milliseconds       
}// loop end



/*
 * Written by Ahmad Shamshiri on Nov 17, 2018 for Robojax.com
 * lcdDisplay(int dis, int rowNum, String titleText, String valueText, String value2Text)
  for example to display
 * dis is display number
 * rowNum  is row number  (0)
 * title is the text (Voltage:)
 * valueText is the value 
 *  value2Text is the appended to the valueText like (A, V etc)
 * 
 * @brief prints text on the screen on specific row and character
 * @param tc=text character number, trc=text row number, 
 * @return the remaining time as integet second

 * 
 */
void lcdDisplay(int dis, int rowNum, String titleText, String valueText, String value2Text)
{
    clearRow(dis,rowNum);
    String myStr;
    myStr = String(valueText);

    int titleTextLength = titleText.length();
   // Robojax.com multiple LCD1602 I2C display
   if(dis ==1)
   {
     lcd1.setCursor (0,rowNum); //
     lcd1.print(titleText);
     
     lcd1.setCursor (titleTextLength,rowNum); //
     lcd1.print(myStr);
     
     lcd1.setCursor (myStr.length()+titleTextLength,rowNum); //
     lcd1.print(value2Text);  
   } 
   if(dis ==2)
   {
     lcd2.setCursor (0,rowNum); //
     lcd2.print(titleText);
     
     lcd2.setCursor (titleTextLength,rowNum); //
     lcd2.print(myStr);
     
     lcd2.setCursor (myStr.length()+titleTextLength,rowNum); //
     lcd2.print(value2Text);  
   }    
 
}

/*
 * Written by Ahmad Shamshiri on Nov 17, 2018 for Robojax.com
 * @brief clears only one row of specific display
 * @param d, the display number integer
 * @param r, the row number integer
 * @return no return value
 */
void clearRow(int d,int r)
{
  //
  for(int i=0; i<16; i++)
  {
    if(d ==1)
    {
      lcd1.setCursor (i,r); //
      lcd1.print(" ");
    }
    if(d ==2)
    {
      lcd2.setCursor (i,r); //
      lcd2.print(" ");
    } 
       
  }
}//clearRow end


/*
 * Written by Ahmad Shamshiri on Nov 18, 2018 for Robojax.com
 * @brief converts integer to string
 * @param a, the integer wanted to convert
 * @return the converted value as string
 */
String intToStr(int a)
{

  return String(a);
}//intToStr end
 

/*
 * @brief converts float to string
 * @param a, the float wanted to convert
 * @return the converted value as string
 */
String floatToStr(float a)
{
  char buff[6]; // create a buffer of 6 character
  dtostrf(a, positions, decimals, buff );// 5 positions and 2 decimal places
  return buff;// return the buffer
}//floatToStr end
 

 

Tham khảo: Robojax.com

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Tổng hợp trang web liên quan thiết kế phần cứng điện tử

4 trang web tải thư viện SCH/PCB và 3D https://www.ultralibrarian.com/ https://componentsearchengine.com/ https://octopart.com/ https://www.snapeda.com/ https://componentsearchengine.com/ 2 trang tìm 3D cho thư viện của các bạn bao gồm: https://www.3dcontentcentral.com/ https://grabcad.com/library 4 trang cung cấp các...

Mạch đóng ngắt Relay sử dụng Transistor

Giới thiệu về Relay Rơ le (Relay) là một công tắc chuyển đổi hoạt động bằng điện. Dòng điện chạy qua cuộn dây của rơ...

Nạp Bootloader cho Arduino Pro Micro

Bootloader là một chương trình nhỏ được nạp sẵn vào chip vi điều khiển trên Arduino, nhờ đó bạn lập trình cho Arduino một...

Một vài lưu ý khi thiết kế sản phẩm đáp ứng EMC

Mỗi bảng mạch in (PCB) phải có thể hoạt động mà không bị gián đoạn do nhiễu từ các thiết bị khác và không...

Recent Comments