Nodemcu

PavelAndreev

New member
Возник вчера один казус при установке датчика ds18b20, который припаян к плате NodeMCU V3, в следвие этого казуса возник вопрос: Насколько мощный приёмник WiFi сети стоит в плате?

Датчик размещён на метровом кронштейне на стене возле рамы лоджии. Путь сигнала проходит через эту раму, затем 2 метра лоджии, затем через балконную дверь, после неё ещё метров 5. Плата спрятана в пластиковый бокс (фото ниже) и закреплена на кронштейне. Вот такой путь сигнал пройти не может и сигнал не доходит. По какой причине это может происходить? Может из-за герметичного бокса?

 

kab

New member
Относительно пути сигнала.
антенна у ESP не остро направленная , поэтому сигнал проходит не только через раму но и через щели и стекло .
Метров 10 через бетонную стену работает без проблем.
Недавно прочитал, что для связи Wi-Fi в обычной средней квартире наибольшую проблему представляют шкафы с большими зеркальными дверками. Зеркальный слой - это слой металла - практически полное препятствие на пути wi-fi :)

ЗЫ. сам не проверял - пересказываю статью...
 

PavelAndreev

New member
Приемник бывает не мощный, а чувствительный.
А мощным бывает передатчик.
У ESP мощность передатчика управляемая, максимальная равна максимально допустимой для данного диапазона без регистрации =100 мвт.
-----------------
Относительно пути сигнала.
антенна у ESP не остро направленная , поэтому сигнал проходит не только через раму но и через щели и стекло .
Метров 10 через бетонную стену работает без проблем.
Если метров 10 через бетонную стену, то почему периодически теряется сигнал на расстоянии 7 метров через 2 окна?

P.S. Плата на улице расположена.
 

kab

New member
Если метров 10 через бетонную стену, то почему периодически теряется сигнал на расстоянии 7 метров через 2 окна?
На этом сайте разбирали похожую проблему. В том случае, по обсуждению всех аспектов, пришли к выводу, что работе wi-fi с балкона мешает антенна станции мобильной связи, расположенной в непосредственной близости от балкона.
 

AndrF

New member
Недавно прочитал, что для связи Wi-Fi в обычной средней квартире наибольшую проблему представляют шкафы с большими зеркальными дверками..
Металлические жалюзи на окнах оказывают сильное влияние - проверено. Из-за них сигналу приходится пробираться через капитальную стену,что сильно снижает его уровнь...
 

gerkimuyda

New member
Может роутер дохлый?
А вообще - возьмите и запустите постоянные пинги и индикатор уровня сигнала, потом с модулем в руках походите по помещению и посмотрите, что и где и как теряется... в конечном итоге дойдя, до места планируемой установки, обследуйте все. Может вам понадобится всего на метр передвинуть и все будет работать (а сейчас модуль от роутера отделяет деревянная рама и силовой кабель на пути сигнала)? Изучите радиообстановку в окружающем пространстве! o_O
 

RealChel

New member
Цикл из 4 простеньких статей. Хоть и 2016 года.
Где я наконец то понял, что такое nodeMCU
Без всяких умных фраз и попыткой разобрать ответы форумчан.
Может уже на это ссылка где то и есть на форуме
Считаю что надо в FAQ вынести
 

kab

New member
Цикл из 4 простеньких статей. Хоть и 2016 года.
Где я наконец то понял, что такое nodeMCU
Без всяких умных фраз и попыткой разобрать ответы форумчан.
Может уже на это ссылка где то и есть на форуме
Считаю что надо в FAQ вынести
Да, бегло посмотрел - цикл статей неплохой. Единственно, по моему опыту (и большинство форумчан - думаю, поддержат) - у Arduino IDE имеются существенные преимущества для работы с ESP8266 (в том числе и с nodeMCU) по сравнению с программированием на LUA. Но, а если кто-то с Lua разобрался и его этот язык устраивает - не имею ничего против...
Но новичку бы не посоветовал.
 

RealChel

New member
Да, бегло посмотрел - цикл статей неплохой. Единственно, по моему опыту (и большинство форумчан - думаю, поддержат) - у Arduino IDE имеются существенные преимущества для работы с ESP8266 (в том числе и с nodeMCU) по сравнению с программированием на LUA. Но, а если кто-то с Lua разобрался и его этот язык устраивает - не имею ничего против...
Но новичку бы не посоветовал.
под ардуино у меня куплен visual micro юзаю его в VS,
а тут собрался метеостанций понаделать, на esp-01 и bme 280 примеры только для Lua
В этой статья сжато и понятно написано(во всяком случае для меня)
Ссылки выложил, может кому пригодиться.
 

dronixon

New member
Всем доброго времени суток Помогите пожалуйста реанимировать NodeMcu V3 Lua WI-FI. Пришла из Китая, первый раз подключил к компу, всё нормально,, светодиод мигал, wi fi наблюдался. Не знаю что пошло не так, но после ошибок компиляции в Arduino IDE и нажатии кнопок Reset и Flash на плате теперь вот такие симптомы. Светодиод не моргает совсем, плата в портах видится USB SERIAL CH340, nodemcu-flasher-master шить не желает. (Тапками не кидайтесь я в теме новечёк)Снимок555.JPG
 
Последнее редактирование:

dronixon

New member
Ребят проблема решена, не качественно видно ноги паял (старался). Пропаял все заново и платка ожила.
 
Доброй ночи, уважаемые пользователи форма. Никак не могу разобраться с проблемой на nodemcu v3. Использую Arduino IDE, в менеджере установлено esp8266 версии 2.4.2 (бетка вообще не приконнектилась к wi-fi + хочу больше стабильности, чего бетка герантирует меньше). Из ESP8266WebServer загружаю пример WebUpdate. Работает, но не выдаёт результат загрузки в браузер ("OK"или "FAIL"). Браузер пишет, что нет доступа (ну, оно и понятно - ни ответа, так сказать...). Пытался дебажить с помощью Serial.print - всё, вроде, должно работать, но не работает. Не понимаю, почему. Может, кто-нибудь знает, что нужно сделать, чтоб исправить это?
Код:
/*
  To upload through terminal you can use: curl -F "image=@firmware.bin" esp8266-webupdate.local/update
*/

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* host = "esp8266-webupdate";
const char* ssid = "my_ssid";
const char* password = "my_pass";

ESP8266WebServer server(80);
const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";

void setup(void) {
  Serial.begin(115200);
  Serial.println();
  Serial.println("Booting Sketch...");
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);
  if (WiFi.waitForConnectResult() == WL_CONNECTED) {
    MDNS.begin(host);
    server.on("/", HTTP_GET, []() {
      server.sendHeader("Connection", "close");
      server.send(200, "text/html", serverIndex);
    });
    server.on("/update", HTTP_POST, []() {
      server.sendHeader("Connection", "close");
      server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK"); //Why are you silent, thing?
      Serial.printf("Rebooting...\n");
      ESP.restart();
    }, []() {
      HTTPUpload& upload = server.upload();
      if (upload.status == UPLOAD_FILE_START) {
        Serial.setDebugOutput(true);
        WiFiUDP::stopAll();
        Serial.printf("Update: %s\n", upload.filename.c_str());
        uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
        if (!Update.begin(maxSketchSpace)) { //start with max available size
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_WRITE) {
        if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_END) {
        if (Update.end(true)) { //true to set the size to the current progress
        } else {
          Update.printError(Serial);
        }
        Serial.setDebugOutput(false);
      }
      yield();
    });
    server.begin();
    MDNS.addService("http", "tcp", 80);

    Serial.printf("Ready! Open http://%s.local in your browser\n", host);
  } else {
    Serial.println("WiFi Failed");
  }
}

void loop(void) {
  server.handleClient();
  delay(1);
}
 

CodeNameHawk

Moderator
Команда форума
Работает, но не выдаёт результат загрузки в браузер ("OK"или "FAIL"). Браузер пишет, что нет доступа (ну, оно и понятно - ни ответа, так сказать...).
Од куда вы знаете, что не выдает, а не просто броузер не показывает?
Хотя бы показали лог. из сериал.
 
Од куда вы знаете, что не выдает, а не просто броузер не показывает?
Хотя бы показали лог. из сериал.
Я захватываю все пакеты в неразборчивом режиме. Среди них всех (за нужный мне период) было только один HTTP - POST для отправки файла на nodemcu (до нажатия на "Update" у меня захват был выключен, захват работал достаточное время, чтоб захватить (если он будет) пакет ответа от nodemcu). HTTP из nodemcu даже не отправляется. Есть зато TCP (но должен быть HTTP), которые тоже не содержат ответа.

Update: sketch_dec23b.ino.nodemcu.bin
sleep disable
Rebooting... <-- В этот момент должен отправиться ответ, но этого не происходит

ets Jan 8 2013,rst cause:2, boot mode:(3,7)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
vbb28d4a3
@cp:0
ld

Booting Sketch...
Ready! Open http://esp8266-webupdate.local in your browser
 

CodeNameHawk

Moderator
Команда форума
Вы очень слабо описываете, что и как делаете.
У вас нет информации на сериал, что файл обновился.

Первый раз заливаю файл прошивки, через сом порт.
После этого есп выдает в сериал:
Код:
 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
vbb28d4a3
@cp:0
ld

Booting Sketch...
Ready! Open http://esp8266-webupdate.local in your browser
Выбрав файл WebUpdate.bin и нажав кнопку Update, выдает :
Код:
Update: WebUpdate.bin
sleep disable
Update Success: 292832
Rebooting...
Попробуйте грузить файл этого скетча. (возможно вы пытаетесь залить файл, которому не хватает места),

Если немного изменить код скетча,
Код:
    server.on("/update", HTTP_POST, [](){
      server.sendHeader("Connection", "close");
      server.sendHeader("Access-Control-Allow-Origin", "*");
      server.send(200, "text/plain", (Update.hasError())?"FAIL":"OK");
      delay(10000);
      ESP.restart();
тогда в браузере успевает отразиться результат.

result.png
 
Последнее редактирование:
тогда в браузере успевает отразиться результат
Да, видимо проблема была в задержке. Сейчас всё работает хорошо. Спасибо!

Написал код уже для HTTPS сервера. Всё работает.
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServerSecure.h>
#include <ESP8266mDNS.h>
#include <FS.h>

extern const char* serverIndex;
extern const char* serverCert;
extern const char* serverKey;

const char* host PROGMEM = "esp8266-webupdate";
const char *ssid PROGMEM = "my_ssid",
           *password PROGMEM = "ma_password";
        
const char *user_name PROGMEM = "username",
           *user_password PROGMEM = "password";

BearSSL::ESP8266WebServerSecure server(443);


FSInfo fs_info;

File update_file;
bool HashEqualsFirmware(const String chash) {
  MD5Builder md5h;
  md5h.begin();
  uint8_t *fbuff = new uint8_t[512];
  update_file = SPIFFS.open("/frmwupdate/nfw.bin", "r");
  uint16_t readlen = update_file.read(fbuff, 512);
  while(readlen) {
      md5h.add(fbuff, readlen);
      readlen = update_file.read(fbuff, 512);
  }
  update_file.close();
  delete[] fbuff;
  md5h.calculate();
  return chash == md5h.toString();
}

void getHTTPserverIndex(){
  if (!server.authenticate(user_name, user_password))
      return server.requestAuthentication();
  server.sendHeader("Connection", "close");
  server.send(200, "text/html", serverIndex);
}

bool nerrfile; byte callfsinfo;
void uploadUpdateFile(){
  if (!server.authenticate(user_name, user_password))
     return server.requestAuthentication();
  HTTPUpload& upload = server.upload();
  if (upload.status == UPLOAD_FILE_START) {
    if (strcmp(upload.type.c_str(),"application/octet-stream")) nerrfile = false;
    else {
      nerrfile = true;
      callfsinfo = 3;
      SPIFFS.remove("/frmwupdate/nfw.bin");
      update_file = SPIFFS.open("/frmwupdate/nfw.bin", "w");
    }
  } else if (upload.status == UPLOAD_FILE_WRITE && nerrfile) {
    if (callfsinfo) {
      --callfsinfo;
    } else {
      callfsinfo = 3;
      SPIFFS.info(fs_info);
      //8192 == 0x2000; 0xFFFFE000 - mask for the number without 0x1FFF (8191) mask inside
      //fs_info.usedBytes == fs_info.usedBytes & 0xFFFFE000 mean, that 0x1FFF no role in number
      //fs_info.usedBytes & 0x3FFF - get number by mask. If number < 0x2000, then clear it (fs_info.usedBytes & 0xFFFFC000) and add  0x2000 (rounding to greater)
      //If number > 0x2000, then clear it (fs_info.usedBytes & 0xFFFFC000) and add  0x2000*2 (0x4000) (rounding to greater)
      // < 0x2000 mean that free space less, than need to write block 8192 (size of chunk)
      if (fs_info.totalBytes - ((fs_info.usedBytes & 0xFFFFE000) == fs_info.usedBytes ? fs_info.usedBytes : ((fs_info.usedBytes & 0x3FFF) > 0x2000 ? (fs_info.usedBytes & 0xFFFFC000) + 0x4000 : (fs_info.usedBytes & 0xFFFFC000) + 0x2000)) < 0x2000) {
        update_file.close();
        nerrfile = false;
        return;
      }
    }
    update_file.write(upload.buf, upload.currentSize);
  } else if (upload.status == UPLOAD_FILE_END && nerrfile) {
     update_file.close();
  }
  yield();
}

void uploadUpdateFileEnd(){
  if (!server.authenticate(user_name, user_password))
     return server.requestAuthentication();
  server.sendHeader("Connection", "close");
  if (nerrfile) {
   if (HashEqualsFirmware(server.arg(String("md5")))) {
      WiFiUDP::stopAll();
      uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
      if (!Update.begin(maxSketchSpace)) { //start with max available size
          server.send(200, "text/plain", "File uploaded successfully!\nError on begining of writing firmware!");
          return;
      }
      uint8_t *fbuff = new uint8_t[512];
      update_file = SPIFFS.open("/frmwupdate/nfw.bin", "r");
      uint16_t readlen = update_file.read(fbuff, 512);
      while(readlen) {
         if (Update.write(fbuff, readlen) != readlen) {
             server.send(200, "text/plain", "File uploaded successfully!\nError in firmware writing process!");
            return;
         }
         readlen = update_file.read(fbuff, 512);
      }
      update_file.close();
      delete[] fbuff;
      if (!Update.end(true)) { //true to set the size to the current progress
          server.send(200, "text/plain", "File uploaded successfully!\nError on ending of writing firmware!");
          return;
      }
      server.send(200, "text/plain", "File uploaded successfully!\nFirmware written successfully!\nRebooting after 1 second...");
      delay(1000);
      ESP.restart();
    } else {
      server.send(412, "text/plain", "File is damaged or invalid hash!");
    }
  } else server.send(415, "text/plain", "Wrong file type of size!");
}

void setup(void) {
  Serial.begin(115200);
  Serial.println("Booting Sketch...");
 
  SPIFFS.begin();
 
  Dir dir = SPIFFS.openDir("/");
  while (dir.next()) {
    Serial.print(dir.fileName());
    if(dir.fileSize()) {
        File f = dir.openFile("r");
        Serial.printf(" %d bytes",f.size());
    }
    Serial.println("");
  }
  WiFi.mode(WIFI_AP_STA);
 
  WiFi.begin(ssid, password);
  while(WiFi.waitForConnectResult() != WL_CONNECTED){
    Serial.println("WiFi failed, retrying.");
    delay(1000);
    WiFi.begin(ssid, password);
  }
 
  configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov");
 
  MDNS.begin(host);
  server.setRSACert(new BearSSLX509List(serverCert), new BearSSLPrivateKey(serverKey));
  server.on("/", HTTP_GET, getHTTPserverIndex);
  server.on("/updatefirmware", HTTP_POST, uploadUpdateFileEnd, uploadUpdateFile);
  server.begin();
  MDNS.addService("https", "tcp", 443);
  Serial.printf("Open https://%s.local", host);
}

void loop(void) {
  server.handleClient();
  delay(1);
}
Код:
const char* serverIndex PROGMEM = "<!DOCTYPE html><html><head><title>Firmware upgrade</title><style>html,body{height:100%;margin:0;}body{display:flex;justify-content:center;align-items:center;text-align:center;}div{background-color:lightblue;border:2px ridge gray;margin:4px;}h2{margin-block-start:0px;margin-block-end:0px;margin:inherit;}form,input{margin:inherit;}}</style></head><body><div><h2>Firmware upgrade</h2><form method='POST'action='/updatefirmware'enctype='multipart/form-data'><input type='file'name='update'accept='application/octet-stream'><br>Enter MD5 of bin:<input type='text'name='md5' ><br><input type='submit'value='Update'></form></div></body></html>";

const char* serverCert PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
paste certificate
-----END CERTIFICATE-----
)EOF";

const char* serverKey PROGMEM =  R"EOF(
-----BEGIN PRIVATE KEY-----
paste key
-----END PRIVATE KEY-----
)EOF";
 
Последнее редактирование:
Сверху Снизу