Какой модуль Wi-Fi может размещать собственный веб-интерфейс и выступать в качестве станции и точки доступа?

Я новичок в Arduino. Я ищу модуль Wi-Fi, который может выступать в качестве станции и точки доступа. Он должен иметь внешнюю антенну.

Мне нужно загрузить сценарий, который запускает веб-сервер, чтобы я мог разместить свой собственный пользовательский интерфейс, в котором пользователь сможет вводить свои учетные данные WLAN. После установки учетных данных он должен попытаться подключиться к этой WLAN, как в примере сценария ниже, из видео на YouTube.

Я пробовал ESP8266, но при загрузке моего сценария прошивка также была перезаписана.

Кто-то предложил «Wemos D1 mini», но у него нет большой антенны, а тот, который я нашел с антенной на Amazon, действительно имеет плохие отзывы.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
ESP8266WebServer server(80);

struct settings {
  char ssid[30];
  char password[30];
} user_wifi = {};

void setup() {
  EEPROM.begin(sizeof(struct settings) );
  EEPROM.get(0, user_wifi);
  WiFi.mode(WIFI_STA);
  WiFi.begin(user_wifi.ssid, user_wifi.password);
  byte tries = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    if (tries++ > 30) {
      WiFi.mode(WIFI_AP);
      WiFi.softAP("Setup Portal", "mrdiy.ca");
      break;
    }
  }
  server.on("/", handlePortal);
  server.begin();
}

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

void handlePortal() {
  if (server.method() == HTTP_POST) {
    strncpy(user_wifi.ssid, server.arg("ssid").c_str(), sizeof(user_wifi.ssid));
    strncpy(user_wifi.password, server.arg("password").c_str(), sizeof(user_wifi.password));
    user_wifi.ssid[server.arg("ssid").length()] = user_wifi.password[server.arg("password").length()] = '\0';
    EEPROM.put(0, user_wifi);
    EEPROM.commit();
    server.send(200, "text/html", "<!doctype html><html lang='en'><head><meta charset='utf-8'><meta name='viewport' content='width=device-width, initial-scale=1'><title>Wifi Setup</title><style>*,::after,::before{box-sizing:border-box;}body{margin:0;font-family:'Segoe UI',Roboto,'Helvetica Neue',Arial,'Noto Sans','Liberation Sans';font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#f5f5f5;}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);border:1px solid #ced4da;}button{border:1px solid transparent;color:#fff;background-color:#007bff;border-color:#007bff;padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem;width:100%}.form-signin{width:100%;max-width:400px;padding:15px;margin:auto;}h1,p{text-align: center}</style> </head> <body><main class='form-signin'> <h1>Wifi Setup</h1> <br/> <p>Your settings have been saved successfully!<br />Please restart the device.</p></main></body></html>" );
  } else {
    server.send(200, "text/html", "<!doctype html><html lang='en'><head><meta charset='utf-8'><meta name='viewport' content='width=device-width, initial-scale=1'><title>Wifi Setup</title> <style>*,::after,::before{box-sizing:border-box;}body{margin:0;font-family:'Segoe UI',Roboto,'Helvetica Neue',Arial,'Noto Sans','Liberation Sans';font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#f5f5f5;}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);border:1px solid #ced4da;}button{cursor: pointer;border:1px solid transparent;color:#fff;background-color:#007bff;border-color:#007bff;padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem;width:100%}.form-signin{width:100%;max-width:400px;padding:15px;margin:auto;}h1{text-align: center}</style> </head> <body><main class='form-signin'> <form action='/' method='post'> <h1 class=''>Wifi Setup</h1><br/><div class='form-floating'><label>SSID</label><input type='text' class='form-control' name='ssid'> </div><div class='form-floating'><br/><label>Password</label><input type='password' class='form-control' name='password'></div><br/><br/><button type='submit'>Save</button><p style='text-align: right'><a href='https://www.mrdiy.ca' style='color: #32C5FF'>mrdiy.ca</a></p></form></main> </body></html>" );
  }
}

, 👍-2

Обсуждение

почему перезаписанная прошивка является проблемой? зачем тебе большая антенна?, @Juraj

1. Если перепрошить, то у меня аппарат не реагирует на АТ команды и вообще не работает вайфай. 2. Чтобы иметь возможность передавать и получать данные на большее расстояние, не менее 20 метров., @Black

Неработающий Wi-Fi не связан с прошивкой. но это отдельный вопрос., @Juraj

Спасибо, тогда я задам еще один вопрос., @Black

О плохих отзывах: Многие жалуются на необходимость отпаивать SMD резистор сопротивлением 0 Ом для использования внешней антенны. Возможно, вы сможете найти аналогичный комплект более высокого качества и без демонтажа у более авторитетного продавца. Судя по всему, вы находитесь в Германии, возможно, в Райхельте или Конраде, или в другом месте. Я не искал у них такой комплект, но качество на Amazon часто такое же, как при покупке клонов напрямую из Китая через AliExpress или аналогичный сайт., @chrisl

@chrisl, да, и не только это, они также заменили диод на резистор сопротивлением 0 Ом, который может вывести из строя USB-разъем вашего компьютера. Я также убедился в том, что Amazon все больше и больше становится похожим на желание. Продавцы также покупают 5-звездочные отзывы, пытаясь подкупить пользователей деньгами/подарочными картами. Я поищу в другом магазине, спасибо, @Black

20 метров не требует внешней антенны., @Delta_G

@Delta_G ну, очевидно. Это зависит от того, сколько препятствий на пути и как далеко находится маршрутизатор. В моем случае устройство будет помещено в колодец на глубину нескольких метров, поэтому мне понадобится внешняя антенна, которую я могу разместить наверху., @Black

Что вы имеете в виду, зависит от того, как далеко находится маршрутизатор. Вы сказали, что это 20 метров. Вы ничего не упомянули ни о каком колодце., @Delta_G

«загрузка моего скрипта также перезаписала прошивку» ну да... Вы заменяете прошивку, поэтому, очевидно, у вас больше не может быть AT-команд., @dda

@Delta_G, то есть ты автоматически предположил, что препятствий на пути вообще нет, только потому, что я упомянул, что расстояние 20 метров? Это странный вывод., @Black

@dda есть ли способ загрузить скетч без замены прошивки?, @Black

Я думаю, что ты не понимаешь, так это то, что скетч и прошивка - это одно и то же. У вас там только одна программа. Прошивка похожа на предварительно загруженный скетч и реагирует на AT-команды. Вы можете написать программу, которая также будет отвечать на AT-команды или делать любые другие действия, которые вы захотите. Но вы не можете заменить программу на чипе и затем рассчитывать, что сможете ее использовать., @Delta_G

@Black - я ничего не предполагал. Вы не сказали, что есть какие-то препятствия. Глупо просить о помощи в чем-то, а потом скрывать об этом информацию., @Delta_G


1 ответ


Лучший ответ:

2

Я постараюсь ответить на некоторые недоразумения, хотя на самом деле это не полный ответ, поскольку в настоящее время я не знаю, в чем именно заключается проблема.

Сначала несколько терминов:

  • Прошивка. Прошивка — это программа, работающая на устройстве. То, что мы называем прошивкой, обычно является результатом скомпилированного кода, то есть программы на машинном языке. (Хотя иногда люди говорят о прошивке и имеют в виду код прошивки, который на тот момент не компилируется). В мире микроконтроллеров прошивка работает непосредственно на аппаратном обеспечении микроконтроллера (в отличие от ПК, где между ними находится операционная система). Таким образом, в любой момент времени на микроконтроллере может работать только одна прошивка. Вы не можете загрузить несколько прошивок в микроконтроллер одновременно. Таким образом, при загрузке нового файла предыдущий будет перезаписан.
  • Эскиз: это термин Arduino, обозначающий код вашей программы. Когда вы скомпилируете скетч, компилятор переведет ваш код на ассемблер, а затем на машинный язык. Полученный файл затем можно загрузить в микроконтроллер, где он перезапишет предыдущее содержимое флэш-памяти.
  • SDK. Комплект разработки программного обеспечения — это набор кода, который обеспечивает простой в использовании доступ к важным функциям. Саму среду Arduino можно назвать SDK. Он обеспечивает простой в использовании доступ к часто используемым функциям микроконтроллера, таким как цифровые и аналоговые входы. Если вы программируете ESP через Arduino IDE, у него будет копия ESP SDK, которая упрощает доступ к сложным вещам, таким как управление Wi-Fi. Этот ESP SDK разработан компанией, производящей ESP: Espressif. Если кто-то хочет написать программу для ESP, например прошивку, которая передает AT-команды по последовательному порту, кто-то получит ESP SDK от Espressif.
  • Прошивка AT: Прошивка AT на самом деле не отличается от вашей собственной программы, которую вы пишете/компилируете в Arduino IDE. Он использует ESP SDK для обработки таких вещей, как Wi-Fi. И он прослушивает последовательный порт ESP на наличие AT-команд и реагирует на них. Если хотите, вы можете написать свою собственную AT-прошивку. Этот тип прошивки предназначен для обеспечения более простых микроконтроллеров без оборудования Wi-Fi сетевым подключением через Wi-Fi. Простой микроконтроллер может отправлять AT-команды по последовательному порту для управления соединением Wi-Fi. Хотя это, конечно, неэффективно и ограничено. Может быть полезно включить Wi-Fi в существующий проект, хотя, когда вы пытаетесь сделать более сложную задачу, часто лучше отказаться от более простого микроконтроллера и делать все непосредственно на ESP с помощью собственной прошивки. Тогда нет необходимости в AT-командах.

почему команды WiFi и AT больше не работают после загрузки эскиза

Как описано выше, вы создали и загрузили собственную прошивку, написав скетч для ESP в Arduino IDE и загрузив его. Эта программа перезаписывает ту, которая ранее была сохранена на ESP. Таким образом, прошивки AT больше нет. Если вы хотите восстановить его, я уверен, что вы сможете найти в Интернете подходящий для вашей доски и загрузить его снова.

Хотя из того, что вы написали, мне кажется, что АТ-прошивка вам не особо нужна. Программирование пользовательского портала для учетных данных Wi-Fi — это то, где вам в любом случае понадобится собственная прошивка. Вы сейчас сидите на месте АТ прошивки со своей же программой. Вы можете указать ему, что делать, написав соответствующий код.

Какой модуль Wi-Fi может размещать собственный веб-интерфейс и выступать в качестве станции и точки доступа?

Насколько мне известно, каждая плата ESP способна на это. Хотя я еще не видел прошивки AT, которая поддерживала бы настройку пользовательского веб-интерфейса. Поэтому вам придется написать свою собственную прошивку.

Кто-то предложил «Wemos D1 mini», но у него нет большой антенны, а тот, который я нашел с антенной на Amazon, имеет очень плохие отзывы.

Большинство плат ESP не имеют приоритетной внешней антенны. Даже тем, у кого есть разъем для внешней антенны, может потребоваться некоторая работа, чтобы переключить их с внутренней на внешнюю антенну (например, отпаять резистор). Возможно, вы сможете найти тот, который не требует этого. К сожалению, Wemos D1 mini pro требует отпайки резистора сопротивлением 0 Ом. Это установлено производителем, поэтому любой реселлер выполнит всю работу самостоятельно. Не многие на это пойдут.

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

А для лучшего качества нужно обращаться к авторитетным источникам. Amazon часто является такой же плохой авантюрой, как и прямые покупки в Китае, AliExpress или аналогичных компаниях. Если вы покупаете там, ожидайте, что качество будет довольно низким, а некоторые платы могут даже сломаться. Иногда это нормально, иногда нет.

Примечание: я действительно не эксперт в области радиочастот, но, честно говоря, я был бы удивлен, если бы подключение антенны с помощью кабеля длиной несколько метров не оказало бы существенного влияния на мощность сигнала. Аппаратное обеспечение ESP Wi-Fi, вероятно, не предназначено для подачи заряда в такую длинную антенну. В этом случае, возможно, лучше переосмыслить дизайн вашего проекта. Вы можете разместить ESP наверху колодца (легко в зоне досягаемости сети Wi-Fi) и оттуда подключить все, что у вас есть в колодце. Или вы можете использовать другой микроконтроллер, управляющий всем в колодце, подключаясь к ESP через кабель. Или, если вам абсолютно необходим Wi-Fi для подключения там, вы можете использовать удлинитель наверху колодца (это также можно сделать с помощью ESP, если вам не нужен там полноценный удлинитель Wi-Fi). Это во многом зависит от ваших конкретных требований, поэтому здесь лишь несколько идей.


Кроме того, я заметил, что в вашей функции handlePortal() вы копируете SSID и пароль в структуру user_Wifi, но фактически не меняете статус Wi-Fi. . Я ожидаю, что код выполнит переход из режима точки доступа в режим станции или повторное подключение к новому Wi-Fi.

Вы сохраняете учетные данные в EEPROM (который на ESP представляет собой просто флэш-память) и извлекаете их при следующем запуске. Я сам много раз допускал эту ошибку: когда ожидаемая сеть Wi-Fi от ESP не отображается, уверены ли вы, что с вашего предыдущего запуска не сохранено действительных учетных данных Wi-Fi?


Надеюсь, это вам немного поможет.

,

«Аппаратное обеспечение ESP Wi-Fi, вероятно, не предназначено для подачи заряда в такую длинную антенну». Вот что я нашел с ESP-07. Потери в кабеле намного превышают выигрыш от антенны. В конце концов, встроенная керамическая антенна работала намного лучше, даже если длина антенны была всего несколько см., @Delta_G

Значит, SDK постоянно находится в ESP и его нельзя переопределить путем перепрошивки флэш-памяти?, @Black

Нет, SDK — это программный компонент на вашем компьютере, на который ссылается ваш собственный эскиз (например, всякий раз, когда вы используете там Wi-Fi). Когда вы компилируете свой собственный эскиз, компилятор также компилирует соответствующие части SDK и помещает их в один двоичный файл, который затем можно загрузить в ESP. SDK нужен при компиляции программы для доступа ESP к его специальным функциям (например, Wi-Fi), чтобы компилятор знал, как должны выглядеть вызовы к ним., @chrisl

Спасибо за полезную информацию @chrisl, я ценю это, @Black