Table of Content
ArduinoとSoracomを使ってセンサデータをクラウドに保存
センサーからの信号を遠隔からモニタリングするために、ArduinoとSoracomの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側にデータが送れていたら成功です。
2019年8月15日
[…] 次回は最後、APIでArduinoからM2Xからデータをストリームするです。 […]