산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

부품 및 소모품

Arduino MKR1000 1개
0.1uF 0805 커패시터 8개
LED (범용) 4개
긴 프레스 버튼 4개
INA219 (SOIC-8) 1개
LM3526M 2개
USB 소켓 (수직형) 4개
1k 0805 저항 4개
0.1옴 전류 감지 저항 1개
1uF 0805 커패시터 1개

필요한 도구 및 장비

앱 및 온라인 서비스

프로젝트 개요

점점 더 많은 기기가 USB 전원으로 작동합니다. 이들 중 상당수는 인터넷 연결이나 홈 오토메이션 기능이 없는 "덤(dumb)" 기기들입니다(예: LED 조명). 이런 기기들을 어떻게 원격으로 자동화하거나 제어할 수 있을까요? 메인 스위치에 꽂힌 USB 어댑터를 쓰는 건 과한 데다, 4개 기기를 개별 제어하려면 더 복잡해집니다.

이 프로젝트는 USB 전원 기기의 전원 공급을 인터넷을 통해 제어하고, Tinamous SmartHome Skill for Alexa를 이용해 음성 제어를 가능하게 합니다.

배경

현재 USB 전원을 원격 제어하는 기기는 시장에 거의 없습니다. 프로젝트 시작 당시(영국 기준)엔 전혀 없었고, 최근 멀티탭 형태의 제품이 몇 가지 나왔지만 잘 알려진 홈 오토메이션 제조사가 아닌 무명 업체 제품들입니다(ZLD-34UK 등). 이런 제품들은 어떤 클라우드를 쓰는지, 데이터가 중국으로 가는지, 제조사가 사라지면 어떻게 되는지, 보안은 어떤지, 소프트웨어 사용성은 어떤지, 일주일 뒤 재활용함에 들어갈지 등 일반적인 IoT 기기의 우려가 따릅니다. 오픈소스 아두이노 기반 기기처럼 해킹(커스터마이징)하기도 어렵습니다.

활용 사례

단순 전원 제어: 알렉사 음성 제어나 Tinamous 명령을 통한 인터넷 기반 전원 켜기/끄기.

스마트 전원 제어: 많은 USB 램프가 터치 컨트롤로 켜지는 방식이라 원격으로 켤 순 없지만, 끌 순 있습니다. 잘 때 램프 켜둔 것 끄기, 외출 시 모든 조명 끄기 등에 유용합니다. 하지만 알렉사로 끄고 나면 다시 켜기 위해 "켜줘"라고 해야 하는 건 번거롭습니다. 스마트 전원 모드를 쓰면 끄기 명령 시 잠시 전원을 끊었다가 다시 공급해 램프를 끄면서도 이후 정상 작동하게 합니다.

타이머 자동화: 설정된 시간에 기기 자동 종료. 아이들이 파이어 스틱으로 아마존 TV를 늦게까지 보면 오후 8시에 USB 전원 자동 차단.

전력 모니터링: USB 전원 하드웨어 개발 시 기기 소비 전류를 알 수 있습니다. 특히 처음 켤 때나 배터리 팩 충전 프로파일링 시 유용합니다. 온보드 INA219로 전류 소비 모니터링 가능(약 1kHz 샘플링 달성). 고용량 시 USB 케이블 전압 강하 문제도 INA219가 기기 측 전력을 모니터링해 저전압 경고 가능. 단자대도 제공돼 더 높은 전류와 굵은 케이블 사용 가능.

전원 장애 감지: MKR1000 배터리 옵션을 써 USB 공급 전압 모니터링하고 입력 전원 장애 시 알림 전송. USB 전원을 쓰는 원격(오프사이트) 솔루션에 추가 모니터링용으로 유용하거나, 단순 가정용 정전 감지기로도 활용 가능.

하드웨어

아두이노 MKR1000을 중심으로, 두 개의 LM3526M으로 하이사이드 스위칭과 결함 감지(저전압, 과전류) 구현, INA219로 전력 모니터링(전압/전류), LED와 스위치로 로컬 제어 옵션 제공.

DirtyPCBs.com에서 PCB 제작했고, OSHPark.com에도 .brd 파일 보내 제작 가능. 아두이노 소켓 양쪽에 각 핀마다 패드가 있어 해킹 용이(센서 추가, 소형 OLED 디스플레이로 전압/전류 표시 등).

깃허브 저장소에 2포트와 4포트 옵션이 있습니다. 2포트 PCB는 USB 소켓 레이아웃을 잘못 잡아(역방향 – 극성 오류!) 주의 필요합니다.

실패에서 얻은 승리:

USB 소켓을 보드 뒷면에 장착하니 핀 연결이 맞았고(2포트 보드에선 실크스크린이 반대편에 가는 단점도), 아두이노 헤더가 소켓에 꽂혀 높이가 나와 USB 소켓이 인클로저 밖으로 나오게 하니 오히려 공간 확보에 유리했습니다. 소켓, 스위치, LED를 뒷면으로 옮기고 포트 2개 추가해 4포트 버전 제작(2포트 버전엔 LED 정렬도 엉망이었음).

6~8포트 확장도 어렵지 않으나 LED와 스위치는 생략하거나 개선 필요.

회로도가 복잡해 보이지만 실제론 단순합니다. 많은 저항이 옵션입니다. R23, 19, 27, 26은 스위치 풀업, R20-22, R14, R15는 USB 제어/결함 감지 풀업으로 아두이노 INPUT_PULLUP 핀 모드로 대체 가능. 단, 저전력 슬립 모드에서 인터럽트로 깨우려면 플로팅 방지용으로 실장하는 게 좋습니다.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

USB D+/D- 라인 주변 옵션 저항도 추가했습니다. 기기에 사용 가능 전력을 알려주지만, 많은 덤 기기는 무시합니다. 아래에선 LED 전류 제한용 R24만 필요하고 R2-5, R28은 비워둡니다.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

LED와 스위치는 완전 옵션입니다. 원격 제어만 원하면 이 부품들 생략 가능.

전원 입력

세 가지 옵션으로 전원 공급 가능.

  1. 내부 (JP6 핀 1-2 연결): 아두이노 5V 핀(아두이노 USB 커넥터)에서 USB 전원 가져옴. 저전력 부하만 사용 권장.
  2. 외부 (JP6 핀 2-3 연결): J2(온보드 USB 마이크로 커넥터)나 JP8(단자대)로 5V 입력. 두 옵션 동시 사용 금지. 외부 전원은 아두이노 VIn 핀으로도 라우팅돼 아두이노 별도 전원 불필요.
  3. 보너스: R10, R11에 0옴 저항과 J2 장착 시 USB 3.0 패스스루 가능. 하드웨어 개발 시 PC USB 소켓 마모 없이 기기 재부팅에 편리.
알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

인클로저

3D 프린터용 인클로저 포함. PCB와 뚜껑 연결에 M3 열압입 인서트 사용하나 뚜껑은 마찰 결합으로도 충분.

뚜껑 옵션: 배터리 수납부 유무, 발(고정용 마운트 홀) 유무. 베이스 박스도 OpenSCAD로 세 가지 전원 입력 옵션별 개구부 설정 가능.

몇 번 시행착오 끝에 완성. Rigid.Ink 팬클럽 샘플들이 큰 도움.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어
알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어
알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

Tinamous 연결하기

아두이노 MKR1000으로 WiFi 연결. 이 보드가 처음이면 아두이노 IDE에 보드 옵션 추가 필요.

Tinamous MQTT 서버 사용(만든 사람이라...). 디바이스로 전송된 메시지 수신용 'Status.To' 토픽 구독.

코딩 전 아두이노 최신 펌웨어와 Tinamous 보안 연결용 SSL 인증서 필수. 로컬 MQTT 서버 쓰면 보안 덜 신경 써도 됨.

1단계

아두이노 IDE에서 WiFi101 예제의 FirmwareUpdater 스케치 열고 업로드.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

2단계

업로드 후 도구 메뉴에서 WiFi101 Firmware Updater 선택.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

3단계

연결 테스트 후 Update Firmware. 완료되면 Add domain 버튼으로 tinamous.com 추가해 SSL 인증서 설치. Upload Certificates to WiFi module 버튼으로 인증서 업로드.

4단계

이제 자체 펌웨어 작성. 프로젝트 첨부 파일과 깃허브 저장소(최신 버전)에 코드 있음.

WiFi101과 MQTT Client 라이브러리 필요.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

Joel Gaehwiler의 MQTT 선택.

secrets.h 파일에 WiFi와 Tinamous MQTT 설정 입력(내 설정은 보안상 미포함).

#define SECRET_SSID "Your SSID"
#define SECRET_PASS "Your SSIDs Password"
/************************* Tinamous MQTT Setup *********************************/
#define MQTT_SERVER ".tinamous.com"
#define MQTT_SERVERPORT 8883
#define MQTT_USERNAME "UsbSwitch."
#define MQTT_PASSWORD "Your password goes in here."
#define MQTT_CLIENT_ID "UsbSwitch"
#define DEVICE_USERNAME "UsbSwitch"

Tinamous 미가입 시 무료 계정 생성 가능. 등록 시 계정/조직명 입력하는데 이게 Tinamous 내 프라이빗 영역이 되고, 다른 멤버(알렉사 포함) 초대해 기기 공유 가능.

내 계정은 "AlexaExample"로, MQTT 설정에 포함되고 Tinamous 계정은 https://AlexaExample.Tinamous.com

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

5단계

디바이스 추가. Tinamous Devices 페이지에서 Add 버튼 클릭.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

내 디바이스용 Tinamous MQTT 설정 예시:

/************************* Tinamous MQTT Setup *********************************/
#define MQTT_SERVER "AlexaExample.tinamous.com"
#define MQTT_SERVERPORT 8883
#define MQTT_USERNAME "UsbSwitch.AlexaExample"
#define MQTT_PASSWORD "My super secret password that totally isn't Passw0rd...."
#define MQTT_CLIENT_ID "UsbSwitch"
#define DEVICE_USERNAME "UsbSwitch"

계정과 디바이스 준비 완료. 더 많은 디바이스 추가 가능 – DEVICE_USERNAME과 MQTT_USERNAME만 업데이트(MQTT는 HTTP처럼 헤더 정보 안 보내므로 계정명을 사용자명에 지정).

6단계

첨부 코드 업로드(수정한 secrets.h 포함). TinamousMQTTClient.ino 파일 살펴보기 – MQTT 상호작용과 알렉사 명령 수신 처리.

SSL용 WiFiSSLClient 사용. 로컬 MQTT 서버(SSL 없음) 쓰면 일반 WiFi Client에 포트 1883 사용 가능하지만, 인터넷 기반이라면 SSL Client 필수.

MQTT 클라이언트 버퍼 기본값보다 크게 예약 – 여기선 4096바이트.

WiFiSSLClient networkClient;
MQTTClient mqttClient(4096);

mqttClient.begin으로 클라이언트 설정하고 onMessage로 메시지 수신 핸들러 지정.

mqttClient.begin(MQTT_SERVER, MQTT_SERVERPORT, networkClient);
mqttClient.onMessage(messageReceived);

연결 후 관심 토픽 구독. 여기선 "Tinamous/V1/Status.To/UsbSwitch" 구독 – Tinamous 타임라인으로 @UsbSwitch에게 보낸 메시지 수신. 이게 알렉사 명령 수신 경로.

if (!mqttClient.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) {
  if (mqttClient.lastError() == LWMQTT_CONNECTION_DENIED) {
    // 사용자명/비밀번호 오류
  }
  if (mqttClient.lastError() == -6) {
    // SSL 인증서 미설치 가능성
  }
  delay(10000);
  return false;
}
mqttClient.subscribe("/Tinamous/V1/Status.To/" DEVICE_USERNAME);
알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

Tinamous 타임라인은 디바이스용 프라이빗 트위터 같은 것. MQTT나 REST API(또는 봇)로 메시지 수신/처리하고 응답 게시 가능.

Tinamous SmartHome Skill 쓰면 코딩은 여기까지.

알렉사용 Tinamous Smart Home Skill

작성 시점 기준 Tinamous Smart Home Skill은 승인 대기 중(이제 스토어에 있을지도). 직접 만들 필요 없이 이 스킬 사용하면 됩니다.

이 스킬은 매우 범용적 – 디바이스나 통신 방식 모름. Tinamous에서 디바이스에 태그 달면 스킬이 알렉사용 적절한 디바이스 생성. 이 스킬과 Tinamous로 내 프로젝트 몇 줄 코드로 음성 제어 가능.

하지만 수정하거나 직접 스킬 만들고 싶을 수 있으니 개발 내용 공유.

C#으로 .Net Core 2.0 작성. 원래 BOFF 스마트 팬 프로젝트용이었는데, 이 프로젝트에서 디바이스가 여러 아웃렛(포트)을 갖고 각 포트가 알렉사 Smart Home 디바이스의 일급 시민이 되도록 확장.

전체 코드(테스트 포함)는 Tinamous SmartHome 저장소에. Visual Studio 2017에 AWS 툴 설치해 Lambda로 푸시.

프레임워크가 알렉사에서 들어오는 지시 메시지를 역직렬화해 객체로 접근, 헤더 네임스페이스와 지시명에 따라 적절한 액션 수행 후 응답 반환.

주요 메시지:

  • Account Linking
  • Discovery
  • State Report
  • Power Control

Account Linking

알렉사가 처리. 스킬 추가 후 알렉사가 인증 요청, Tinamous 인증 페이지로 이동해 디바이스의 계정 접근 허용. 계정명(AlexaExample), 사용자명(Steve), 비밀번호 입력.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

Discovery

계정 연결 후 알렉사가 검색 요청. 스킬이 "Alexa.SmartDevice" 태그 달린 디바이스 쿼리. 태그 없는 디바이스는 무시.

태그는 Tinamous Devices 페이지에서 디바이스 편집 시 적용.

"MultiPort" 태그도 있으면 각 포트 열거해 별도 디바이스로 추가. 지원하는 알렉사 지시 기반 태그도 적용 – 여기선 "Alexa.PowerController"와 앱 내 표시 카테고리용 "SmartPlug" 태그.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

다른 인터페이스(Alexa.BrightnessController 등)도 가능하나 여기선 덜 유용. 저장소 README 참고.

MultiPort 디바이스가 개별 포트를 알렉사에 노출하려면 State Variables 설정 필요(디바이스 편집 페이지).

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

PortCount로 포트 수 지정, "Port-1".."Port-n"으로 알렉사용 포트 이름 지정. 이름 없는 포트는 무시. 여기서 이름 바꾸고 재검색 하면 알렉사 업데이트.

검색 단계에서 스킬은 "powerState" 또는 "powerState-port-n" 태그/이름/레이블 가진 필드 찾음. 발견 시 디바이스 지원 기능으로 할당(State Report에서 자세히).

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

State Report

검색 단계에서 디바이스 기능 알렉사에 알림. 스킬 기본값으로 이 기능들 요청 가능하게 설정돼 알렉사가 StateReport 요청으로 값 조회.

필드 태그로 지원 설정 – 디바이스가 데이터 전송(아두이노 코드의 senml 메시지가 MQTT로 푸시)하면 Tinamous가 필드 생성. 필드 목록의 Advanced 옵션으로 편집. 태그 방식이 가장 범용적 – 펌웨어에서 필드명 정확히 맞출 필요 없고, 나중에 이름 바꿔도 문제없음.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어
알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

포트별 필드 없으면 비포트별 필드(powerState)로 폴백.

Power Control

이게 없으면 알렉사에서 쓸모없음! 알렉사가 "TurnOn", "TurnOff" 두 지시 전송. 스킬 진입점에서 네임스페이스(Alexa.PowerController) 확인 후 적절한 컨트롤러 클래스(PowerController.cs)로 위임.

스킬은 Tinamous 타임라인에 Status Message 발행.

예: @UsbSwitch Turn On 또는 @UsbSwitch Turn On port-1

다른 인터페이스도 거의 동일 처리. 디바이스가 이 상태 메시지 감시하다 액션 수행. 알렉사는 StateReport로 상태 읽기.

이제 AWS Lambda에 푸시하고 알렉사 콘솔에 스킬 등록해 알렉사 접근 권한 부여만 남음.

AWS Lambda 함수 생성

Visual Studio 내 AWS 툴로 컴파일된 스킬 Lambda에 푸시. 먼저 Lambda 생성.

꿀팁: 지원 언어에 맞는 AWS 리전 생성. English (UK)는 eu-west(아일랜드).

새 Lambda 함수 생성(기존 블루프린트는 구식이고 제한적 – V2만 지원, 폐기됨. 우린 V3 사용).

Lambda가 필요한 리소스 접근할 새 역할 생성. 여기선 Simple Microservices 기본 선택(실제론 더 많이 줌). CloudWatch 로그 안 뜨면 IAM에서 권한 추가 필요.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

Visual Studio에서 게시. AWS 툴 설치 후 프로젝트 우클릭 → "Publish to AWS Lambda..."

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

Lambda 표현식 세부사항 입력 후 업로드.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어
알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

업로드 후 테스트 실행. Actions 드롭다운에서 "Publish new version".

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

게시 후 스킬에 Lambda 접근 권한 부여.

"Alexa Smart Home" 트리거 클릭하고 스킬 ID 입력(아직 없음...).

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

알렉사 콘솔에서 스킬 생성

Lambda 준비되면 https://developer.amazon.com 가서 Alexa Skills Kit 선택, 새 스킬 추가.

Smart Home Skill API, 대상 언어(영국은 English (UK)), V3 페이로드 버전 선택.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

Configuration 페이지에서 버전된 Lambda ARN 입력(우측 상단). 끝이 :1, :2, :5246 등.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

Lambda에서도 스킬의 "Application ID"/"Skill ID"/"ID" 복사 붙여넣기. amzn1.ask.skill.2_______________50 형태. Save 클릭 필수. 구 콘솔에선 헤더 아래 스킬 명 아래, 신 콘솔에선... 새 창 열기, 콘솔 스킬 목록 돌아가기, 적절한 링크 클릭(마치 직접 스킬 만들어본 적 없는 듯).

계정 연결용 OAuth 애플리케이션은 Tinamous의 Alexa Bot으로 생성. Tinamous 계정 Bots 페이지에서 Alexa Bot 추가. 생성 후 대화상자에 계정 연결 설정용 모든 정보 나옴.

참고: (곧 출시될) 공개 Tinamous SmartHome 스킬 쓰면 Alexa Bot 불필요.

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어
알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

봇이 생성한 애플리케이션으로 다른 Tinamous 계정 보유자도 내 스킬 써서 계정 연결 가능. 자연스럽게 스킬 비공개 유지 가능, 내 Tinamous 계정 아무것도 안 보임.

다른 디바이스 클라우드 쓰면(왜? ;-) ) 그쪽 OAuth 애플리케이션 정보 입력.

Test 페이지에서 "Show this skill in the Alexa App"을 "Yes"로.

저장 후 alexa.amazon.co.uk(또는 지역별) 또는 앱으로 이동. "Skills" → 우상단 "Your Skills" → "DEV SKILLS"에서 내 스킬 확인(초록 마커로 개발 스킬 표시).

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어
알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

"Alexa, turn off the usb light" 등 호출 문구와 스킬 선택 시 추가 정보는 "Publishing Information" 페이지에서 설정 – 개발 중에도 전체 퍼블리싱 없이 입력 가능.

스킬 코드 업데이트 시: 새 Lambda 함수 업로드 → 새 버전 생성 → SmartHome 트리거와 Skill ID 재추가 → 버전된 Lambda ARN을 스킬 콘솔에 붙여넣기(버전 없는 Lambda 쓸 수 있을지도 모르지만 당시 시도에선 안 됐음 – 다른 것도 많이 틀렸었지만).

성공!

Lambda에서 스킬 코드 실행되고 알렉사 계정에 스킬 설치되면 검색 실행 후 기기 제어 시작.

CloudWatch 로그로 스킬 작성 로그 확인 가능.

스킬 디버깅 & 팁

알렉사는 문제 발생 시 개발자 피드백 거의 없음. 왜 알렉사가 내 기대대로 안 동작하는지 추측하느라 시간 낭비하기 쉽습니다.

  • 엔드포인트 ID에 영숫자 외 문자 피하기(* 썼다가 다 망가짐 – 분명한 에러도 아님. #은 괜찮음. 이유 모름).
  • 모든 것 로깅. 스킬 호출 시 로그 확인. 로그 없으면 인증 문제거나 스킬이 Lambda에 권한 없음.
  • AWS와 알렉사 이메일 계정 일치시키기.
  • Lambda와 스킬 같은 리전 유지(UK 스킬은 아일랜드).
  • 스킬 호출됐는데 알렉사 응답 없음(디바이스 나열 안 함) → 응답 포맷 오류 가능성 높음.
  • 일상용 알렉사 계정 쓰기 싫으면 Amazon Households로 두 번째 성인 계정 추가. 단 2명으로 제한, 변경 시 지연 큼.
  • "Alexa, Switch Profiles"로 개발자/일반 프로필 전환 가능.
  • 알렉사 콘솔 리디자인으로 더 나은 디버깅 정보 기대. 지금은 더 큰 박스와 약간 나은 검증뿐. 일부 로그 있지만 성공 로그만 – 관리자용 기분 좋은 지표, 36시간 지연돼 디버깅엔 무용지물!

하나의 스킬로 모든 (IoT) 것 제어!

Tinamous SmartHome 스킬로, 내 (IoT) 것이 Tinamous MQTT 서버에 연결되거나(또는 지원 봇 경유) 알렉사 SmartHome 제어 추가는 "Turn On", "Turn Off", "Set brightness 20" 같은 메시지 처리하는 몇 줄 코드와 Tinamous 태그 추가만으로 끝.

"Alexa, Discover Smart Home Devices".

코드

  • AlexaUsbSwitcher.ino
  • TinamousMQTTClient.ino
  • UsbControl.ino
  • WiFiClient.ino
  • Secrets.h

AlexaUsbSwitcher.ino (메인 파일)

#include <MQTTClient.h>
#include <system.h>
#include <WiFi101.h>
#include <Adafruit_INA219.h>
#include "Secrets.h"

// 4포트 보드 설정
#define MAX_USB_PORTS 4
int led_pin[MAX_USB_PORTS][2] = {{14, 14}, {13,13}, {7,7}, {6,6}};
int switch_pin[] = {A0, A1, A2, A3};
int usb_enable_pin[] = {5, 4, 1, 3};
int usb_fault_pin[] = {2, 2, 2, 2};
bool usb_port_state[] = {false, false, false, false};
int usb_power_mode[] = {1, 0, 0, 0}; // 0: 요청대로 끔, 1: 껐다가 딜레이 후 켬(터치 조명용)

unsigned long usb_power_switch_on_at[] = {0, 0, 0, 0};
unsigned long usb_power_switch_off_at[] = {1, 1, 1, 1};

Adafruit_INA219 ina219;
bool has_usb_fault = false;
float shunt_voltage = 0, bus_voltage = 0, current_mA = 0, load_voltage = 0, power_mW = 0;
float max_current_mA = 0, max_busvoltage = 0, min_busvoltage = 20;
unsigned long last_measurement_time = 0;
bool power_failed = false, over_current = false;
int update_interval_seconds = 20;
unsigned long next_message_send_at = 0;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  for (int ch=0; ch

TinamousMQTTClient.ino (MQTT 연결 처리)

#include <MQTTClient.h>
#include <system.h>
#include "secrets.h"

WiFiSSLClient networkClient;
MQTTClient mqttClient(4096);
bool was_connected = false;
String senml = "";
unsigned long nextSendMeasurementsAt = 0;

bool setupMqtt() {
  senml.reserve(4096);
  mqttClient.begin(MQTT_SERVER, MQTT_SERVERPORT, networkClient);
  mqttClient.onMessage(messageReceived);
  return connectToMqttServer();
}

bool connectToMqttServer() {
  if (mqttClient.connected()) return true;
  if (WiFi.status() != WL_CONNECTED) {
    delay(10000);
    return false;
  }
  if (!mqttClient.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) {
    if (mqttClient.lastError() == LWMQTT_CONNECTION_DENIED) {
      // 사용자명/비밀번호 확인: 'DeviceName.AccountName' 형태여야 함
    }
    if (mqttClient.lastError() == -6) {
      // 아두이노에 Tinamous.com SSL 인증서 설치 확인
    }
    delay(10000);
    return false;
  }
  mqttClient.subscribe("/Tinamous/V1/Status.To/" DEVICE_USERNAME);
  publishTinamousStatus("Hello! Usb switch is now connected. @ me with help for help.");
  was_connected = true;
  return true;
}

void mqttLoop() {
  connectToMqttServer();
  mqttClient.loop();
}

void publishTinamousStatus(String message) {
  mqttClient.publish("/Tinamous/V1/Status", message);
}

void publishTinamousSenMLMeasurements(String senml) {
  mqttClient.publish("/Tinamous/V1/Measurements/SenML", senml);
}

void messageReceived(String &topic, String &payload) {
  if (payload.startsWith("@")) {
    payload.toLowerCase();
    if (handleStatusMessage(payload)) return;
  }
  publishTinamousStatus("Hello! Sorry I didn't understand the message. @ me with help for help.");
}

bool handleStatusMessage(String payload) {
  char buffer[25];
  for (int port=0; port 0) { setUsb(port, true); return true; }
    sprintf(buffer, "turn off port-%d", port+1);
    if (payload.indexOf(buffer) > 0) { setUsb(port, false); return true; }
  }
  if (payload.indexOf("turn on") > 0) { allOn(); return true; }
  if (payload.indexOf("turn off") > 0) { allOff(); return true; }
  if (payload.indexOf("help") > 0) {
    publishTinamousStatus("Send @UsbSwitch: 'Turn on Port-1', 'Turn off Port-1', 'Turn on', 'Turn off'");
    return true;
  }
  return false;
}

기타 파일

UsbControl.ino: USB 포트 전원 제어 및 표시 로직
WiFiClient.ino: WiFi 연결 처리
Secrets.h: 본인 WiFi 및 Tinamous 설정으로 수정 필요

커스텀 파트 및 인클로저

아두이노, 단자대, 추가 USB 마이크로용 구멍 포함 버전, 모든 커넥터 버전(첫 레이어 텍스트 제외로 일부 프린터 호환성 향상), 가장 단순하고 빠른 버전 제공.

회로도

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어
알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

OSHPark나 DirtyPCBs로 제작 의뢰하세요.

  • arduinostandaloneusbswitch-4port_q16AoF01Aq.brd
  • arduinostandaloneusbswitch-v2_Xd45dtjndI.sch
알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

깃허브 USB Power Switcher 저장소

원하는 폴더: Arduino/StandAlone/ 폴더와 4포트 버전
https://github.com/ThingySticks/USBPowerSwitcher

알렉사 연동 USB 파워 스위치 – USB 기기 스마트 제어

제조공정

  1. C# switch 문 마스터하기: 문법, 예제, 모범 사례
  2. TI, 초소형 고효율 BQ25790/BQ25792 벅부스트 배터리 충전기 출시
  3. 라즈베리 파이용 효율적인 230VAC 정전 감지 센서: 저비용, 콤팩트, 안전
  4. 라즈베리 파이 & Hologram으로 SMS 제어 스마트 AC 전원 스위치 만들기
  5. 풍력 발전: 공기 움직임을 청정 전기로 변환하기
  6. 파워 해머 마스터하기: 현대 대장장이를 위한 종합 가이드
  7. 자동 파워 프레스 이해: 특징, 이점, 응용 분야
  8. 파워 척 이해: 정의, 용도 및 장점
  9. 파워 척 종합 가이드: 정밀 가공을 위한 필수 지식
  10. 수력 발전 완벽 가이드: 원리, 유형, 장단점 총정리