自作Alexa IOT デバイスの第3段目になります。2作目まではリモコン内部のスイッチをフォトカプラに置き換えてAlexaデバイスを作りました。今回は赤外線リモコンの信号をコピーした赤外線リモコン用の自作Alexaデバイスを作ります。
使用するESP8266のデジタルpinは12mAしか流せないので、赤外線 LEDを直接には駆動できません。そこでLED電流はNPNトランジスタで5V電源から引っ張りこみます。電源電圧のゆとりを利用して、赤外線(以下IR)LEDを2~3個直列にして大きな照度を得ます。
デジタルpinは12mAですが、トランジスタを駆動するだけなのでわずかな電流を消費するだけです。余剰(といっても、極わずかですが)電流を使って、目視確認を目的の赤色LEDを点灯させます。
2SC1815の増幅率(min) 120のとき、ベース電流 Ib = 98 / 120 = 0.82 mA ですが、デジタル的にON/OFFを繰り返す今回の回路ではベース電流の飽和領域で使うのがよいとされています。
しかたなく、コード解析はあきらめrawデータを送信することにします。rawデータはIR信号のON/OFF時間を表しているので、発信のたびにある程度のばらつきがあります。そこで約10個のデータを取り、平均した数値を使用することにしました。参考に載せますが、一回の送信で295個の数値データがあります。
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include <Espalexa.h>
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
boolean connectWifi();
void RAS251_ACChanged(EspalexaDevice* dev);
const char* ssid = "**********";
const char* password = "***password***";
boolean wifiConnected = false;
Espalexa espalexa;
const uint16_t kIrLed = 4;
IRsend irsend(kIrLed);
uint16_t rawDataON[] = {
4560,4246,705,1443,720,1454,688,1463,707,1464,703,372,699,400,664,1484,688,407,663,414,656,418,673,404,675,421,647,1502,670,1502,645,429,659,1515,640,433,662,415,656,441,631,442,645,430,649,452,622,1524,647,1527,623,1527,647,1524,619,1557,620,1525,648,1526,620,1530,642,457,615,457,614,459,645,457,607,464,607,466,646,452,608,468,603,471,621,1554,602,1544,644,458,600,471,600,1565,613,469,601,473,612,463,634,466,598,475,598,476,640,461,596,479,594,476,628,465,603,477,595,478,596,1579,595,477,596,484,625,1544,596,478,616,480,600,478,594,494,579,495,611,473,594,500,573,500,604,476,593,504,569,504,570,1579,594,5424,4432,4371,570,1578,598,1571,575,1581,594,1571,602,480,594,479,594,1575,604,474,594,504,570,504,600,476,593,504,569,1579,595,1578,570,504,600,1574,570,504,598,478,593,505,569,504,570,504,595,479,594,1579,599,1575,569,1580,594,1578,570,1581,594,1578,601,1573,570,1578,597,478,594,504,570,503,601,475,594,504,570,504,597,480,593,504,569,505,568,1581,594,1579,601,475,594,504,569,1581,593,480,594,504,569,506,595,480,593,506,568,506,597,479,592,506,568,506,574,500,592,482,593,506,567,1582,593,506,568,506,592,1583,567,506,567,507,592,481,593,509,564,509,591,480,592,509,564,510,580,492,591,482,593,510,563,1582,592
};
uint16_t rawDataOFF[] = {
4615,4166,773,1397,703,1472,742,1406,768,1406,734,340,737,342,744,1423,707,368,742,357,713,360,712,362,741,359,707,1441,685,1490,703,370,699,1475,700,374,700,374,715,387,694,377,695,379,673,404,716,1455,691,1483,689,1459,695,1479,689,1461,713,1459,689,1485,686,1461,676,421,691,385,688,386,684,391,712,386,686,387,686,388,698,406,675,394,679,1484,691,1469,682,393,710,389,680,1468,689,416,674,394,679,394,666,411,702,394,678,395,677,397,701,398,676,398,675,1510,663,1473,673,1501,674,1474,693,409,671,399,674,400,658,448,667,400,672,401,673,402,700,400,669,403,670,404,668,1506,669,404,650,1524,669,1480,699,400,669,5349,4507,4275,664,1484,657,1516,665,1484,691,1481,667,408,692,412,661,1482,656,462,649,407,666,407,666,409,693,406,664,1483,672,1501,666,406,642,1532,668,405,667,407,696,403,666,407,665,409,660,472,632,1483,660,1514,669,1480,692,1481,668,1496,680,1477,672,1503,670,1478,688,419,665,401,672,401,651,431,690,401,672,401,671,403,697,401,670,404,669,1530,646,1477,656,420,695,403,669,1479,695,412,662,404,668,405,647,480,640,406,667,407,666,408,690,409,665,409,664,1541,636,1481,638,1536,668,1481,696,403,668,405,667,407,663,464,639,407,665,409,651,425,689,409,663,410,663,411,689,1485,661,412,643,1531,664,1485,692,407,664
};
void setup()
{
irsend.begin();
#if ESP8266
Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
#else
Serial.begin(115200, SERIAL_8N1);
#endif
Serial.begin(115200);
wifiConnected = connectWifi();
if(wifiConnected){
espalexa.addDevice("RAS251_AC", RAS251_ACChanged, EspalexaDeviceType::onoff);
espalexa.begin();
} else
{
while (1) {
Serial.println("Cannot connect to WiFi. Please check data and reset the ESP.");
delay(2500);
}
}
}
void loop()
{
espalexa.loop();
delay(1);
}
void RAS251_ACChanged(EspalexaDevice* d) {
if (d == nullptr) return;
Serial.print("A changed to ");
if (d->getValue()){
Serial.println("Turn ON 空清・自動モードでON");
irsend.sendRaw(rawDataON, 295, 38);
}
else {
Serial.println("Turn OFF 停止");
irsend.sendRaw(rawDataOFF, 295, 38);
}
}
boolean connectWifi(){
boolean state = true;
int i = 0;
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("Connecting to WiFi");
Serial.print("Connecting...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (i > 20){
state = false; break;
}
i++;
}
Serial.println("");
if (state){
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
else {
Serial.println("Connection failed.");
}
return state;
}
スケッチにはAlexa化エミュレートライブラリのEspalexaを入れていますので、ESP8266を起動してAlexaアプリから新しいデバイスを探して追加すれば、「アレクサ、エアコンをつけて」でエアコンが動きます。