実に面白い SORACOM Lagoon 温湿度&受信信号強度を可視化
○目的
・もちろんSORACOM Lagoon評価
・湿度と受信信号強度の相関調査
○プログラム
#include <WioLTEforArduino.h>
#include <stdio.h>
#define INTERVAL (60000)
#define RECEIVE_TIMEOUT (10000)
#define SENSOR_PIN (WIOLTE_D38)
#include <limits.h>
WioLTE Wio;
void setup() {
delay(200);
SerialUSB.println("");
SerialUSB.println("--- START ---------------------------------------------------");
SerialUSB.println("### I/O Initialize.");
Wio.Init();
SerialUSB.println("### Power supply ON.");
Wio.PowerSupplyLTE(true);
//LTEモジュールの操作は0.5秒以上待ってください。(LTEモジュールの動作が安定するまで待つ。)
//念の為5秒まつ
delay(5000);
SerialUSB.println("### Turn on or reset.");
if (!Wio.TurnOnOrReset()) {
SerialUSB.println("### ERROR! ###");
return;
}
SerialUSB.println("### Connecting to \"soracom.io\".");
if (!Wio.Activate("soracom.io", "sora", "sora")) {
SerialUSB.println("### ERROR! ###");
return;
}
#ifdef SENSOR_PIN
TemperatureAndHumidityBegin(SENSOR_PIN);
#endif // SENSOR_PIN
SerialUSB.println("### Setup completed.");
}
void loop() {
char data[100];
#ifdef SENSOR_PIN
float temp;
float humi;
//緑色LED点灯
Wio.LedSetRGB(0, 100, 0);
//LTEモジュールが受信している信号強度[dBm]を取得します。
int rssi = Wio.GetReceivedSignalStrength();
if (rssi == INT_MIN) {
SerialUSB.println("### ERROR! ###");
goto err;
}
SerialUSB.print("RSSI:");
SerialUSB.print(rssi);
SerialUSB.println("");
if (!TemperatureAndHumidityRead(&temp, &humi)) {
SerialUSB.println("ERROR!");
goto err;
}
SerialUSB.print("Current humidity = ");
SerialUSB.print(humi);
SerialUSB.print("% ");
SerialUSB.print("temperature = ");
SerialUSB.print(temp);
SerialUSB.println("C");
sprintf(data, "{\"temp\":%.1f,\"humi\":%.1f,\"rssi\":%d}", temp, humi,rssi);
#else
sprintf(data, "{\"uptime\":%lu}", millis() / 1000);
#endif // SENSOR_PIN
SerialUSB.println("### Open.");
//送信するときに青LED点灯
Wio.LedSetRGB(0, 0, 100);
int connectId;
connectId = Wio.SocketOpen("harvest.soracom.io", 8514, WIOLTE_UDP);
if (connectId < 0) {
SerialUSB.println("### ERROR! ###");
goto err;
}
SerialUSB.println("### Send.");
SerialUSB.print("Send:");
SerialUSB.print(data);
SerialUSB.println("");
if (!Wio.SocketSend(connectId, data)) {
SerialUSB.println("### ERROR! ###");
goto err_close;
}
SerialUSB.println("### Receive.");
int length;
length = Wio.SocketReceive(connectId, data, sizeof (data), RECEIVE_TIMEOUT);
if (length < 0) {
SerialUSB.println("### ERROR! ###");
goto err_close;
}
if (length == 0) {
SerialUSB.println("### RECEIVE TIMEOUT! ###");
goto err_close;
}
SerialUSB.print("Receive:");
SerialUSB.print(data);
SerialUSB.println("");
err_close:
SerialUSB.println("### Close.");
if (!Wio.SocketClose(connectId)) {
SerialUSB.println("### ERROR! ###");
goto err;
}
err:
//消灯
Wio.LedSetRGB(0, 0, 0);
delay(INTERVAL);
}
////////////////////////////////////////////////////////////////////////////////////////
//
#ifdef SENSOR_PIN
int TemperatureAndHumidityPin;
void TemperatureAndHumidityBegin(int pin)
{
TemperatureAndHumidityPin = pin;
DHT11Init(TemperatureAndHumidityPin);
}
bool TemperatureAndHumidityRead(float* temperature, float* humidity)
{
byte data[5];
DHT11Start(TemperatureAndHumidityPin);
for (int i = 0; i < 5; i++) data[i] = DHT11ReadByte(TemperatureAndHumidityPin);
DHT11Finish(TemperatureAndHumidityPin);
if (!DHT11Check(data, sizeof (data))) return false;
if (data[1] >= 10) return false;
if (data[3] >= 10) return false;
*humidity = (float)data[0] + (float)data[1] / 10.0f;
*temperature = (float)data[2] + (float)data[3] / 10.0f;
return true;
}
#endif // SENSOR_PIN
////////////////////////////////////////////////////////////////////////////////////////
//
#ifdef SENSOR_PIN
void DHT11Init(int pin)
{
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
void DHT11Start(int pin)
{
// Host the start of signal
digitalWrite(pin, LOW);
delay(18);
// Pulled up to wait for
pinMode(pin, INPUT);
while (!digitalRead(pin)) ;
// Response signal
while (digitalRead(pin)) ;
// Pulled ready to output
while (!digitalRead(pin)) ;
}
byte DHT11ReadByte(int pin)
{
byte data = 0;
for (int i = 0; i < 8; i++) {
while (digitalRead(pin)) ;
while (!digitalRead(pin)) ;
unsigned long start = micros();
while (digitalRead(pin)) ;
unsigned long finish = micros();
if *1 ;
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
bool DHT11Check(const byte* data, int dataSize)
{
if (dataSize != 5) return false;
byte sum = 0;
for (int i = 0; i < dataSize - 1; i++) {
sum += data[i];
}
return data[dataSize - 1] == sum;
}
#endif // SENSOR_PIN
////////////////////////////////////////////////////////////////////////////////////////
○ダッシュボード
○所感
・湿度と受信信号強度の2軸グラフもやってみましたが
見づらいのでやめました。
・「晴天」「雨天」などで電波信号強度がどのように変化するか
モニタリングしようと思っていた矢先に「SORACOM Lagoon」リリース!
初心者でも簡単にモニタリングできる時代になったんですね。
*1:unsigned long)(finish - start) > 50) data |= 1 << (7 - i);
}
return data;
}
void DHT11Finish(int pin)
{
// Releases the bus
while (!digitalRead(pin