From 9cbf5f0b388742c6404da211b77bda196c0fbdb0 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Mon, 17 Feb 2025 20:49:33 +0300 Subject: [PATCH] upd AnalogADC, fix asyncWiFi UDP --- src/Main.cpp | 17 +++++ src/modules/sensors/AnalogAdc/AnalogAdc.cpp | 80 +++++++++++++-------- 2 files changed, 69 insertions(+), 28 deletions(-) diff --git a/src/Main.cpp b/src/Main.cpp index e95706dc..91102283 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -236,12 +236,15 @@ void setup() { // инициализация задач переодического выполнения periodicTasksInit(); +#if defined(ESP8266) + // Перенесли после получения IP, так как теперь работа WiFi асинхронная // запуск работы udp addThisDeviceToList(); #ifdef UDP_ENABLED udpListningInit(); udpBroadcastInit(); #endif +#endif // создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке createItemFromNet("onStart", "1", 1); @@ -302,6 +305,20 @@ void setup() { } void loop() { +#if !defined(ESP8266) + static bool udpFirstFlag = true; + // Перенесли после получения IP, так как теперь работа WiFi асинхронная + if (isNetworkActive() && udpFirstFlag) { + udpFirstFlag = false; + // запуск работы udp + addThisDeviceToList(); + #ifdef UDP_ENABLED + udpListningInit(); + udpBroadcastInit(); + #endif + } +#endif + #ifdef LOOP_DEBUG unsigned long st = millis(); #endif diff --git a/src/modules/sensors/AnalogAdc/AnalogAdc.cpp b/src/modules/sensors/AnalogAdc/AnalogAdc.cpp index 564dd2eb..1df0f770 100644 --- a/src/modules/sensors/AnalogAdc/AnalogAdc.cpp +++ b/src/modules/sensors/AnalogAdc/AnalogAdc.cpp @@ -7,33 +7,41 @@ extern IoTGpio IoTgpio; // для добавления сенсора вам нужно скопировать этот файл и заменить в нем текст AnalogAdc на название вашего сенсора // Название должно быть уникальным, коротким и отражать суть сенсора. -//ребенок - родитель -class AnalogAdc : public IoTItem { - private: +// ребенок - родитель +class AnalogAdc : public IoTItem +{ +private: //======================================================================================================= // Секция переменных. // Это секция где Вы можете объявлять переменные и объекты arduino библиотек, что бы // впоследствии использовать их в loop и setup unsigned int _pin; - unsigned int _avgSteps, _avgCount; - unsigned long _avgSumm; - float adCresult = 0; + unsigned int _avgSteps; + unsigned int realSteps; + float _adcAverage = 0; + unsigned int _period = 0; + unsigned long _lastSoundingMillis = 0; - public: +public: //======================================================================================================= // setup() // это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора. // Такие как ...begin и подставлять в них параметры полученные из web интерфейса. // Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции: // jsonReadStr, jsonReadBool, jsonReadInt - AnalogAdc(String parameters) : IoTItem(parameters) { + AnalogAdc(String parameters) : IoTItem(parameters) + { _pin = jsonReadInt(parameters, "pin"); _avgSteps = jsonReadInt(parameters, "avgSteps"); - if (!_avgSteps) { + if (!_avgSteps) + { jsonRead(parameters, F("int"), _interval, false); } - _avgSumm = 0; - _avgCount = 0; + else + { + _period = _interval / _avgSteps; + } + // Serial.println("_period = " + String(_period)); } //======================================================================================================= @@ -44,10 +52,19 @@ class AnalogAdc : public IoTItem { // если у сенсора несколько величин то делайте несколько regEvent // не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции // и выполнить за несколько тактов - void doByInterval() { - if (_avgSteps <= 1) value.valD = IoTgpio.analogRead(_pin); - else value.valD = adCresult;/// - regEvent(value.valD, "AnalogAdc"); //обязательный вызов хотяб один + void doByInterval() + { + if (_avgSteps <= 1) + value.valD = IoTgpio.analogRead(_pin); + else + { + value.valD = _adcAverage / (float)realSteps; + //Serial.print("value= " + String(value.valD) + " \t"); + //Serial.print("adcAverage = " + String(_adcAverage) + " \t"); + //Serial.println("realSteps = " + String(realSteps)); + realSteps = 0; + } + regEvent(value.valD, "AnalogAdc"); // обязательный вызов хотяб один } //======================================================================================================= @@ -55,17 +72,20 @@ class AnalogAdc : public IoTItem { // полный аналог loop() из arduino. Нужно помнить, что все модули имеют равный поочередный доступ к центральному loop(), поэтому, необходимо следить // за задержками в алгоритме и не создавать пауз. Кроме того, данная версия перегружает родительскую, поэтому doByInterval() отключается, если // не повторить механизм расчета интервалов. - void loop() { - if (_avgSteps > 1) { - if (_avgCount > _avgSteps) { - // value.valD = _avgSumm / (_avgSteps + 1); - adCresult = _avgSumm / (_avgSteps + 1); - _avgSumm = 0; - _avgCount = 0; - } + void loop() + { + if (_avgSteps > 1) + { - _avgSumm = _avgSumm + IoTgpio.analogRead(_pin); - _avgCount++; + if (millis() > _lastSoundingMillis + _period) + { + realSteps++; + int sounding = IoTgpio.analogRead(_pin); + _adcAverage = _adcAverage + sounding; // IoTgpio.analogRead(_pin); + _lastSoundingMillis = millis(); + //Serial.print("adc= " + String(sounding) + " \t"); + //Serial.println("_adcAverage = " + String(_adcAverage)); + } } IoTItem::loop(); } @@ -76,10 +96,14 @@ class AnalogAdc : public IoTItem { // после замены названия сенсора, на функцию можно не обращать внимания // если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть // создание и контроль соответствующих глобальных переменных -void* getAPI_AnalogAdc(String subtype, String param) { - if (subtype == F("AnalogAdc")) { +void *getAPI_AnalogAdc(String subtype, String param) +{ + if (subtype == F("AnalogAdc")) + { return new AnalogAdc(param); - } else { + } + else + { return nullptr; } }