練習19 温湿度計を作る5 HTTP, POST

前回、WiFiへ接続しました。
今回は、サーバーへ測定値を送付したいと思います。

ソース

(1)ヘッダ

データを格納するString dataと、サーバーのIPアドレス、ポートを定義します。YN_Wifiは、WiFi接続に成功したかどうか判別するためのフラグです。

String data;  
const char*    host = "192.168.**.**";
const uint16_t port = 8080;
int            YN_Wifi;
WiFiClient client;

(2)loop()

温湿度を測定した後、サーバーへ送信するdataを作成します。フォーマットはBME280と共通して使うため、気圧(Press)の項を残しておきます。
Vcは電池の電圧で、後で説明します。
if(Vc>3.6)は電池の残量が少なくなったときに、「起動→WiFi接続失敗→リセット」を繰り返さないようにする仕組みです。3.6Vは暫定値で、実際に使いながら最適化したいと思います。WiFiへ接続できたら、POST2()を実行てdataをサーパーに送信します。

void loop(){
  read_SHT31();     //<---温湿度測定
  data  = "Vc= " + String(Vc) + " [V]"; 
  data += ", Temp5=  " + String(temp_31)  + " [degC]";
  data += ", Humid5= " + String(humid_31) + " [%]";
  data += ", Press5= 1000 [hPa]";
  data += "||data>text";
  Serial.println(data);

  if(Vc>3.6){                      //<---過放電保護
    YN_Wifi = setupWiFi2();        //<---WiFi接続
    if(YN_Wifi==1) Post2();        //<---POST送信
    WiFi.disconnect();
  }
  Display_Pic3(1);      //<---OLED表示
  DeepSleep();
  delay(1000);
}

(3)関数 Post2()

サーバーに接続して、dataをHTTPでPOST送信します。

void Post2(){ 
  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }
  Serial.println("Requesting POST: ");
  client.println("POST / HTTP/1.1");
  client.println("Host: server_name");
  client.println("Accept: */*");
  client.println("Content-Type: application/x-www-form-urlencoded");
  client.print("Content-Length: ");
  client.println(data.length());
  client.println();
  client.print(data);
  delay(100); 

  //<---(190706)Responce解析
  while(true){
    while (client.available()) {
        char c = client.read();
    }
    if (!client.connected()) { 
      Serial.println("disconnecting.");
      client.stop();
      break;
    }
  }
  if (client.connected()) { 
    client.stop();  // DISCONNECT FROM THE SERVER
  }
  Serial.println("closing connection");
  delay(100);
}

測定値をサーバーに送信することができるようになりました。
次回は、電池駆動部を作りたいと思います。
サーバー側は、そのうち整理するつもりです。