ホームページをリニューアルしました。旧HPはこちら
Arduino ソフト・ハードウェア

Arduinoで自動体重記録計を作る

ネット検索をしていたら、世の中には頭の良い人がいるもので、既成の赤外線通信を使って体重を表示する体重計を使って、計測データを自動記録する方法が載っていたので、早速試してみた。

参考記事:
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]

 

 

コメント

タイトルとURLをコピーしました