ESP32-DevKitCが一定期間毎におかしな挙動をする

ESP32-DevKitCでスケッチを実行したところ、一定期間毎におかしな結果がレポートされます。



ほぼ同じスケッチを、ESP8266(ESPr Developer)に書き込んだところ、問題なく実行できるので、ハードウエアに依存する問題だと思います。


原因は今のところ分かりません。


詳細は以下のとおりです。

ESP32-DevKitCにダストセンサをつないで、部屋のホコリの量を観測しようと思いました。
使用したダストセンサはこちらです。


作成したスケッチはこちらです。
データを測定する部分は、こちら のページに記載されているものを、ほぼそのまま流用しました。

#include <WiFi.h>

char ssid[40] = "XXXXXXXX";
char pass[40] = "XXXXXXXX";
char host[40] = "XXXXXXXX";
char event[40] = "XXXXXXXX";
int interval = 300000;
uint16_t chipid = (uint16_t)((ESP.getEfuseMac())>>32);

int pin = 13;
//int pin = 16;
//int pin = 36;

unsigned long sendTime;

void setup() {
  Serial.begin(115200);

  setupWiFi();
  delay(2000);

  pinMode(pin, INPUT);
  sendTime = millis();
}

unsigned long lowpulseoccupancy = 0;

void loop() {
  unsigned long duration = pulseIn(pin, LOW);
  lowpulseoccupancy = lowpulseoccupancy + duration;

  unsigned long currentTime = millis();
  if(currentTime-sendTime >= interval || currentTime < sendTime) {
    float ratio = lowpulseoccupancy / (interval * 10.0);
    float value = 1.1*pow(ratio, 3) - 3.8*pow(ratio, 2) + 520*ratio + 0.62;

    if(!sendRequest(value)) {
      Serial.println("Failed to send request.");
    }
    sendTime = currentTime;
    lowpulseoccupancy = 0;
  }
}

void setupWiFi() {
  // 省略
}

boolean sendRequest(float val0) {
  // 省略
}

このスケッチでは、測定したホコリの量を、5分毎にWebサーバに送信します。
Webサーバには、収集したデータをグラフ表示するプログラムが準備してあるので、送信したデータをグラフで見ることができます。

データを確認したところ、2時間弱の間隔で、非常に大きい値がレポートされています。
正確に調べると、1.83〜1.96時間(6600〜7000秒)毎に、大きい値が出力されています。データ送信間隔が300秒なので、一定間隔といえます。

さらに状況を把握するため、データ送信間隔を1分(60秒)に変更してみましたが、やはり同じ間隔で大きい値がレポートされます。
こちらも正確に調べると、1.83〜1.86時間(6590〜6710秒)毎に、大きい値が出力されていました。

スケッチがおかしいと考え、色々と悩んでいましたが、原因は分かりません。
使用する入力端子も変えてみました。13番、16番、36番で試しましたが、結果は同じでした。

どうしても原因が分からないので、ESP32の使用をあきらめ、ESPr Developerを使ってみることにしました。
ほとんど同じスケッチ(以下のもの)を、ESPr Developerに書き込んで、確認してみました。

#include <ESP8266WiFi.h> // 変更

char ssid[40] = "XXXXXXXX";
char pass[40] = "XXXXXXXX";
char host[40] = "XXXXXXXX";
char event[40] = "XXXXXXXX";
int interval = 300000;
uint16_t chipid = ESP.getChipId(); // 変更

int pin = 4; // 変更

unsigned long sendTime;

void setup() {
  Serial.begin(115200);

  setupWiFi();
  delay(2000);

  pinMode(pin, INPUT);
  sendTime = millis();
}

unsigned long lowpulseoccupancy = 0;

void loop() {
  unsigned long duration = pulseIn(pin, LOW);
  lowpulseoccupancy = lowpulseoccupancy + duration;

  unsigned long currentTime = millis();
  if(currentTime-sendTime >= interval || currentTime < sendTime) {
    float ratio = lowpulseoccupancy / (interval * 10.0);
    float value = 1.1*pow(ratio, 3) - 3.8*pow(ratio, 2) + 520*ratio + 0.62;

    if(!sendRequest(value)) {
      Serial.println("Failed to send request.");
    }
    sendTime = currentTime;
    lowpulseoccupancy = 0;
  }
}

void setupWiFi() {
  // 省略
}

boolean sendRequest(float val0) {
  // 省略
}

すると、ESP32-DevKitCの時のような、定期的な大きなデータは現れず、正常な結果がレポートされました。

つまり、本件は、ソフトウエアの問題ではなく、ハードウエア依存の問題と思われます。

結局、原因は分かりませんでしたが、ハードウエアによって、いろいろとクセがあるようです。