ESP8266 - Sonoff POW - Чтение HLW8012 - PullRequest
0 голосов
/ 05 мая 2018

Я использую эту библиотеку (https://github.com/SensorsIot/Sonoff-POW), и она работает очень хорошо, однако время от времени я получаю исключение, и sonoff перезагружается.

Я реализовал простой эскиз, который считывает значения мощности и отправляет их с помощью веб-клиента. Части веб-клиента прекрасно работают без кода POWER, поэтому я предполагаю, что это может быть связано с прерыванием из библиотеки POWER

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

подключение к xxxxx.xxx.me

Exception 0: Illegal instruction
Decoding 29 results
0x402034f4: ESP8266PowerClass::measureVoltageFreq() at C:\Users\Sergio\Documents\SERGIO\libraries\Sonoff_POW-master/power.cpp line 294
0x40107018: interrupt_handler at C:\Users\Sergio\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_wiring_digital.c line 119
0x4010177d: ppEnqueueRxq at ?? line ?
0x40101433: ppProcessTxQ at ?? line ?
0x40106fe0: interrupt_handler at C:\Users\Sergio\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_wiring_digital.c line 113
0x40103d19: lmacProcessTXStartData at ?? line ?
0x4010707c: interrupt_handler at C:\Users\Sergio\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_wiring_digital.c line 135
0x401055c1: ets_timer_disarm at ?? line ?
0x40106fe0: interrupt_handler at C:\Users\Sergio\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_wiring_digital.c line 113
0x4020954c: pm_get_sleep_type at ?? line ?
0x40105b26: spi_flash_read at ?? line ?
0x401074b8: pvPortZalloc at C:\Users\Sergio\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/heap.c line 33
0x4020901d: pm_set_sleep_time at ?? line ?
0x402094b2: pm_get_sleep_type at ?? line ?
0x4020955f: pm_get_sleep_type at ?? line ?
0x4021ac3d: ets_timer_handler_isr at ?? line ?
0x4021ac82: ets_timer_handler_isr at ?? line ?

Перезагрузка всегда происходит в этом коде:

Serial.print("connecting to ");
  Serial.print(host);

  // Use WiFiClient class to create TCP connections
   WiFiClient client;
  // const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("....connection failed");
    return;
  }
  Serial.println("....connected!");

Сразу после того, как я вижу печать в последовательном порту сообщения «соединение с хостом», но я не получаю печать «подключен».

Есть ли вероятность, что библиотека что-то делает во время "client.connect", что вызывает исключение:

Причины исключений (EXCCAUSE) EXCCAUSE Код Причина Имя Причина Описание Обязательный параметр EXCVADDR Loaded

0 IllegalInstructionCause Недопустимая инструкция Исключение №

Я не ожидаю просмотреть всю библиотеку, но, может быть, некоторые указания о том, почему это может происходить. возможно я могу отсоединить прерывания во время запроса клиента? Может быть, реализовать некоторый код, чтобы остановить этот таймер, а затем вызвать его снова? (я не знаю, как это сделать)

извлечено из библиотеки:

void ESP8266PowerClass::startMeasure(void)
{
    os_timer_setfn(&myTimer, (os_timer_func_t *)&ESP8266PowerClass::timerCallback, NULL);
    os_timer_arm(&myTimer, 1, true);  // every ms
}

спасибо за помощь

...