ネット検索をしていたら、世の中には頭の良い人がいるもので、既成の赤外線通信を使って体重を表示する体重計を使って、計測データを自動記録する方法が載っていたので、早速試してみた。
参考記事:
Arduino で自動体重記録計を作る
参考記事に載っているProgramに、さくらインターネットサーバーにデータを飛ばすコードを盛り込んで完成。
システム:
Arduino+Ethernet Shield + TP-LINK Wifi router(Client mode)
赤外線センサーの受信ICは、昔、EPSONのEndeavorについていたものを改良して使った。
サーバへの保存データ例:
2017/10/01 13:17:24,59.00
2017/10/01 13:25:09,59.00
2017/10/01 15:00:07,58.80
Arduino スケッチ
/* *参考URL https://qiita.com/td2sk/items/56dce27c92b1fbfd63ce *体重計データをさくらインターネットに送る *要件を満たす体重計として、以下の機種を使う。 *Amacon.co.jp: Hashy SALUTE(サルート) ワイヤレス体重計 (WH) BH-2581 * *2017/10/01 ver01 *program_name = "taijyukei_aterm_sakura_01" * */ #include <avr/sleep.h> #include <SPI.h> #include <Ethernet.h> #define PIN 2 #define LED 13 #define SHORT_TIMEOUT 5000 #define LONG_TIMEOUT 1000000 char* program_name = "taijyukei_aterm_sakura_01"; //------------------------------------------------------- // server port #define PORT 80 // Ethernet Shild Mac address of arduino byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFA, 0xEA }; // Ethernet Shild IP address of arduino byte ip[] = {192,168,10,30 }; // Aterm router address 2017/10/01 //----------------------------------------------------------- // sakura server IP byte server[] = {************ }; // generate clinet EthernetClient client; ////////// sub routine //////////////////////// void deepSleep() { set_sleep_mode(SLEEP_MODE_PWR_SAVE); // Arduino Uno では、以下のコードにより2番ピンの変化を受けてスリープから復帰できる attachInterrupt(0, wakeup, FALLING); digitalWrite(LED, LOW); delay(100); sleep_enable(); sleep_mode(); sleep_disable(); detachInterrupt(0); digitalWrite(LED, HIGH); } void wakeup() { delay(500); } // 先の状態遷移図に対応する関数 // 新しい信号が来なくなったら、最後に読んだ体重値を return する unsigned long receive() { uint32_t count = 0; uint32_t bits = 0; uint32_t ret = 0; while (true) { unsigned long pulse = pulseIn(PIN, HIGH, SHORT_TIMEOUT); if (pulse == 0) { if (count != 0) { /* 信号が 39bit かつ、体重が安定しているときに保存する。 先頭 12 bit は固定で 0b101010110000 = 0xAB8 安定を示す次の 2ビットが 11 、更に続く 2 bit は常に 0 である。 よって、体重が安定したとき、信号の先頭 16 bit は 0xAB8C になる。 */ if ((count == 39) && (bits >> 16 == 0xAB8C)) { // SALUTE 体重計の測定上限は 150kg (1500) までなので、 11bit 取れば十分 ret = bits & 0x7ff; } count = 0; continue; } pulse = pulseIn(PIN, HIGH, LONG_TIMEOUT); if (pulse == 0) { break; } } if (count < 32) { unsigned long b = pulse < 750 ? 1 : 0; bitWrite(bits, 31 - count, b); } ++count; } return ret; } ////////////////////////////////////////////// void setup() { Serial.begin(9600); while (!Serial) ; delay(100); Serial.println(program_name); Serial.println("weight measurement"); // Ethernet intialize Ethernet.begin(mac, ip); delay(100); /// cli(); pinMode(PIN, INPUT); pinMode(LED, OUTPUT); //Serial.begin(9600); sei(); Serial.println(""); delay(100); digitalWrite(LED, LOW); } ////////////////////////////////////////////////// void loop() { uint32_t v; float ww; String strww; do { deepSleep(); delay(100); } while ((v = receive()) == 0); Serial.println(v/10.0); ww=v/10.0; strww = String(ww); Serial.print("data upload to sukura: srtww="); Serial.println(strww); if (client.connect(server, 80)) { Serial.println("----- check HTTP GET sending data -------"); //sakura web server PHP Script GET //directory= home/www/logdata/fujimi280/fujimi280.txt //php file = ****.php, datalog file = ****.txt //client.write("GET /logdata/testlog/****.php?ww="); // testlog client.write("GET /logdata/testlog/****.php?weight="); //OK client.print(strww); // weight //client.write("&temp_act="); //client.print(temp_act); client.write(" HTTP/1.1\r\n"); client.write("HOST:*****.sakura.ne.jp\r\n"); client.write("Connection: close\r\n\r\n"); client.stop(); // <------------------Sever disconect } delay(200); }