• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

PZEM004 V3 и nodemcu v3

MapaT

New member
Проблема: через некий интервал времени (всегда разный), датчик начинает присылать данные NAN (т.е. не может получить показания). Помогает только reset по кнопке или удаленная прошивка с перезапуском (оборудование стоит далеко на производстве)

PZEM004 V3 и nodemcu v3 питаются от блока питания 5v. RX и TX на D5 и D6 через Softwareserial.
Скетч сейчас скинуть не могу, но там самый минимум:
Softwareserial для обмена данными с датчиком
TimerMS для вызова функции получения данных каждые 3 секунды (delay в loop нет)
ESP8266WiFi для wifi подключения
HTTPClient для отправки GET запроса с показаниями датчика
ArduinoOTA для удаленной прошивки.

Все что делает скетч, каждые 3 секунды снимает показания и отправляет GET запрос на сервер с данными.

Не стал поднимать старые темы. явных ответов в инете не нашел. Подскажите, может кто сталкивался с данной проблемой, как решили?
 

MapaT

New member
Подскажите что именно делают эти две строки.
SoftwareSerial pzemSWSerial(PZEM_RX_PIN, PZEM_TX_PIN);
PZEM004Tv30 pzem(pzemSWSerial);

В продолжении темы и тишины в ответ вопрос такой.
Как программно остановить передачу через Serial и можно ли заново инициализировать? Т.Е. идея в том, при возникновении ошибки перезагрузить не модуль, а только передачу по UART
 

CodeNameHawk

Moderator
Команда форума
https://docs.arduino.cc/learn/built-in-libraries/software-serial#softwareserial
PZEM004 V3 и nodemcu v3 питаются от блока питания 5v. RX и TX на D5 и D6 через Softwareserial.
А ничего, что на выводы есп надо подавать лог. уровень 3,3В ?
С чего вы решили, что подвисает сериал,а не сама есп или модуль PZEM004T ?
 

MapaT

New member
https://docs.arduino.cc/learn/built-in-libraries/software-serial#softwareserial

А ничего, что на выводы есп надо подавать лог. уровень 3,3В ?
С чего вы решили, что подвисает сериал,а не сама есп или модуль PZEM004T ?
1. судя по многочисленным обмусоливаниям этой темы в интернете - ничего. Работать может сутки, а может и через полчаса перестать получать данные с PZEM, пока не понимаю с чем связать.
2. ESP продолжает выполнять скетч и данные отправляются. Тоже думал может подвисает PZEM, но после перезагрузки ESP не отключая при этом PZEM работа восстанавливается. Вот и решил попробовать переинициализировать Serial, если такое вообще возможно, и как...?
 

CodeNameHawk

Moderator
Команда форума
судя по многочисленным обмусоливаниям этой темы в интернете - ничего.
Если некоторые делают по дурному, зачем это повторять?
Вы схему модуля смотрели? Попробуйте подать на модуль 3.3 в, от отдельного стабилизатора.
Если надо замените резисторы в модуле и только после этого ищите проблему.
 

MapaT

New member
Если некоторые делают по дурному, зачем это повторять?
Вы схему модуля смотрели? Попробуйте подать на модуль 3.3 в, от отдельного стабилизатора.
Если надо замените резисторы в модуле и только после этого ищите проблему.
Для чистоты эксперимента буду использовать wemos d1 с 5в логическим уровнем, но подозреваю что проблема останется.
Все-таки подскажите как можно переинициализировать UART "на ходу"?
 

svs2007m

Active member
Попробуй поставить что-то типа TASMOTA. Если все заработает значит твой код в топку. Если нет значит по железу засада :) По крайне мере за последние 3 года обсуждения этой темы проблемы остались только у тебя:)
 

CodeNameHawk

Moderator
Команда форума
буду использовать wemos d1 с 5в логическим уровнем
Откуда там лог. 5
Все-таки подскажите как можно переинициализировать UART "на ходу"?
Вручную очистите буфер.
Принятые данные с сериал надо проверять до преобразования.

Сколько остается свободной памяти, когда подвисает есп?
 
Последнее редактирование:

svs2007m

Active member
А если оборудование стоит на производстве ... То есть такая умная книжка ПУЭ. Шаг влево шаг в право или доп. оборудование без лицензионного проекта "расстрел":). А в текущих условиях на Украине в буквальном смысле за терроризм на производстве:)
 

enjoynering

Well-known member
я так понял что автор использует software serial с esp8266 и arduino. Вот мои две копееки.
1. Software serial на esp8266 не умеет высокие скорости, те 115200 не заведётся (максимальные смотри в документации).
2. Перед чтением rx нужно включать прерывания иначе большая часть просто потеряется. Делается это так:

Код:
mySoftSerial.enableRx(true); //вкл. прерывания

//тут читаем инфу с пина rx устройства PZEM004 V3

mySoftSerial.enableRx(false); //вык. прерывания
 

MapaT

New member
я так понял что автор использует software serial с esp8266 и arduino. Вот мои две копееки.
1. Software serial на esp8266 не умеет высокие скорости, те 115200 не заведётся (максимальные смотри в документации).
2. Перед чтением rx нужно включать прерывания иначе большая часть просто потеряется. Делается это так:

Код:
mySoftSerial.enableRx(true); //вкл. прерывания

//тут читаем инфу с пина rx устройства PZEM004 V3

mySoftSerial.enableRx(false); //вык. прерывания
Можно подробнее что за прерывания? Чего большая часть теряется? т.е. для чего это использовать?
 

MapaT

New member
Выкладываю скетч на проверку.

#include <PZEM004Tv30.h>
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <TimerMs.h>

TimerMs tmr(3000, 1, 1);

const char *ssid = "*******";
const char *pass = "*******";

#if defined(ESP32)
#error "Software Serial is not supported on the ESP32"
#endif

#if !defined(PZEM_RX_PIN) && !defined(PZEM_TX_PIN)
#define PZEM_RX_PIN 12
#define PZEM_TX_PIN 14
#endif


SoftwareSerial pzemSWSerial(PZEM_RX_PIN, PZEM_TX_PIN);
PZEM004Tv30 pzem(pzemSWSerial);

void setup() {


WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(50);
}

delay(5000);

Serial.begin(9600);

tmr.setPeriodMode();


ArduinoOTA.setHostname("Ext_3");
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_SPIFFS
type = "filesystem";
}
});

ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) {
Serial.println("Auth Failed");
} else if (error == OTA_BEGIN_ERROR) {
Serial.println("Begin Failed");
} else if (error == OTA_CONNECT_ERROR) {
Serial.println("Connect Failed");
} else if (error == OTA_RECEIVE_ERROR) {
Serial.println("Receive Failed");
} else if (error == OTA_END_ERROR) {
Serial.println("End Failed");
}
});

ArduinoOTA.begin();
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

}

void loop() {

ArduinoOTA.handle();
HTTPClient http;

if (tmr.tick()){
float current = pzem.current();
float voltage = pzem.voltage();
float energy = pzem.energy();

String address = "http://192.168.1.16/amp_test.php?machine=extruder_3&value=" + String(current) + "&volt=" + String(voltage) + "&energy=" + String(energy);
http.begin(address);
http.GET();
http.end();
}
}
 

MapaT

New member
Откуда там лог. 5

Вручную очистите буфер.
Принятые данные с сериал надо проверять до преобразования.

Сколько остается свободной памяти, когда подвисает есп?
Возможно с логом 5 на wemos d1 (не мини) ошибаюсь.

Тоже если можно конкретнее.
1. Как почистить буфер?
2. Зачем проверять принятые данные?
3. Как посмотреть свободную память?
п.с. есп скорее всего не подвисает, т.к. работа продолжается(связь с есп не теряется). Данные или не обновляются, т.е. значения не меняются или выдает значение NAN.
 
Сверху Снизу