環境センサー「BME280」を接続したAVR-IoT WA開発ボードから、取得したセンサ情報をjson形式でネット上にアップロードし、ネット上のデータベースに保存します。「環境センサー「BME280」の情報をネット上にアップロード」では、すでにraspberry pi 3からjson形式でネット上にアップロードしました。
AVR-IoT WA開発ボードと環境センサー「BME280」の接続
Arduino nanoとESP8266間の接続ピンを次に示します。
AVR-IoT WA開発ボード | BME280 |
---|---|
SCL | SCL |
SDA | SDA |
GND | GND |
3V3 | VIN |
AVR-IoT WA開発ボードと環境センサー「BME280」の接続画像を次に示します。
Jsonライブラリのインストール
メニューから「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」を開き、次のようにJsonライブラリ「ArduinoJson」をインストールします。
アップロードプログラムの作成
アップロードプログラム「upload.ino」を次に示します。環境センサー「BME280」のプログラムは別ファイルにして関数により呼び出しています。プログラムの詳細は、「BME280を用いたPro Microの温湿度・気圧測定 プログラム」を参照してください。
upload.ino
#include <SPI.h> #include <WiFi101.h> #include <ArduinoJson.h> #include "uploadlib.h" char ssid[] = "xxxx"; char pass[] = "xxxx"; const char* host = "192.168.0.10"; int status = WL_IDLE_STATUS; double temp_act = 0.0, press_act = 0.0, hum_act = 0.0; //WiFiSSLClient client; WiFiClient client; // Initialize the WiFi client library void setup() { Serial2.begin(115200); WiFi.setPins(PIN_PA7, PIN_PF2, PIN_PA1, PIN_PF3); if (WiFi.status() == WL_NO_SHIELD) { Serial2.println("WiFi shield not present"); // don't continue: while (true); } while (status != WL_CONNECTED) { Serial2.print("Attempting to connect to SSID: "); Serial2.println(ssid); status = WiFi.begin(ssid, pass); } Serial2.println("Connected to wifi"); BME280init(); } void loop() { signed long int temp_cal; unsigned long int press_cal, hum_cal; readData(); temp_cal = calibration_T(temp_raw); press_cal = calibration_P(pres_raw); hum_cal = calibration_H(hum_raw); temp_act = (double)temp_cal / 100.0; press_act = (double)press_cal / 100.0; hum_act = (double)hum_cal / 1024.0; Serial2.print(press_act); Serial2.print(" hPa HUM : "); Serial2.print("TEMP : "); Serial2.print(temp_act); Serial2.print(" DegC PRESS : "); Serial2.print(hum_act); Serial2.println(" %"); sendMessage(); delay(1000); } void sendMessage() { // if (client.connect(host, 443)) { if (client.connect(host, 80)) { StaticJsonDocument<500> obj1; obj1["Pressure"] = press_act; obj1["Temperature"] = temp_act; obj1["Humidity"] = hum_act; char buffer[255]; serializeJson(obj1, buffer, sizeof(buffer)); Serial2.println(buffer); String data_length = String(strlen(buffer)+1); //Compute the data buffer length Serial2.println(data_length); client.println("POST /jsondump HTTP/1.1"); client.println("Host: 192.168.0.10"); client.println("User-Agent: tomosoft"); client.println("Connection: close"); client.println("Content-Type: application/json"); client.println("Content-Length: "+data_length); client.println(); client.println(buffer); delay(250); //Wait to receive the response client.parseFloat(); String resp = String(client.parseInt()); Serial2.println("Response code:"+resp); while (client.available()) { char c = client.read(); Serial2.write(c); } Serial2.println("request Sucessful"); } else { Serial2.println("request failed"); } }
次に示す「jsondump.php」は、動作確認のためサーバから受け取ったhttpメッセージのヘッダとbodyをレスポンスとして返すphpプログラムです。
jsondump.php
<?php try { print_r(getallheaders() ); echo "body".file_get_contents('php://input'); } catch (PDOException $e){ var_dump($e->getMessage()); } ?>
アップロードプログラムの実行
作成したアップロードプログラム「upload.ino」を実行すると、シリアルモニタに次のメッセージが表示されます。気圧(Pressure)、温度(Temperature)、湿度(Humidity)の各センサ情報が、json形式になっていることが確認できます。
Attempting to connect to SSID: aterm-5459b0-g Connected to wifi 1014.62 hPa HUM : TEMP : 17.69 DegC PRESS : 55.47 % {"Pressure":1014.62,"Temperature":17.69,"Humidity":55.46875} 61 Response code:200 OK Server: nginx Date: Wed, 10 Mar 2021 03:06:32 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close X-Powered-By: PHP/7.4.15 109 Array ( [Host] => xxxx [X-Real-Ip] => xxxx [Listen-Ipaddr] => xxxxx [Content-Length] => 61 [User-Agent] => tomosoft [Content-Type] => application/json ) body{"Pressure":1014.62,"Temperature":17.69,"Humidity":55.46875} request Sucessful 1014.54 hPa HUM : TEMP : 17.69 DegC PRESS : 55.48 % {"Pressure":1014.54,"Temperature":17.69,"Humidity":55.47949} 61 Response code:200 OK Server: nginx ・・・
データベースにセンサ情報の保存
ネット上のデータベースに検出した気圧(Pressure)、温度(Temperature)、湿度(Humidity)の各センサ情報を保存します。次のプログラム「writenv.php」によりデータベースにデータを保存します。
writenv.php
<?php try { //print_r(getallheaders() ); $post_body = file_get_contents('php://input'); //echo "body".$post_body; //$post_body = '{"Temperature":111, "Humidity":345 , "Pressure":678}'; $obj = json_decode($post_body); if ($obj === NULL) return; // var_dump($obj); $pdo = new PDO("mysql:host=xxxx; dbname=xxxx, "xxxx", "xxx", array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); date_default_timezone_set('Asia/Tokyo'); $date = date("Y/m/d G:i:s"); $temperature = $obj->{'Temperature'}; $humidity = $obj -> {"Humidity"}; $pressure = $obj -> {"Pressure"}; $sql = "INSERT INTO sensor VALUES(:date,:temperature,:humidity,:pressure)"; $stmt = $pdo->prepare($sql); $stmt->bindValue(':date',$date, PDO::PARAM_STR); $stmt->bindValue(':temperature', $temperature); $stmt->bindValue(':humidity',$humidity); $stmt->bindValue(':pressure',$pressure); $res = $stmt->execute(); } catch (PDOException $e){ var_dump($e->getMessage()); } ?>
シリアルモニタに次のメッセージが表示されます。
Attempting to connect to SSID: xxxxxx Connected to wifi 1009.48 hPa HUM : TEMP : 22.54 DegC PRESS : 43.55 % {"Pressure":1009.48,"Temperature":22.54,"Humidity":43.5459} 60 Response code:200 OK Server: nginx Date: Fri, 26 Mar 2021 05:10:53 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close X-Powered-By: PHP/7.4.15 2 request Sucessful 1009.48 hPa HUM : TEMP : 22.54 DegC PRESS : 43.56 % {"Pressure":1009.48,"Temperature":22.54,"Humidity":43.55664} 61 Response code:200 OK Server: nginx Date: Fri, 26 Mar 2021 05:10:55 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close X-Powered-By: PHP/7.4.15 2 request Sucessful 1009.56 hPa HUM : TEMP : 22.53 DegC PRESS : 43.56 % {"Pressure":1009.56,"Temperature":22.53,"Humidity":43.55566} 61 Response code:200 OK Server: nginx Date: Fri, 26 Mar 2021 05:10:56 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close X-Powered-By: PHP/7.4.15 2
phpMyAdminアプリにより登録されたデータを確認します。