로보테크AI

융합_로보테크 AI 자율주행 로봇 개발자 과정-26/02/25

steezer 2026. 2. 25. 18:30

와이파이

3F_302

0424719222!!

 

온습도 계측과 데이터 표시

 

DHT11 미니 온습도 센서 모듈

주변의 온도와 습도를 측정할 수 있는 ‘온습도 센서’ 중에서도 입문(학습)용으로 많이 사용

3개 단자로 구성되어 있으며, 순서는 왼쪽부터 Data, VCC, GND

 

아두이노 기본 라이브러리에는 DHT11 센서 값을 읽기 위해 필요한 기능이 포함되어 있지 않으므로, 라이브러리 매니저를 통해 [DHT Sensor Library]를 설치

 

 

5V 전압과 GND를 연결하고, 온습도 출력 단자는 디지털 2번 핀에 연결

저항은 필요 X

 

// 전처리문: 헤더파일 불러오기
#include "DHT.h" // 사용자 정의 또는 외부 다운로드 헤더

#define DHTPIN 2      // 데이터 핀
#define DHTTYPE DHT11 // 센서 종류 지정 (DHT11)

// 온습도센서 처리 객체 dht 생성됨!
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin(); // 센서 초기화
}

void loop() {
  delay(3000); // 측정 주기가 느리므로 딜레이가 짧을 필요 없음

  float h = dht.readHumidity();    // 습도 값 읽기
  float t = dht.readTemperature(); // 섭씨 온도 값 읽기

  // 오류 체크
  if (isnan(h) || isnan(t)) {
    Serial.println("DHT11 센서에서 데이터를 읽을 수 없습니다!");
    return;
  }

  // 값 출력
  Serial.print("습도: ");
  Serial.print(h);
  Serial.print("%, ");

  Serial.print("온도: ");
  Serial.print(t);
  Serial.println("*C");
}

 

 

 

4-digit FND 출력하기

7세그먼트는 7개의 LED로 구성된 장치로, 주로 숫자를 표현할 때 사용

4-digit FND는 7세그먼트 4개가 붙어있는 형태의 장치로 4자리의 숫자를 표시할 수 있음

여러 개의 LED가 내장되어 있어 핀이 많은데, 핀 구성은 크게 숫자의 위치(4자리 중 선택)를 결정하는 핀과 세그먼트 제어 핀으로 구분

위 그림에서 D1~D4가 숫자의 위치를 결정하며, a~g는 세그먼트를 제어

dp는 점

#define PERIOD 1000

int position_pin[] = {1,2,3,4};             //4자리 결정 핀
int segment_pin[] = {5,6,7,8,9,10,11};     //세그먼트 제어 핀

//0 ~ 9를 표현하는 세그먼트 값
byte data[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE4, 0xFE, 0xE6};
int number = 0;

void setup() {       
  for(int i = 0; i < 4; i++) {
     pinMode(position_pin[i], OUTPUT);
  }

  for(int i = 0; i < 7; i++) {
    pinMode(segment_pin[i], OUTPUT);
  }

  // 4자리 결정 PIN이 LOW일 때 각 자리 활성화됨
  for(int i = 0; i < 4; i++) {
    digitalWrite(position_pin[i], LOW);
  }
}

void loop() {

  if(number > 8) number = 0;

 
  for(int i = 0; i < 8; i++){
    // 각 숫자에 해당하는 16진수 값을 토대로 활성 세그먼트 정하기!
    byte segment = (data[number] & (0x01 << i)) >> i;
    if(segment == 1){
      digitalWrite(segment_pin[7 - i], HIGH);
    } else {
      digitalWrite(segment_pin[7 - i], LOW);
    }
  }
  number++;
  delay(PERIOD);
}

 

 

실습 과제 1
FND의 숫자가 0000부터 9999까지 카운트하게 만드는 프로젝트를 진행해보세요. 카운팅 주기는 자유롭게 결정해도 좋습니다. 

//7세그먼트 선택 핀
int digit_select_pin[] = {1,2,3,4};
//7세그먼트 제어 핀
int segment_pin[] = {5,6,7,8,9,10,11,12};
//자릿수 표현 사이의 지연 시간, ms 단위
int time_delay = 6;
//0~9까지의 숫자 표시를 위한 세그먼트 a~dp의 점멸 패턴
//켜지는 부분이 1로 표현됨
byte digits_data[10]={0xFC, 0x60, 0xDA, 0xF2,  0x66, 
                      0xB6, 0xBE, 0xE4, 0xFE, 0xE6};
int d1000, d100, d10, d1;

void setup()
{
  //자릿수 선택 핀을 출력으로 설정
  for(int i = 0; i < 4; i++)
  {
    pinMode(digit_select_pin[i], OUTPUT);
  }
  // 세그먼트 제어 핀을 출력으로 설정
  for(int i = 0; i < 8; i++)
  {
    pinMode(segment_pin[i], OUTPUT);
  }
}
//해당 자릿수에 숫자 하나를 표시하는 함수
//(위치, 출력할 숫자)
void show_digit(int pos, int number)
{
  for(int i = 0; i < 4; i++)
  {
    if(i+1 ==pos)
      //해당 자릿수의 선택 핀만 LOW로 설정
      digitalWrite(digit_select_pin[i], LOW);
    else
      //나머지 자리는 HIGH로 설정
      digitalWrite(digit_select_pin[i], HIGH);
  }
  // 8개 세그먼트 제어
  for(int i = 0; i < 8; i++)
  {
    byte segment_data = (digits_data[number] 
         & (0x01 << i)) >> i;
    if(segment_data == 1)
      digitalWrite(segment_pin[7-i], HIGH);
    else
      digitalWrite(segment_pin[7-i], LOW);
  }
}
void loop()
{
  for( int i = 0; i < 10000; i++)
  {
 
    d1000 = i /1000;
    d100 = i % 1000/100;
    d10 = i % 100/10;
    d1 = i % 10;
    for(int j = 0 ; j < 10 ; j++)
    {
 
     show_digit(1, d1000);
     delay(time_delay);
     show_digit(2, d100);
     delay(time_delay);
     show_digit(3, d10);
     delay(time_delay);
     show_digit(4, d1);
     delay(time_delay);
    }
  }
}


실습 과제 2
온습도 센서의 센싱값인 온도 또는 습도 중 하나를 선택하여 FND에 표시하는 프로젝트를 진행해보세요. 난이도 하향을 위해 정수부만 표시하는 것으로 하겠습니다.

 

※시간 부족으로 코드

#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

// 세그먼트 핀
int segment_pin[] = {5,6,7,8,9,10,11,12};

// 자리 선택 핀 (A0~A3 사용)
int digit_select_pin[] = {A0, A1, A2, A3};

int time_delay = 3;

// 0~9 패턴 (기존 코드 유지)
byte digits_data[10]={0xFC, 0x60, 0xDA, 0xF2, 0x66, 
                      0xB6, 0xBE, 0xE4, 0xFE, 0xE6};

int d1000, d100, d10, d1;

void setup()
{
  for(int i = 0; i < 4; i++)
    pinMode(digit_select_pin[i], OUTPUT);

  for(int i = 0; i < 8; i++)
    pinMode(segment_pin[i], OUTPUT);

  dht.begin();
}

// 자리 표시 함수
void show_digit(int pos, int number)
{
  for(int i = 0; i < 4; i++)
  {
    digitalWrite(digit_select_pin[i], (i+1 == pos) ? LOW : HIGH);
  }

  for(int i = 0; i < 8; i++)
  {
    byte segment_data = (digits_data[number] & (0x01 << i)) >> i;

    digitalWrite(segment_pin[7-i], 
                (segment_data == 1) ? HIGH : LOW);
  }
}

// 4자리 분해
void splitNumber(int value)
{
  if(value < 0) value = 0;
  if(value > 9999) value = 9999;

  d1000 = value / 1000;
  d100  = (value % 1000) / 100;
  d10   = (value % 100) / 10;
  d1    = value % 10;
}

void loop()
{
  // 1초마다 온도 읽기
  static unsigned long lastRead = 0;
  if(millis() - lastRead > 1000)
  {
    lastRead = millis();

    float temp = dht.readTemperature(); // 섭씨

    if(!isnan(temp))
    {
      int t = (int)temp;   // 정수부만
      splitNumber(t);
    }
  }

  // 계속 멀티플렉싱
  for(int j = 0 ; j < 5 ; j++)
  {
    show_digit(1, d1000); delay(time_delay);
    show_digit(2, d100);  delay(time_delay);
    show_digit(3, d10);   delay(time_delay);
    show_digit(4, d1);    delay(time_delay);
  }
}

 

거리 계측 및 데이터 응용하기

 

HC-SR04는 초음파를 이용해 거리를 측정하는 센서

트리거(Trig) 핀으로 초음파 신호를 보내고,

물체에 반사되어 돌아오는 시간을 에코(Echo) 핀에서 측정해 거리를 계산

pyserial

파이썬에서 시리얼 통신을 쉽게 다룰 수 있게 해 주는 라이브러리

아두이노와 같은 마이크로컨트롤러 보드가 시리얼을 통해 전송하는 데이터를 파이썬 코드에서 받아 처리하거나,

반대로 파이썬에서 명령을 보드로 전송할 수 있음

#define TRIG_PIN 6
#define ECHO_PIN 7

void setup() {
  Serial.begin(9600);         // 시리얼 모니터 시작
  pinMode(TRIG_PIN, OUTPUT);  // Trig 핀 출력
  pinMode(ECHO_PIN, INPUT);   // Echo 핀 입력
}

void loop() {
  long duration, distance;

  // Trig 핀에서 10µs 펄스 발생
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  // Echo 핀에서 HIGH 유지 시간 측정 (µs 단위)
  duration = pulseIn(ECHO_PIN, HIGH);

  // 거리 계산 (음속 약 340m/s → 29.1µs에 1cm 이동)
  distance = duration * 0.034 / 2; // 왕복이므로 2로 나눔

  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");

  delay(500); // 0.5초마다 측정
}

 

실습 과제
HC-SR04 초음파 센서 값을 파이썬 코드에서 출력(`print()` 함수)하는 프로젝트를 진행해보세요.  숫자가 아닌 다른 유형의 데이터가 전송되었을 경우에는 이를 무시할 수 있도록 예외 처리까지 포함해서 코드를 작성하세요.

 

아두이노 C++

#define TRIG_PIN 6
#define ECHO_PIN 7

void setup() {
  Serial.begin(9600);         // 시리얼 모니터 시작
  pinMode(TRIG_PIN, OUTPUT);  // Trig 핀 출력
  pinMode(ECHO_PIN, INPUT);   // Echo 핀 입력
}

void loop() {
  long duration, distance;

  // Trig 핀에서 10µs 펄스 발생
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  // Echo 핀에서 HIGH 유지 시간 측정 (µs 단위)
  duration = pulseIn(ECHO_PIN, HIGH);

  // 거리 계산 (음속 약 340m/s → 29.1µs에 1cm 이동)
  distance = duration * 0.034 / 2; // 왕복이므로 2로 나눔

  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");

  delay(500); // 0.5초마다 측정
}

 

파이참 python

import serial
import re
import time

# 시리얼 포트 설정
PORT = 'COM3'
BAUDRATE = 9600

def extract_distance(text):
    match = re.search(r'\d+', text)
    if match:
        return int(match.group())
    return None

def main():
    try:
        ser = serial.Serial(PORT, BAUDRATE, timeout=1)
        time.sleep(2)  # 아두이노 리셋 대기

        print("거리 수신 시작")

        while True:
            try:
                line = ser.readline().decode('utf-8').strip()

                if not line:
                    continue

                distance = extract_distance(line)

                if distance is not None:
                    print(f"Distance: {distance} cm")
                else:
                    # 숫자 없는 데이터는 무시
                    continue

            except UnicodeDecodeError:
                # 깨진 문자열 무시
                continue

            except ValueError:
                # 숫자 변환 실패 시 무시
                continue

    except serial.SerialException as e:
        print("시리얼 연결 오류:", e)

    except KeyboardInterrupt:
        print("\n프로그램 종료")

    finally:
        if 'ser' in locals() and ser.is_open:
            ser.close()

if __name__ == "__main__":
    main()

 

거리 수신 시작

Distance: 188 cm
Distance: 26 cm
Distance: 12 cm
Distance: 7 cm
Distance: 7 cm
Distance: 15 cm
Distance: 14 cm
Distance: 13 cm
Distance: 4 cm
Distance: 3 cm
Distance: 19 cm
Distance: 188 cm


프로그램 종료


종료 코드 0(으)로 완료된 프로세스

 

 

무선 통신 모듈 활용하기

블루투스 HC-06 모듈

아두이노와 같은 마이크로컨트롤러 보드에서 많이 사용하는 저가형 블루투스 직렬 통신 모듈

기본적으로 마스터가 아닌 슬레이브 모드로 동작하며, 스마트폰이나 PC와 시리얼 통신을 통해 데이터를 주고받을 수 있음

간단한 AT 명령으로 통신 속도와 이름 등을 설정 가능

 

 

TX (Transmit): 모듈이 데이터를 내보내는 핀

HC-06이 아두이노로 전송하는 데이터는 이 TX 핀을 통해 나감

아두이노의 RX 핀에 연결


RX (Receive): 모듈이 데이터를 받는 핀

아두이노에서 HC-06으로 데이터를 보내려면 아두이노의 TX 핀을 HC-06의 RX에 연결

 

직렬 통신은 항상 교차 연결이 원칙

 

명령어 기능 기본값 / 예시
AT 모듈 응답 확인 OK
AT+VERSION 펌웨어 버전 확인 OKlinvor1.8
AT+NAMExxxx 모듈 이름 변경 AT+NAMEHC06 (기본: HC-06)
AT+PINxxxx 블루투스 연결 비밀번호 변경 AT+PIN1234 (기본: 1234)
AT+BAUDx 통신 속도(baud rate) 변경 AT+BAUD4 → 9600bps (기본값)

 

명령어 Baud rate
AT+BAUD1 1200
AT+BAUD2 2400
AT+BAUD3 4800
AT+BAUD4 9600 (기본값)
AT+BAUD5 19200
AT+BAUD6 38400
AT+BAUD7 57600
AT+BAUD8 115200

 

 

실습 과제 1
안드로이드 스마트폰 사용자의 경우, 시리얼 통신 테스트용 앱을 다운로드해 블루투스 모듈과 스마트폰 간의 데이터 통신을 수행해보세요(아이폰 사용자는 블루투스 모듈 사용에 제약이 있으니 방법만 조사해보세요).

 

Serial Bluetooth Terminal 어플 설치

AT

setnameTEST1

setPIN0000

#include <SoftwareSerial.h>        // 블루투스 시리얼 통신 라이브러리 추가

#define BT_RXD 8
#define BT_TXD 7

SoftwareSerial bluetooth(BT_RXD, BT_TXD);        // 블루투스 설정 BTSerial(Tx, Rx)

void setup() {
  Serial.begin(9600);
  bluetooth.begin(9600);                         // 블루투스 통신 시작
}

void loop() {

  if (bluetooth.available()) {        // 블루투스에서 보낸 내용은 시리얼모니터로 전송
    Serial.write(bluetooth.read());
  }

  if (Serial.available()) {           // 시리얼모니터에서 보낸 내용은 블루투스로 전송
    bluetooth.write(Serial.read());
  }
  
}

 

 

 

실습 과제 2

PyQt를 이용해 입력 필드와 전송 버튼, 그리고 라벨이 있는 GUI 프로그램을 만들고, 전송 버튼을 누르면 입력한 값이 블루투스 모듈에 전달되어 설정 값 변경이 수행되는 프로젝트를 진행해보세요. 블루투스로부터 전달된 데이터는 라벨에 표시하세요(난이도 약~간 있음).

 

arduino

#include <SoftwareSerial.h>

#define BT_RXD 8
#define BT_TXD 7
#define LED_PIN 9

SoftwareSerial bluetooth(BT_RXD, BT_TXD);

int settingValue = 0;

void setup() {
  Serial.begin(9600);
  bluetooth.begin(9600);
  pinMode(LED_PIN, OUTPUT);
}

void loop() {

  // Python -> Bluetooth
  if (Serial.available()) {
    String input = Serial.readString();
    input.trim();

    if (input.length() > 0) {
      settingValue = input.toInt();
      settingValue = constrain(settingValue, 0, 255);
      analogWrite(LED_PIN, settingValue);

      // 결과 다시 Python으로 보내기
      Serial.print("SET:");
      Serial.println(settingValue);
    }
  }

  // Bluetooth -> Python
  if (bluetooth.available()) {
    String input = bluetooth.readString();
    input.trim();

    if (input.length() > 0) {
      settingValue = input.toInt();
      settingValue = constrain(settingValue, 0, 255);
      analogWrite(LED_PIN, settingValue);

      Serial.print("SET:");
      Serial.println(settingValue);
    }
  }
}

 

pycharm

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QPushButton, QLabel
from PyQt5.QtCore import QTimer
import serial
import serial.tools.list_ports


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt5 & pyserial App")
        self.ser = None

        self.input = QLineEdit(self)
        self.input.setPlaceholderText("보낼 내용을 입력하세요")
        self.send_btn = QPushButton("전송", self)
        self.result = QLabel("수신: (아직 없음)", self)

        layout = QVBoxLayout(self)
        layout.addWidget(self.input)
        layout.addWidget(self.send_btn)
        layout.addWidget(self.result)
        self.setLayout(layout)

        try:
            ports = serial.tools.list_ports.comports()
            for port in ports:
                if "Arduino" in port.description:
                    self.ser = serial.Serial(port.device, 9600, timeout=0.05)
                    print(f"{port.device}에 연결되었습니다.")
                    break
        except Exception as e:
            self.ser = None
            self.result.setText(f"포트 열기 실패: {e}")

        self.send_btn.clicked.connect(self.send_text)
        self.input.returnPressed.connect(self.send_text)

        self.timer = QTimer(self)
        self.timer.setInterval(30)  # 30ms마다 수신 확인 (가볍고 UI 멈춤 없음)
        self.timer.timeout.connect(self.read_serial)
        self.timer.start()

    def send_text(self):
        if not self.ser or not self.ser.is_open:
            self.result.setText("오류: 시리얼 포트가 열리지 않았습니다.")
            return
        data = self.input.text()
        if data == "":
            return
        try:
            self.ser.write(data.encode())
        except Exception as e:
            self.result.setText(f"전송 오류: {e}")

    def read_serial(self):
        if not self.ser or not self.ser.is_open:
            return
        try:
            n = self.ser.in_waiting
            if n > 0:
                raw = self.ser.read(n)
                text = raw.decode("utf-8")
                self.result.setText(f"수신: {text}")
        except Exception as e:
            self.result.setText(f"수신 오류: {e}")

    def closeEvent(self, event):
        try:
            if self.ser and self.ser.is_open:
                self.ser.close()
        except:
            pass
        event.accept()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.resize(500, 140)
    w.show()
    sys.exit(app.exec_())

무선 통신 모듈 활용2

 

ESP-8266 & ESP-01 모듈

 

ESP-8266 모듈

Wi-Fi 무선 통신 기능을 탑재한 저전력 마이크로컨트롤러

 

ESP-01 모듈

8핀 소형 폼팩터로, 보통 ESP-01 어댑터나 USB to TTL 변환 모듈을 통해 연결하고,

아두이노 IDE 등을 사용해 프로그램을 업로드하여 사용

https://www.silabs.com/software-and-tools/usb-to-uart-bridge-vcp-drivers?tab=downloads

 

CP210x USB to UART Bridge VCP Drivers - Silicon Labs

The CP210x USB to UART Bridge Virtual COM Port (VCP) drivers are required for device operation as a Virtual COM Port to facilitate host communication with CP210x products. These devices can also interface to a host using the direct access driver.

www.silabs.com

$RG02DZJ.zip
8.56MB
$RP0JPR9.zip
0.28MB

 

ESP-01 주요 명령어

AT 모듈이 응답하는지 테스트 (OK 응답)
AT+RST 모듈 리셋
AT+GMR 펌웨어 버전 확인
AT+GSLP=<time> 저전력 슬립 모드로 진입
ATE0 / ATE1 명령어 에코(출력) 끄기 / 켜기
AT+UART? / AT+UART=<baud>,8,1,0,0 UART 설정 확인 / 변경

 

AT+CWMODE? / AT+CWMODE=<mode> Wi-Fi 모드 설정(1=Station, 2=SoftAP, 3=Both)
AT+CWJAP? / AT+CWJAP="SSID","PASS" Wi-Fi 접속 상태 확인 / 접속
AT+CWQAP Wi-Fi 연결 해제
AT+CWLAP 주변 Wi-Fi 목록 검색
AT+CWSAP? / AT+CWSAP="SSID","PASS",ch,ecn SoftAP 설정 확인 / 변경
AT+CIPSTAMAC? / AT+CIPSTAMAC="MAC" Station 모드 MAC 주소 확인 / 설정
AT+CIPSTA? / AT+CIPSTA="IP","Gateway","Mask" IP 주소 설정
AT+CWJAP_DEF / AT+CWSAP_DEF 기본(Wi-Fi 자동 연결용) 설정 저장

 

모듈 공유기랑 연결

 

실습 과제
다음 두 예제의 의미를 파악하고, 이를 응용하여 아두이노 보드와 ESP-01 모듈을 실행해보세요. ESP-01 모듈을 서버로 활용하여 웹페이지에서 보낸 명령을 통해 LED를 제어하는 프로그램입니다.

 

#include <SoftwareSerial.h>
#define DEBUG true

SoftwareSerial esp8266(2,3);

void setup() {
  Serial.begin(9600);
  esp8266.begin(9600);
  
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);

  sendData("AT+RST\r\n",2000,DEBUG);
  sendData("AT+CIOBAUD?\r\n",2000,DEBUG);
  sendData("AT+CWMODE=3\r\n",1000,DEBUG);
  sendData("AT+CWLAP\r\n",3000,DEBUG);
  sendData("AT+CWJAP=\"3F_302\",\"0424719222!!\"\r\n",5000,DEBUG);
  sendData("AT+CIFSR\r\n",1000,DEBUG);
  sendData("AT+CIPMUX=1\r\n",1000,DEBUG);
  sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG);
}

void loop() {
  if (esp8266.available()) {
    if (esp8266.find("+IPD,")) {
      delay(1000);
      int connectionId = esp8266.read() - 48;
      esp8266.find("pin=");
      int pinNumber = (esp8266.read() - 48) * 10;
      pinNumber += (esp8266.read() - 48);
      digitalWrite(pinNumber, !digitalRead(pinNumber));
      String closeCommand = "AT+CIPCLOSE=";
      closeCommand += connectionId;
      closeCommand += "\r\n";
      sendData(closeCommand,1000,DEBUG);
    }
  }
}

String sendData(String command, const int timeout, boolean debug) {
  String response = "";
  esp8266.print(command);
  long int time = millis();
  while ((time + timeout) > millis()) {
    while (esp8266.available()) {
      char c = esp8266.read();
      response += c;
    }
  }
  if (debug) {
    Serial.print(response);
  }
  return response;
}
<html>
<head>
    <title>ESP8266 LED Control</title>
</head>
<body>
    <button id="13" class="led">Pin 13</button> 

    <script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            $(".led").click(function(){
                var p = $(this).attr('id');
                $.get("http://자신의_ESP_01_보드_IP:80/", { pin:p });    
            });
        });
    </script>
</body>
</html>