来週までの課題 BOXに提出
Ambientセンサデータ送信グラフ化課題_ino_ソースコードとスクリーンショット
UNVIII/内部加速度センサの複数種類のセンサデータをAmbientに送信しグラフ化に成功すること
Wifiは5G帯は使えない。自宅に2.4Gがない人は注意。実は大学Wifも2.4Gは利用可能である。
Ambientの制約に注意せよ。
1user :8ch
1ch:8種類のデータ
送信間隔 5sec以上
1chあたり最大 3000件
チャート 1チャンネルあたり8個
AmbientはIoTデータの可視化サービスです。
マイコンなどから送られるセンサデータを受信し、蓄積し、可視化(グラフ化)します。
AmbientはIoTのアイデアをなるべく簡単にプロトタイプするお手伝いをします。細かな初期設定をしなくても送ったデータをリアルタイムでグラフ化します。例えばセンサから得られた温度と湿度のデータを初期設定をしないで送った場合でも、グラフが表示されます。
→登録用のメールが返ってくるまで時間を要する場合があるようなので,その場合は先にStep 1.から進めること.
Step 0. Ambientを使ってみる – Ambient の手順にしたがって,1.ユーザー登録(無料) と 2. チャネル生成 までを済ませておく
0番目 準備
Ambientライブラリのインストール方法 ライブラリマネジャーから「Ambient ESP32 ESP8266 lib」で検索
Ambientの制約:
1user :8ch
1ch:8種類のデータ
送信間隔 5sec以上
1chあたり最大 3000件
チャート 1チャンネルあたり8個
wifi につなげる。プログラム第1段階
ssid は “sensor-net”;
password は “sensor-net0101";
#include <M5Core2.h>
#include <WiFi.h>
const char* ssid = "sensor-net_xxxxx";
const char* password = "xxxxxxxx";
void setup() {
M5.begin();
M5.Lcd.setTextSize(2);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
M5.Lcd.print(".");
}
M5.Lcd.print("\r\nWiFi connected\r\nIP address: ");
M5.Lcd.println(WiFi.localIP());
}
void loop() {
}
第2段階 wifiにつなげてデータ送信 固定のデータ
// Ambient Test
#include <M5Core2.h>
#include "Ambient.h"
#define PERIOD 6
WiFiClient client;
Ambient ambient;
const char* ssid = "wifi_ssidxxxxxxx";
const char* password = "passwordxxxxx";
unsigned int channelId = 99999; // AmbientのチャネルID自分で設定
const char* writeKey = "write_key"; // ライトキー (not read key)自分で設定
void setup() {
M5.begin();
Serial.begin(115200);
delay(100);
Serial.println("M5Stack -> Ambient Test");
WiFi.begin(ssid, password); // Wi-Fi APに接続
while (WiFi.status() != WL_CONNECTED) { // Wi-Fi AP接続待ち
delay(100);
}
Serial.print("WiFi connected\r\nIP address: ");
Serial.println(WiFi.localIP());
M5.Lcd.print(WiFi.localIP());
M5.Lcd.print(" is local IP address\r\n");
ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
}
void loop() {
int t = millis();
ambient.set(1, 5); // 適当なデータ
ambient.set(2, 10);
ambient.set(3, 20);
ambient.send();
M5.Lcd.print("Sending to Ambient...\r\n");
t = millis() - t;
t = (t < PERIOD * 1000) ? (PERIOD * 1000 - t) : 1;
delay(t);
}
第3段階 ENVIIIのunit_envのサンプルを動かす。
その後 envIIIのセンサデータ 温度 湿度 気圧データをAmbientに送信すること。
第4段階 加速度データをAmbientに送ろう。
#include <M5Core2.h>
#include <Wire.h>
#include "Ambient.h"
#define PERIOD 30
float accX = 0.0F;
float accY = 0.0F;
float accZ = 0.0F;
float gyroX = 0.0F;
float gyroY = 0.0F;
float gyroZ = 0.0F;
float pitch = 0.0F;
float roll = 0.0F;
float yaw = 0.0F;
float temp = 0.0F;
WiFiClient client;
Ambient ambient;
const char* ssid = "sensor-netxxxxx";
const char* password = xxxxxxxx";
unsigned int channelId = 3xxxxx; // AmbientのチャネルID
const char* writeKey = "3dxxxxxxxxx"; // ライトキー
// the setup routine runs once when M5Stack starts up
void setup() {
// Initialize the M5Stack object
M5.begin();
Serial.println("\r\nM5Stack+BME280->Ambient test");
WiFi.begin(ssid, password); // Wi-Fi APに接続
while (WiFi.status() != WL_CONNECTED) { // Wi-Fi AP接続待ち
delay(100);
}
Serial.print("WiFi connected\r\nIP address: ");
Serial.println(WiFi.localIP());
M5.IMU.Init();
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextColor(GREEN , BLACK);
M5.Lcd.setTextSize(2);
ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
}
// the loop routine runs over and over again forever
void loop() {
int t = millis();
// put your main code here, to run repeatedly:
M5.IMU.getGyroData(&gyroX, &gyroY, &gyroZ);
M5.IMU.getAccelData(&accX, &accY, &accZ);
M5.IMU.getAhrsData(&pitch, &roll, &yaw);
M5.IMU.getTempData(&temp);
M5.Lcd.setCursor(0, 20);
M5.Lcd.printf("%6.2f %6.2f %6.2f ", gyroX, gyroY, gyroZ);
M5.Lcd.setCursor(220, 42);
M5.Lcd.print(" o/s");
M5.Lcd.setCursor(0, 65);
M5.Lcd.printf(" %5.2f %5.2f %5.2f ", accX, accY, accZ);
M5.Lcd.setCursor(220, 87);
M5.Lcd.print(" G");
M5.Lcd.setCursor(0, 110);
M5.Lcd.printf(" %5.2f %5.2f %5.2f ", pitch, roll, yaw);
M5.Lcd.setCursor(220, 132);
M5.Lcd.print(" degree");
M5.Lcd.setCursor(0, 155);
M5.Lcd.printf("Temperature : %.2f C", temp);
ambient.set(1, accX); // 適当なデータ
ambient.set(2, gyroX);
ambient.set(3, temp);
ambient.send();
M5.Lcd.print("Sending to Ambient...\r\n");
t = millis() - t;
t = (t < PERIOD * 1000) ? (PERIOD * 1000 - t) : 1;
delay(t);
}
環境によってはM5Stack向けにコンパイルしようとすると「複数のライブラリが見つかりました」というエラーが出る
macとか
Ambient::bulk_send()
説明
begin()で指定したチャネルに複数件のデーターをまとめて送信します。データーは下記に示すJSON形式で渡し、データーの中に生成時刻を含める必要があります。送信後、AmbientサーバーからのHTTPステータスコードがAmbient::statusにセットされます。
構文
#include "Ambient.h"
int Ambient::bulk_send(char * buf[, uint32_t tmout]);
引数
char * buf; // データーへのポインター
uint32_t tmout; // サーバー接続のタイムアウト値(ミリ秒)。省略時は30秒
データーは次のようなJSON形式にします。
{
"writeKey" : "ライトキー",
"data" : [
{"created" : "YYYY-MM-DD HH:mm:ss.sss", "d1" : "値", "d2" : "値", ...},
{"created" : "YYYY-MM-DD HH:mm:ss.sss", "d1" : "値", "d2" : "値", ...},
...
{"created" : "YYYY-MM-DD HH:mm:ss.sss", "d1" : "値", "d2" : "値", ...}
]
}
見やすくするために改行やインデントを入れてありますが、実際には改行やインデントは不要です。“created”はデーターの生成時刻で、値は“YYYY-MM-DD HH:mm:ss.sss”という形式か、 数値を渡します。 数値を渡した場合は1970年1月1日00:00:00からのミリ秒と解釈されます。“created”の後にはデーターを“キー“:”値“という形式で並べます。 キーは“d1″、“d2″、“d3″、“d4″、“d5″、“d6″、“d7″、“d8″のいずれかを指定します。
さらに、次のように“time”: 1 を指定すると、数値は「秒(協定世界時(UTC)の1970年1月1日00:00:00からの)」として扱われます。“YYYY-MM-DD HH:mm:ss.sss”という形式の場合は“time”: 1を指定しても無視します。
{
"writeKey" : "ライトキー",
"data" : [
{"created" : 数値, "time" : 1, "d1" : "値", "d2" : "値", ...},
{"created" : 数値, "time" : 1, "d1" : "値", "d2" : "値", ...},
...
{"created" : 数値, "time" : 1, "d1" : "値", "d2" : "値", ...}
]
}
戻り値
実際に送信できたバイト数が返されます。
https://ambidata.io/refs/arduino/
ambient bulk_send
https://jiwashin.blogspot.com/2016/07/esp30.html