……何しろ暑いので、思いついて、今度はサーミスタを取り付け、便所の温度をも便器に報告させることにした。
俺は佐藤宅の便器だ。今フタが閉まった。 便所の気温は 27.88 ℃だ。 1627489451
— 佐藤家の物 (@SatoGoods) August 8, 2015
回路図は今度もごく簡単である。
現在のスケッチは下のとおりだ。
// // つぶやき便所 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); }