パチンコ AWS支部員 SORACOMユーザー会

ガーデン八潮実践、作ったものリスト

実に面白い 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

////////////////////////////////////////////////////////////////////////////////////////

 

ダッシュボード

f:id:datafocus:20180708121405j:plain

 

○所感

・湿度と受信信号強度の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