Сеть ESP8266 и WPA2 PSK

У меня возникли проблемы с подключением esp8266 к сети Wi-Fi. Я тестирую точку доступа с мобильного телефона. Если я настрою сеть на открытие (без безопасности), мой код ниже работает без проблем. Если я включу безопасность, WPA2 PSK (я предполагаю, что это означает личную версию) и добавлю пароль к коду, он не сможет подключиться. Есть предположения, в чем может быть проблема?

//загружаем библиотеку softserial
#include <SoftwareSerial.h>

//устанавливаем логическую постоянную переменную в true
//#определить ОТЛАДКА true
const boolean DEBUG = true;

//RX (контакт 2) идет на TX на esp8266, TX (контакт 3) идет на RX на esp8266
SoftwareSerial esp8266(2, 3);

// светодиодный контактный анод (длинная ножка) равен 13, а катод (короткая ножка) GND
int LED = 13;

// Массив состояния светодиодов - светодиод 0 выключен (0) при запуске.
int ledarray[] = {0};


void setup()
{
  // устанавливаем вывод светодиода в качестве выхода
  pinMode(LED, OUTPUT);

  //открываем последовательный порт
  Serial.begin(9600);

  //запускаем модуль esp8266 (примечание: скорость передачи вашего esp может отличаться)
  esp8266.begin(115200);

  // сбросить модуль esp8266
  senddata("AT+RST\r\n", 2000, DEBUG); 

  // устанавливаем esp8266 в качестве режима точки доступа
  //senddata("AT+CWMODE=1\r\n", 1000, DEBUG);

  // установить esp8266 в качестве режима беспроводной станции (веб-сервер)
  senddata("AT+CWMODE=1\r\n", 1000, DEBUG);

  //установить сетевой SSID и пароль, если esp8266 активирован как режим станции, иначе закомментировать
  senddata("AT+CWJAP=\"test\", \"\"\r\n", 6000, DEBUG);

  // получить IP-адрес для esp8266
  senddata("AT+CIFSR\r\n", 2000, DEBUG);

  // настроить esp8266 для нескольких подключений
  senddata("AT+CIPMUX=1\r\n", 1000, DEBUG);

  // включаем сервер esp8266 на порт 80
  senddata("AT+CIPSERVER=1,80\r\n", 1000, DEBUG);
}


void loop()
{
  //отправляет ли esp8266 сообщение
  if(esp8266.available())
  {
    //если получены данные от esp8266
    if (esp8266.find("+IPD,"))
    {
      //вычесть 48, потому что функция read() возвращает десятичное число ASCII
      //значение и 0 (первое десятичное число) начинается с 48
      int connectionid = esp8266.read() - 48;

      // читаем адрес, отправленный клиентом, ищем переменную (?)
      String msg;
      esp8266.find("?");
      delay(100);
      msg = esp8266.readStringUntil(' ');
      String command = msg.substring(0);

      //HTML передается в браузер
      String webpage = "<html><head><title>LED WEB SWITCH</title>";
      webpage += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><style>.button {background-color: orange;border: none;color: white;padding: 15px 32px;text-align: center;display: inline-block;font-size: 16px;} .centre {text-align: center;}</style>";
      webpage += "</head><body class=\"centre\"><h1 class=\"centre\">LED WEB SWITCH</h1>";

      //если команда T (переменная передается в ссылке кнопки на веб-странице)
      if (command == "T")
      {
        //если позиция 0 массива равна 1
        if (ledarray[0] == 1)
        {
          //выключаем светодиод
          digitalWrite(LED, LOW);

          // устанавливаем позицию 0 ledarray в 0
          ledarray[0] = 0;

          // добавляем текст на веб-страницу
          webpage += "<p>LED STATUS OFF</p>";
        }
        else
        {
          //включаем светодиод
          digitalWrite(LED, HIGH);

          //установить позицию 0 массива ledarray в 1
          ledarray[0] = 1;

          // добавляем текст на веб-страницу
          webpage += "<p>LED STATUS ON</p>";
        }
      }
      else
      {
        // добавляем текст на веб-страницу
        webpage += "<p>LED STATUS OFF</p>";
      }

      //добавляем кнопку (обратите внимание, что ссылка имеет '?T')
      webpage += "<a class=\"button\" href=\"?T\">TAP</a></body></html>";

      // создаем строку senddata для отправки wenbpage на esp8266
      String cipsend = "AT+CIPSEND=";
      cipsend += connectionid;
      cipsend += ",";
      cipsend += webpage.length();
      cipsend += "\r\n";
      senddata(cipsend, 500, DEBUG);
      senddata(webpage, 500, DEBUG);

      // создаем строку closecommand, добавляем идентификатор соединения, возврат и новую строку
      String closecommand = "AT+CIPCLOSE=";
      closecommand += connectionid;
      closecommand += "\r\n";

      // отправляем команду закрытия
      senddata(closecommand, 500, DEBUG);
    }
  }   
}


void senddata(String command, const int timeout, boolean debug)
{
  //отправляем полученную команду на esp8266
  esp8266.print(command);

  //устанавливаем переменную int в число миллисендов с момента запуска Arduino
  long int time = millis();

  //в то время как время и тайм-аут меньше, чем количество миллисендов с момента запуска Arduino
  while((time + timeout) > millis())
  {
    // пока esp8266 отправляет сообщения
    while(esp8266.available())
    {
      // отображаем вывод в последовательном окне
      Serial.write(esp8266.read());
    }  
  }
}

, 👍0

Обсуждение

Между прочим, отлаживать намного проще, если вы программируете esp вместо uno., @dandavis

SoftwareSerial не работает надежно на скорости 115200 бод. изменить скорость передачи данных в прошивке АТ и в скетче на 9600 бод, @Juraj

Я пробовал следовать совету здесь: https://arduinoprosto.ru/q/24156/how-to-change-baudrate-of-esp8266-12e-permanently ; //начнем с 115200 esp8266.начало (115200); // устанавливаем 9600 и начинаем снова senddata("AT+UART_DEF=9600,8,1,0,0\r\n", 2000, ОТЛАДКА); esp8266.begin(9600); Это вроде не работает, на 9600 отказывается подключаться к сети и ошибок не выдает., @garrettlynchirl


1 ответ


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

1

Решение этой проблемы никак не связано с безопасностью WPA2 PSK или используемой скоростью передачи данных. В моем коде у меня был пробел между именем сервера WIFI и паролем (я правильно форматировал). По-видимому, ESP8266 не нравится этот бит, и пробел нужно удалить - вот так:

//устанавливаем сетевой SSID и пароль, если esp8266 активирован как режим станции, иначе прокомментировать
senddata("AT+CWJAP=\"test\",\"\"\r\n", 6000, DEBUG);
,