0

温度センサーからのデータを保存するアクセス ポイントおよびサーバーとして構成された ESP8266 Thing Dev ボードを使用しています。目標は Android アプリケーションでこのデータにアクセスすることですが、今のところ、使用するクライアントは Chrome を実行している私のコンピューターです。

センサーは 250 ミリ秒ごとに新しい温度を提供し、文字列 (JSON 形式) に追加されます。クライアントがデータを要求すると、文字列が終了し (JSON 構造を閉じる)、サーバーに出力されます。

クライアントは、一度に最大 2*50 の値にアクセスできる必要があります。ただし、リクエストが送信されるたびに、2 つまたは 4 つの値のみが出力されるか、ページが機能していません。

arduino用のESP8266およびTMP102ライブラリを使用した私のArduinoコード:

#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Ticker.h>
#include "tmp102.h"

#define NB_MAX_TEMP 50
#define MAX_INPUT 20

const byte sensorAddress1 = 0x90;  // ADD0 -> GND
const byte sensorAddress2 = 0x92;  // ADD0 -> V+
tmp102 *thermometer1 = new tmp102(&Wire);
tmp102 *thermometer2 = new tmp102(&Wire);

// Timer
Ticker ticker;
bool flag = false;

// Wifi
const char WiFiAPPSK[] = "sparkfun"; // Wifi password
WiFiServer server(80);

int count = 0;
String s;

void setupWiFi()
{
  WiFi.mode(WIFI_AP);

  // Do a little work to get a unique-ish name. Append the
  // last two bytes of the MAC (HEX'd) to "ThingDev-":
  uint8_t mac[WL_MAC_ADDR_LENGTH];
  WiFi.softAPmacAddress(mac);
  String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) +
  String(mac[WL_MAC_ADDR_LENGTH - 1], HEX);
  macID.toUpperCase();
  String AP_NameString = "ThingDev-" + macID;

  char AP_NameChar[AP_NameString.length() + 1];
  memset(AP_NameChar, 0, AP_NameString.length() + 1);

  for (int i = 0; i < AP_NameString.length(); i++)
  AP_NameChar[i] = AP_NameString.charAt(i);

  WiFi.softAP(AP_NameChar, WiFiAPPSK);
}

void timer_done()
{
  flag = true;
}

void acquire()
{
  int temp1 = 0, temp2 = 0;
  if (thermometer1->readTemp(temp1))
  {
    // If we're reading pins, print out those values:
    // first temp
    s += String(temp1 * 0.0625);
  }
  s += ",";
  if (thermometer2->readTemp(temp2))
  {
    // If we're reading pins, print out those values:
    // second temp
    s += String(temp2 * 0.0625);
  }
  return;
}

void setup()
{
  Wire.begin(); // start the I2C library
  Serial.begin(115200);
  thermometer1->init(sensorAddress1);
  thermometer2->init(sensorAddress2);

  //Set default config.
  thermometer1->writeConf(TMP102_DEFAULT_CONF);
  thermometer2->writeConf(TMP102_DEFAULT_CONF);

  setupWiFi();
  server.begin();

  // timer every 0.25s
  ticker.attach(0.25, timer_done);
}

void loop()
{
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  if (flag) {
    flag = false;

    int temp1 = 0, temp2 = 0;

    if (count == 0) {
      // prepare string
      s = "HTTP/1.1 200 OK\r\n";
      s += "Content-Type: text/html\r\n\r\n";
      s += "{temp:[";
    }
    delay(1);
    // add a measurement
    s += "[";
    acquire();
    s += "],";

    count += 1;
    if (count == NB_MAX_TEMP) {
      // Prevent the string to become infinite
      count = 0;
      s = s.substring(0, s.length() - 1);
      s += "]};";
    }
  }
   if (client.available() > 0) {
      // Read the first line of the request
      String req = client.readStringUntil('\r');
      client.flush();
      Serial.println(req);

      if (req.indexOf("/read") != -1) {
        // End the string
        s.setCharAt(s.length() - 1, '\0'); 
        s += "]};";
        client.print(s);
        Serial.println(s);
        count = 0;
      }
    }
    delay(1);
    Serial.println("Client disconnected");

    // The client will actually be disconnected
    // when the function returns and 'client' object is detroyed
}

そして、シリアルコンソールで取得したもののサンプル (JSON 文字列は、サーバーページで読んだものと同じです):

GET /read HTTP/1.1
HTTP/1.1 200 OK
Content-Type: text/html

{temp:[[24.00,24.56],[24.00,24.56];
Client disconnected
GET /favicon.ico HTTP/1.1
Client disconnected
GET /read HTTP/1.1
HTTP/1.1 200 OK
Content-Type: text/html

{temp:[[24.00,24.56];
Client disconnected

私は何を間違っていますか?ブロッキング機能を使用していますか? /favicon.ico リクエストが問題を引き起こしていますか?

参考までに、私のコードのアクセス ポイント部分とセンサー部分は別々にテストされており、期待どおりに動作します。

前もって感謝します。

4

0 に答える 0