In deze Arduino LCD 20x4 I2C tutorial leren we hoe u een LCD 20x4 (Liquid Crystal Display) aansluit op een Arduino board via de I2C-interface.
Of u kunt de volgende kits kopen:
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.
Aankoopadvies: Een andere optie is om het LCD I2C-display te maken door LCD 2004 Display en PCF8574 I2C Adapter Module te combineren.
De LCD 20x4 I2C gebruikt de I2C-interface en heeft dus 4 pinnen:
GND pin: moet verbonden zijn met GND (0V).
VCC pin: de voedingsspanning voor de LCD, moet verbonden zijn met VCC (5V).
SDA pin: I2C data signaal
SCL pin: I2C klok signaal
De LCD I2C 20x4 bestaat uit 20 kolommen en 4 rijen. De kolommen en rijen zijn genummerd vanaf 0.

Deze afbeelding is gemaakt met Fritzing. Klik om de afbeelding te vergroten.
| LCD I2C | Arduino Uno, Nano | Arduino Mega |
| Vin | 5V | 5V |
| GND | GND | GND |
| SDA | A4 | 20 |
| SCL | A5 | 21 |
Dankzij de DIYables_LCD_I2C bibliotheek is het gebruik van de LCD heel eenvoudig.
#include <DIYables_LCD_I2C.h>
DIYables_LCD_I2C lcd(0x27, 20, 4);
lcd.init();
lcd.backlight();
lcd.setCursor(column_index, row_index);
lcd.print("Hello World!");
※ Notiz:
Het I2C-adres van de LCD kan variëren afhankelijk van de fabrikant. In de code gebruiken we 0x27, zoals gespecificeerd door fabrikant DIYables
#include <DIYables_LCD_I2C.h>
DIYables_LCD_I2C lcd(0x27, 20, 4);
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("LCD 20x4");
lcd.setCursor(0, 1);
lcd.print("I2C Address: 0x27");
lcd.setCursor(0, 2);
lcd.print("DIYables");
lcd.setCursor(0, 3);
lcd.print("www.diyables.io");
}
void loop() {
}
Navigeer naar het Libraries icoon in de linkerzijbalk van de Arduino IDE.
Zoek "DIYables LCD I2C" en vind de DIYables_LCD_I2C bibliotheek van DIYables
Klik op de Installeren knop om de DIYables_LCD_I2C bibliotheek te installeren.
Kopieer de bovenstaande code en open deze met de Arduino IDE
Klik op de Upload knop in de Arduino IDE om de code naar de Arduino te uploaden
Bekijk het resultaat op de LCD
We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.
Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten en helpt u stap voor stap bij het aansluiten en programmeren van de LCD 20x4 met Arduino via I2C.
De onderstaande videodemo gebruikt de onderstaande code. Let op: de video toont de Arduino Uno R4, maar het werkt identiek voor de Arduino Uno R3:
#include <Wire.h>
#include <DIYables_LCD_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
DIYables_LCD_I2C lcd(0x27, 20, 4);
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
Servo doorServo;
#define SERVO_PIN 6
#define BUZZER 8
byte adminUID[4] = {0x3C, 0x7F, 0xB3, 0x02};
enum State { IDLE, SCANNING, GRANTED, DENIED, LOCKED };
State systemState = IDLE;
int failCount = 0;
unsigned long stateTime = 0;
unsigned long lockTime = 0;
void beepOK() {
for (int i = 0; i < 2; i++) {
digitalWrite(BUZZER,HIGH);
delay(100);
digitalWrite(BUZZER,LOW);
delay(50);
}
}
void beepFail() {
for (int i = 0; i < 3; i++) {
digitalWrite(BUZZER,HIGH);
delay(150);
digitalWrite(BUZZER,LOW);
delay(80);
}
}
void beepLock() {
digitalWrite(BUZZER,HIGH);
delay(300);
digitalWrite(BUZZER,LOW);
}
void showIdle() {
lcd.clear();
lcd.setCursor(0,0); lcd.print("SYSTEM READY");
lcd.setCursor(0,1); lcd.print("PLEASE SCAN CARD");
lcd.setCursor(0,2); lcd.print("DOOR: LOCKED");
lcd.setCursor(0,3); lcd.print("SECURITY: ACTIVE");
Serial.println("[STATE] IDLE");
systemState = IDLE;
}
void showScanning() {
lcd.clear();
lcd.setCursor(0,1);
lcd.print("SCANNING CARD...");
Serial.println("[STATE] SCANNING");
systemState = SCANNING;
}
void showGranted() {
lcd.clear();
lcd.setCursor(0,0); lcd.print("SYSTEM: GRANTED");
lcd.setCursor(0,1); lcd.print("USER: ADMIN");
lcd.setCursor(0,2); lcd.print("OPENING DOOR...");
lcd.setCursor(0,3); lcd.print("AUTO LOCK 3s");
doorServo.write(90);
beepOK();
stateTime = millis();
systemState = GRANTED;
Serial.println("[STATE] GRANTED");
}
void showDenied(byte *uid) {
lcd.clear();
lcd.setCursor(0,0); lcd.print("SYSTEM: DENIED");
lcd.setCursor(0,1); lcd.print("UID: ");
for (byte i=0;i<4;i++) {
lcd.print(uid[i], HEX);
lcd.print(" ");
}
lcd.setCursor(0,2); lcd.print("ACCESS BLOCKED");
failCount++;
lcd.setCursor(0,3);
lcd.print("FAIL: ");
lcd.print(failCount);
lcd.print("/3");
beepFail();
stateTime = millis();
systemState = DENIED;
Serial.println("[STATE] DENIED");
}
bool isAdmin(byte *uid) {
for (byte i=0;i<4;i++) {
if (uid[i] != adminUID[i]) return false;
}
return true;
}
void lockSystem() {
systemState = LOCKED;
lcd.clear();
lcd.setCursor(0,1);
lcd.print("SYSTEM LOCKED!");
lcd.setCursor(0,2);
lcd.print("TOO MANY FAILS");
doorServo.write(0);
beepLock();
Serial.println("[STATE] LOCKED");
delay(3000);
failCount = 0;
showIdle();
}
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
SPI.begin();
rfid.PCD_Init();
doorServo.attach(SERVO_PIN);
doorServo.write(0);
pinMode(BUZZER, OUTPUT);
showIdle();
}
void loop() {
if (failCount >= 3 && systemState != LOCKED) {
lockSystem();
return;
}
if (systemState == DENIED && millis() - stateTime > 2000) {
showIdle();
}
if (systemState == GRANTED && millis() - stateTime > 3000) {
doorServo.write(0);
beepLock();
showIdle();
}
if (!rfid.PICC_IsNewCardPresent()) return;
if (!rfid.PICC_ReadCardSerial()) return;
showScanning();
byte *uid = rfid.uid.uidByte;
Serial.print("UID: ");
for (byte i=0;i<rfid.uid.size;i++) {
Serial.print(uid[i], HEX);
Serial.print(" ");
}
Serial.println();
delay(300);
if (isAdmin(uid)) {
showGranted();
} else {
showDenied(uid);
}
rfid.PICC_HaltA();
}