Tower Pro SG90が意外とトルクあったんで直接スイッチ押すことができた。ソレノイドとかボールねじとかいろいろ考えてたけど必要なかった。サーボモーターをダイソーの万能ベルトでアイリスオオヤマの加湿器に直接縛り付けてる。
youtu.be
Arduino UNOコード。なぜかDHT.read()の前にDHT.readStatus();しないと動かなかったので追加。
#include "DHT20.h" #define SV_PIN 2 #define INPUT_PIN 3 #define nl 200 #define TURN_ON_HUMIDITY 35.0f #define TURN_OFF_HUMIDITY 50.0f DHT20 DHT; void sleepMinute(int minute) { delay(minute * 60UL * 1000UL); } void moveToHomePosition() { #ifdef ARDUINO_AVR_UNO Serial.println("moveToHomePosition"); #endif for (int j = 0; j < nl; ++j) { digitalWrite(SV_PIN, HIGH); delayMicroseconds(500); digitalWrite(SV_PIN, LOW); delayMicroseconds(20000 - 500); } delay(1000); } void pressSwitch() { #ifdef ARDUINO_AVR_UNO Serial.println("pressSwitch"); #endif for (int j = 0; j < nl; ++j) { digitalWrite(SV_PIN, HIGH); delayMicroseconds(2400); digitalWrite(SV_PIN, LOW); delayMicroseconds(20000 - 2400); } moveToHomePosition(); } float getHumidity() { DHT.readStatus(); DHT.read(); #ifdef ARDUINO_AVR_UNO float h = DHT.getHumidity(); Serial.println(h); return h; #else return DHT.getHumidity(); #endif } float getTemperature() { DHT.readStatus(); DHT.read(); #ifdef ARDUINO_AVR_UNO float t = DHT.getTemperature(); Serial.println(t); return t; #endif return DHT.getTemperature(); } bool getInput() { int inputVal = digitalRead(INPUT_PIN); delay(10); // チャタリング防止 return inputVal == LOW; } void turnOnMode() { pressSwitch(); // turn on; while(true) { if (getHumidity() > TURN_OFF_HUMIDITY || getInput()) { break; } delay(1000); } pressSwitch(); // turn off } void setup() { #ifdef ARDUINO_AVR_UNO Serial.begin(115200); // なぜか9600だと一部文字化けする Serial.println("Hello"); #endif pinMode(SV_PIN, OUTPUT); pinMode(INPUT_PIN, INPUT_PULLUP); moveToHomePosition(); // Test pressSwitch(); delay(1000); pressSwitch(); DHT.begin(); Wire.setClock(400000); delay(1000); } void loop() { if (getHumidity() < TURN_ON_HUMIDITY || getInput()) { turnOnMode(); } delay(1000); //sleepMinute(15); }