1. 課題
・自宅はオール電化なので、エアコンで各部屋を適切な温度に管理する必要がある(出し入れが面倒なので、冬場にファンヒータなど使いたくない)
・エアコンだけでは、リビングダイニングを均一な温度にできず、特にダイニングで調理する妻が夏は暑く、冬は寒い
・サーキュレータVornado 660-JPを使って空気を循環させることで部屋全体が温調できるようになった
・エアコンはGoogle home miniとIFTTTを使って音声でON、OFF、温度変化を調整できていた
・Vornado 660-JPは電源タイマーや赤外線リモコンで制御できない
・Google homeからも操作できない
・Vornadoは電源ONでファンが「中」で動作を開始するがうるさい。「弱」で十分
2. 解決策
→エアコンと一緒にサーキュレータを弱で動作させる
・Google homeに連携する赤外線リモコンを使う
・Vornado 660-JPのスイッチを押すところを自作
・IoTプッシュボタンも色々売り出されているが自分で作ってみる
・電源ONのあとにすぐに「弱」ボタンも押させる
3. 手順
・イメージは下記の通り。sRemo-R3を使ってエアコンとサーキュレータを制御する
・Vornadoの電源スイッチはトグル動作なので、ON/OFFの状態がわかっている必要がある
・そこで、電流センサでON/OFFを確認してからサーボモータを動作させる
持っている機材
・Google home mini
・sRemo-R3
・Vornado 660-JP
購入した機材
・Arduino micro
・赤外線受信モジュール
・マイクロサーボ SG-90
・クランプ式電流センサ CTL-10-CLS
・サーボモータの先端にクッション材をはさみ、電源スイッチを押させる
4. プログラム
・赤外線受光部で参考にしたページ:
Arduinoで家にある赤外線リモコン全部解析 - Qiita
・サーボモータ制御で参考にしたページ:
Arduinoを用いてサーボモータを制御する | 物を作る者
→Arduinoのプログラム
#include <IRremote.h>
#include <Servo.h>
const int SERVO_PIN01 = 10;
const int SERVO_PIN02 = 9;
const int PIN_ANALOG_INPUT = 0;
float average = 0.0;
int j = 0;
//servo
Servo servo, servo2;
int angle_0 = 0;
int angle_1 = 40;
int angle_2 = -60;
int angle = 0;
int angle_change = 30;
int angle_up = 180;
int angle_right = 120;
int angle_down = 90;
int angle_left = 60;
//ir
int RECV_PIN = 7;
//led
int led_pin = 13;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
//ir sensor
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
//servo
servo.attach(SERVO_PIN01);
servo.write(angle);
servo2.attach(SERVO_PIN02);
servo2.write(angle);
//led 必要ないが、sRemoの信号を受光していることを確認するため
pinMode(led_pin, OUTPUT);
}
void dump(decode_results *results) {
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
int count = results->rawlen;
for (int i = 1; i < count; i++) {
if (i & 1) {
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else {
Serial.write('-');
Serial.print((unsigned long) results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println();
}
//サーキュレータのON/OFF状態を検出
float evaluate_current(){
float current=0.0;
int i = analogRead( PIN_ANALOG_INPUT );
for(j=0;j<40;j++){
current += analogRead( PIN_ANALOG_INPUT ) * 5.0 / 1023.0 *2.0;
//Serial.println(current);
delay(25);
}
//Serial.println(current);
return current;
}
void loop() {
int result;
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
Serial.println(results.value);
result = results.value;
//led
digitalWrite(led_pin, HIGH);
//check current
average = evaluate_current();
Serial.println(average);
//on button
if (results.value == 2991439680){
if (average < 1.0){
servo.write(angle_1);
delay(500);
servo.write(angle_0);
}else{
//no motion サーキュレータがONならON信号が来ても何もしない
}
}
//off button
else if (results.value == 2991431520){
if (average > 1.0){
servo.write(angle_1);
delay(500);
servo.write(angle_0);
}else{
//no motion サーキュレータがOFFならOFF信号が来ても何もしない
}
}
//weaken button
else if (results.value == 2991398880){
if (average > 1.0){//サーキュレータがONで弱ボタンの信号が来たときに動作
servo2.write(angle_1);
delay(500);
servo2.write(angle_0);
}else{
//no motion
}
}else{
servo.write(0);
servo2.write(0);
}
delay(500);
irrecv.resume(); // Receive the next value
//led
digitalWrite(led_pin, LOW);
}
}
5. 運用してみた感想
・朝起きたときにエアコンと一緒にサーキュレータがONになっているので、部屋の温度が一様になっていて良い。
・とりあえずこの方法なら赤外線リモコンに対応していない装置も制御できそうなので色々な機械にくっつけてみたい。
・流石に見た目があまりにもメカメカしいのでちょっと隠れるように工夫が必要。3Dプリンタでケースか何か作ろう。