아두이노 우노 R4 LCD 20x4
이 튜토리얼에서는 I2C 인터페이스를 사용하여 Arduino UNO R4 보드와 함께 20x4 LCD 디스플레이를 사용하는 방법을 보여드리겠습니다. 구체적으로, 우리는 다음을 배울 것입니다:
1 × Arduino UNO R4 WiFi or Arduino UNO R4 Minima
1 × (또는) DIYables STEM V4 IoT, Compatible with Arduino Uno R4 WiFi 쿠팡 | 아마존
1 × USB 케이블 타입-A to 타입-C (USB-A PC용) 쿠팡 | 아마존
1 × USB 케이블 타입-C to 타입-C (USB-C PC용) 아마존
1 × LCD 20x4 쿠팡 | 아마존
1 × 점퍼케이블 쿠팡 | 아마존
1 × (추천 ) 아두이노 우노 R4용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1 × (추천 ) Sensors/Servo Expansion Shield for Arduino UNO R4 쿠팡 | 아마존
1 × (추천 ) 아두이노 우노 R4용 브레드보드 쉴드 쿠팡 | 아마존
1 × (추천 ) 아두이노 우노 R4용 케이스 쿠팡 | 아마존
1 × (추천 ) 아두이노 우노 R4용 전원 분배기 쿠팡 | 아마존
1 × (추천 ) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
LCD 20x4 I2C는 I2C 인터페이스를 사용하며 4개의 핀이 있습니다:
LCD I2C 20x4는 20개의 열과 4개의 행을 가지고 있습니다. 열과 행은 0부터 시작합니다.
이 이미지는 Fritzing 을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
Arduino Uno R4와 기타 부품에 전원을 공급하는 가장 효과적인 방법을 확인하시려면, 아래 링크를 참조하세요: 아두이노 우노 R4 전원 공급 방법 .
LCD I2C Arduino UNO R4, Nano Arduino Mega
Vin 5V 5V
GND GND GND
SDA A4 20
SCL A5 21
DIYables_LCD_I2C 라이브러리를 사용하면 LCD 사용이 매우 쉽습니다.
#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!" );
※ 주의:
다른 제조업체들은 LCD에 대해 다른 I2C 주소를 사용할 수 있습니다. 우리의 예시에서는 제조업체 DIYables가 제공한 0x27 주소를 사용했습니다.
#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 () {
}
다음 지침을 단계별로 따르세요:
제공된 다이어그램에 따라 Arduino UNO R4에 LCD I2C 20x4를 연결합니다.
USB 케이블을 사용하여 Arduino Uno R4 보드를 컴퓨터에 연결합니다.
컴퓨터에서 Arduino IDE를 실행합니다.
적절한 Arduino Uno R4 보드(예: Arduino Uno R4 WiFi )와 COM 포트를 선택합니다.
Arduino IDE 좌측에 있는 Libraries 아이콘으로 이동합니다.
"DIYables LCD I2C" 를 입력하고 DIYables의 DIYables_LCD_I2C 라이브러리를 찾습니다.
Install 버튼을 눌러 DIYables_LCD_I2C 라이브러리를 추가합니다.
당신의 Arduino Uno R4 보드가 LCD에 충분한 전력을 공급하지 못할 수 있습니다. 만약 LCD가 밝지 않거나 문자를 표시하지 않는다면, LCD에 외부 전원 공급 장치를 사용하세요. 아래에 보이는 것처럼 전원 분배기 세트 를 사용할 수 있습니다.
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.
아래 동영상 데모는 아래 코드를 사용합니다:
#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 ();
}