前提・実現したいこと
Amazon Echoで複数のワードごとに、対応するサーボモータを制御したいと考えています。
現在1つのサーボモータを下記のように制御しています。
Initial:90°→"ライトON"→サーボ125°
Initial:90°→"ライトOFF"→サーボ55°
ライティングソフトはArduino、ESP8266を使用、ライブラリはfauxmoESPより引用。
該当のソースコード:C++
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "fauxmoESP.h"
#include <Servo.h>
Servo myservo;
int servoIni = 90;
int servoState = 0;
int flag = 0;
#define WIFI_SSID "SSID"
#define WIFI_PASS "Password"
fauxmoESP fauxmo;
// -----------------------------------------------------------------------------
#define SERIAL_BAUDRATE 115200
#define ID "ライト"
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// Wifi
// -----------------------------------------------------------------------------
void wifiSetup() {
// Set WIFI module to STA mode
WiFi.mode(WIFI_STA);
// Connect Serial.printf("[WIFI] Connecting to %s ", WIFI_SSID); WiFi.begin(WIFI_SSID, WIFI_PASS); // Wait while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(100); } Serial.println(); // Connected! Serial.printf("[WIFI] STATION Mode, SSID: %s, IP address: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
}
void setup() {
// Init serial port and clean garbage
Serial.begin(SERIAL_BAUDRATE);
Serial.println();
Serial.println();
// Wifi wifiSetup(); // By default, fauxmoESP creates it's own webserver on the defined port // The TCP port must be 80 for gen3 devices (default is 1901) // This has to be done before the call to enable() fauxmo.createServer(true); // not needed, this is the default value fauxmo.setPort(80); // This is required for gen3 devices // You have to call enable(true) once you have a WiFi connection // You can enable or disable the library at any moment // Disabling it will prevent the devices from being discovered and switched fauxmo.enable(true); // Add virtual devices fauxmo.addDevice(ID); fauxmo.onSetState([](unsigned char device_id, const char * device_name, bool state, unsigned char value) { Serial.printf("[MAIN] Device #%d (%s) state: %s value: %d\n", device_id, device_name, state ? "ON" : "OFF", value); // Checking for device_id is simpler if you are certain about the order they are loaded and it does not change. // Otherwise comparing the device_name is safer. if (strcmp(device_name, ID)==0) { if(state){ flag = 1; }else{ flag = 2; } } });
}
void loop() {
// fauxmoESP uses an async TCP server but a sync UDP server
// Therefore, we have to manually poll for UDP packets
fauxmo.handle();
if(flag == 1){ lightOn(); flag = 0; }else if(flag == 2){ lightOff(); flag = 0; }
}
void lightOn() {
myservo.attach(D8);
delay(500);
myservo.write(55);
delay(500);
myservo.write(servoIni);
delay(500);
myservo.detach();
Serial.print("Switch turn on ...");
}
void lightOff() {
myservo.attach(D8);
delay(500);
myservo.write(125);
delay(500);
myservo.write(servoIni);
delay(500);
myservo.detach();
Serial.print("Switch turn off ...");
}
発生している問題
Alexaへの指定ワードを追加し(例:リビング、キッチンなど)、
対応するサーボモータの動作に関連付けできたらと考えています。
1台のESP8266もしくはESP32でAlexaより数通りの信号を受信、複数のサーボモータを制御、
という意味です。
試したこと
IDを複数作成し、対応するピンを指定したのですが、
スクリプト自体がRedefineによりエラー、もしくはコンパイルできても適正に信号が送られず、
サーボモータが動作しません。
ご教示のほど、何卒宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー