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

Нагрев NodeMCU и SDK

Noperkon

New member
Заметил что программы выполняющие одинаковые функции (простой блинк) написанные для NodeMCU и SDK вызывают разный нагрев контроллера (esp8266). Если сишная программа греет весьма заметно, то программа на Lua оставляет устройство практически холодным.
Соответственно вопрос - с чем это связано?
Если уже было то звиняйте, сильно не пинайте, просто ткните пальцем.
 

Юрий Ботов

Moderator
Команда форума
А вы в SDK задержку делаете большим циклом? Если да то вот он и нагрев.
 

Noperkon

New member
Кое-что стало прояснятся, но появились новые вопросы.
Нагрев под SDK удалось побороть вставив в loop небольшой delay. В простое все отлично - контроллер абсолютно холодный, но ведь под нагрузкой (к примеру будет отдавать в сеть большой файл) эта задержка будет как палка в колесах. Как бы так сделать чтобы и волки сыты были и овцы целы?
 

Noperkon

New member
Код:
#include <ESP8266WiFi.h>
#include <Ticker.h>
Ticker blinker;

#define LED_PIN 2  //On board LED
#define HALF_PERIOD 500
#define WIFI_SSID "********"
#define WIFI_PSWD "********"

void changeState() {
    digitalWrite ( LED_PIN, ! ( digitalRead ( LED_PIN ) ) );
}

void setup() {
    WiFi.mode ( WIFI_STA );
    WiFi.begin ( WIFI_SSID, WIFI_PSWD );
    Serial.begin ( 115200 );
    Serial.println();
    pinMode ( LED_PIN, OUTPUT );
    blinker.attach_ms ( HALF_PERIOD, changeState );
}

void loop() {
    delay ( 50 );  // Если убрать начинает греться.
}
Обнаружились еще непонятности. Если в сетапе ничего не упоминать про WIFI то греется независимо от задержки в основном цикле. Если же модем отправить в спячку то нагрева нет при любом раскладе.
 

Noperkon

New member
Так греется -
Код:
#include <ESP8266WiFi.h>

void setup() {
    WiFi.mode ( WIFI_STA );
    WiFi.begin ( "********", "********" );
}

void loop() {
}
Так нет-
Код:
#include <ESP8266WiFi.h>

void setup() {
    WiFi.mode ( WIFI_STA );
    WiFi.begin ( "********", "********" );
}

void loop() {
    delay ( 50 );
}
Нагрев не то чтобы критический, градусов 40, но хотелось бы обойтись без него.
 

enjoynering

Well-known member
я так понял вы пишите в arduino framework for ESP8266 который основан на SDK? похоже косяк разрабов.
заметили как аксакалы притихли:). так же было когда народ на глючный драйвер I2C под arduino framework жаловался - тишина и игнор.


а если с delay(1), меньше греется?
 

Noperkon

New member
Похоже с WiFi я немного погорячился. Сейчас еще немного поэкспериментировал, и независимо от состояния модема - если в лупе есть задержка (в том числе 1) - нет нагрева, нет задержки - есть нагрев.

Код:
cat ./package.json
{
    "name": "framework-arduinoespressif8266",
    "description": "Arduino Wiring-based Framework (ESP8266 Core)",
    "url": "https://github.com/esp8266/Arduino",
    "version": "2.5.0-dev"
}
 

enjoynering

Well-known member
а если в setup убрать все и заменить на это
Код:
WiFi.persistent(false);  //disable saving wifi config into SDK flash area
WiFi.forceSleepBegin();  //disable AP & station by calling "WiFi.mode(WIFI_OFF)" & put modem to sleep
и в loop оставить пустым. нагрев есть?
 

enjoynering

Well-known member
тогда это на 99.9% не wifi радио, тк команда forceSleepBegin() загоняет его в сон.
похоже delay(1) каким-то магическим образом притормаживает 80МГц-овый процессор так хорошо, что он начинает потреблять меньше. еще бы токи промерять.

чисто из любопыства, а

Код:
delayMicroseconds(1);
так-же уменьшает нагрев?
 

Сергей_Ф

Moderator
Команда форума
@enjoynering не радио, а реализация внутри ардуино. Надо смотреть исходники, но сдается там не ошибка, а "особенность реализации".
 

Noperkon

New member
Значит так.
delayMicroseconds со значениями 1,100,1000 - греется
delay(0) - греется
delay(1) - не греется
 

enjoynering

Well-known member
однако.

а если в loop в место delay(1) поместить пустой for

Код:
for (int i = 0; x < 10; i++)
{
  //empty
}
будет греться?
 

enjoynering

Well-known member
прикольно. вот это баг фича. теперь осталось понять будет ли уменьшение потребления с delay и for

Код:
#include <ESP8266WiFi.h>

void setup()
{
    WiFi.mode( WIFI_STA );
    WiFi.begin( "********", "********" );
}

void loop()
{
    delay(1);
    for (int i = 0; x < 10; i++)
    {
        //empty
    }
}
если не будет, то я вас поздравлю с открытием новой пасхалки от китайцев. а люди на них управление газовыми котлами делает - вот где безумие и отвага.
 
Сверху Снизу