안주 디스펜서를 IoT 화해 보았다.
🍶 🍺 🍻 🍷 🍸 🍹 🍾 🥃 + 🍲 🍔 🌭 🌮 🌯 🍕 🍖 🍗 🍙 🍛 🍛
캔디·디스펜서라든지, 안주 디스펜서라든지, 오토 디스펜서등의 검색 키워드로 나오는 제품으로, 이하 2개의 제품을 입수해 분해했는데 같은 기반·부품·배선으로 실장되고 있었으므로, 같은 구조로 이케 라고 생각한다.
구성
스마트 스피커(Google Home 또는 Amazon Alexa)를 입력하여 Node-RED를 통해 webhook 요청을 MQTT 요청(Publish)으로 변환하고 Milkcocoa를 통해 안주 디스펜서에 MQTT 요청(Subscribe)을 보내도록 구성했습니다. 음성 입력의 내용에 의해 Node-RED로부터의 MQTT 요구의 내용을 변경해, 안주 디스펜서에의 요구를 배분하는 구성으로 했다.
분해
본 제품은 내용물(안주)을 바꾸므로 기본적으로 분해하여 씻을 수 있게 되어 있다.
케이스, 트레이, 회전체를 제거하고 3개의 나사를 플러스 드라이버로 분리하면 기반, 모터, 터치 센서에 액세스할 수 있다.
받침대는 뒷면의 미끄럼 방지(스펀지)를 제거하면 4개의 나사가 나타나고, 플러스 드라이버로 분리하면 전지 박스, 슬라이드 스위치에 액세스할 수 있다.
배선도
기반에 탑재된 싱글 채널 터치 센서 스위치의 칩 사양은 여기 ( 사양서 )
기존의 터치 센서 기능을 살리면서 원격 조작이 가능하도록 Wio-Node에서 MOS-FET의 게이트 전압을 조작함으로써 모터의 음극(-)을 스위칭시키는 배선으로 했다. MOS-FET는 정평 2SK2232(60V25A)의 입수가 어려워졌기 때문에 대체품으로서 2SK4017(60V5A) 또는 2SK703(100V5A)를 사용했다.
또한 Wio-Node의 전원은 기존의 전원 박스에서 공급하여 슬라이드 스위치로 ON/OFF 할 수 있는 배선으로 했다.
중개를 제거한 후, 베이스(기반을 멈추고 있는 나사 부근)에 1개의 리드선을 납땜하고, 각통을 통해 받침대의 이면에 배선한다.
・모터의 음극(-)을 제어하기 위해 기반에 납땜하여 받침대의 이면에 배선한 리드선을 MOS-FET(드레인)에 접속하고, 전지 박스의 음극(-)에서 MOS-EFT(소스)로 연결하고 Grove 커넥터 (노란색 리드선)를 저항 (220Ω)을 사이에두고 MOS-FET (게이트)에 연결하십시오.
Wio-Node에 전원을 공급하기 위해 PH2 커넥터의 음극 (-)을 배터리 박스에 연결하고 양극 (+)을 슬라이드 스위치에 연결하십시오.
소스 코드
Wio-Node의 소스 코드는 여기
ESP8266_MOTOR_01.ino
#include <ESP8266WiFi.h>
#include <Milkcocoa.h>
#define WLAN_SSID "" // Wi-Fi
#define WLAN_PASS "" // Wi-Fi
#define MOTORPIN 5 // Wio-Node IO5 => MOTOR, NodeMCU D1=GPIO5 D6=GPIO12
#define DEVICEID 1 // if selector is 0, MOTOR works in 0.1 second for health check purpose.
// if selector is DEVICEID, MOTOR is switched on during timer. if NOT, MOTOR doesn't work.
WiFiClient client;
#define MILKCOCOA_APP_ID "" // MilkCocoa Application ID
#define MILKCOCOA_DATASTORE "" // MilkCocoa Datastore Name
#define MILKCOCOA_SERVERPORT 1883
const char MQTT_SERVER[] PROGMEM = MILKCOCOA_APP_ID ".mlkcca.com";
const char MQTT_CLIENTID[] PROGMEM = __TIME__ MILKCOCOA_APP_ID;
Milkcocoa milkcocoa = Milkcocoa(&client, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID);
int red, green, blue, selector, timer;
void onpush(DataElement *elem) {
Serial.println("onpush");
Serial.print("r:");
Serial.print(elem->getInt("r"));
Serial.print(",g:");
Serial.print(elem->getInt("g"));
Serial.print(",b:");
Serial.print(elem->getInt("b"));
Serial.print(",s:");
Serial.print(elem->getInt("s"));
Serial.print(",t:");
Serial.print(elem->getInt("t"));
Serial.println();
red = elem->getInt("r");
green = elem->getInt("g");
blue = elem->getInt("b");
selector = elem->getInt("s");
timer = elem->getInt("t");
if (selector) {
if (selector == DEVICEID) {
digitalWrite(MOTORPIN, HIGH);
delay(timer * 1000);
digitalWrite(MOTORPIN, LOW);
}
} else {
digitalWrite(MOTORPIN, HIGH);
delay(100);
digitalWrite(MOTORPIN, LOW);
}
}
void setupWiFi() {
Serial.println(); Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void setup() {
pinMode(15, OUTPUT); // for Wio-Node
digitalWrite(15, 1); // for Wio-Node
Serial.begin(115200);
setupWiFi();
Serial.println( milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush) );
pinMode(MOTORPIN, OUTPUT);
}
void loop() {
milkcocoa.loop();
}
요약
현재 구상 중인 IoT 선술집(가정)의 실현을 향해 한 걸음이라도 가까워지면 다행입니다.
Reference
이 문제에 관하여(안주 디스펜서를 IoT 화해 보았다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kitazaki/items/db137536d4ce3f0cc3b8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)