PIC 마이크로컨트롤러로 디지털 온도 컨트롤러 만들기 🌡️🔧
안녕, 친구들! 오늘은 정말 재밌고 유용한 프로젝트를 함께 해볼 거야. 바로 PIC 마이크로컨트롤러를 이용해서 디지털 온도 컨트롤러를 만드는 거지! 😎 이 프로젝트를 통해 우리는 마이크로컨트롤러의 세계로 깊이 들어가 볼 거야. 그리고 이런 실용적인 기술을 배우면서, 어쩌면 너의 숨겨진 재능을 발견할 수도 있겠지? 그럼 우리 함께 시작해볼까?
🌟 꿀팁: 이런 프로젝트를 통해 얻은 지식과 경험은 정말 값진 자산이 될 거야. 혹시 이런 기술을 다른 사람들과 나누고 싶다면, 재능넷(https://www.jaenung.net)이라는 플랫폼을 이용해보는 건 어때? 거기서 너의 재능을 공유하고, 또 다른 사람들의 재능도 배울 수 있을 거야!
1. PIC 마이크로컨트롤러란? 🤔
자, 우선 PIC 마이크로컨트롤러에 대해 알아보자. PIC는 "Peripheral Interface Controller"의 약자야. 이름에서 알 수 있듯이, 이 작은 칩은 주변 장치들과 인터페이스하는 데 특화되어 있어. 🧠
PIC 마이크로컨트롤러는 Microchip Technology라는 회사에서 만든 마이크로컨트롤러 제품군이야. 이 작은 칩 안에는 프로세서, 메모리, 그리고 다양한 주변장치 인터페이스가 모두 들어있어. 마치 초소형 컴퓨터라고 생각하면 돼!
PIC 마이크로컨트롤러의 주요 특징:
- 저전력 소비 ⚡
- 다양한 내장 주변장치 🔌
- 높은 성능 대비 가격 💰
- 프로그래밍의 용이성 💻
- 다양한 패키지 옵션 📦
PIC 마이크로컨트롤러는 정말 다재다능해서 로봇 제어부터 가전제품, 자동차 전자 시스템까지 다양한 분야에서 사용되고 있어. 우리가 만들 디지털 온도 컨트롤러도 이 작은 칩의 힘을 빌려 만들 거야!
2. 프로젝트 개요: 디지털 온도 컨트롤러 🌡️
자, 이제 우리가 만들 디지털 온도 컨트롤러에 대해 자세히 알아보자. 이 프로젝트는 단순히 온도를 측정하는 것을 넘어서, 특정 온도를 설정하고 그 온도를 유지할 수 있도록 하는 시스템을 만드는 거야. 😎
🎯 프로젝트 목표: PIC 마이크로컨트롤러를 사용하여 온도를 측정하고, 사용자가 설정한 목표 온도에 맞춰 히터나 쿨러를 제어하는 시스템을 만든다.
이 프로젝트를 통해 우리는 다음과 같은 것들을 배우게 될 거야:
- PIC 마이크로컨트롤러 프로그래밍 🖥️
- 온도 센서 인터페이싱 🌡️
- LCD 디스플레이 제어 📟
- 릴레이를 통한 외부 장치 제어 🔌
- PID 제어 알고리즘 구현 🧮
흥미진진하지 않아? 이 프로젝트를 마치고 나면, 너는 마이크로컨트롤러를 이용한 실제 응용 시스템을 만들 수 있는 능력을 갖추게 될 거야. 어쩌면 이런 경험을 바탕으로 재능넷에서 다른 사람들에게 마이크로컨트롤러 프로그래밍을 가르치는 튜터가 될 수도 있겠어!
3. 필요한 하드웨어 준비하기 🛠️
우리의 디지털 온도 컨트롤러를 만들기 위해서는 몇 가지 하드웨어 부품들이 필요해. 자, 어떤 것들이 필요한지 하나씩 살펴보자!
🧰 필요한 부품 목록:
- PIC16F877A 마이크로컨트롤러
- LM35 온도 센서
- 16x2 LCD 디스플레이
- 10K 가변저항 (LCD 콘트라스트 조절용)
- 푸시버튼 스위치 4개 (메뉴 조작용)
- 5V 릴레이 모듈
- 각종 저항 및 커패시터
- 브레드보드 및 점퍼 와이어
- 5V 전원 공급 장치
이 부품들 중에서 가장 중요한 건 역시 PIC16F877A 마이크로컨트롤러야. 이 칩이 우리 프로젝트의 두뇌 역할을 할 거거든. 그럼 이 칩에 대해 조금 더 자세히 알아볼까?
PIC16F877A 마이크로컨트롤러 소개 🧠
PIC16F877A는 Microchip사의 8비트 마이크로컨트롤러야. 이 칩은 다음과 같은 특징을 가지고 있어:
- 8K x 14 단어의 플래시 프로그램 메모리
- 368 x 8 바이트의 데이터 메모리 (RAM)
- 256 x 8 바이트의 EEPROM 데이터 메모리
- 최대 20MHz의 동작 주파수
- 33개의 I/O 핀
- 10비트 A/D 컨버터
- 2개의 아날로그 비교기
- 프로그래머블 USART
와! 정말 많은 기능이 있지? 이 모든 기능들이 우리의 온도 컨트롤러를 만드는 데 큰 도움이 될 거야. 😊
이 다이어그램을 보면 PIC16F877A의 핀 배치를 알 수 있어. 각 핀은 특정한 기능을 가지고 있고, 우리는 이 핀들을 이용해서 온도 센서, LCD, 릴레이 등을 연결할 거야.
LM35 온도 센서 🌡️
LM35는 정밀 집적 회로 온도 센서야. 이 센서는 섭씨 온도에 비례하는 전압을 출력해. 주요 특징을 살펴볼까?
- 측정 범위: -55°C ~ 150°C
- 정확도: ±0.5°C (at 25°C)
- 선형 출력: 10mV/°C
- 저전력 소비: 60µA 미만
- 낮은 자체 발열
LM35는 사용하기 정말 쉬워. 전원을 연결하고 출력 핀을 PIC의 아날로그 입력 핀에 연결하기만 하면 돼. 그럼 PIC가 이 전압을 읽어서 온도로 변환할 거야.
16x2 LCD 디스플레이 📟
16x2 LCD는 2줄에 각각 16개의 문자를 표시할 수 있는 디스플레이야. 우리는 이걸 통해 현재 온도와 설정 온도를 보여줄 거야. LCD를 제어하는 건 조금 복잡할 수 있지만, 걱정 마! 우리가 차근차근 해볼 거니까.
릴레이 모듈 🔌
릴레이는 전기 신호를 이용해 전기 회로를 열거나 닫는 스위치야. 우리는 이걸 이용해서 히터나 쿨러 같은 고전력 장치를 제어할 거야. PIC에서 나오는 작은 신호로 큰 전력을 다룰 수 있게 해주는 중요한 부품이지.
자, 이제 우리가 사용할 주요 부품들에 대해 알아봤어. 이 부품들을 어떻게 연결하고 프로그래밍 하는지는 다음 섹션에서 자세히 다뤄볼 거야. 기대되지 않아? 😄
4. 하드웨어 연결하기 🔌
자, 이제 우리가 준비한 부품들을 하나하나 연결해볼 거야. 이 과정은 정말 중요해. 왜냐하면 하드웨어가 제대로 연결되어 있어야 우리가 작성할 소프트웨어가 제대로 동작할 수 있거든. 그럼 차근차근 연결해보자!
1. PIC16F877A 연결하기
먼저 PIC16F877A를 브레드보드 중앙에 꽂아줘. 이 칩이 우리 시스템의 두뇌 역할을 할 거야.
- 핀 1 (MCLR): 10K 저항을 통해 5V에 연결
- 핀 11, 32 (VDD): 5V에 연결
- 핀 12, 31 (VSS): GND에 연결
- 핀 13 (OSC1), 핀 14 (OSC2): 20MHz 크리스탈과 22pF 커패시터 2개를 이용해 연결
이렇게 하면 PIC의 기본적인 동작을 위한 연결이 완료돼.
2. LM35 온도 센서 연결하기
LM35는 아주 간단해. 총 3개의 핀만 있거든.
- VCC: 5V에 연결
- GND: GND에 연결
- OUT: PIC의 RA0 (핀 2)에 연결
이렇게 연결하면 PIC가 RA0 핀을 통해 온도 센서의 출력을 읽을 수 있어.
3. 16x2 LCD 연결하기
LCD는 좀 더 많은 핀을 연결해야 해. 하지만 걱정 마, 하나씩 해보자!
- VSS: GND에 연결
- VDD: 5V에 연결
- V0: 10K 가변저항을 통해 GND에 연결 (콘트라스트 조절용)
- RS: PIC의 RD2 (핀 21)에 연결
- RW: GND에 연결 (우리는 쓰기만 할 거니까)
- E: PIC의 RD3 (핀 22)에 연결
- D4: PIC의 RD4 (핀 27)에 연결
- D5: PIC의 RD5 (핀 28)에 연결
- D6: PIC의 RD6 (핀 29)에 연결
- D7: PIC의 RD7 (핀 30)에 연결
- A: 5V에 연결 (백라이트 양극)
- K: GND에 연결 (백라이트 음극)
우리는 LCD를 4비트 모드로 사용할 거야. 그래서 D0-D3는 연결하지 않았어.
4. 푸시버튼 연결하기
우리는 4개의 푸시버튼을 사용할 거야. 이 버튼들로 메뉴를 조작하고 온도를 설정할 수 있게 될 거야.
- UP 버튼: PIC의 RB0 (핀 33)에 연결
- DOWN 버튼: PIC의 RB1 (핀 34)에 연결
- SET 버튼: PIC의 RB2 (핀 35)에 연결
- MENU 버튼: PIC의 RB3 (핀 36)에 연결
각 버튼은 한 쪽은 GND에, 다른 쪽은 해당 PIC 핀과 10K 풀업 저항을 통해 5V에 연결해줘.
5. 릴레이 모듈 연결하기
릴레이 모듈은 히터나 쿨러를 제어하는 데 사용될 거야.
- VCC: 5V에 연결
- GND: GND에 연결
- IN: PIC의 RC2 (핀 17)에 연결
릴레이의 NO (Normally Open)와 COM (Common) 단자는 제어하고자 하는 장치 (히터 또는 쿨러)의 전원선에 연결해.
와! 이제 우리의 하드웨어가 모두 연결됐어. 이 회로도를 보면 각 부품들이 어떻게 연결되어 있는지 한눈에 볼 수 있지? 이렇게 연결된 하드웨어는 우리가 앞으로 작성할 소프트웨어의 기반이 될 거야. 😊
하드웨어를 연결하는 과정에서 어려움을 겪었다면, 걱정하지 마. 이런 실습 경험은 정말 값진 거야. 나중에 재능넷에서 너의 경험을 공유하면, 다른 사람들에게도 큰 도움이 될 거야!
5. 소프트웨어 개발: PIC 프로그래밍 시작하기 💻
자, 이제 하드웨어 연결이 끝났으니 본격적으로 소프트웨어 개발을 시작해볼까? PIC 마이크로컨트롤러를 프로그래밍하는 건 처음에는 조금 어려워 보일 수 있어. 하지만 천천히 따라오다 보면 어느새 마스터가 되어 있을 거야! 😎
PIC 프로그래밍 환경 설정
PIC 마이크로컨트롤러를 프로그래밍하기 위해서는 몇 가지 도구가 필요해:
- MPLAB X IDE: Microchip에서 제공하는 통합 개발 환경
- XC8 컴파일러: C 언어로 PIC를 프로그래밍하기 위한 컴파일러
- PICkit3 프로그래머: 작성한 코드를 PIC에 업로드하기 위한 하드웨어
이 도구들은 모두 Microchip 웹사이트에서 무료로 다운로드 받을 수 있어. 설치가 완료되면 새 프로젝트를 만들어보자!
새 프로젝트 만들기
- MPLAB X IDE를 실행해.
- "File" > "New Project"를 선택해.
- "Microchip Embedded" > "Standalone Project"를 선택해.
- 디바이스로 "PIC16F877A"를 선택해.
- 툴체인으로 "XC8"을 선택해.
- 프로그래머로 "PICkit3"을 선택해.
- 프로젝트 이름과 위치를 지정하고 "Finish"를 클릭해.
좋아, 이제 우리의 개발 환경이 준비됐어! 🎉
기본 코드 구조 작성하기
자, 이제 우리의 프로젝트를 위한 기본 코드 구조를 작성해볼 거야. 먼저 필요한 헤더 파일들을 포함시키고, 기본적인 설정을 해줄 거야.
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 20000000 // 20MHz 크리스탈 사용
// 함수 프로토타입
void initialize();
void read_temperature();
void update_display();
void check_buttons();
void control_relay();
// 전역 변수
float current_temp = 0.0;
float set_temp = 25.0;
void main(void) {
initialize();
while(1) {
read_temperature();
update_display();
check_buttons();
control_relay();
__delay_ms(100); // 100ms 딜레이
}
return;
}
void initialize() {
// TODO: 초기화 코드 작성
}
void read_temperature() {
// TODO: LM35에서 온도 읽기
}
void update_display() {
// TODO: LCD 업데이트
}
void check_buttons() {
// TODO: 버튼 상태 확인 및 처리
}
void control_relay() {
// TODO: 릴레이 제어
}
이 코드는 우리 프로젝트의 기본 구조야. 각 함수들은 아직 구현되지 않았지만, 이제 우리가 해야 할 일들이 명확해졌지? 😊
온도 읽기 구현하기
자, 이제 LM35 센서에서 온도를 읽는 함수를 구현해볼 거야. PIC16F877A의 ADC(Analog-to-Digital Converter)를 사용해서 아날로그 값을 디지털로 변환할 거야.
void initialize() {
ADCON1 = 0x80; // 오른쪽 정렬, AN0를 아날로그 입력으로 설정
TRISA = 0x01; // RA0를 입력으로 설정
}
void read_temperature() {
ADCON0 = 0x41; // ADC 켜기, AN0 선택
__delay_us(10); // 안정화를 위한 지연
GO_nDONE = 1; // 변환 시작
while(GO_nDONE); // 변환 완료 대기
int adc_value = (ADRESH << 8) + ADRESL; // 10비트 ADC 값 읽기
current_temp = (adc_value * 5.0 * 100.0) / 1024.0; // 온도로 변환
}
이 코드는 LM35 센서의 출력을 읽어서 온도로 변환해. LM35는 섭씨 1도당 10mV의 전압을 출력하니까, 우리는 이 관계를 이용해서 ADC 값을 온도로 바꿔주는 거야.
LCD 제어 구현하기
다음으로, LCD를 제어하는 코드를 작성해볼 거야. 16x2 LCD를 4비트 모드로 사용할 거야.
#define LCD_RS RD2
#define LCD_EN RD3
#define LCD_D4 RD4
#define LCD_D5 RD5
#define LCD_D6 RD6
#define LCD_D7 RD7
void LCD_Command(unsigned char cmd) {
LCD_RS = 0;
LCD_D4 = (cmd & 0x10) >> 4;
LCD_D5 = (cmd & 0x20) >> 5;
LCD_D6 = (cmd & 0x40) >> 6;
LCD_D7 = (cmd & 0x80) >> 7;
LCD_EN = 1;
__delay_us(1);
LCD_EN = 0;
__delay_us(100);
LCD_D4 = cmd & 0x01;
LCD_D5 = (cmd & 0x02) >> 1;
LCD_D6 = (cmd & 0x04) >> 2;
LCD_D7 = (cmd & 0x08) >> 3;
LCD_EN = 1;
__delay_us(1);
LCD_EN = 0;
__delay_us(100);
}
void LCD_Char(unsigned char data) {
LCD_RS = 1;
LCD_D4 = (data & 0x10) >> 4;
LCD_D5 = (data & 0x20) >> 5;
LCD_D6 = (data & 0x40) >> 6;
LCD_D7 = (data & 0x80) >> 7;
LCD_EN = 1;
__delay_us(1);
LCD_EN = 0;
__delay_us(100);
LCD_D4 = data & 0x01;
LCD_D5 = (data & 0x02) >> 1;
LCD_D6 = (data & 0x04) >> 2;
LCD_D7 = (data & 0x08) >> 3;
LCD_EN = 1;
__delay_us(1);
LCD_EN = 0;
__delay_us(100);
}
void LCD_Init() {
TRISD = 0x00;
__delay_ms(20);
LCD_Command(0x02); // 4비트 모드로 초기화
LCD_Command(0x28); // 4비트 모드, 2줄, 5x7 도트
LCD_Command(0x0C); // 디스플레이 켜기, 커서 끄기
LCD_Command(0x06); // 커서 우측 이동, 화면 이동 없음
LCD_Command(0x01); // 화면 지우기
__delay_ms(2);
}
void LCD_String(const char *str) {
while(*str)
LCD_Char(*str++);
}
void update_display() {
char temp_str[16];
LCD_Command(0x80); // 첫 번째 줄 시작
sprintf(temp_str, "Curr: %.1fC", current_temp);
LCD_String(temp_str);
LCD_Command(0xC0); // 두 번째 줄 시작
sprintf(temp_str, "Set: %.1fC", set_temp);
LCD_String(temp_str);
}
이 코드로 LCD를 초기화하고, 현재 온도와 설정 온도를 표시할 수 있어. 😊
버튼 제어 구현하기
이제 버튼을 통해 설정 온도를 조절하는 기능을 구현해볼 거야.
#define BTN_UP RB0
#define BTN_DOWN RB1
#define BTN_SET RB2
#define BTN_MENU RB3
void initialize() {
// ... 이전 코드 ...
TRISB = 0x0F; // RB0-RB3를 입력으로 설정
OPTION_REG &= 0x7F; // PORTB 풀업 저항 활성화
}
void check_buttons() {
if(!BTN_UP && set_temp < 40.0) {
set_temp += 0.5;
__delay_ms(200); // 디바운싱
}
if(!BTN_DOWN && set_temp > 10.0) {
set_temp -= 0.5;
__delay_ms(200); // 디바운싱
}
// SET과 MENU 버튼은 추가 기능을 위해 나중에 구현할 수 있어
}
이 코드는 UP 버튼과 DOWN 버튼을 사용해 설정 온도를 조절할 수 있게 해줘. 설정 온도는 10°C에서 40°C 사이로 제한했어.
릴레이 제어 구현하기
마지막으로, 온도에 따라 릴레이를 제어하는 코드를 작성해볼 거야.
#define RELAY RC2
void initialize() {
// ... 이전 코드 ...
TRISC &= ~(1 << 2); // RC2를 출력으로 설정
RELAY = 0; // 초기에 릴레이 끄기
}
void control_relay() {
if(current_temp < set_temp - 0.5) {
RELAY = 1; // 히터 켜기
} else if(current_temp > set_temp + 0.5) {
RELAY = 0; // 히터 끄기
}
}
이 코드는 현재 온도가 설정 온도보다 0.5°C 이상 낮으면 히터를 켜고, 0.5°C 이상 높으면 히터를 끄는 간단한 온-오프 제어를 구현했어.
최종 코드
자, 이제 모든 부분을 합쳐서 최종 코드를 만들어볼까?
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 20000000 // 20MHz 크리스탈 사용
#define LCD_RS RD2
#define LCD_EN RD3
#define LCD_D4 RD4
#define LCD_D5 RD5
#define LCD_D6 RD6
#define LCD_D7 RD7
#define BTN_UP RB0
#define BTN_DOWN RB1
#define BTN_SET RB2
#define BTN_MENU RB3
#define RELAY RC2
float current_temp = 0.0;
float set_temp = 25.0;
void initialize();
void read_temperature();
void update_display();
void check_buttons();
void control_relay();
void LCD_Command(unsigned char);
void LCD_Char(unsigned char);
void LCD_Init();
void LCD_String(const char*);
void main(void) {
initialize();
while(1) {
read_temperature();
update_display();
check_buttons();
control_relay();
__delay_ms(100);
}
}
void initialize() {
ADCON1 = 0x80;
TRISA = 0x01;
TRISB = 0x0F;
TRISC &= ~(1 << 2);
TRISD = 0x00;
OPTION_REG &= 0x7F;
RELAY = 0;
LCD_Init();
}
void read_temperature() {
ADCON0 = 0x41;
__delay_us(10);
GO_nDONE = 1;
while(GO_nDONE);
int adc_value = (ADRESH << 8) + ADRESL;
current_temp = (adc_value * 5.0 * 100.0) / 1024.0;
}
void update_display() {
char temp_str[16];
LCD_Command(0x80);
sprintf(temp_str, "Curr: %.1fC", current_temp);
LCD_String(temp_str);
LCD_Command(0xC0);
sprintf(temp_str, "Set: %.1fC", set_temp);
LCD_String(temp_str);
}
void check_buttons() {
if(!BTN_UP && set_temp < 40.0) {
set_temp += 0.5;
__delay_ms(200);
}
if(!BTN_DOWN && set_temp > 10.0) {
set_temp -= 0.5;
__delay_ms(200);
}
}
void control_relay() {
if(current_temp < set_temp - 0.5) {
RELAY = 1;
} else if(current_temp > set_temp + 0.5) {
RELAY = 0;
}
}
void LCD_Command(unsigned char cmd) {
LCD_RS = 0;
LCD_D4 = (cmd & 0x10) >> 4;
LCD_D5 = (cmd & 0x20) >> 5;
LCD_D6 = (cmd & 0x40) >> 6;
LCD_D7 = (cmd & 0x80) >> 7;
LCD_EN = 1;
__delay_us(1);
LCD_EN = 0;
__delay_us(100);
LCD_D4 = cmd & 0x01;
LCD_D5 = (cmd & 0x02) >> 1;
LCD_D6 = (cmd & 0x04) >> 2;
LCD_D7 = (cmd & 0x08) >> 3;
LCD_EN = 1;
__delay_us(1);
LCD_EN = 0;
__delay_us(100);
}
void LCD_Char(unsigned char data) {
LCD_RS = 1;
LCD_D4 = (data & 0x10) >> 4;
LCD_D5 = (data & 0x20) >> 5;
LCD_D6 = (data & 0x40) >> 6;
LCD_D7 = (data & 0x80) >> 7;
LCD_EN = 1;
__delay_us(1);
LCD_EN = 0;
__delay_us(100);
LCD_D4 = data & 0x01;
LCD_D5 = (data & 0x02) >> 1;
LCD_D6 = (data & 0x04) >> 2;
LCD_D7 = (data & 0x08) >> 3;
LCD_EN = 1;
__delay_us(1);
LCD_EN = 0;
__delay_us(100);
}
void LCD_Init() {
__delay_ms(20);
LCD_Command(0x02);
LCD_Command(0x28);
LCD_Command(0x0C);
LCD_Command(0x06);
LCD_Command(0x01);
__delay_ms(2);
}
void LCD_String(const char *str) {
while(*str)
LCD_Char(*str++);
}
와! 우리가 만든 디지털 온도 컨트롤러의 전체 코드야. 이 코드를 PIC16F877A에 업로드하면, 우리의 온도 컨트롤러가 작동하기 시작할 거야. 😊
6. 테스트 및 디버깅 🐛
코드를 작성하고 업로드했다고 해서 끝난 게 아니야. 이제 우리의 시스템이 제대로 작동하는지 테스트하고, 문제가 있다면 디버깅해야 해.