閉じる

Arduinoで火災報知機をつくってみた

家にある電気ストーブにオフタイマーが付いていなくて、ついついつけっぱなしにしてしまうことがあった。ときには8時間以上つけっぱなしにしていることがあって、その分の電気代もったいないし、火災の危険もあるためなんとかせねばならないと考えた。そこで、ちょうど手元にあったArduinoとGrooveの温度センサとブザーを使って、室温が一定以上になったときに、ブザーが鳴る簡単な報知器システムを構築してみた。

画像のように、Arduino UNOにGrove shieldを取り付けた。それの、A0に温度センサを取り付け、D2にボタンを取り付け、D3にLEDを取り付け、D6にブザーを取り付けた。

そして、以下のプログラムをArduinoに書き込むことによって、システムを稼働させた。温度が一定以上になったときにブザーが鳴り、LEDが赤色に光る。ボタンを押すと音が止む仕組みになっている。

// demo of Starter Kit V2.0 - Grove Temperature Sensor
//

const int PinTemp = A0;      // pin of temperature sensor
const int PinButton = 2;
const int PinLed    = 3;
const int PinBuzzer    = 6;

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

float temperature;
int B=3975;                  // B value of the thermistor
float resistance;

int maxtemp = 30;
int cnt = 0;
int maxcnt = 60*60*3; // 3 hour
int coolingcnt = 0;
int maxcoolingcnt = 60*60; // cooling count 1 hour

void setup()
{
    Serial.begin(9600);     //Baud rate for the serial communication of Arduino
    pinMode(A0,INPUT);      //Setting the A0 pin as input pin to take data from the temperature sensor 
    pinMode(PinLed, OUTPUT);                    // set led OUTPUT
    pinMode(PinButton, INPUT);  // initialize the pushbutton pin as an input:
    pinMode(PinBuzzer, OUTPUT);
    
}

void loop()
{
    int val = analogRead(PinTemp);                               // get analog value
    
    resistance=(float)(1023-val)*10000/val;                      // get resistance
    temperature=1/(log(resistance/10000)/B+1/298.15)-273.15;     // calc temperature
    Serial.println(temperature);
    Serial.println(cnt);

    if (temperature > maxtemp) {
      digitalWrite(PinLed, HIGH);
      cnt += 1;
    }
    else{
      digitalWrite(PinLed, LOW);
      coolingcnt += 1;
    }

    // read the state of the pushbutton value:
    buttonState = digitalRead(PinButton);

    // button clear
    if (buttonState == HIGH) {
        // turn LED on and off three times:
        digitalWrite(PinLed, HIGH);
        delay(100);
        digitalWrite(PinLed, LOW);
        delay(100);
        digitalWrite(PinLed, HIGH);
        delay(100);
        digitalWrite(PinLed, LOW);

        cnt = 0;
    }

    // cnt clear
    if (coolingcnt > maxcoolingcnt){
      cnt = 0;
      coolingcnt = 0;
    }

    if (cnt > maxcnt) {
      digitalWrite(PinBuzzer, HIGH);
    }
    else {
      digitalWrite(PinBuzzer, LOW);
    }

    delay(1000);          // delay 1s
}

コメントを残す

あなたのメールアドレスは公開されません。必須項目には印がついています *

© 2020 CV・NLP TIPS | WordPress Theme: Annina Free by CrestaProject.