ネット検索をしていたら、世の中には頭の良い人がいるもので、既成の赤外線通信を使って体重を表示する体重計を使って、計測データを自動記録する方法が載っていたので、早速試してみた。
参考記事:
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 スケッチ
[cpp] /**参考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.1rn");
client.write("HOST:*****.sakura.ne.jprn");
client.write("Connection: closernrn");
client.stop(); // <——————Sever disconect
}
delay(200);
}
[/cpp]
コメント