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