よっしゃ便所の

投稿日:

 ……何しろ暑いので、思いついて、今度はサーミスタを取り付け、便所の温度をも便器に報告させることにした。

 回路図は今度もごく簡単である。

tweetToilet2-2

 現在のスケッチは下のとおりだ。

//
//  つぶやき便所 tweetToilet2.ino
//    27.08.08(土) 1900~
//    佐藤俊夫
//    チルトスイッチで便所のふたの動きを検出し、呟かせる。
//    温度を定期的に報告させるよう機能追加。
//
#include <SPI.h>
#include <Ethernet2.h>
#include <Twitter.h>
#include <stdio.h>
//
byte MAC[] = { 0x90, 0xA2, 0xDA, 0x0F, 0xF6, 0x74 };
IPAddress IP(192, 168, 1, 129);
Twitter TWITTER("取得したトークンをここに書く。");  //  トークン
const int TILTSW = 9;
const int THERMISTOR = 1;
const unsigned long int TEMPINTERVAL = 1000 * 60 * 5;  //  ミリ秒単位で5分
//
void setup()
{
  pinMode(TILTSW, INPUT);
  pinMode(THERMISTOR, INPUT);
  delay(1000);
  Ethernet.begin(MAC, IP);
  delay(1000);
}

void loop()
{
  static int tiltSwStatus = LOW, prevStatus = LOW;
  int i = 0;
  tiltSwStatus = tiltSw();
  if(tiltSwStatus != prevStatus){
    prevStatus = tiltSwStatus;
    tweetMsg(tiltSwStatus);
    delay(1000);
  }else{
    ;
  }
}
//
int tiltSw(){
  //  チルトスイッチの読み取りを安定させるため、100回連続して同じ値が返るまで読む。
  int i = 0, prevStatus = LOW, nowStatus = LOW;
  prevStatus = digitalRead(TILTSW);
  do{
    nowStatus = digitalRead(TILTSW);
    if(nowStatus == prevStatus){
      i ++;
    }else{
      i = 0;
    }
    prevStatus = nowStatus;
  }while(i < 100);
  return(nowStatus);
}
//
void tweetMsg(int tiltStatus){
  char
    openMsg[] = "%e3%82%84%e3%81%82%e3%80%82%e4%bf%ba%e3%81%af%e4%bd%90%e8%97%a4%e5%ae%85%e3%81%ae%e4%be%bf%e5%99%a8%e3%81%a0%e3%80%82%e4%bb%8a%e3%83%95%e3%82%bf%e3%81%8c%e9%96%8b%e3%81%84%e3%81%a6%e3%81%84%e3%82%8b%e3%80%82",
    //  "やあ。俺は佐藤宅の便器だ。今フタが開いている。"
    closeMsg[] = "%e4%bf%ba%e3%81%af%e4%bd%90%e8%97%a4%e5%ae%85%e3%81%ae%e4%be%bf%e5%99%a8%e3%81%a0%e3%80%82%e4%bb%8a%e3%83%95%e3%82%bf%e3%81%8c%e9%96%89%e3%81%be%e3%81%a3%e3%81%9f%e3%80%82",
    //  "俺は佐藤宅の便器だ。今フタが閉まった。"
    tempMsg1[] = "%e4%be%bf%e6%89%80%e3%81%ae%e6%b0%97%e6%b8%a9%e3%81%af",
    //  "便所の気温は"
    tempMsg2[] = "%e2%84%83%e3%81%a0%e3%80%82";
    //  "℃だ。"
  char tweetStr[512], *openCloseMsg = "", tempStr[16];
  if(tiltStatus == HIGH){
    openCloseMsg = openMsg;
  }else{
    openCloseMsg = closeMsg;
  }
  dtostrf(tempMesure(), 5, 2, tempStr);
  sprintf(tweetStr, "%s  \r\n %s %s %s\r\n%ld", openCloseMsg, tempMsg1, tempStr, tempMsg2, millis());
  //  Twitterは同じ文字列を繰り返し書き続けられないので、起動時間を付けて書き、重複を防ぐ。
  TWITTER.post(tweetStr);
  TWITTER.wait();
}
//
float tempMesure(){
  const float B = 4350.0, Ta = 25.0, Rt0 = 50000.0;  //  MF11-503Kスペックシート記載
  const float K = 273.15;  //  熱力学温度の定数
  const float v0 = 5.0, r0 = 1000.0;  //  Arduino +5Vと電流調整抵抗1kΩ
  const int resolution = 1024;  //  アナログ入力の分解能
  int srcVal = 0;
  float vt = 0.0, rt = 0.0;
  
  srcVal = analogRead(THERMISTOR);
  vt = srcVal * (v0 / (resolution - 1));
  rt = (v0 * r0 - vt * r0) / vt;
  return(1.0 / (log(rt / Rt0) / B + 1.0 / (Ta + K)) - K);
}

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください