반응형

아두이노나 ESP32에서 소리를 측정할 때는 보통 MAX4466, MAX9814 같은 아날로그 마이크 모듈을 ADC 핀에 연결하여 사용한다. 하지만 아날로그 방식은 보드의 전원 잡음과 ADC 잡음이 그대로 소리 데이터에 섞이고, ESP32의 ADC는 정밀도가 높지 않아 녹음 품질이 떨어지는 한계가 있었다.

INMP441은 마이크와 ADC가 하나의 칩에 들어 있는 MEMS 디지털 마이크로, 소리를 칩 안에서 24비트 디지털 값으로 바꾼 후 I2S 방식으로 보내기 때문에 잡음이 적고 깨끗한 소리를 얻을 수 있다. 이 글에서는 INMP441의 사양과 ESP32 연결 방법, 소리 크기(dB)를 측정하는 예제와 녹음 방법을 소개한다.

 


1. INMP441 소개

INMP441은 TDK InvenSense에서 만든 전방향(Omnidirectional) MEMS 마이크로, 마이크 소리 구멍이 기판 아래쪽에 있는 바텀 포트(Bottom Port) 구조이다. 판매되는 모듈은 이 칩을 작은 원형 기판에 올리고 6개의 핀을 뽑아 놓은 형태이며, 소리 구멍은 칩이 없는 반대쪽 면에 뚫려 있다.

I2S(Inter-IC Sound)는 디지털 오디오 데이터를 주고받기 위한 통신 방식으로, 비트 클럭(SCK), 좌우 채널 선택(WS), 데이터(SD) 3개의 선으로 소리 데이터를 계속 전송한다. ESP32, ESP32-S3, 라즈베리파이 피코 등은 I2S 주변장치를 갖추고 있어 INMP441을 바로 연결할 수 있다.

특징:

  • 디지털 출력: 칩 안에서 24비트로 변환하므로 보드의 전원 잡음과 ADC 성능에 영향을 적게 받는다.
  • 높은 신호 대 잡음비: SNR 61dBA로 작은 소리도 비교적 깨끗하게 측정할 수 있다.
  • 스테레오 구성: L/R 핀 설정을 다르게 한 INMP441 두 개를 같은 I2S 선에 연결하면 스테레오 녹음을 할 수 있다.
  • 저전력: 1.4mA 정도의 낮은 전류로 동작하여 배터리 장치에도 사용할 수 있다.

2. 주요 사양 및 아날로그 마이크와의 비교

많이 사용하는 아날로그 마이크 모듈 MAX9814와 INMP441의 차이는 다음과 같다.

항목 MAX9814 (아날로그) INMP441 (디지털)
출력 방식 아날로그 전압 I2S 디지털 (24-bit)
연결 핀 ADC 핀 1개 I2S 3개 (SCK, WS, SD)
해상도 보드 ADC에 따름 (ESP32 12-bit) 24-bit
신호 대 잡음비 보드 잡음에 따라 달라짐 61 dBA
감도 자동 이득 조절 (AGC) -26 dBFS (94dB SPL 기준)
주파수 응답 20Hz ~ 20kHz 60Hz ~ 15kHz
동작 전압 2.7 ~ 5.5V 1.8 ~ 3.3V
사용 가능 보드 아두이노 우노 등 대부분 I2S 지원 보드 (ESP32 등)

 

아두이노 우노처럼 I2S 기능이 없는 보드에서는 INMP441을 사용할 수 없으므로, 우노에서는 아날로그 마이크를 사용하고 ESP32 계열에서는 INMP441을 사용하는 것이 좋다.


3. PIN 배열 및 연결

1) INMP441 핀 기능

핀 기능
VDD 전원 (3.3V)
GND GND
SCK I2S 비트 클럭 (BCLK)
WS 좌우 채널 선택 (LRCLK)
SD 소리 데이터 출력
L/R 채널 선택 (GND: 왼쪽, VDD: 오른쪽)

 

2) ESP32 연결

ESP32 DevKitC 보드와 다음과 같이 연결한다. ESP32의 I2S 핀은 대부분의 GPIO로 바꿀 수 있지만, SD 신호는 입력 전용 핀(GPIO34~39)에도 연결할 수 있다.

INMP441 ESP32
VDD 3.3V
GND GND
SCK GPIO26
WS GPIO25
SD GPIO33
L/R GND

 

 

출처: 직접 제작


4. 개발환경 및 라이브러리

아두이노 IDE의 보드 매니저에서 esp32 by Espressif Systems 패키지 3.x 버전을 설치한다. 3.x 버전에는 I2S를 쉽게 사용할 수 있는 ESP_I2S 라이브러리가 포함되어 있으므로 따로 라이브러리를 설치할 필요가 없다. 보드는 [ESP32 Dev Module]을 선택한다.

2.x 버전에서 사용하던 driver/i2s.h 방식의 예제는 3.x 버전에서 동작하지 않거나 경고가 출력되므로, 인터넷의 예제를 사용할 때는 패키지 버전을 확인해야 한다.


5. 예제 코드

1) 소리 크기(dB) 측정

INMP441로 소리를 받아 대략적인 소리 크기를 dB로 계산하고, 70dB이 넘으면 보드의 내장 LED를 켜는 예제이다.

#include <ESP_I2S.h>

#define I2S_SCK 26   // INMP441 SCK
#define I2S_WS  25   // INMP441 WS
#define I2S_SD  33   // INMP441 SD
#define LED_PIN 2    // 보드 내장 LED

I2SClass i2s;
int32_t samples[256];

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);

  i2s.setPins(I2S_SCK, I2S_WS, -1, I2S_SD);
  if (!i2s.begin(I2S_MODE_STD, 16000, I2S_DATA_BIT_WIDTH_32BIT,
                 I2S_SLOT_MODE_MONO, I2S_STD_SLOT_LEFT)) {
    Serial.println("I2S 초기화 실패");
    while (true) delay(1000);
  }
}

void loop() {
  size_t bytes = i2s.readBytes((char *)samples, sizeof(samples));
  int count = bytes / 4;
  if (count == 0) return;

  double sum = 0;
  for (int i = 0; i < count; i++) {
    int32_t v = samples[i] >> 8;   // 상위 24비트가 소리 데이터
    sum += (double)v * v;
  }
  double rms = sqrt(sum / count);
  double db = 20.0 * log10(rms / 8388607.0 + 1e-9) + 120.0;
  Serial.println(db);

  digitalWrite(LED_PIN, db > 70 ? HIGH : LOW);
}

코드 설명:

  • 1 Line: ESP32 패키지에 포함된 I2S 라이브러리를 불러온다.
  • 3~6 Line: INMP441을 연결한 핀과 LED 핀을 정의한다. 보드에 따라 내장 LED가 없거나 다른 핀에 있을 수 있다.
  • 8~9 Line: I2S 객체와 소리 데이터 256개를 담을 배열을 만든다.
  • 15 Line: 비트 클럭, WS, 출력(사용 안 함 -1), 입력 핀 순서로 I2S 핀을 지정한다.
  • 16~20 Line: 표준 I2S 모드, 16kHz 샘플링, 32비트 데이터, 모노(왼쪽 채널)로 시작한다. INMP441은 24비트 데이터를 32비트 슬롯에 담아 보내므로 32비트로 설정해야 한다.
  • 24~26 Line: 소리 데이터를 읽고, 읽은 바이트 수를 4로 나누어 샘플 수를 구한다.
  • 28~33 Line: 각 샘플을 8비트 오른쪽으로 밀어 24비트 값으로 만든 후 제곱 평균의 제곱근(RMS)을 구한다.
  • 34 Line: RMS 값을 최대값(8388607)에 대한 dBFS로 바꾸고 120을 더해 대략적인 dB SPL 값으로 만든다. INMP441은 94dB 소리에서 -26dBFS가 나오므로 94 + 26 = 120을 더한다.
  • 35~37 Line: 계산한 값을 출력하고, 70dB이 넘으면 LED를 켠다.

업로드한 후 [툴] → [시리얼 플로터]를 열고 115200bps로 설정하면 소리 크기가 그래프로 표시된다. 조용한 방에서는 30~40dB 정도, 박수를 치면 80dB 이상으로 올라가는 것을 확인할 수 있다. 정확한 소음계가 아니므로 소음계 앱이나 측정기와 비교하여 120 값을 조금 조정해 사용하면 된다.

 

2) 녹음하여 WAV 파일로 저장

ESP_I2S 라이브러리는 정해진 시간 동안 녹음하여 WAV 데이터로 만들어 주는 recordWAV() 함수를 제공한다. [파일] → [예제] → [ESP_I2S] → [Record_to_WAV] 예제를 열어 I2S 핀 번호를 위의 연결에 맞게 바꾸고, microSD 카드 핀을 사용하는 보드에 맞게 설정하면 5초 동안 녹음한 소리를 test.wav 파일로 저장할 수 있다.

WAV 데이터는 16kHz, 16비트 모노 기준으로 1초에 약 32KB가 필요하므로, 길게 녹음하려면 PSRAM이 있는 ESP32-S3 보드를 사용하는 것이 좋다.


6. 주요 용도 및 주의사항

추천 주요 용도:

  • 소음 측정기: 교실, 사무실, 공사장의 소음을 측정하고 기준을 넘으면 경고 LED나 알림을 보낼 수 있다.
  • 음성 녹음기: microSD 카드에 녹음 파일을 저장하는 간단한 녹음기를 만들 수 있다.
  • 음성 인식: 녹음한 소리를 서버나 AI 음성 인식 서비스로 보내거나, ESP32-S3의 ESP-SR 라이브러리로 음성 명령을 인식할 수 있다.
  • 소리 반응 조명: 소리 크기나 박수 소리에 맞춰 LED가 반응하는 조명을 만들 수 있다.

사용 시 주의사항:

  • 3.3V 전용: VDD에 5V를 연결하면 칩이 손상될 수 있다.
  • L/R 핀 연결: L/R 핀을 비워 두면 채널이 정해지지 않아 데이터가 0으로 나오거나 불안정해지므로 반드시 GND 또는 VDD에 연결한다.
  • 소리 구멍 방향: 소리 구멍은 칩 반대쪽 면에 있으므로, 케이스에 넣을 때 구멍이 막히지 않도록 한다.
  • 선 길이: I2S 신호는 속도가 빠르므로 점퍼선은 20cm 이내로 짧게 연결하는 것이 좋다.
  • 처음 읽는 값: 시작 직후 수십 ms 동안은 값이 불안정하므로 처음 읽은 데이터는 버리고 사용하는 것이 좋다.

구매좌표:

 

 

 

INMP441 Omnidirectional Microphone Module I2S Interface High Sensitivity for ESP32 IoT Voice Development - AliExpress 18

Smarter Shopping, Better Living! Aliexpress.com

www.aliexpress.com

 

반응형
반응형

사람의 움직임을 감지하는 센서로는 적외선 방식의 PIR 센서인 HC-SR501이 가장 많이 사용된다. 가격이 저렴하고 사용 방법도 간단하지만, 사람이 몸에서 나오는 적외선의 변화를 감지하는 방식이기 때문에 사람이 움직이지 않고 가만히 앉아 있거나 누워 있으면 감지하지 못하는 한계가 있다. 그래서 PIR 센서로 조명을 자동으로 켜면 책상에 앉아 작업하는 도중에 조명이 꺼지는 일이 자주 생긴다.

LD2410은 HiLink에서 만든 24GHz 밀리미터파 레이더 센서로, 사람의 큰 움직임뿐 아니라 호흡처럼 아주 작은 움직임까지 감지하여 가만히 있는 사람도 감지할 수 있다. 이 글에서는 LD2410의 주요 사양을 HC-SR501과 비교하고, 핀 배열과 연결 방법, 라이브러리 설치 방법, OUT 핀과 UART 통신을 이용한 예제 코드를 소개한다.

 

 

출처: Hi-Link HLK-LD2410C 제품 페이지, © Shenzhen Hi-Link Electronic


1. LD2410 레이더 인체감지센서 소개

LD2410은 24GHz 대역의 전파를 보내고 사람에게 반사되어 돌아오는 신호를 분석하는 FMCW(주파수 변조 연속파) 레이더 방식의 센서이다. 반사 신호의 미세한 변화를 분석하여 사람이 있는지, 움직이고 있는지 정지해 있는지, 센서에서 얼마나 떨어져 있는지를 알려 준다.

감지 영역은 0.75m 간격의 거리 구간(Gate) 9개(0~8번)로 나뉘며, 구간별로 감지 감도를 다르게 설정할 수 있다. 예를 들어 센서 앞 1.5m 이내만 감지하거나, 선풍기가 있는 거리 구간의 감도만 낮추는 식으로 설정할 수 있다.

특징:

  • 움직이는 사람(Moving target)과 정지해 있는 사람(Stationary target)을 구분하여 감지한다.
  • OUT 핀으로 사람이 있으면 HIGH, 없으면 LOW 신호를 출력하므로 PIR 센서처럼 간단하게 사용할 수 있다.
  • UART 통신으로 사람까지의 거리, 신호 세기(에너지) 값을 읽고 감지 거리와 감도를 설정할 수 있다.
  • 전파 방식이므로 얇은 플라스틱, 나무, 유리 케이스 안에 넣어도 감지할 수 있으며, 빛이나 온도의 영향을 받지 않는다.

LD2410은 모델에 따라 LD2410(1.27mm 핀, 블루투스 없음), LD2410B(1.27mm 핀, 블루투스 지원), LD2410C(2.54mm 핀, 블루투스 지원)로 나뉜다. 브레드보드와 점퍼선을 바로 사용할 수 있는 LD2410C가 가장 사용하기 편하며, 이 글에서는 LD2410C를 기준으로 설명한다.


2. 주요 사양 및 HC-SR501과의 비교

PIR 센서인 HC-SR501과 LD2410C의 주요 사양 차이는 다음과 같다.

항목 HC-SR501 (PIR) LD2410C (레이더)
감지 방식 적외선(인체 열) 변화 감지 24GHz FMCW 레이더
정지한 사람 감지 불가 가능 (호흡 등 미세 움직임)
감지 거리 최대 약 7m 최대 약 6m (0.75m 단위 구간 설정)
감지 각도 약 110~120° 약 ±60°
거리 측정 불가 가능 (cm 단위)
동작 전압 4.5~20V 5V
소비 전류 약 65μA (대기) 평균 약 80mA
출력 디지털 OUT (3.3V) 디지털 OUT (3.3V) + UART (256000bps)
설정 방법 가변저항 2개, 점퍼 UART 명령, 블루투스 앱
케이스 투과 불가 (렌즈가 노출되어야 함) 가능 (플라스틱, 유리 등)

 

LD2410의 가장 큰 장점은 정지한 사람까지 감지한다는 점이다. 반면 소비 전류가 HC-SR501보다 훨씬 커서 배터리로 오래 동작시키기에는 적합하지 않으므로, 배터리 기기에는 HC-SR501, 상시 전원을 사용하는 재실 감지 장치에는 LD2410을 사용하는 것이 좋다.


3. PIN 배열 및 연결

LD2410C 모듈은 한쪽 끝에 2.54mm 간격의 5핀 헤더가 있다.

 

출처: Hi-Link HLK-LD2410C 제품 페이지, © Shenzhen Hi-Link Electronic

핀 기능 아두이노 우노 ESP32
VCC 전원 (5V) 5V 5V (VIN)
GND 접지 GND GND
TX UART 송신 사용 안 함 GPIO16 (RX2)
RX UART 수신 사용 안 함 GPIO17 (TX2)
OUT 감지 출력 (3.3V) D2 GPIO4 (선택)

 

  • 전원은 반드시 5V로 공급해야 하며, 3.3V로 공급하면 정상 동작하지 않는다.
  • UART 기본 통신 속도가 256000bps로 매우 빠르기 때문에, 아두이노 우노의 SoftwareSerial로는 안정적으로 통신할 수 없다. 우노에서는 OUT 핀만 사용하고, 거리 값을 읽으려면 하드웨어 UART가 여러 개 있는 ESP32나 아두이노 메가를 사용하는 것이 좋다.
  • TX, RX, OUT 핀은 3.3V 로직이므로 ESP32에는 직접 연결할 수 있다.
  • 센서의 안테나 면(부품이 없는 쪽)이 감지할 방향을 향하도록 설치해야 한다.

4. 라이브러리 설치

OUT 핀만 사용할 때는 라이브러리가 필요 없으며, UART로 거리 값을 읽을 때는 ld2410 라이브러리를 사용한다.

  1. 아두이노 IDE에서 툴 -> 라이브러리 관리를 선택한다.
  2. 검색창에 "ld2410"을 입력하고 ncmreynolds의 ld2410 라이브러리를 설치하면 된다.

[이미지: 라이브러리 매니저에서 ld2410 라이브러리 설치 화면]

감지 거리, 구간별 감도, 사람이 사라진 후 OUT 핀이 LOW가 될 때까지의 시간(기본 5초) 등은 스마트폰 앱 HLKRadarTool에서 블루투스로 연결하여 쉽게 설정할 수 있다. 앱에서는 거리별 신호 세기를 그래프로 보여 주므로 감도를 조절할 때 편리하다.


5. 예제 코드

1) OUT 핀으로 사람 감지하기 (아두이노 우노)

LD2410C의 OUT 핀을 우노의 D2에 연결하고, 사람이 감지되면 우노의 내장 LED를 켜는 예제이다. HC-SR501을 사용하던 코드와 거의 같다.

const int radarPin = 2;

void setup() {
  Serial.begin(9600);
  pinMode(radarPin, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  int state = digitalRead(radarPin);
  digitalWrite(LED_BUILTIN, state);

  if (state == HIGH) {
    Serial.println("사람 감지");
  } else {
    Serial.println("감지 없음");
  }
  delay(500);
}
  • 1 Line: OUT 핀을 연결한 D2 핀 번호를 지정한다.
  • 5~6 Line: D2 핀을 입력으로, 내장 LED 핀을 출력으로 설정한다.
  • 10 Line: OUT 핀의 상태를 읽는다. 사람이 있으면 HIGH, 없으면 LOW가 된다.
  • 11 Line: 읽은 상태 그대로 내장 LED를 켜고 끈다.
  • 13~17 Line: 감지 결과를 시리얼 모니터에 출력한다.

코드를 업로드한 후 센서 앞에 앉아 움직이지 않고 있어도 LED가 계속 켜져 있는 것을 확인할 수 있다. 자리를 떠나면 설정된 시간(기본 5초)이 지난 후 LED가 꺼진다. OUT 핀의 HIGH 전압은 3.3V이지만 우노에서 HIGH로 인식되므로 그대로 사용할 수 있다.

 

 

2) UART로 거리와 상태 읽기 (ESP32)

ESP32의 Serial2에 LD2410C를 연결하고, 움직이는 사람과 정지한 사람의 거리와 신호 세기를 1초마다 출력하는 예제이다.

#include <ld2410.h>

#define RADAR_RX_PIN 16
#define RADAR_TX_PIN 17

ld2410 radar;
unsigned long lastPrint = 0;

void setup() {
  Serial.begin(115200);
  Serial2.begin(256000, SERIAL_8N1, RADAR_RX_PIN, RADAR_TX_PIN);
  delay(500);

  if (radar.begin(Serial2)) {
    Serial.println("LD2410 연결 성공");
  } else {
    Serial.println("LD2410 연결 실패");
  }
}

void loop() {
  radar.read();

  if (radar.isConnected() && millis() - lastPrint > 1000) {
    lastPrint = millis();
    if (radar.presenceDetected()) {
      if (radar.movingTargetDetected()) {
        Serial.printf("움직이는 사람: %d cm, 세기 %d\n",
                      radar.movingTargetDistance(), radar.movingTargetEnergy());
      }
      if (radar.stationaryTargetDetected()) {
        Serial.printf("정지한 사람: %d cm, 세기 %d\n",
                      radar.stationaryTargetDistance(), radar.stationaryTargetEnergy());
      }
    } else {
      Serial.println("감지 없음");
    }
  }
}
  • 1 Line: ld2410 라이브러리를 포함한다.
  • 3~4 Line: 센서의 TX를 연결한 ESP32 수신 핀(GPIO16)과 센서의 RX를 연결한 송신 핀(GPIO17)을 지정한다.
  • 6~7 Line: 레이더 객체와 출력 간격을 확인하기 위한 시간 변수를 선언한다.
  • 11 Line: Serial2를 LD2410의 통신 속도인 256000bps로 시작한다.
  • 14~18 Line: 센서와 통신을 시작하고, 연결 결과를 시리얼 모니터에 출력한다.
  • 22 Line: 센서가 보내는 데이터를 읽어 들인다. 데이터가 계속 들어오므로 loop()에서 delay() 없이 자주 호출해야 한다.
  • 24~25 Line: 센서가 연결되어 있고 1초가 지났을 때만 결과를 출력한다.
  • 26 Line: 움직이거나 정지한 사람이 감지되었는지 확인한다.
  • 27~30 Line: 움직이는 사람이 있으면 거리(cm)와 신호 세기(0~100)를 출력한다.
  • 31~34 Line: 정지한 사람이 있으면 거리와 신호 세기를 출력한다.

코드를 업로드한 후 시리얼 모니터(115200bps)를 열고 센서 앞에서 움직이거나 가만히 서 있으면 상태에 따라 거리 값이 출력되는 것을 확인할 수 있다. 거리 값은 0.75m 구간 단위로 계산되므로 정밀한 거리 측정용이 아니라 대략적인 위치 확인용으로 사용하는 것이 좋다.

[이미지: 시리얼 모니터에 출력된 거리와 신호 세기 값]


6. 주요 용도 및 주의사항

추천 주요 용도:

  • 재실 감지 조명: 책상, 화장실, 거실 등에서 사람이 가만히 있어도 조명이 꺼지지 않는 자동 조명을 만들 수 있다.
  • 스마트홈 센서: ESP32와 함께 Home Assistant 등에 연결하여 방에 사람이 있는지에 따라 에어컨, 난방, 모니터 전원을 제어할 수 있다.
  • 숨김형 감지 장치: 케이스 안에 넣어도 감지가 되므로 외부에 센서가 드러나지 않는 장치를 만들 수 있다.
  • 거리별 동작 장치: 사람이 가까이 오면 화면을 켜거나 안내 음성을 재생하는 등 거리에 따라 다르게 동작하는 장치를 만들 수 있다.

사용 시 주의사항:

  • 오감지: 선풍기, 커튼, 화분처럼 움직이는 물체나 반려동물도 감지될 수 있으므로, 앱에서 해당 거리 구간의 감도를 낮추거나 최대 감지 거리를 줄여야 한다.
  • 금속 차폐: 전파는 금속을 통과하지 못하므로 금속 케이스 안에 넣거나 금속판 뒤에 설치하면 감지되지 않는다.
  • 전원 품질: 전원 노이즈가 많으면 오감지가 늘어나므로 안정적인 5V 전원을 사용하고, 필요하면 VCC와 GND 사이에 커패시터(예: 100μF)를 추가한다.
  • 통신 속도: 256000bps는 SoftwareSerial로 처리하기 어려우므로 하드웨어 UART를 사용해야 한다.

구매좌표:

 

 

HLK-LD2410 5V Mini High Sensitivity 24GHz Human Presence Status Sensor Radar Module - AliExpress 502

Smarter Shopping, Better Living! Aliexpress.com

www.aliexpress.com

 

반응형
반응형

아두이노로 무게를 측정하려면 무게에 따라 저항 값이 변하는 로드셀(Load Cell)을 사용한다. 하지만 로드셀에서 나오는 신호는 수 mV 정도로 매우 작아서, 아두이노 우노에 내장된 10비트 ADC로 직접 읽으면 1g 단위는커녕 수백 g의 변화도 제대로 구분하기 어렵다. 그래서 로드셀의 작은 신호를 크게 증폭하고 정밀하게 디지털 값으로 바꿔 주는 별도의 변환 모듈이 필요하다.

HX711은 로드셀 전용으로 만들어진 24비트 ADC 칩으로, 증폭기와 ADC가 하나의 칩에 들어 있어 로드셀을 연결하기만 하면 아두이노에서 2개의 선으로 무게 값을 읽을 수 있다. 이 글에서는 HX711의 주요 사양과 로드셀 종류, 연결 방법, 라이브러리 설치 방법, 보정(Calibration) 방법과 전자저울 예제 코드를 소개한다.


1. HX711과 로드셀 소개

로드셀은 금속 몸체에 스트레인 게이지(Strain Gauge)를 붙인 센서로, 무게가 가해지면 금속이 아주 조금 휘어지면서 스트레인 게이지의 저항 값이 변한다. 일반적인 로드셀은 스트레인 게이지 4개를 휘트스톤 브리지(Wheatstone Bridge) 회로로 연결하여, 무게에 비례하는 아주 작은 전압 차이를 출력한다.

HX711은 이 작은 전압 차이를 최대 128배로 증폭한 후 24비트 디지털 값으로 변환한다. 아두이노와는 DT(데이터)와 SCK(클럭) 2개의 핀으로 통신하며, I2C나 SPI가 아닌 HX711 전용 방식이므로 아무 디지털 핀에나 연결할 수 있다.

특징:

  • 24비트 해상도로 로드셀의 아주 작은 변화까지 측정할 수 있다.
  • 로드셀에 공급할 전원(E+, E-)을 모듈에서 만들어 주므로 별도의 전원 회로가 필요 없다.
  • 입력 채널이 2개(A, B)이며, 일반적으로 증폭률이 높은 A 채널을 사용한다.
  • 초당 10회(10SPS) 또는 80회(80SPS)로 측정할 수 있으며, 대부분의 모듈은 10SPS로 설정되어 있다.

2. 주요 사양 및 로드셀 종류

HX711과 아두이노 우노에 내장된 ADC의 사양 차이는 다음과 같다.

항목 아두이노 우노 내장 ADC HX711
해상도 10-bit (1,024단계) 24-bit (약 1,677만 단계)
증폭기 없음 내장 (128배, 64배, 32배)
입력 방식 단일 입력 (GND 기준) 차동 입력 (A+, A- 사이 전압)
입력 채널 6채널 2채널 (A: 128/64배, B: 32배)
측정 속도 약 10,000회/초 10회/초 또는 80회/초
동작 전압 5V 2.6~5.5V
소비 전류 - 1.5mA 이하 (절전 시 1μA 이하)
통신 방식 - DT, SCK 2선 직렬 통신

 

로드셀은 측정할 무게와 모양에 따라 여러 종류가 있으며, 아두이노에서는 주로 다음 두 가지를 많이 사용한다.

종류 측정 범위 배선 주요 용도
바(Bar) 타입 1kg, 5kg, 10kg, 20kg 등 4선 (풀 브리지) 주방 저울, 소형 전자저울
하프 브리지 타입 개당 50kg 3선 (4개를 조합해 사용) 체중계, 대형 저울

 

처음 사용한다면 4선 바 타입 로드셀이 연결과 고정이 쉬워 가장 좋으며, 측정할 최대 무게보다 조금 큰 용량의 로드셀을 선택한다. 이 글에서는 5kg 바 타입 로드셀을 기준으로 설명한다.


3. PIN 배열 및 연결

HX711 모듈은 한쪽에 로드셀을 연결하는 핀(E+, E-, A-, A+, B-, B+), 다른 쪽에 아두이노를 연결하는 핀(GND, DT, SCK, VCC)이 있다.

 

1) 로드셀과 HX711 연결

로드셀 선 색 기능 HX711 핀
빨강 여기 전압 + E+
검정 여기 전압 - E-
흰색 신호 - A-
초록 신호 + A+

 

선 색은 제조사마다 다를 수 있으므로 판매 페이지의 배선도를 확인한다. 무게를 올렸을 때 값이 줄어든다면 흰색과 초록색 선(A-, A+)을 서로 바꿔 연결하면 된다.

2) HX711과 아두이노 우노 연결

  • VCC: 5V (ESP32는 3.3V)
  • GND: GND
  • DT: D3
  • SCK: D2

3) 로드셀 고정 방법

바 타입 로드셀은 한쪽 끝을 바닥판에, 반대쪽 끝을 저울판에 나사로 고정해야 휘어짐이 생겨 무게를 측정할 수 있다. 로드셀 몸체에 표시된 화살표가 무게가 가해지는 방향(아래쪽)을 향하도록 설치하고, 가운데의 스트레인 게이지 부분은 다른 물체에 닿지 않도록 띄워야 한다.

 


4. 라이브러리 설치

  1. 아두이노 IDE에서 툴 -> 라이브러리 관리를 선택한다.
  2. 검색창에 "HX711"을 입력하고 Bogdan Necula의 HX711 Arduino Library를 설치하면 된다.

[이미지: 라이브러리 매니저에서 HX711 Arduino Library 설치 화면]

이 라이브러리의 주요 함수는 다음과 같다.

  • tare(): 현재 값을 0으로 맞추는 영점 설정 함수이다.
  • set_scale(값): 측정값을 g 단위로 바꾸기 위한 보정 계수를 설정한다.
  • get_value(횟수): 지정한 횟수만큼 측정한 평균값에서 영점 값을 뺀 원시 값을 돌려준다.
  • get_units(횟수): get_value() 값을 보정 계수로 나눈 실제 무게 값을 돌려준다.

5. 예제 코드

1) 보정 계수 구하기

로드셀은 같은 제품이라도 출력 값이 조금씩 다르기 때문에, 무게를 알고 있는 물건을 올려 보정 계수(Calibration Factor)를 먼저 구해야 한다. 무게를 정확히 알고 있는 물건(예: 500g 생수병, 주방 저울로 잰 물건)을 준비한다.

#include <HX711.h>

const int DOUT_PIN = 3;
const int SCK_PIN = 2;

HX711 scale;

void setup() {
  Serial.begin(9600);
  scale.begin(DOUT_PIN, SCK_PIN);

  Serial.println("저울 위의 물건을 모두 치우세요.");
  delay(3000);
  scale.tare();
  Serial.println("영점 설정 완료. 무게를 알고 있는 물건을 올리세요.");
}

void loop() {
  float value = scale.get_value(10);
  Serial.print("측정값: ");
  Serial.println(value);
  delay(1000);
}
  • 1 Line: HX711 라이브러리를 포함한다.
  • 3~4 Line: HX711의 DT, SCK 핀을 연결한 아두이노 핀 번호를 지정한다.
  • 10 Line: 지정한 핀으로 HX711과 통신을 시작한다.
  • 12~14 Line: 저울 위를 비울 수 있도록 3초 기다린 후 tare() 함수로 영점을 설정한다.
  • 19 Line: 10회 측정한 평균값에서 영점 값을 뺀 원시 값을 읽는다.
  • 20~21 Line: 읽은 값을 1초마다 시리얼 모니터에 출력한다.

물건을 올린 후 출력되는 측정값을 물건의 무게(g)로 나누면 보정 계수가 된다. 예를 들어 500g 물건을 올렸을 때 측정값이 210000 정도라면 보정 계수는 210000 ÷ 500 = 420이 된다. 측정값이 음수로 나오면 로드셀의 A-, A+ 선을 바꾸거나 보정 계수를 음수로 사용하면 된다.

[이미지: 보정용 물건을 올리고 시리얼 모니터에서 측정값을 확인하는 모습]

2) 영점 버튼이 있는 전자저울

앞에서 구한 보정 계수를 사용하여 무게를 g 단위로 출력하고, D4에 연결한 버튼을 누르면 영점을 다시 설정하는 전자저울 예제이다. 버튼은 한쪽을 D4, 다른 쪽을 GND에 연결한다.

#include <HX711.h>

const int DOUT_PIN = 3;
const int SCK_PIN = 2;
const int TARE_BTN = 4;
const float CAL_FACTOR = 420.0;

HX711 scale;

void setup() {
  Serial.begin(9600);
  pinMode(TARE_BTN, INPUT_PULLUP);
  scale.begin(DOUT_PIN, SCK_PIN);
  scale.set_scale(CAL_FACTOR);
  scale.tare();
  Serial.println("저울 준비 완료");
}

void loop() {
  if (digitalRead(TARE_BTN) == LOW) {
    scale.tare();
    Serial.println("영점 설정");
    delay(300);
  }

  float weight = scale.get_units(5);
  if (weight > -0.5 && weight < 0.5) {
    weight = 0;
  }
  Serial.print("무게: ");
  Serial.print(weight, 1);
  Serial.println(" g");
  delay(500);
}
  • 5 Line: 영점 버튼을 연결한 핀 번호를 지정한다.
  • 6 Line: 앞의 예제에서 구한 보정 계수를 입력한다.
  • 12 Line: 버튼 핀을 내부 풀업 저항을 사용하는 입력으로 설정한다. 버튼을 누르면 LOW가 된다.
  • 14 Line: 보정 계수를 설정하여 get_units() 함수가 g 단위 값을 돌려주도록 한다.
  • 15 Line: 전원이 켜질 때 저울 위의 무게를 0으로 설정한다.
  • 20~24 Line: 버튼이 눌리면 영점을 다시 설정한다. 그릇을 올려놓고 버튼을 누르면 그릇 무게를 뺀 내용물의 무게만 측정할 수 있다.
  • 26 Line: 5회 측정한 평균 무게(g)를 읽는다.
  • 27~29 Line: 아무것도 올리지 않았을 때 0.1~0.3g 정도 값이 흔들리는 것을 막기 위해 ±0.5g 이내의 값은 0으로 처리한다.
  • 30~32 Line: 무게를 소수점 첫째 자리까지 출력한다.

코드를 업로드한 후 저울 위에 물건을 올리면 시리얼 모니터에 무게가 g 단위로 출력되는 것을 확인할 수 있다. 시리얼 모니터 대신 I2C LCD나 OLED에 무게를 출력하면 독립된 전자저울로 사용할 수 있다.

[이미지: 완성된 전자저울과 시리얼 모니터 출력 화면]


6. 주요 용도 및 주의사항

추천 주요 용도:

  • 전자저울: 주방 저울, 택배 무게 측정기, 커피 원두 계량기 등을 만들 수 있다.
  • 잔량 감지: 사료통, 물통, 가스통, 정수기 물병 등의 무게로 남은 양을 확인하고 부족하면 알림을 보낼 수 있다.
  • 체중계: 50kg 하프 브리지 로드셀 4개를 조합하여 체중계를 만들 수 있다.
  • 힘 측정: 당기는 힘이나 누르는 힘을 측정하는 실험 장치, 추력 측정 장치 등에 사용할 수 있다.

사용 시 주의사항:

  • 로드셀 고정: 로드셀을 제대로 고정하지 않으면 값이 흔들리거나 무게가 정확히 측정되지 않으므로, 단단한 판에 나사로 고정해야 한다.
  • 과부하 주의: 로드셀의 정격 용량을 넘는 무게를 올리거나 충격을 주면 로드셀이 영구적으로 변형될 수 있다.
  • 예열과 온도 변화: 전원을 켠 직후에는 값이 조금씩 변하므로 1~2분 정도 지난 후 영점을 다시 잡는 것이 좋고, 온도가 크게 변하면 영점이 틀어질 수 있다.
  • 배선 노이즈: 로드셀 선이 길거나 모터, 전원선 근처를 지나면 노이즈가 생기므로 선은 짧게 하고 꼬아서 연결하는 것이 좋다.
  • 측정 속도: 기본 10SPS에서 get_units(10)처럼 평균 횟수를 크게 하면 한 번 측정하는 데 1초가 걸리므로, 반응 속도와 안정성에 맞게 횟수를 조절한다.

구매좌표:

 

 

Electronic Scale DIY Kit 1KG Weighing Capacity 51 Microcontroller Soldering Practice Kit with Digital Tube Display HX711 Chip 5V

Smarter Shopping, Better Living! Aliexpress.com

www.aliexpress.com

 

반응형
반응형

ESP32 두 대 사이에 데이터를 주고받으려면 보통 두 보드를 같은 공유기에 연결하고 HTTP나 MQTT 같은 방식으로 통신한다. 하지만 이 방법은 공유기가 반드시 있어야 하고, 전원을 켤 때마다 공유기에 접속하는 데 수 초가 걸리며, 공유기가 없는 야외나 공유기와 멀리 떨어진 곳에서는 사용할 수 없는 한계가 있다. 블루투스를 사용하면 공유기는 필요 없지만 페어링과 연결 과정이 번거롭고 통신 거리도 짧다.

ESP-NOW는 Espressif에서 만든 무선 통신 방식으로, 공유기 없이 ESP32끼리 MAC 주소만으로 바로 데이터를 주고받을 수 있다. 연결 과정이 없어 전원을 켜자마자 통신할 수 있고 반응 속도도 매우 빠르다. 이 글에서는 ESP-NOW의 특징을 Wi-Fi, BLE와 비교하고, MAC 주소 확인 방법과 버튼으로 다른 ESP32의 LED를 켜는 송신, 수신 예제 코드를 소개한다.

 

ESP-NOW 통신 구조 (Initiator와 Responder)

 

출처: Espressif ESP-NOW 공식 문서, Apache License 2.0


1. ESP-NOW 소개

ESP-NOW는 ESP32의 2.4GHz Wi-Fi 하드웨어를 그대로 사용하지만, 공유기 접속이나 IP 주소 같은 TCP/IP 과정을 모두 생략하고 Wi-Fi 데이터 프레임에 짧은 데이터를 직접 담아 보내는 방식이다. 데이터를 받을 기기의 MAC 주소를 상대(Peer)로 등록하기만 하면 바로 데이터를 보낼 수 있다.

특징:

  • 공유기가 필요 없으며, 전원을 켠 후 바로 통신할 수 있다.
  • 한 번에 최대 250바이트의 데이터를 보낼 수 있다. 센서 값, 버튼 상태, 명령어 등을 보내기에 충분한 크기이다.
  • 1:1 통신뿐 아니라 1:N(여러 대에 보내기), N:1(여러 대에서 받기), 양방향 통신이 모두 가능하다.
  • 데이터를 보낸 후 바로 딥슬립에 들어갈 수 있어 배터리로 동작하는 센서에 적합하다.
  • ESP32, ESP32-S3, ESP32-C3, ESP32-C6, ESP8266 등 Espressif의 Wi-Fi 칩끼리 서로 통신할 수 있다.

ESP-NOW는 아두이노 ESP32 보드 패키지에 기본으로 포함되어 있어 별도의 라이브러리를 설치할 필요가 없다. 최신 ESP-IDF 5.4 이상에서는 한 번에 보낼 수 있는 데이터가 최대 1470바이트로 늘어난 ESP-NOW v2도 지원하지만, 이 글에서는 모든 보드에서 사용할 수 있는 250바이트 기준으로 설명한다.


2. 주요 사양 및 Wi-Fi, BLE 통신과의 비교

ESP32에서 사용할 수 있는 무선 통신 방식의 차이는 다음과 같다.

항목 Wi-Fi (공유기 경유) BLE ESP-NOW
공유기 필요 불필요 불필요
연결 과정 공유기 접속, IP 할당 (수 초) 검색, 연결 (수 초) 없음 (MAC 주소 등록)
1회 전송 크기 제한 거의 없음 기본 20바이트 (확장 시 수백 바이트) 250바이트 (v2: 1470바이트)
반응 속도 수십~수백 ms 수십 ms 수 ms
통신 거리 공유기 범위 약 10~30m 실내 수십 m, 야외 약 100~200m
연결 기기 수 공유기 성능에 따라 다름 수 대 최대 20대 (암호화 시 최대 17대)
인터넷 연결 가능 불가 불가
스마트폰 연결 가능 가능 불가

 

ESP-NOW는 스마트폰이나 인터넷과는 직접 통신할 수 없지만, ESP32끼리 짧은 데이터를 빠르게 주고받는 데는 가장 간단하고 빠른 방법이다. 인터넷 연결이 필요하면 여러 ESP32의 데이터를 ESP-NOW로 한 대에 모은 후, 그 한 대만 Wi-Fi로 서버에 보내는 방식으로 함께 사용할 수 있다.


3. 준비물 및 연결

이 글의 예제는 ESP32 개발보드 2대를 사용하며, 한 대는 버튼 상태를 보내는 송신기, 다른 한 대는 데이터를 받아 LED를 켜는 수신기로 사용한다.

  • 송신기: 버튼의 한쪽을 GPIO4, 다른 쪽을 GND에 연결한다. 내부 풀업 저항을 사용하므로 저항은 필요 없다.
  • 수신기: 대부분의 ESP32 개발보드는 GPIO2에 파란색 LED가 내장되어 있으므로 그대로 사용한다. 내장 LED가 없는 보드는 GPIO2에 220Ω 저항과 LED를 연결한다.

4. 개발환경 및 MAC 주소 확인

아두이노 IDE에 ESP32 보드 패키지(esp32 by Espressif Systems)가 설치되어 있으면 ESP-NOW를 바로 사용할 수 있다. 이 글의 코드는 보드 패키지 3.x 버전을 기준으로 작성되었다.

ESP-NOW로 데이터를 보내려면 먼저 수신기 ESP32의 MAC 주소를 알아야 한다. 다음 코드를 수신기로 사용할 보드에 업로드하고 시리얼 모니터(115200bps)를 열면 MAC 주소가 출력된다.

#include <WiFi.h>
#include <esp_wifi.h>

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.STA.begin();

  uint8_t mac[6];
  esp_wifi_get_mac(WIFI_IF_STA, mac);
  Serial.printf("MAC 주소: %02X:%02X:%02X:%02X:%02X:%02X\n",
                mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}

void loop() {
}
  • 6~7 Line: ESP32를 Wi-Fi 스테이션 모드로 설정하고 Wi-Fi 기능을 시작한다. ESP-NOW는 스테이션 모드의 MAC 주소를 사용한다.
  • 9~10 Line: 스테이션 모드의 MAC 주소 6바이트를 읽는다.
  • 11~12 Line: MAC 주소를 "24:6F:28:AA:BB:CC" 같은 16진수 형식으로 출력한다.

출력된 MAC 주소는 메모해 두었다가 송신기 코드에 입력한다. 시리얼 모니터에 아무것도 나오지 않으면 보드의 RESET(EN) 버튼을 한 번 누르면 된다.

[이미지: 시리얼 모니터에 출력된 MAC 주소]


5. 예제 코드

1) 송신기 코드

버튼 상태와 전송 횟수를 구조체에 담아 0.2초마다 수신기로 보내는 코드이다.

#include <WiFi.h>
#include <esp_now.h>

uint8_t receiverMac[] = {0x24, 0x6F, 0x28, 0xAA, 0xBB, 0xCC};

typedef struct {
  int count;
  bool button;
} Message;

Message msg;
const int BTN_PIN = 4;
esp_now_peer_info_t peerInfo;

void setup() {
  Serial.begin(115200);
  pinMode(BTN_PIN, INPUT_PULLUP);
  WiFi.mode(WIFI_STA);

  if (esp_now_init() != ESP_OK) {
    Serial.println("ESP-NOW 초기화 실패");
    return;
  }

  memcpy(peerInfo.peer_addr, receiverMac, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;
  esp_now_add_peer(&peerInfo);
}

void loop() {
  msg.count++;
  msg.button = (digitalRead(BTN_PIN) == LOW);

  esp_err_t result = esp_now_send(receiverMac, (uint8_t *)&msg, sizeof(msg));
  if (result == ESP_OK) {
    Serial.printf("전송: count=%d, button=%d\n", msg.count, msg.button);
  } else {
    Serial.println("전송 실패");
  }
  delay(200);
}
  • 1~2 Line: Wi-Fi 라이브러리와 ESP-NOW 라이브러리를 포함한다.
  • 4 Line: 앞에서 확인한 수신기의 MAC 주소를 입력한다. "24:6F:28:AA:BB:CC"라면 각 자리 앞에 0x를 붙여 입력하면 된다.
  • 6~9 Line: 보낼 데이터의 형식을 구조체로 정의한다. 수신기 코드에도 똑같은 구조체를 정의해야 한다.
  • 11~13 Line: 보낼 데이터 변수, 버튼 핀 번호, 상대 기기 정보를 담을 변수를 선언한다.
  • 18 Line: ESP-NOW를 사용하기 위해 Wi-Fi를 스테이션 모드로 설정한다. 공유기에는 연결하지 않는다.
  • 20~23 Line: ESP-NOW를 초기화하고, 실패하면 메시지를 출력한다.
  • 25~28 Line: 수신기의 MAC 주소를 상대 기기(Peer)로 등록한다. channel을 0으로 하면 현재 Wi-Fi 채널을 사용하고, encrypt를 false로 하면 암호화 없이 보낸다.
  • 32~33 Line: 전송 횟수를 1 증가시키고, 버튼이 눌렸으면 true, 아니면 false를 저장한다.
  • 35 Line: 구조체 데이터를 바이트 배열로 바꿔 수신기로 보낸다.
  • 36~40 Line: 전송 요청 결과를 시리얼 모니터에 출력한다.
  • 41 Line: 0.2초마다 데이터를 보낸다.

esp_now_send()의 결과가 ESP_OK인 것은 전송 요청이 정상적으로 처리되었다는 의미이며, 수신기가 실제로 받았는지까지 확인하려면 esp_now_register_send_cb() 함수로 전송 완료 콜백 함수를 등록하면 된다. 단, 전송 완료 콜백 함수의 형식은 보드 패키지 버전에 따라 다르므로 사용하는 버전의 예제(파일 -> 예제 -> ESP32 -> ESPNow)를 참고한다.

2) 수신기 코드

송신기에서 받은 데이터를 시리얼 모니터에 출력하고, 버튼이 눌린 상태이면 LED를 켜는 코드이다.

#include <WiFi.h>
#include <esp_now.h>

typedef struct {
  int count;
  bool button;
} Message;

Message msg;
const int LED_PIN = 2;

void onReceive(const esp_now_recv_info_t *info, const uint8_t *data, int len) {
  memcpy(&msg, data, sizeof(msg));
  digitalWrite(LED_PIN, msg.button ? HIGH : LOW);
  Serial.printf("수신: count=%d, button=%d\n", msg.count, msg.button);
}

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  WiFi.mode(WIFI_STA);

  if (esp_now_init() != ESP_OK) {
    Serial.println("ESP-NOW 초기화 실패");
    return;
  }
  esp_now_register_recv_cb(onReceive);
}

void loop() {
}
  • 4~7 Line: 송신기와 똑같은 형식의 구조체를 정의한다. 구조체의 형식이 다르면 데이터가 잘못 읽힌다.
  • 12 Line: 데이터를 받았을 때 자동으로 실행되는 콜백 함수이다. info에는 보낸 기기의 MAC 주소 등이 들어 있고, data와 len은 받은 데이터와 길이이다.
  • 13 Line: 받은 데이터를 구조체 변수에 복사한다.
  • 14 Line: 버튼이 눌린 상태이면 LED를 켜고, 아니면 끈다.
  • 15 Line: 받은 데이터를 시리얼 모니터에 출력한다.
  • 21 Line: Wi-Fi를 스테이션 모드로 설정한다.
  • 23~26 Line: ESP-NOW를 초기화한다.
  • 27 Line: 데이터를 받았을 때 실행할 콜백 함수를 등록한다.
  • 30~31 Line: 데이터 수신은 콜백 함수에서 처리하므로 loop()에는 코드가 없다.

보드 패키지 2.x 버전을 사용한다면 12 Line의 콜백 함수 첫 번째 인자를 const uint8_t *mac으로 바꿔야 컴파일된다. 두 보드에 각각 코드를 업로드하고 송신기의 버튼을 누르면, 공유기 없이도 수신기의 LED가 거의 바로 켜지는 것을 확인할 수 있다.

[이미지: 송신기 버튼을 누르자 수신기 LED가 켜진 모습과 시리얼 모니터 출력]

3) 여러 대와 통신하기

  • 1:N 전송: 송신기에서 여러 수신기의 MAC 주소를 각각 esp_now_add_peer()로 등록한 후, esp_now_send()의 첫 번째 인자에 원하는 수신기의 주소를 넣거나 NULL을 넣으면 등록된 모든 기기로 보낸다.
  • N:1 수신: 여러 송신기가 같은 수신기 주소로 데이터를 보내면 되고, 수신기에서는 콜백 함수의 info->src_addr로 어느 송신기가 보냈는지 구분할 수 있다.
  • 양방향 통신: 두 보드가 서로의 MAC 주소를 상대 기기로 등록하고, 송신 코드와 수신 콜백 함수를 모두 넣으면 된다.

6. 주요 용도 및 주의사항

추천 주요 용도:

  • 무선 리모컨: RC카, 로봇, 조명, 블라인드 등을 버튼이나 조이스틱으로 제어하는 무선 리모컨을 만들 수 있다.
  • 무선 센서 네트워크: 여러 곳에 배치한 온습도 센서, 문열림 센서의 값을 한 대의 ESP32로 모을 수 있다.
  • 배터리 센서: 깨어나서 측정하고 데이터를 보낸 후 바로 딥슬립에 들어가는 방식으로 배터리 수명을 크게 늘릴 수 있다.
  • 공유기가 없는 장소: 야외, 창고, 작업장처럼 공유기가 없는 곳에서 기기끼리 통신하는 장치를 만들 수 있다.

사용 시 주의사항:

  • Wi-Fi 채널 일치: ESP-NOW와 공유기 연결을 함께 사용하는 보드는 공유기의 채널로 동작하므로, 다른 보드들도 같은 채널을 사용하도록 설정해야 통신이 된다.
  • 데이터 크기 제한: 한 번에 250바이트까지만 보낼 수 있으므로 큰 데이터는 나누어 보내야 한다.
  • 전송 보장 없음: 데이터를 받지 못해도 자동으로 다시 보내지 않으므로, 중요한 데이터는 전송 완료 콜백으로 결과를 확인하고 실패하면 다시 보내도록 만들어야 한다.
  • 콜백 함수 처리: 수신 콜백 함수는 Wi-Fi 작업 중에 실행되므로 delay()나 오래 걸리는 작업을 넣지 말고, 데이터만 저장한 후 loop()에서 처리하는 것이 좋다.
  • 보안: 암호화하지 않은 데이터는 다른 기기에서도 받을 수 있으므로 도어락처럼 보안이 필요한 장치에는 암호화(encrypt) 기능을 사용해야 한다.

구매좌표:

 

 

Extend Antenna ESP32-S3 Development Board 2.4G Wifi Module for Arduino IDF AI IOT DIY ESP32-S3 N16R8 CH343 Type-C ESP32S3 - AliE

Smarter Shopping, Better Living! Aliexpress.com

www.aliexpress.com

 

반응형

+ Recent posts