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の時のような、定期的な大きなデータは現れず、正常な結果がレポートされました。
つまり、本件は、ソフトウエアの問題ではなく、ハードウエア依存の問題と思われます。
結局、原因は分かりませんでしたが、ハードウエアによって、いろいろとクセがあるようです。