Arduino+SoracomでIoT(3/3)

ArduinoとSoracomを使ってセンサデータをクラウドに保存

センサーからの信号を遠隔からモニタリングするために、ArduinoSoracomのSIMカードを使ってIoTを構築しました。データのストレージには無料で使用できるAT&Tが提供しているM2Xを使用しました。


本記事の内容

  • 準備するもの
  • 3GIMのセットアップ
  • Soracomのセットアップ
  • M2Xのセットアップ
  • Arduinoのコード(本記事はここ)

Arduinoのコード

3GIMのライブラリによるPOSTリクエストの書き方が特有です。
センサを繋げずに、下のコードでPOSTリクエストを投げます。センサを繋げる場合には適宜変更してください。

#include <SoftwareSerial.h>

//SoftwareSerial iemSerial(4, 5);
SoftwareSerial Serial3G(4,5);
const unsigned long baudrate = 9600;
#define INTERVAL 180000UL // 3 min INTERVAL
#define LIMITTIME 35000 // ms (3G module start time)

String url = "https://api-m2x.att.com/v2/devices/DEVICE_ID/updates/ ";
String header = "\"HOST: api-m2x.att.com$r$nX-M2X-KEY: PRIMARY_API_KEY$r$nContent-Type:application/json$r$n\"";

//===========================================================

void setup() {
  while (!Serial);
  Serial.begin(baudrate);
  Serial3G.begin(baudrate);

  Serial.println(">Ready. Initilaizing...");
  while ( !_3Gsetup() ) {
    Serial.println(" Connect Error ... Stop");
    while (1);
  }
  Serial.println("Connected");
}

void loop () {
    static uint32_t tim = millis();
    static voltage = 0;
    voltage= 5 - voltage; //適宜analogやdegitalReadに変更, 例)analogRead(A1);
    Serial.println("signal = " + String(voltage));
    String dtime = datetime();
    Serial.println("DateTime = " + dtime);

    String body1 = "\"{\$\"values\$\" : {\$\"STREAM_ID\$\" : [{ \$\"timestamp\$\" : \$\"";
    String body2 = "\$\" , \$\"value\$\" : \$\"" + String(voltage) +"\$\"}]}}\" ";

    if (_3G_WP("$WP " + url + body1 + dtime + body2 + header)) {
        Serial.println("Data Update complete.");
    }
    else Serial.println("Data Update false...");
    delay(INTERVAL);
}

// =================== datetime ==============
// Get Date & Time (3GIM command)
// return --> string "2015-12-23T01:23:45%2B09:00"
// 2015-09-20T14:05:12.345Z\$\" , \$\"value\$\" : \$\"32.0\$\"}]}}\" ";
// + "2015-09-02T11:59:00%2B09:00&csv=TEMP01,2015-09-02T10:00:00%2B09:00LIGHT01,24.2"
String datetime() {
  String dtime;
  do {
    Serial3G.println("$YT");
    while (!Serial3G.available());
    Serial.println("reading...");

    dtime = Serial3G.readStringUntil('\n');
    delay(10000);
  } while ( !(dtime.indexOf("201") > 0) );
  dtime.replace(" ", "T"); dtime.replace("/", "-");
  return (dtime.substring(7) + "$+09:00");
}

//============== 3G setup =================
boolean _3Gsetup() {
  Serial.println("start _3Gsetup()");
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH); delay(100);
  digitalWrite(7, LOW); // 3G shield --> digitalWrite(7,HIGH);
  //------- 3G module begin & connect ---------
  String str;
  unsigned long tim = millis();
  do {
    while (!Serial3G.available());
    str = Serial3G.readStringUntil('\n');
  } while (!(str.indexOf("3GIM") > 0) && (millis() - tim) < LIMITTIME);
  if ( millis() - tim >= LIMITTIME) {
    return false;
  } else return true;
}

//============== $WP command =================
boolean _3G_WP(String command) {
  delay(10);
  Serial.println(command); // debug
  delay(10);
  Serial3G.println(command);
  String rstr;
  unsigned long tim = millis(); // time set(ms)
  do {
    while (!Serial3G.available());
    rstr = Serial3G.readStringUntil('\n');
    Serial.println(rstr); //debug print....
  } while (!(rstr.indexOf("$WP=") == 0) && (millis() - tim) < LIMITTIME); // $WP return check
  return (rstr.indexOf("$WP=") == 0);
}

コンパイル・書き込みを行って、M2X側にデータが送れていたら成功です。

1 Comment

  1. […] 次回は最後、APIでArduinoからM2Xからデータをストリームするです。 […]

    返信

コメントを残す

Scroll to top