메이커 Maker

ChatGPT를 사용하여 Arduino 및 ESP32용 코드 작성하기

지구빵집 2025. 1. 26. 15:26
반응형

 

오늘은 놀라운 ChatGPT 챗봇을 사용하여 Arduino Uno와 ESP32 둘 다에 대한 C++ 및 MicroPython 코드를 작성해 보겠습니다. 이 글의 원문 기사와 이미지 출처는 이 링크를 따라가세요.

 

오늘부터 마이크로컨트롤러 코딩을 도와줄 AI 어시스턴트가 생겼습니다!

 

소개

 

2022년 11월 30일에 출시된 이후 ChatGPT는 세상을 강타했습니다. 구조화되지 않은 질문에 인간과 같은 응답을 제공하는 능력은 사람들을 놀라게 하고 두렵게 했습니다.

 

 

 

ChatGPT에 대한 대부분의 초점은 독창적이고 인간처럼 들리는 텍스트를 생성하는 놀라운 능력에 맞춰져 있지만 프로그래밍 코드도 작성할 수 있습니다.

 

실제로 ChatGPT는 마이크로컨트롤러와 함께 사용할 수 있는 C++ 및 MicroPython과 같은 언어를 포함하여 다양한 언어로 코딩할 수 있습니다. 그리고 오늘은 Arduino Uno와 ESP32 모듈 둘 다에 대한 코드를 작성하는 능력을 테스트해 보겠습니다.

 

대부분의 코딩 예제는 Arduino IDE용 C++ 스케치이지만, ChatGPT에서 MicroPython을 사용하여 ESP32 웹 서버를 만들 것입니다.

 

ChatGPT

 

ChatGPT는 이전에 본 적이 없는 다른 챗봇과는 다르게 작동하는 AI 챗봇입니다. 기본적으로 모든 언어의 모든 주제와 모든 주제를 가르친 대규모 언어 모델에서 학습되었습니다.

 

ChatGPT는 인터넷에 연결되어 있지 않습니다. 적어도 데이터 세트는 그렇지 않습니다. 현재 공개 베타는 2022년 초에 완성된 데이터에서 학습되었으므로 2021년 이후의 이벤트에 대한 지식이 제한적입니다.

 

ChatGPT 인터페이스는 매우 간단하며 질문이나 명령을 입력하기 위한 텍스트 상자로 구성되어 있습니다. 결과는 웹 페이지 상단에 표시됩니다.

 

OpenAI

 

ChatGPT는 영리 목적의 OpenAI LP와 모회사인 비영리 단체 OpenAI Inc.로 구성된 인공지능 연구 연구소인 OpenAI의 아이디어입니다. 이 회사는 인류 전체에 이로운 방식으로 친화적인 AI를 개발하고 홍보하는 데 중점을 두고 있습니다. OpenAI의 연구 분야에는 머신 러닝과 인공지능이 포함됩니다.

 

창립 멤버는 다음과 같습니다.

 

Sam Altman – 기술 가속기 Y Combinator의 전 사장.

Elon Musk – Tesla, SpaceX, Twitter의 CEO.

Reid Hoffman – LinkedIn의 공동 창립자.

Jessica Livingston – Y Combinator의 창립 파트너.

Peter Thiel – Facebook의 최초 투자자 중 하나인 PayPal의 공동 창립자.

 

ChatGPT는 OpenAI가 출시한 유일한 제품이 아닙니다. 그들은 또한 AI를 사용하여 텍스트 설명에서 아트워크를 만드는 DALL.E 2 이미지 생성기를 출시했습니다.

 

ChatGPT 작동 방식

 

기본적으로 ChatGPT는 딥 러닝을 사용하여 인간과 유사한 음성을 생성하는 자기 회귀 언어 모델입니다. 인공 지능, 머신 러닝 또는 신경망을 다루지 않았다면 그다지 의미가 없을 수 있습니다.

 

ChatGPT는 OpenAI의 GPT-3.5 언어 모델을 기반으로 하므로 작동 방식을 이해하는 것이 ChatGPT를 이해하는 데 중요합니다. 언어 모델 자체부터 시작하여 몇 가지 기본 AI 용어에 익숙해야 합니다.

 

언어 모델

 

언어 모델은 인간과 유사한 음성을 이해하고 생성할 수 있는 컴퓨터 프로그램입니다. 이는 문장에서 다음에 나올 가능성이 가장 높은 단어를 예측하여 수행합니다. 이러한 모델은 컴퓨터가 사람을 이해하고 사람과 소통하는 데 중요합니다. 작동 방식을 이해하려면 컴퓨터가 정보를 학습하고 처리하는 방법에 대해 더 많이 알아야 합니다.

 

머신 러닝

 

머신 러닝은 컴퓨터가 데이터를 사용하여 학습하고 개선하는 방법입니다. 컴퓨터에 일련의 예를 제공한 다음 컴퓨터가 스스로 규칙과 패턴을 파악하도록 하는 것과 같습니다. 머신 러닝에는 지도 학습, 비지도 학습, 강화 학습과 같은 여러 유형이 있습니다.

 

GPT-3.5 모델은 언어 모델이라고 하는 머신 러닝 모델 유형입니다. 지도 학습과 강화 학습을 사용하여 학습하고 미세 조정했습니다. 이 모델의 작동 방식은 인공 신경망을 사용하는 특정 유형의 머신 러닝인 딥 러닝이라는 기술을 기반으로 합니다.

 

딥 러닝

 

딥 러닝은 여러 계층의 신경망을 사용하여 데이터를 처리하고 이해하는 매우 진보된 머신 러닝 형태입니다. 인간 뇌의 구조와 기능에서 영감을 얻었습니다.

 

GPT-3.5 언어 모델은 딥 러닝을 자연어 처리에 사용할 수 있는 가장 강력한 예 중 하나입니다. 이 모델은 방대한 양의 텍스트 데이터에서 학습되었으며 딥 러닝을 사용하여 인간과 유사한 음성을 이해하고 생성하는 방법을 학습합니다.

 

신경망

 

신경망은 인간의 뇌처럼 작동하도록 설계된 일종의 컴퓨터 프로그램입니다. 상호 연결된 "노드" 또는 "뉴런" 계층으로 구성됩니다. 각 노드는 정보를 처리하여 다음 노드로 전송하는 작은 컴퓨터와 같습니다.

 

정보는 입력 계층의 신경망에 입력되고, 최종 출력에 대한 중요도에 따라 가중치가 지정됩니다. 가중치가 충분히 높으면 노드가 활성화되고 추가 처리를 위해 다음 계층으로 정보를 보냅니다. 정보가 계층을 이동하면서 점진적으로 변환되고 추상화되어 신경망이 데이터에서 점점 더 복잡한 패턴과 기능을 학습할 수 있습니다.

 

GPT-3.5 언어 모델은 이 기술을 사용하여 인간과 유사한 음성을 이해하고 생성하는 신경망의 한 예입니다.

 

ChatGPT의 훈련 방법

 

ChatGPT와 GPT-3.5 언어 모델의 실제 작동은 적절하지만 OpenAI는 언어 모델을 훈련하는 데 사용된 훈련 프로세스를 설명하는 다이어그램을 공개했습니다.

 

 

기본적으로 훈련에는 데이터를 입력하고 시스템에 쿼리하는 많은 인간 작업자가 포함되었습니다. 훈련자는 컴퓨터가 원하는 출력을 생성할 때 제공되는 "보상" 시스템을 설정했습니다. 이는 여러 번 반복되었고 컴퓨터는 매번 더 똑똑해졌습니다.

 

OpenAI 다이어그램은 해석하기 어려울 수 있지만, 세 단계를 각각 나누어 단순화할 수 있습니다.

 

1단계 - 데모 데이터 수집 및 지도 정책 학습

 

단순화 - 인간 예제로 학습

 

GPT-3.5를 만드는 첫 번째 단계는 인간이 생성한 텍스트의 예제를 사용하여 모델을 학습하는 것이었습니다. 이를 지도 학습이라고 합니다. 모델에 프롬프트와 예제 응답을 제공했고, 표시된 예제와 유사한 텍스트를 생성하는 방법을 학습했습니다.

 

2단계 - 비교 데이터 수집 및 보상 모델 학습

 

단순화 - 피드백을 받고 이를 통해 학습

 

다음 단계는 모델의 성능에 대한 피드백을 받는 것이었습니다. OpenAI는 모델에서 생성한 응답에서 새로운 데이터를 수집한 다음 인간 트레이너에게 가장 좋은 것부터 가장 나쁜 것까지 순위를 매기도록 요청했습니다. 이 피드백을 사용하여 보상 모델이라는 새로운 모델을 만들었으며, 이를 통해 모델이 좋은 응답을 만드는 요소를 이해하는 데 도움이 되었습니다.

 

3단계 - PPO 강화 학습 알고리즘을 사용하여 보상 모델에 대한 정책 최적화

 

간소화 - 피드백을 사용하여 모델 개선

 

마지막으로, GPT-3.5 모델은 보상 모델의 피드백을 사용하여 미세 조정되었습니다. 즉, 모델에 새로운 프롬프트가 제공되었고, 보상 모델에 따라 응답이 순위가 매겨졌습니다. 피드백은 모델의 성능을 개선하는 데 사용되었습니다. 이 프로세스는 OpenAI가 GPT-3.5 모델을 대중에게 공개하기 전에 여러 번 반복되었습니다.

 

ChatGPT에 액세스하기

 

이 글을 쓰는 시점(2023년 1월 말)에는 ChatGPT에 대한 액세스가 완전히 무료입니다. 이메일 주소를 제공하여 얻을 수 있는 OpenAI 계정이 필요합니다.

 

OpenAI 웹사이트나 ChatGPT 로그인 페이지에서 직접 ChatGPT에 로그인할 수 있습니다. 가끔 액세스를 기다리는 대기 목록이 있습니다. 그래도 OpenAI가 ChatGPT에 대한 엄청난 수요를 수용하기 위해 서버를 확장함에 따라 많은 액세스 문제가 사라진 것 같습니다.

 

ChatGPT 사용자 인터페이스는 가능한 한 간단합니다. 메인 페이지와 왼쪽 사이드바가 있습니다.

 

 

 

사이드바에는 이전 "채팅"과 새 채팅을 시작하는 버튼이 있습니다. 처음 로그인하면 새 채팅 화면이 표시됩니다. 거기에서 시작하거나 이전 채팅 중 하나로 돌아가서 대화를 계속할 수 있습니다.

 

사이드바의 채팅 아래에는 몇 가지 메뉴 항목이 있습니다. 채팅을 지우고, 인터페이스를 "다크 모드"로 설정하고, OpenAI Discord 서버 또는 FAQ 페이지로 이동할 수 있습니다. 아래 버튼을 사용하면 로그아웃할 수 있습니다.

 

메인 인터페이스는 화면의 더 큰 섹션에 있으며 매우 간단합니다. 텍스트 상자와 Enter(화살표) 버튼입니다. 텍스트 상자에 쿼리나 명령을 입력하고 Enter 키를 누르거나 텍스트 상자 옆에 있는 화살표 아이콘을 클릭하기만 하면 됩니다. ChatGPT가 대화를 화면 상단으로 이동하고 응답합니다.

 

이 인터페이스는 텍스트와 동일한 방식으로 코딩에 사용됩니다. ChatGPT에 원하는 것을 알려주기만 하면 최선을 다해 전달합니다.

 

기억하세요, 현재 버전(2023년 1월 9일)은 2022년 초의 이벤트를 알지 못하므로 최신 뉴스에 포함되지 않습니다. 믿기 어려울 수 있지만 데이터베이스는 인터넷에 연결되어 있지 않습니다!

 

ChatGPT 코딩 기본 사항 - Arduino

 

ChatGPT로 작업하고 우리를 위해 코드를 작성해 보겠습니다. Arduino Uno로 시작해서 몇 가지 구성 요소를 연결합니다.

 

Arduino 연결

 

Arduino Uno의 연결은 매우 간단합니다. 다음이 필요합니다.

 

Arduino Uno 또는 복제품

LED, 어떤 색상이든 상관없음

저항기, 220옴 또는 150~470옴 사이의 값

포텐셔미터, 5K 이상, 선형 테이퍼가 선호됨

I2C 인터페이스가 있는 SSD1306 OLED 디스플레이

SPST 순간 접촉 정상 개방 푸시 버튼

 

납땜이 없는 브레드보드와 점퍼 와이어를 사용하여 다음과 같이 모든 것을 연결합니다.

 

더 큰 이미지를 열려면 배선도를 클릭하세요

 

이제 ChatGPT에서 Arduino와 주변 장치에 대한 코드를 작성해 보겠습니다!

 

ChatGPT Blink

 

Arduino 프로그래밍 여정을 유명한 Blink 스케치를 재현하는 것으로 시작하는 것이 관례이며, 저는 전통을 깨는 사람이 아닙니다. 따라서 AI 생성 프로그래밍의 세계로의 첫 진출을 위해 온보드 LED를 켜거나 Arduino를 1초에 한 번씩 깜박이게 하겠습니다!

 

ChatGPT를 열고 새 대화를 시작합니다. 다음 명령을 입력 텍스트 상자에 입력(또는 붙여넣기)합니다.

 

Arduino Uno의 온보드 LED를 1초에 한 번씩 깜박이는 코드 작성

 

완료되면 Enter 키를 누르거나 화살표를 클릭합니다.

 

ChatGPT에서 코드 작성을 시작합니다. 어떤 경우에는 응답하기 전에 최대 1분까지 지연될 수 있습니다. 이는 서버가 모든 활성 세션으로 인해 과부하 상태이기 때문일 수 있습니다. 때로는 전혀 지연되지 않습니다.

 

ChatGPT에서 코드 샘플로 응답합니다. 코드 샘플이 끝나면 코드에 대한 간략한 설명을 제공합니다.

 

const int LED_PIN = 13;  // Onboard LED is connected to pin 13

void setup() {
  pinMode(LED_PIN, OUTPUT);  // Set pin as an output
}

void loop() {
  digitalWrite(LED_PIN, HIGH);  // Turn on LED
  delay(1000);  // Wait for 1 second
  digitalWrite(LED_PIN, LOW);  // Turn off LED
  delay(1000);  // Wait for 1 second
}

 

 

응답 코드는 여러분이 받은 코드와 정확히 같지 않을 수 있습니다. 사실, 동일한 쿼리를 입력하면 다른 코드 및/또는 설명이 나올 가능성이 큽니다.

 

ChatGPT 코드 출력 상단에 있는 "코드 복사" 아이콘을 사용하여 코드 샘플을 복사할 수 있습니다. 그러면 코드가 클립보드에 복사되고, 거기에서 Arduino IDE에 붙여넣을 수 있습니다.

 

코드를 업로드하고 Arduino Uno를 관찰합니다. 깜박이는 온보드 LED가 여러분을 맞이할 것입니다.

 

 

이제 통과 의례가 끝났으므로 더 크고 더 나은 것으로 넘어갈 수 있습니다!

 

ChatGPT PWM LED 제어

 

Arduino Uno의 9번 핀에 드롭핑 저항을 통해 연결된 LED가 있고, 운 좋게도 그 핀은 PWM이 가능합니다. 그리고 또 다른 행운으로, 전압 분배기로 연결된 전위차계가 있고 출력은 아날로그 입력 A0에 연결되어 있습니다.

 

분명히 이 상황을 이용하여 전위차계로 해당 LED의 밝기를 제어하는 코드를 작성해야 합니다!

 

 

ChatGPT가 대신 해드리겠습니다. 새 세션을 열거나(또는 현재 세션에 머물러서) 다음을 입력하세요.

 

아두이노 우노 코드 생성 PWM을 사용하여 아날로그 입력 A0에 연결된 전위차계로 Arduino Uno의 핀 9에 연결된 LED의 밝기를 제어하는 코드를 생성해.

 

다시 한 번, 새로운 AI 코드 어시스턴트가 이와 비슷한 스케치를 생성하기 시작해야 합니다.

 

// PWM을 사용하여 전위차계로 LED 밝기 제어

const int potPin = A0;    // 전위차계가 연결된 아날로그 핀
const int ledPin = 9;     // LED가 연결된 PWM 핀

void setup() {
  // 핀 설정
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // 전위차계 값을 읽음 (0 ~ 1023)
  int potValue = analogRead(potPin);

  // 전위차계 값을 PWM 값(0 ~ 255)으로 매핑
  int pwmValue = map(potValue, 0, 1023, 0, 255);

  // LED 밝기를 PWM 값으로 설정
  analogWrite(ledPin, pwmValue);

  // 약간의 딜레이
  delay(10);
}

 

앞서 말했듯이 ChatGPT는 동일한 쿼리에 대해 다른 출력을 생성할 수 있습니다. 이 스케치가 올바르게 생성된 것을 보았고(여기에 있는 사본처럼) "map" 함수 호출이 누락되어 잘못 생성된 것도 보았습니다.

 

스케치가 마음에 들지 않으면 "응답 재생성" 버튼을 클릭하여 ChatGPT에 새 스케치를 요청하세요.

 

Arduino에 업로드한 코드는 완벽하게 작동하여 전위차계로 LED를 제어할 수 있었습니다. 그리고 실제로 코드를 직접 작성한 것은 아니고 원하는 것을 말했을 뿐인데 마법처럼 나타났습니다.

 

 

적어도 마법처럼 보입니다!

 

ChatGPT로 코드 수정

 

작동하지 않는 코드를 수정하는 데도 ChatGPT를 사용할 수 있습니다. IDE에서 제공하는 컴파일러 오류와 함께 사용하면 유용한 도구가 될 수 있습니다. 사실 ChatGPT는 컴파일러보다 한 단계 더 나아가 오류를 수정하여 코드를 다시 작성할 수 있습니다!

 

이를 테스트하기 위해 의도적으로 이전 코드(가변 밝기 LED 스케치)에 오류를 넣었습니다. 변수 중 하나의 이름을 변경했는데, 이로 인해 코드가 컴파일되지 않습니다.

 

그런 다음 ChatGPT에 다음과 같이 물었습니다.

 

다음 코드를 수정하세요.

 

이 문장 바로 뒤에 코드를 붙여넣어도 ChatGPT는 괜찮았을 것입니다. AI 챗봇은 텍스트 서식에 관심이 없습니다(적어도 저는 신경 쓰지 않는다고 생각합니다). 하지만 아래 줄에 넣는 것이 훨씬 더 깔끔합니다.

 

문제는 Enter를 누르면 코드 자체가 아니라 ChatGPT에 "다음 코드를 수정하세요"라는 텍스트가 입력된다는 것입니다.

 

ChatGPT 인터페이스에서 줄을 아래로 이동하려면 Shift 키를 누른 채 Enter를 누릅니다. 그러면 커서가 새 줄로 이동하고 텍스트 상자의 크기가 커집니다. 그런 다음 코드를 붙여넣을 수 있습니다.

 

코드를 입력하면 ChatGPT가 잠시 "생각"한 다음 수정된 코드를 다시 제공합니다. 또한 변경해야 하는 코드에 주석을 삽입했을 것입니다.

 

많은 코드 샘플로 이 작업을 시도하지 않았습니다. 여기서 기능을 테스트하는 것이 흥미로울 것입니다. 작업을 확인하고 오류를 찾을 수 있는 보조 코더가 있으면 꽤 좋은 것 같습니다!

 

ChatGPT를 사용한 Arduino 프로젝트

 

ChatGPT에서 완전한 프로젝트를 빌드하도록 합시다.

 

우리는 이미 프로젝트의 배선을 완료했습니다. 섭씨와 화씨 사이에서 디스플레이를 토글하는 푸시 버튼이 있는 온도 및 습도계를 빌드할 것입니다. 필요한 것은 스케치뿐입니다.

 

이 프로젝트를 빌드하는 동안 제가 설명하고 싶은 한 가지는 ChatGPT를 "단계별" 모드로 사용하여 프로젝트를 진행하면서 빌드하는 방법입니다.

 

DHT22 사용

 

DHT22 온도 및 습도 센서부터 시작하겠습니다.

 

DHT22는 꽤 흔한 장치입니다. AM2302라고도 하며, 꽤 기본적인 온도 및 습도 센서입니다. 또한 사용할 수 있는 사촌인 DHT11도 있습니다. DHT11을 사용하는 경우 코딩이 약간 다르므로 ChatGPT에 알려야 합니다.

 

직렬 모니터에 판독값을 표시하여 센서를 테스트합니다. 저는 이런 방식으로 프로젝트를 빌드하고 각 주요 구성 요소를 단계별로 테스트하는 것을 좋아합니다. 프로젝트 설계 프로세스 초기에 배선 또는 코딩 오류를 포착하는 좋은 방법입니다.

 

그래서 저는 ChatGPT에 코드를 써달라고 부탁했습니다.

 

DHT22 센서의 온도와 습도 판독값을 직렬 모니터에 표시하는 코드를 작성하세요. DHT는 Arduino Uno의 D3핀에 연결되어 있습니다.

 

컴파일하여 다음 스케치를 작성했습니다.

 

#include <DHT.h>  // DHT 라이브러리 포함

#define DHTPIN 3      // DHT22가 연결된 핀
#define DHTTYPE DHT22 // DHT 센서 유형 정의 (DHT22)

DHT dht(DHTPIN, DHTTYPE); // DHT 객체 생성

void setup() {
  Serial.begin(9600); // 직렬 통신 시작
  Serial.println("DHT22 센서 초기화 중...");
  dht.begin();        // DHT 센서 초기화
}

void loop() {
  // 온도와 습도 값을 읽음
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  // 센서 판독 실패 여부 확인
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("DHT 센서로부터 데이터를 읽을 수 없습니다.");
    return;
  }

  // 판독값 출력
  Serial.print("온도: ");
  Serial.print(temperature);
  Serial.print(" °C\t");

  Serial.print("습도: ");
  Serial.print(humidity);
  Serial.println(" %");

  // 2초 대기 (DHT22의 권장 업데이트 주기)
  delay(2000);
}

 

ChatGPT는 또한 Arduino IDE에 DHT 라이브러리를 설치해야 한다고 알려주었지만, 제 경우에는 이미 설치했습니다.

 

스케치를 Arduino IDE에 붙여넣었고 컴파일되었습니다. Arduino에 업로드하고 직렬 모니터를 열어 결과를 관찰했습니다.

 

스케치가 제대로 작동하여 2초마다 온도와 습도를 표시했습니다.

 

DHT22가 작동하면 이제 디스플레이를 작동시킬 차례입니다.

 

OLED 디스플레이 추가

 

SSD1306은 매우 일반적인 OLED 디스플레이입니다. SPI와 I2C 인터페이스로 모두 사용할 수 있으며, 이 프로젝트에서는 I2C를 통해 연결되는 디스플레이를 사용합니다.

 

디스플레이 코드를 얻기 위해 ChatGPT에 다음 쿼리를 제시했습니다.

 

SSD1306 OLED 디스플레이에 DHT22 센서의 온도 및 습도 판독값을 표시하는 코드를 작성합니다. DHT는 Arduino Uno의 D3 핀에 연결됩니다. SSD1306은 I2C를 사용합니다.

 

그리고 다시 ChatGPT가 몇 가지 코드를 반환했습니다.

 

#include <Adafruit_SSD1306.h> // SSD1306 OLED 디스플레이 라이브러리
#include <Adafruit_GFX.h>     // 그래픽 라이브러리
#include <DHT.h>              // DHT 센서 라이브러리

#define SCREEN_WIDTH 128 // OLED 디스플레이 폭
#define SCREEN_HEIGHT 64 // OLED 디스플레이 높이

#define OLED_RESET    -1 // OLED 리셋 핀 (-1은 리셋 핀이 없음)
#define SCREEN_ADDRESS 0x3C // I2C 주소 (일반적으로 0x3C)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define DHTPIN 3      // DHT22가 연결된 핀
#define DHTTYPE DHT22 // DHT 센서 유형 정의
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  // SSD1306 디스플레이 초기화
  if (!display.begin(SSD1306_I2C_ADDRESS, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 디스플레이를 초기화할 수 없습니다."));
    while (true);
  }
  display.clearDisplay();
  display.display();

  // DHT 센서 초기화
  dht.begin();

  Serial.begin(9600); // 디버깅용 직렬 통신
  Serial.println("DHT22 및 OLED 설정 완료");
}

void loop() {
  // DHT 센서로부터 값 읽기
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  // 오류 처리
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("DHT 센서 데이터 읽기 실패");
    return;
  }

  // 디버깅: 직렬 모니터 출력
  Serial.print("온도: ");
  Serial.print(temperature);
  Serial.print(" °C\t");
  Serial.print("습도: ");
  Serial.print(humidity);
  Serial.println(" %");

  // OLED 디스플레이에 출력
  display.clearDisplay();
  display.setTextSize(2); // 텍스트 크기 설정
  display.setTextColor(SSD1306_WHITE); // 텍스트 색상
  display.setCursor(0, 0); // 텍스트 시작 위치
  display.print("Temp: ");
  display.print(temperature);
  display.println(" C");
  display.print("Hum:  ");
  display.print(humidity);
  display.println(" %");

  display.display(); // 화면에 표시

  delay(2000); // 2초 대기
}

 

 

또한 프로젝트를 작동하려면 몇 가지 Adafruit 라이브러리가 필요하다고 말했습니다. 라이브러리 설치 지침이 표현된 방식으로 인해 ChatGPT가 현재 Arduino IDE 2.0이 아닌 IDE 1.8에 더 익숙하다고 생각하지만 물론 IDE 2.0이 프로덕션 버전이 되기 전인 2021년의 데이터를 학습했기 때문에 완벽하게 말이 됩니다.

 

다시 말하지만 코드는 제대로 작동하여 OLED 디스플레이에 온도 및 습도 판독값을 생성했습니다.

 

섭씨/화씨 버튼 추가

 

코드에 대한 마지막 수정 사항은 섭씨와 화씨 사이에서 온도 표시를 전환하는 방법을 제공하는 것입니다. 이를 위해 순간 접촉 푸시 버튼을 사용할 것입니다. 한쪽은 I/O 핀 D4에 연결되고 다른 쪽은 접지됩니다.

 

전체 프로젝트를 설명하는 대신 ChatGPT에 마지막 코드만 업데이트하도록 요청합니다. 같은 대화에 머무르는 한 이 작업을 수행할 수 있으며 나중에 대화로 돌아와 코드를 추가로 업데이트할 수 있습니다.

 

위의 회로에 핀 D4에 연결된 푸시 버튼을 추가합니다. 푸시 버튼을 코딩하여 온도 표시를 섭씨에서 화씨로 전환합니다.

 

ChatGPT에서 푸시 버튼이 있는 코드를 작성했으며 작동할 것 같습니다.

 

그러나 회로에 풀업(또는 풀다운) 저항을 추가하거나 내부 풀업 저항을 사용하도록 코드를 수정해야 한다고 언급합니다.

 

하지만 왜 스스로 코드를 수정해야 할까요? 2022년이 아니라 2023년입니다! ChatGPT에 대신 해달라고 요청해 보겠습니다.

 

위의 코드를 수정하여 푸시 버튼에 내부 풀업 저항을 사용합니다.

 

ChatGPT가 코드를 다시 작성하여 이번에는 스위치 입력에 내부 풀업 저항을 사용합니다.

 

그래서 ChatGPT가 만든 코드를 로드하여 시도해 보았습니다. 그리고 "어느 정도 작동합니다"!

 

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"

#define DHTTYPE DHT22   // DHT 22  (AM2302)
#define DHTPIN 3     // what pin we're connected to
#define BUTTON_PIN 4  // pushbutton connected to pin D4

DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(128, 64);
bool isCelsius = true; // flag to keep track of temperature units

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  //initialize the OLED display
  display.clearDisplay();   //clear the display
  display.display();        //display the cleared content
  Serial.begin(9600);
  dht.begin();
  pinMode(BUTTON_PIN, INPUT_PULLUP); // set the pushbutton pin as input with internal pullup resistor
}

void loop() {
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  if(digitalRead(BUTTON_PIN) == LOW){ // check if the pushbutton is pressed
    isCelsius = !isCelsius; // toggle the temperature units
    delay(200); // add a small delay to debounce the button press
  }

  //clear the OLED display
  display.clearDisplay();
  //set cursor position to top-left corner
  display.setCursor(0,0);
  //display temperature and humidity readings
  display.print("Temperature: ");
  if(isCelsius) {
    display.print(temperature);
    display.println(" *C");
  } else {
    float temperatureF = (temperature * 9/5) + 32;
    display.print(temperatureF);
    display.println(" *F");
  }
  display.print("Humidity: ");
  display.print(humidity);
  display.println(" %");
  //display the updated content
  display.display();

  delay(2000);
}

 

 

문제는 푸시 버튼을 잠깐 눌러도 아무 일도 일어나지 않는다는 것입니다. 적어도 대부분의 경우 말입니다. 하지만 계속 누르고 있으면 버튼이 작동하고 온도 단위가 섭씨에서 화씨로 전환됩니다.

 

 

ChatGPT가 작성한 코드를 보면 문제가 드러납니다. 루프 끝에서 2초 지연이 문제인데, 지연이 실행되는 동안 푸시 버튼은 무시됩니다.

 

지연에는 이유가 있습니다. DHT22는 센서가 안정화되기 위해 판독 사이에 2초가 필요합니다.

 

이걸 고치는 건 쉽지 않으니까, ChatGPT를 비난하고 싶지는 않습니다. 제대로 고치려면 2초 타이머 인터럽트나 경과된 밀리초를 세는 카운터를 사용하여 DHT22를 읽어야 합니다. 푸시버튼에도 인터럽트를 사용할 수 있습니다.

 

아니면 그냥 "디스플레이 유닛이 바뀔 때까지 푸시버튼을 누르고 있으세요"라고 읽도록 지침을 변경하면 100% 작동합니다!

 

ChatGPT가 다음 프로젝트의 모든 코드를 작성하지는 못하더라도 대부분을 작성할 수 있다는 걸 증명했다고 말하고 싶습니다.

 

ChatGPT를 사용한 ESP32

 

이제 다른 마이크로컨트롤러인 ESP32로 넘어가겠습니다. 이 작은 32비트 경이로운 제품에는 wifi와 Bluetooth도 포함되어 있으며, 실험에서 이 제품의 wifi 기능을 사용할 것입니다.

 

ESP32에 추가 구성 요소를 부착할 필요는 없지만 ESP32 보드 관리자로 Arduino IDE를 설정해야 합니다. ESP32 소개에서 이에 대해 설명했습니다. 그리고 거의 모든 ESP32 모듈이 작동합니다.

 

두 번째 실험은 MicroPython을 실행하는 것입니다. Thonny IDE를 사용하는 것이 좋습니다. 특히 Thonny 내부의 ESP32에 MicroPython 펌웨어를 직접 로드할 수도 있기 때문입니다.

 

ESP32 WiFi 스캐너

 

첫 번째 실험은 Arduino IDE를 위해 C++로 작성된 WiFi 스캐너입니다. 코드를 얻는 것은 ChatGPT에 다음을 요청하는 것만큼 간단했습니다.

 

ESP32 WiFi 스캐너용 코드 작성

 

마치 마법처럼(정말 마법처럼 보입니다) ChatGPT가 Arduino IDE에 붙여넣을 준비가 된 코드를 펌핑합니다. 제 코드는 다음과 같습니다.

 

#include <WiFi.h>

void setup() {
  Serial.begin(115200); // 직렬 통신 시작
  Serial.println("WiFi 스캐너 초기화 중...");

  WiFi.mode(WIFI_STA); // WiFi를 스테이션 모드로 설정
  WiFi.disconnect();   // 이전 연결 제거
  delay(100);
}

void loop() {
  Serial.println("WiFi 네트워크 스캔 중...");
  
  // 네트워크 스캔 시작
  int networkCount = WiFi.scanNetworks();

  if (networkCount == -1) {
    Serial.println("WiFi 스캔 실패");
    delay(5000);
    return;
  }

  Serial.println("WiFi 네트워크 발견:");
  Serial.println("=====================================");
  for (int i = 0; i < networkCount; i++) {
    // 각 네트워크 정보 출력
    Serial.printf("%d: SSID: %s\n", i + 1, WiFi.SSID(i).c_str());
    Serial.printf("   신호 강도 (RSSI): %d dBm\n", WiFi.RSSI(i));
    Serial.printf("   보안: %s\n", getEncryptionType(WiFi.encryptionType(i)));
    Serial.printf("   BSSID: %s\n", WiFi.BSSIDstr(i).c_str());
    Serial.println("=====================================");
    delay(10); // 출력 안정화를 위해 약간의 딜레이
  }
  
  delay(10000); // 10초 후 다시 스캔
}

// 보안 유형을 문자열로 변환
String getEncryptionType(wifi_auth_mode_t encryptionType) {
  switch (encryptionType) {
    case WIFI_AUTH_OPEN:
      return "Open";
    case WIFI_AUTH_WEP:
      return "WEP";
    case WIFI_AUTH_WPA_PSK:
      return "WPA-PSK";
    case WIFI_AUTH_WPA2_PSK:
      return "WPA2-PSK";
    case WIFI_AUTH_WPA_WPA2_PSK:
      return "WPA/WPA2-PSK";
    case WIFI_AUTH_WPA2_ENTERPRISE:
      return "WPA2-Enterprise";
    default:
      return "Unknown";
  }
}

 

코드를 실행하면 WiFi 네트워크 목록과 신호 강도, 사용하는 암호화 유형이 생성됩니다.

 

MicroPython과 함께 ChatGPT 사용

 

지금까지 ChatGPT가 생성한 모든 코드는 C++로 작성되었습니다. 하지만 이 작은 AI 챗봇은 거의 모든 프로그래밍 언어로 코드를 작성할 수 있습니다.

 

따라서 실험을 마무리하기 위해 ChatGPT가 ESP32에서 작은 웹 서버를 빌드하도록 하겠습니다. 홈페이지에 표시할 텍스트도 지정하겠습니다.

 

ESP32에서 MicroPython 설정

 

이 실험을 수행하려면 최신 버전의 MicroPython 인터프리터가 로드된 ESP32가 필요합니다. 명령줄을 포함하여 여러 가지 방법으로 이 작업을 수행할 수 있지만 가장 쉬운 방법은 Thonny IDE를 사용하는 것입니다.

 

1단계 - Thonny IDE 설치

 

물론 먼저 컴퓨터에 Thonny IDE를 설치해야 하므로 다운로드 페이지로 이동하여 시스템에 맞는 올바른 파일을 선택하세요. Windows, Linux 또는 macOS에 설치할 수 있습니다.

 

Raspberry Pi가 있는 경우 Thonny가 이미 OS의 프로그래밍 섹션에 설치되어 있습니다.

 

2단계 - MICROPYTHON INTERPRETER 다운로드

 

Thonny를 설치한 후 MicroPython 다운로드 페이지로 이동하여 ESP32를 검색하세요. 대부분의 보드는 일반 ESP32 이미지를 사용할 수 있지만 특정 보드용 이미지도 있습니다.

 

보드 페이지에서 인터프리터의 최신 버전을 선택하세요. ".bin" 버전을 다운로드해야 합니다.

 

3단계 – ESP32에 펌웨어 플래싱

 

ESP32 보드가 컴퓨터에 연결되었는지 확인하고 Thonny IDE를 엽니다.

 

  • 도구/옵션/인터프리터로 이동합니다.
  • 인터프리터로 "MicroPython ESP32"를 선택합니다.
  • 보드가 연결된 포트를 선택합니다.
  • "펌웨어 설치 또는 업데이트" 링크를 클릭합니다.
  • 다음 페이지에서 이전에 선택한 것과 동일한 포트를 선택합니다.
  • 찾아보기 버튼을 사용하여 다운로드한 .bin 파일을 선택합니다.
  • 설치 버튼을 클릭합니다.

MicroPython 인터프리터가 포함된 새 펌웨어가 ESP32 보드에 플래싱됩니다.

 

5단계 – IDE를 보드에 연결

 

도구/옵션/인터프리터 메뉴로 돌아가서 선택한 인터프리터와 보드가 올바른지 확인합니다.

 

이렇게 하면 ESP32가 Thonny IDE에 연결됩니다. 성공하면 인터페이스 하단의 셸 디스플레이에 MicroPython 프롬프트가 표시됩니다.

 

이제 ESP32에서 MicroPython 코드를 실행할 준비가 되었습니다.

 

ChatGPT를 사용하여 코드 가져오기

 

오늘 수행한 다른 모든 실험과 마찬가지로 ChatGPT에서 코드를 받게 됩니다. ChatGPT에 요청한 내용은 다음과 같습니다.

 

H1 텍스트로 "ChatGPT"가 쓰여진 홈페이지가 있는 ESP32 웹 서버용 MicroPython 코드를 작성할 수 있습니까?

 

그리고 제 코드를 받았습니다.

 

import network
import uasyncio as asyncio
from machine import Pin

# WiFi 연결 정보
SSID = 'your_wifi_ssid'  # WiFi 이름
PASSWORD = 'your_wifi_password'  # WiFi 비밀번호

# WiFi 연결 설정
def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(SSID, PASSWORD)
    
    print("WiFi 연결 중...")
    while not wlan.isconnected():
        pass

    print("WiFi 연결 완료!")
    print(f"IP 주소: {wlan.ifconfig()[0]}")

# HTML 페이지
HTML_PAGE = """
<!DOCTYPE html>
<html>
<head>
    <title>ESP32 Web Server</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            margin-top: 50px;
        }
        h1 {
            color: #007BFF;
        }
    </style>
</head>
<body>
    <h1>ChatGPT</h1>
</body>
</html>
"""

# 비동기 웹 서버
async def serve_client(reader, writer):
    request_line = await reader.readline()
    print("요청:", request_line.decode().strip())
    
    # 요청 처리
    while await reader.readline() != b"\r\n":
        pass
    
    # HTTP 응답
    response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n" + HTML_PAGE
    await writer.write(response.encode('utf-8'))
    await writer.drain()
    await writer.aclose()
    print("클라이언트 응답 완료")

# 메인 루프
async def main():
    print("웹 서버 시작...")
    server = await asyncio.start_server(serve_client, "0.0.0.0", 80)
    async with server:
        await server.serve_forever()

# 실행
try:
    connect_wifi()
    asyncio.run(main())
except KeyboardInterrupt:
    print("서버 종료")

 

이제 남은 것은 테스트하는 것입니다.

 

Thonny IDE로 테스트

 

MicroPython 인터프리터로 ESP32를 설정하고 컴퓨터에 연결했으며 ESP32를 소스로 선택하여 Thonny IDE를 실행한다고 가정합니다.

 

ChatGPT에서 제공한 코드를 복사하여 Thonny IDE 편집기에 붙여넣습니다. 이제 ESP32에 main.py라는 이름으로 저장합니다(컴퓨터가 아닌). main.py를 이름으로 사용하면 ESP32에 전원이 켜지거나 재설정될 때마다 코드를 실행할 수 있습니다.

 

이제 WiFi 연결이 있는 기기(컴퓨터, 휴대전화, 태블릿)를 찾고 새로운 WiFi 네트워크를 검색합니다. 제 기기는 ChatGPT Server의 SSID를 받았지만 ChatGPT가 항상 동일한 결과를 제공하지는 않으므로 다른 MicroPython 코드를 실행하고 있을 수 있습니다.

 

마지막 단계는 ESP32 WiFi 네트워크에 연결된 기기를 사용하여 192.168.4.1로 이동하는 것입니다. 모든 것이 작동하면 ChatGPT 화면이 표시되어야 합니다.

 

모든 것이 작동하지 않으면 ChatGPT에서 제공한 코드를 확인하세요. 코드를 수정하거나 다시 작성하도록 요청하세요.

 

AI 조수입니다. 수익을 올리세요!

 

ChatGPT의 한계 및 미래

 

이 제품은 출시된 지 불과 2개월이 되었으므로 다음 내용의 대부분은 추측입니다.

 

개인적으로 저는 ChatGPT와 GitHub Copilot(두 제품 간의 비교는 비디오 참조)과 같은 유사한 제품이 프로그래머 툴킷에서 확실히 자리를 잡을 것이라고 생각합니다. 하지만 저는 이 제품들이 곧 프로그래머와 개발자를 대체할 것이라고 보지 않습니다.

 

많은 프로그래밍, 특히 고급 프로그래밍은 코드 조각과 라이브러리를 가져오고 인사하고 모두 함께 작동하도록 만드는 것을 포함합니다. ChatGPT는 여기서 코드 조각을 작성하고 이상한 구성 요소와 함께 사용할 라이브러리를 찾는 데 큰 도움이 될 수 있습니다.

 

지금은 ChatGPT가 사용하는 데이터 세트의 노후화로 인해 한계가 있지만 곧 바뀔 것이라고 확신합니다. 그리고 물론 심각한 한계 중 하나는 챗봇이 완벽하지 않고, 형편없거나 작동하지 않는 코드에 많은 시간을 낭비할 수 있다는 것입니다. 직접 코딩할 수 없는 것을 코딩하는 데 사용해서는 안 될 것입니다. 모든 것을 작동시키려면 문제를 해결해야 할 수 있기 때문입니다.

 

ChatGPT Pro?

 

이 글을 쓰는 시점에서 ChatGPT Pro에 대한 대기자 명단이 있는데, ChatGPT의 더욱 강력한 버전이라는 소문이 있습니다. 현재 무료 버전에서 발생하는 많은 문제를 완화할 것입니다.

 

이번 주(2023년 1월 마지막 주)에야 가격이 공개되었습니다. ChatGPT Pro는 월 42달러에 판매될 것이라는 소문이 있습니다. 하지만 아직 대중에게 공개되지 않았습니다.

 

결론

 

1970년대 중반 마이크로프로세서 혁명이 시작될 무렵에 이 새로운 제품이 세상을 바꿀 수 있을 것이라고 생각했던 기억이 납니다. 1987년에 정부 직원으로서 전 세계 네트워크에 독점적으로 액세스할 수 있게 되어 전 세계 서버의 정보에 액세스할 수 있게 되었을 때도 비슷한 느낌이 들었습니다. 물론 인터넷이었습니다.

 

저는 두 가지 개발이 세상을 바꾸었다고 말하는 것이 공평하다고 생각합니다. ChatGPT 자체가 세상을 바꿀 정도는 아니지만, 우리의 사업 방식과 생활 방식을 변화시킬 인공지능 애플리케이션의 새로운 시대를 나타냅니다.

 

올해 어떤 다른 AI 제품이 출시될지 보는 것은 매우 흥미로울 것입니다. Microsoft가 OpenAI에 투자함에 따라 Google과 Apple의 제품도 뒤처지지 않을 것입니다.

 

ChatGPT를 사용해보고 코드를 작성해 보시기를 강력히 권합니다. 가치가 있을 것이고, 재미있을 것입니다.

 

그리고 네, 저는 여전히 그것이 정말 마법 같다고 생각합니다!

 

부품 목록

 

다음은 이 기사의 실험을 완료하는 데 필요할 수 있는 몇 가지 구성 요소입니다. 이러한 링크 중 일부는 제휴 링크일 수 있으며 DroneBot Workshop은 귀하의 구매에 대해 수수료를 받을 수 있습니다. 이는 귀하의 비용을 증가시키지 않으며 이 광고 없는 웹사이트를 지원하는 방법입니다.

 

Arduino Uno – Arduino Store

ESP32 DEVKIT C – Digikey

 

리소스

 

  • 사용된 코드 – 이것은 ChatGPT에서 받은 코드이며, 동일한 쿼리에 대해 받는 코드와 다를 수 있습니다.
  • ChatGPT – ChatGPT의 로그인.
  • Thonny IDE – Thonny IDE를 사용하여 MicroPython으로 작업할 수 있습니다. Linux, Mac 및 Windows에서 사용할 수 있습니다.
  • MicroPython 다운로드 페이지 – ESP32 보드용 최신 MicroPython 펌웨어를 다운로드하세요. 

 

 

반응형