Почему ESP8266 висит в этой части кода?

Вот код, который доставляет мне неприятности:

void PMS5003::processDataOn(HardwareSerial &serial) {
unsigned long timeout = millis();
int count = 0;
byte incomeByte[NUM_INCOME_BYTE];
boolean startcount = false;
byte data;
while (1){
yield();
ESP.wdtFeed();
if ((millis() - timeout) > 3000){
//ptrSerial.println("SENSOR-ERROR-TIMEOUT");
break;
}
if (serial.available()){
data = serial.read();
if (data == CHAR_PRELIM && !startcount) {
startcount = true;
count++;
incomeByte[0] = data;
}
else if (startcount) {
count++;
incomeByte[count - 1] = data;
if (count >= NUM_INCOME_BYTE){
break;
}
}
}
}
unsigned int calcsum = 0;
unsigned int exptsum;
for (int i = 0; i < NUM_DATA_BYTE; i++) {
calcsum += (unsigned int)incomeByte[i];
}
exptsum = ((unsigned int)incomeByte[CHECK_BYTE] << 8) + (unsigned int)incomeByte[CHECK_BYTE + 1];
if (calcsum == exptsum) {
pm1 = ((unsigned int)incomeByte[PM1_BYTE] << 8) + (unsigned int)incomeByte[PM1_BYTE + 1];
pm25 = ((unsigned int)incomeByte[PM25_BYTE] << 8) + (unsigned int)incomeByte[PM25_BYTE + 1];
pm10 = ((unsigned int)incomeByte[PM10_BYTE] << 8) + (unsigned int)incomeByte[PM10_BYTE + 1];
} else {
//ptrSerial.println("#[exception] PM2.5 Sensor CHECKSUM ERROR!");
pm1 = -1;
pm25 = -1;
pm10 = -1;
}
return;
}

ESP8266 висит где-то здесь после нескольких дней работы. Я считаю, что это как-то связано с if ((millis() - timeout) > 3000){,

На что здесь обратить внимание? Есть ли millis() Переполнение? Или может быть что-то не так с вычитанием?

@редактировать

Вы можете увидеть здесь строку, где я печатаю DEBUG: 32 — это последнее, что я вижу на своем терминале:

ParticulateMatterMeasurements measurePM() {
ParticulateMatterMeasurements measurements;
for (int laserRestartCount = 0; laserRestartCount < 3; laserRestartCount++) {
Serial.println("DEBUG: 31");
for (int getMeasurementCount = 0; getMeasurementCount < 10; getMeasurementCount++) {
Serial.println("DEBUG: 32");
yield();
measurements = getMeasurements();
if (measurements.getAreValid()) {
return measurements;
} else {
delay(2000);
}
}
if (!measurements.getAreValid()) {
Serial.println("DEBUG: 33");
restartPMSensor();
} else {
break;
}
yield();
}
if (!measurements.getAreValid()) {
Serial.println("Restarting ESP (laser error)...");
ESP.restart();
}
}

ParticulateMatterMeasurements getMeasurements() {
ParticulateMatterMeasurements measurements;
measurements.setAreValid(false);
pms5003.processDataOn(Serial);
measurements.setPM01Value(pms5003.getPM1());
measurements.setPM25Value(pms5003.getPM25());
measurements.setPM10Value(pms5003.getPM10());
if (measurements.getPM01Value() != -1 && measurements.getPM25Value() != -1 && measurements.getPM10Value() != -1) {
measurements.setAreValid(true);
}
return measurements;
}

@ edit2

мой loop метод:

void loop() {
Serial.printf("Heap: %u\n", ESP.getFreeHeap());
Serial.println("DEBUG: 16");
restartEspIfNotConnected();
Serial.println("DEBUG: 17");
AllMeasurements measurements = measureAllParameters();
Serial.println("DEBUG: 18");
Serial.printf("Heap: %u\n", ESP.getFreeHeap());
sendMeasurementsToBackupServer(getQueryParametersString(measurements));
Serial.printf("Heap: %u\n", ESP.getFreeHeap());
Serial.println("DEBUG: 19");
Serial.printf("Heap: %u\n", ESP.getFreeHeap());
int statusCode = sendMeasurementsToServer(getQueryParametersString(measurements));
Serial.printf("Heap: %u\n", ESP.getFreeHeap());
Serial.println("DEBUG: 20");
if (statusCode < 0) {
Serial.println("DEBUG: 21");
Serial.println(statusCode);
sendingErrorCounter++;
} else {
Serial.println("DEBUG: 22");
sendingErrorCounter = 0;
}
Serial.println("DEBUG: 23");
if (sendingErrorCounter >= 10) {
Serial.println("DEBUG: 24");
ESP.restart();
}
Serial.println("DEBUG: 25");
Serial.printf("Heap: %u\n", ESP.getFreeHeap());
sendRssi();
Serial.println("DEBUG: 26");
Serial.printf("Heap: %u\n", ESP.getFreeHeap());
checkUpdates();
Serial.println("DEBUG: 27");
Serial.printf("Heap: %u\n", ESP.getFreeHeap());
}

@ Edit3

Это заняло некоторое время, но я немного ближе к ошибке. ESP8266 висит в месте, которое я никогда бы не заподозрил.

Вот дополнительный код:

struct Color {
double r;
double g;
double b;
Color(double r, double g, double b) : r(r), g(g), b(b) {}
Color() {}
};

Color green(0, 1024, 0);
Color greenYellow(512, 1024, 0);
Color yellow(1024, 1024, 0);
Color orange(1024, 200, 0);
Color red(1024, 0, 0);
Color blue(0, 0, 1024);
Color white(1024, 1024, 1024);
Color black(0, 0, 0);
Color currentColor;

AllMeasurements measureAllParameters() {
AllMeasurements allMeasurements;
double PM25[10], PM1[10], PM10[10];
double calculatedMedianPm25[6];
double calculatedMedianPm1[6];
double calculatedMedianPm10[6];
bool measureNow = true;
double bmpTemp[5], dhtTemp[5], humidity[5], bmpPressure[5];
double bmpTempMedian[6], dhtTempMedian[6], humidityMedian[6], pressureMedian[6];
int dhtTempSize = 0;
int humiditySize = 0;
int dhtTempMedianSize = 0;
int humidityMedianSize = 0;
for (int b = 0; b < 6; b++) {
Serial.println("DEBUG: 28");
yield();
int reading = 0;
for (int i = 0; i < 10; i++) {
Serial.println("DEBUG: 29");
yield();
if (measureNow) {
BmpMeasurements bmpMeasurements = getMeasurementsFromBmpSensor();
bmpTemp[reading] = bmpMeasurements.getTemperature();
bmpPressure[reading] = bmpMeasurements.getPressure();
double temp = dht.readTemperature(false);
double hum = dht.readHumidity();
if (!isnan(temp) && !isnan(hum)) {
dhtTemp[dhtTempSize] = temp;
humidity[humiditySize] = hum;
dhtTempSize++;
humiditySize++;
}
reading++;
measureNow = false;
} else {
measureNow = true;
}
Serial.println("DEBUG: 29.0");
ParticulateMatterMeasurements measurements = measurePM();
Serial.println("DEBUG: 29.1");
PM1[i] = measurements.getPM01Value();
Serial.println("DEBUG: 29.2");
PM25[i] = measurements.getPM25Value();
Serial.println("DEBUG: 29.3");
PM10[i] = measurements.getPM10Value();
Serial.println("DEBUG: 29.4");
delay(1000);
Serial.println("DEBUG: 29.5");
}
Serial.println("DEBUG: 29.6");
if (isBMP || isBMP280) {
Serial.println("DEBUG: 29.7");
pressureMedian[b] = median(bmpPressure, 5);
Serial.println("DEBUG: 29.8");
bmpTempMedian[b] = median(bmpTemp, 5);
Serial.println("DEBUG: 29.9");
}
Serial.println("DEBUG: 29.10");
if (dhtTempSize > 0) {
Serial.println("DEBUG: 29.11");
dhtTempMedian[dhtTempMedianSize] = median(dhtTemp, dhtTempSize);
Serial.println("DEBUG: 29.12");
dhtTempMedianSize++;
Serial.println("DEBUG: 29.13");
dhtTempSize = 0;
Serial.println("DEBUG: 29.14");
}
Serial.println("DEBUG: 29.15");
if (humiditySize > 0) {
Serial.println("DEBUG: 29.16");
humidityMedian[humidityMedianSize] = median(humidity, humiditySize);
Serial.println("DEBUG: 29.17");
humidityMedianSize++;
Serial.println("DEBUG: 29.18");
humiditySize = 0;
Serial.println("DEBUG: 29.19");
}
Serial.println("DEBUG: 29.20");
calculatedMedianPm25[b] = median(PM25, 10);
Serial.println("DEBUG: 29.21");
changeLedsColorSmoothlyByPM(calculatedMedianPm25[b]);
Serial.println("DEBUG: 29.22");
calculatedMedianPm1[b] = median(PM1, 10);
Serial.println("DEBUG: 29.23");
calculatedMedianPm10[b] = median(PM10, 10);
Serial.println("DEBUG: 29.24");
}
Serial.println("DEBUG: 30");
if (isBMP || isBMP280) {
allMeasurements.averagePressure = average(pressureMedian, 6);
allMeasurements.averageBmpTemp = average(bmpTempMedian, 6);
}
allMeasurements.averageDhtTemp = average(dhtTempMedian, dhtTempMedianSize);
allMeasurements.averageHumidity = average(humidityMedian, humidityMedianSize);
allMeasurements.averagePm1 = average(calculatedMedianPm1, 6);
allMeasurements.averagePm25 = average(calculatedMedianPm25, 6);
allMeasurements.averagePm10 = average(calculatedMedianPm10, 6);
return allMeasurements;
}

void changeLedsColorSmoothlyByPM(const double pm25) {
Serial.println("DEBUG: Leds.1");
if (pm25 <= 26.6) {
Serial.println("DEBUG: Leds.2");
changeColorSmoothly(currentColor, green, 1000);
Serial.println("DEBUG: Leds.3");
currentColor = green;
Serial.println("DEBUG: Leds.4");
setLedsColorTo(GREEN);
Serial.println("DEBUG: Leds.5");
} else if (pm25 <= 44.24) {
Serial.println("DEBUG: Leds.6");
changeColorSmoothly(currentColor, greenYellow, 1000);
Serial.println("DEBUG: Leds.7");
currentColor = greenYellow;
Serial.println("DEBUG: Leds.8");
} else if (pm25 <= 73.63) {
Serial.println("DEBUG: Leds.9");
changeColorSmoothly(currentColor, yellow, 1000);
Serial.println("DEBUG: Leds.10");
currentColor = yellow;
Serial.println("DEBUG: Leds.11");
} else if (pm25 <= 138.29) {
Serial.println("DEBUG: Leds.12");
changeColorSmoothly(currentColor, orange, 1000);
Serial.println("DEBUG: Leds.13");
currentColor = orange;
Serial.println("DEBUG: Leds.14");
} else if (pm25 > 138.29) {
Serial.println("DEBUG: Leds.15");
changeColorSmoothly(currentColor, red, 1000);
Serial.println("DEBUG: Leds.16");
currentColor = red;
Serial.println("DEBUG: Leds.17");
setLedsColorTo(RED);
Serial.println("DEBUG: Leds.18");
}
Serial.println("DEBUG: Leds.19");
}

void changeColorSmoothly(Color oldColor, Color newColor, int timeInMillis) {
Serial.println("DEBUG: change.1");
Color currentColor;
currentColor = oldColor;
for (int i=0; i<timeInMillis; i++) {
currentColor.r += (newColor.r-oldColor.r)/timeInMillis;
currentColor.g += (newColor.g-oldColor.g)/timeInMillis;
currentColor.b += (newColor.b-oldColor.b)/timeInMillis;
analogWrite(4, (int) currentColor.r);
analogWrite(2, (int) currentColor.g);
analogWrite(15, (int) currentColor.b);
delay(1);
}
Serial.println("DEBUG: change.2");
}

Последнее, что я вижу на терминале, это DEBUG: change.1, Итак, ESP8266 висит внутри changeColorSmoothly метод. Есть идеи, почему он там висит?

@ edit4

Ой, я превышаю предел значения в analogWrite()? Может ли это быть проблемой?

@ edit5

Я обновил устройства новой прошивкой, но некоторые из них зависают.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector