Esp-01 не могу загрузить sketch

Несколько дней мучаюсь, но безрезультатно. Есть модуль esp-01 (пробовал с прошивкой esp-link v2.2.3, сейчас вернул на AT version:0.40.0.0) и Arduino UNO.
Мне надо его подключить к моей сети и отправить данные в интернет (в дальнейшем будет отправка команды в телеграм чат через бота, но до этого мне еще как до луны). Написал самый простой скетч:

#include <ESP8266WiFi.h>

const char* ssid = "Ma*****tor";
const char* password = "26*****71";

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("");
  Serial.println("WiFi connected!");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
void loop() {
  // ... ваш код ...
}

Но он никак не заливается… Долго пытается его залить, но в итоге:
esptool.py v3.0
Serial port COM3
Connecting……_____
A fatal esptool.py error occurred: Failed to connect to ESP8266: Timed out waiting for packet header

Сам модуль на АТ команды отвечает. При прошивке esp-link через web к моей сети я его подключаю, но никакой скетч залить не могу :frowning:

Помогите, что я делаю не так? :((((

а) не правильно указан СОМ порт;
б) СОМ порт занят чем-то другим;
в) неисправен кабель;
г) модуль не был переведен в режим программирования перед прошивкой.

А/в /г - вроде мимо. Ибо

Попробуй менять способ загрузки QIO DIO.

Com свободен (в ардуиномонитор с ним общаюсь через АТ), может я неправильно отправляю скетч? И на самом деле у меня он компилируется минуты полторы… Хотя это i7\8gb\ssd… попробую на другом компе еще.

В какой момент надо отправлять esp-01 в режим программирования? Я же правильно понимаю, что он должен быть подключен в ардуино? Или в TTL??

Делаю так. Отправляю скетч, перед окончанием компилирования модуль кидаю в ресет (через землю) и в режим программирования (также)…

P.S. Смена режимов на QIO DIO и все остальые не помогла. После ресета (когда стоит в ардуино) монитор показывает:
2nd boot version : 1.4(b1)
SPI Speed : 40MHz
SPI Mode : DIO
SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000.

Кстати, в мониторе на 115200 после ресета последней строчкой пишет:
Ai-Thinker Technology Co.,Ltd.

invalid

Закрой монитор перед прошивкой.

Одно с другим не согласуется - если общаетесь через монитор порта, значит порт занят

Закрыл, ничего не поменялось. Может я неправильно что-то изначально делаю?
Я просто скетч отпраляю. Вот тут видео как я делаю. После компиляции немного жду, потом делаю ресет esp-01, вгоняю в режим программирование. Эти же действия пробовал в разном порядке (например, включить саму ардуинку, где esp в режиме программирования и т.п.)…

arduino.mp4 — Яндекс Диск вот тут видео записи экрана

Не надо ничего ждать - переводите esp в режим программирования, а потом нажимаете на заливку скетча. Попробуйте перезапустить IDE, а потом, не запуская монитор порта, залить прошивку

Вот в таком виде подключаю, верно?..

Ещё раз акцентирую

Если выложите скрин настроек ESP и программатора, может кто чего заметит.
И сделайте нормальное согласование и нормальное питание для модуля.

Я также недавно мучился 4 дня с этим модулем ESP8266 ESP-01 :grinning: Точно с такой же ошибкой… Какие схемы подключения только не пробовал, с резисторами, без них, пины местами менял… Но в итоге победил ) В общем: у Arduino логика 5 вольт, у модуля ESP 3,3 вольт. Поэтому нужно якобы с помощью резисторов 5 вольтовую логику ардуины преобразовать в 3.3 вольтовую с поомщью резисторов - но у меня это не получилось. Можно подключить специальный преобразователь на 3,3 вольта - их куча продаются. В общем этот модуль ESP очень привередлив по питанию. Я вспомнил, что у меня есть программатор YP-05 - на нем есть перемычка на 3,3 либо 5 вольт. Подключил модуль ESP к ней и все заработало. Чтобы заливать скетч на модуль, его нужно перевести в режим программирования - перед тем как подать питание на модуль контакт GPIO0 должен быть соединен с землей GND на пару секунд.

Для удобства перевода в режим программирования на макетную плату подключил две кнопки - одна для перезагрузки модуля (при нажатии замыкает RST на GND). Вторая кнопка для перевода в режим программирования (при нажатии замыкает GPIO0 на GND). В итоге когда нужно перейти в режим программирования зажимаю кнопку RESET и после нее зажимаю GPIO0, отпускаю RESET, через 1-2 секунды отпускаю GPIO0 - Готово!

Рабочая схема

схема? где?

Видео - процесс заливки скетча в модуль ESP8266 ESP-01 через программатор YP-05.
https://disk.yandex.ru/i/g7IBaCWnKYCirg

Мой скетч - управление светодиодом через WIFI. Самое важное - модуль ESP8266 умеет работать только с сетями 2,4ГГц.
Суть скетча: после включения модуля ESP, он подключается к вашей WiFi сети (в скетче обязательно вписать свой ssid - имя своей wifi сети, password - пароль). Откройте монитор порта в приложении Arduino IDE, выставьте скорость внизу 115200 baud. А так же Both NL & CR. Увидите информацию о подключении модуля ESP к сети wifi - высветится локальный IP адрес модуля (любое устройство - будь то телефон, ноутбук, телевизор, когда подключается к вашему роутеру - ему присваивается рандомный локальный ip адрес. Если что, в настройках роутера всегда можно для любого устройства назначить, чтобы адрес был статичным - т.е. всегда выдавался один и тот же).
Теперь, когда мы знаем локальный ip-адрес нашего модуля ESP (например, 192.168.0.16), мы вбиваем в любом браузере ноутбука или телефона этот ip адрес (важно: ноутбук или телефон должен быть подключен к этой же wifi сети - тем самым мы находимся в той же локальной сети, что и наш модуль и можем теперь к нему обратиться по ip адресу) и попадаем на веб-страницу, которую вшили в наш модуль. Страница простенькая - в ней только кнопка, при нажатии на которую, мы теперь можем управлять светодиодом, который нужно подключить к контакту GPIO2 на модуле (GPIO2 → GND). В скетче это const int ledPin = 2.
Еще важное замечание: GPIO2 не должен быть замкнут на землю во время включения или перезагрузки модуля. Как и GPIO0. Похоже, этот пин тоже вводит модуль в какой-то режим при включении - точно не помню. Поэтому при включении модуля с этим скетчем, сначала отсоединяю светодиод и подключаю обратно после включения модуля. Такое небольшое неудобство - связано с тем, что на ESP мало выводов для управления сторонними устройствами.

Видео - работа скетча со светодиодом:
https://disk.yandex.ru/i/8V_itNm4-6FhdA

Сам скетч:

/**
   LedAir.ino

    Author: Denis Ken
    Created on: 18.02.2024

    Управление светодиодом по WiFI в локальной сети с помощью модуля ESP8266 ESP-01.
    Светодиод подключить на пин GPIO2 через резистор
    В ssid/password вбить данные своей вайфай сети, к которой подключится модуль (поддерживает только сети 2.4Ггц)
    После включения/ресета модуля, посмотреть в порте монитора локальный ip-адрес модуля, который ему выдал роутер
    Зайти с любого устрйства на этот ip, появится страница с кнопкой для управления светодиодом (светодиод нужно отсоединить перед включением/ресетом модуля)
*/

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

const char* ssid = "YourSSID"; // название вашей WiFi сети, которую раздает роутер
const char* password = "YourPASSWORD"; // пароль от вашей WiFi сети

const int ledPin = 2; // номер пина, на котором подключен светодиод - GPIO2

ESP8266WebServer server(80);

bool ledState = false;

const char html[] PROGMEM = R"(
  <!DOCTYPE html>
  <html lang='ru'>
    <head>
      <meta charset='UTF-8'>
      <meta name='viewport' content='width=device-width, initial-scale=1.0'>
      <title>LED Air</title>
      <link rel='stylesheet' href='style.css'>
    </head>
    <body>
      <div class='container'>
        <button id='button' class='button' onclick='toggleLed()'>Включить</button>
      </div>
      <script src='script.js'></script>
    </body>
  </html>
)";

const char script[] PROGMEM = R"(
/* script.js */
  function toggleLed() {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
      if (xhr.readyState === XMLHttpRequest.DONE) {
        if (xhr.status === 200) {
          if (xhr.responseText === 'led_on') {
            document.getElementById('button').textContent = 'Выключить';
          } else {
            document.getElementById('button').textContent = 'Включить';
          }
        } else {
          console.error('Произошла ошибка: ' + xhr.status);
        }
      }
    }
    xhr.open('GET', '/toggle', true);
    xhr.send();
  }
)";

const char style[] PROGMEM = R"(
/* style.css */

  html {
    box-sizing: border-box;
  }
  
  *,
  *::before,
  *::after {
    box-sizing: inherit;
  }
  
  h1, h2, h3, h4, h5, h6 {
    margin: 0;
  }
  
  p {
    margin: 0;
  }
  
  img {
    max-width: 100%;
  }
  
  button {
    padding: 0;
    border: none;
    background-color: transparent;
    overflow: visible;
    cursor: pointer;
  }
  
  html {
    height: 100%;
  }
  
  body {
    height: 100%;
    margin: 0;
  }
  
  .container {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    background-color: #426564;
  }
  
  .button {
    padding: 15px 20px;
    background-color: #2ba4a1;
    font-size: 18px;
    text-transform: uppercase;
    border-radius: 5px;
    color: #fff;
  }
  
  .button:hover {
    opacity: .8;
  }
)";

void handleRoot() {
  server.send(200, "text/html", html);
}

void handleCSS() {
  server.send(200, "text/css", style);
}

void handleJS() {
  server.send(200, "application/javascript", script);
}

void handleToggle() {
  ledState = !ledState;
  digitalWrite(ledPin, ledState ? HIGH : LOW);
  server.send(200, "text/plain", ledState ? "led_on" : "led_off");
}

void setup() {
  Serial.begin(115200);
  delay(10);

  digitalWrite(ledPin, LOW);
  pinMode(ledPin, OUTPUT);

  Serial.println();
  Serial.println();
  Serial.println("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // обработчик для корневого URL
  server.on("/", handleRoot);
  //обработчик для URL
  server.on("/toggle", handleToggle);
  server.on("/style.css", handleCSS);
  server.on("/script.js", handleJS);

  // запуск HTTP сервера
  server.begin();
}

void loop() {
  // обработка HTTP запросов
  server.handleClient();
}

Также написал небольшое десктопное приложение на ноут: сокет-сервер на языке ActionScript 3.0 для платформы Adobe AIR. А также скетч для ESP8266 ESP-01: сокет-клиент. Такой скетч можно залить на несколько разных модулей ESP.

В итоге имеем программу на компе (сервер), к которому могут в любой момент подключаться множество esp-модулей (клиенты).

К ESP модулю подключена кнопка. При нажатии на нее увеличивается счетчик на единицу, эти данные отправляются в приложение-сервер и он их отображает на экране. :slightly_smiling_face: :+1:

1 лайк