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 スケッチ

/*
 *参考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);
}

 

 

カテゴリー: Arduino, ソフト・ハードウェア パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です