홈으로 돌아가기

스마트 홈에 빈티지 디스플레이 통합 | ESP8266 및 MQTT

이 기사는 빈티지 현금 등록기 디스플레이 Wincor Nixdorf BA64-2를 스마트 홈 시스템에 사용하도록 적응시키는 과정을 설명합니다. 하드웨어 수정, ESP8266에서의 소프트웨어 구현, MQTT 브로커와의 통합이 상세히 논의됩니다. 이 솔루션은 주요 인터페이스에 지속적인 액세스 없이 중요한 데이터를 표시할 수 있게 합니다.

스마트 홈에서 빈티지 현금 등록기 디스플레이가 살아 움직입니다: 단계별 통합
Advertisement 728x90

스마트 홈의 빈티지 현금 등록기 디스플레이: ESP8266과 MQTT 통합

계산대에서 사용되던 빈티지 가스 방전 디스플레이는 스마트 홈 시스템에서 컴팩트한 정보 패널을 만드는 데 완벽한 소재입니다. 이 글에서는 Wincor Nixdorf BA64-2 디스플레이를 ESP8266으로 제어하도록 적응시키고 NTP 동기화와 MQTT 인터페이스 통합을 자세히 설명합니다. 이 솔루션은 메인 인터페이스에 지속적으로 접근하지 않고도 중요한 데이터를 표시할 수 있게 해줍니다.

하드웨어 분석 및 핀아웃

Wincor Nixdorf BA64-2 디스플레이는 컴팩트한 하우징에 들어있는 2줄 가스 방전 표시기(20×2 문자)입니다. 주요 도전 과제는 비표준 RJ45 커넥터에 대한 문서가 없다는 점입니다. 초기 검사에서 다음 특징이 확인되었습니다:

  • 커넥터는 물리적으로 이더넷과 호환되지만 전기적으로는 맞지 않음
  • 단일 커넥터를 통해 USB와 RS232 두 인터페이스 지원
  • 데이터시트에 핀 표시 없음

장치를 분해하고 멀티미터로 보드를 분석한 결과 핀아웃이 확인되었습니다:

Google AdInline article slot
  • Pin 1: +5V (전원)
  • Pin 4: GND
  • Pins 2-3: USB Data±
  • Pins 6-8: RS232 신호 (TxD/RxD)

연결 전에 멀티미터로 전압을 반드시 확인해야 합니다. 표준 어댑터는 장치를 손상시킬 수 있습니다. 오실로스코프로 핀 6과 8에서 RS232 레벨(-7/+7V)을 확인했습니다.

직접 TTL-직렬 연결을 위한 수정

보드에서 TTL-RS232 변환기인 ADM3232E 칩을 발견했습니다. 이 칩을 제거하면 기본 TTL-직렬 인터페이스에 접근할 수 있어 현대 컨트롤러와의 통합이 간단해집니다. 단계는 다음과 같습니다:

  • 핫에어 건으로 350°C에서 칩 탈솔더링
  • 접점 패드의 솔더 잔여물 청소
  • R2out/T2in 라인 식별 (주 전송 채널)
  • 패드에 와이어 연결: VCC (3.3V), GND, TX, RX
  • 핫글루로 연결 고정

직접 TTL-직렬 연결로 레벨 시프터가 필요 없어집니다. 주의: 디스플레이는 3.3V로 작동하므로 전원이 맞아야 합니다. 안정적인 작동을 위해 전송 바이트 간 4ms 지연이 필요합니다—이는 디스플레이의 낮은 데이터 처리 속도를 보상합니다.

Google AdInline article slot

데이터 처리 예시:

bool outs = false;
void outString(char * buf, int length){
  if(outs) return;
  outs = true;
  for(int i=0; i< length; i++){
    Serial.write(buf[i]);
    delay(4);
  }
  outs = false;
}

소프트웨어 구현 및 통합

Arduino Framework 기반 펌웨어는 Wi-Fi 연결, MQTT 클라이언트, NTP 동기화 세 가지 주요 기능을 구현합니다. 아키텍처는 다음과 같습니다:

  • 모드 자동 전환 (시계/정보 메시지)
  • 커서 제어를 위한 이스케이프 시퀀스 처리
  • UTF-8 문자 지원 (℃ 포함)

주요 코드 구성 요소:

Google AdInline article slot
#define CLEAR_SCREEN "\x1B[2J"
#define LINE1_0 "\x1B[1;0H"
#define INFO_PERIOD 60000

void drawClock(){
  time_t dtm = time(nullptr) + 10800; // UTC+3
  DateTime now = DateTime(dtm);
  char buf[21];
  sprintf(buf, "\x1B[1;0H%02d.%02d.%04d %02d:%02d:%02d",
    now.day(), now.month(), now.year(),
    now.hour(), now.minute(), now.second());
  outString(buf, strlen(buf));
}

void msg_callback(char* topic, byte* payload, unsigned int length){
  if(!strncmp((char *)payload, "line1 ", 6)){
    clock_mode = false;
    info_timer = millis();
    outString(LINE1_0, strlen(LINE1_0));
    outString((char*)&payload[6], length - 6);
  }
}

시간 동기화는 로컬 NTP 서버를 통해 처리됩니다. 시작 시 시스템은 시간 획득을 위해 최대 4초 대기합니다:

void TimeSetup(){
  configTime(0, 0, "ntpserver.home");
  int cnt = 4;
  while (!time(nullptr) && cnt > 0) {
    delay(1000);
    cnt--;
  }
}

정보 메시지 모드는 60초 후 자동 종료되어 시계 표시로 돌아갑니다. 이는 메인 인터페이스를 차단하지 않습니다.

스마트 홈 시스템에서의 실전 적용

기존 생태계에 디스플레이를 통합하면 두 가지 주요 요구사항을 해결합니다:

  • 중요 매개변수 실시간 모니터링 — 보일러 온도, 지하실 습도, 태양광 패널 상태
  • 스마트폰 없이 알림 — 시스템 메시지 ("가스 누출", "게이트 개방")

온도 추적 예시:

mosquitto_pub -h localhost -t "ba64/line1" -m "kotel 63.28/55.43\xC2\xB0C"

시스템은 확장 가능합니다: 여러 디스플레이가 특정 토픽을 구독해 서로 다른 정보를 표시할 수 있습니다. 기능을 확장하려면 MQTT 메시지 핸들러를 수정해 새 명령을 지원하면 됩니다.

주요 포인트

  • 전압 확인 필수: 연결 전에 모든 핀 측정—표준 어댑터가 디스플레이를 손상시킬 수 있음.
  • 전송 지연 중요: 바이트 간 delay(4) 없으면 처리 속도 차이로 데이터 손실 발생.
  • OTA 업데이트 필수: 장치에 물리적 접근 없이 재플래싱 가능 유지.
  • 이스케이프 시퀀스: 정확한 커서 위치를 위해 데이터시트의 제어 코드 사용.
  • 로컬 NTP 서버: 외부 서버가 사용할 수 없으면 시계 작동 중단될 수 있음.

— Editorial Team

Advertisement 728x90

다음 읽기