chottoshitahanashi’s diary

基本的に間違ったことばかり書いてるブログ。検索ひっかかるな

加湿器スイッチON/OFF

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);
}