• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Непонятки в работе с arduino

evgen1996

New member
Доброго времени суток, столкнулся с проблемой: Хочу сделать так, чтобы при первом включении создавалась точка доступа с веб интерфейсом, там вводишь пароль от домашнего wifi и он сохраняется и подключается к нему. Вроде и парсер работает и код в норме, но с веб интерфейсом проблемы: 1 раз загружается и виснет. пытаюсь get запрос отправить - не обрабатывает, хотя если сразу после включения отправить запрос - все работает!
Код:
#include <EEPROM.h>
#include <SoftwareSerial.h>
#include <string.h>
SoftwareSerial esp8266(4,5);
void EEPROMWrite(int point, String str){
int str_len = str.length();
char char_array[str_len+1];
str.toCharArray(char_array, str_len+1);
EEPROM.write(point, str_len);
for(int i=0;i<str_len;i++){
  EEPROM.write(point+1+i, char_array[i]);
}
}
String EEPROMRead(int point){
String str = "";
int lenght=EEPROM.read(point);
for(int i=0;i<lenght;i++){
str = str+char(EEPROM.read(point+1+i));
}
return str;
}

String uid="";
String get_resp(String readString){
uid=readString.substring(5, 6);
Serial.println("uid="+uid);
if(readString.indexOf("?")==-1){
Serial.println("+IPD finded");
     String webpage = "<html><form action=\"/\" method=\"get\"><input type=\"text\" name=\"ssid\" /><br><input type=\"text\" name=\"pass\" /><br><input type=\"submit\" value=\"ok\" /></form></html>";

     String cipSend = "AT+CIPSEND=";
     cipSend += uid;
     cipSend += ",";
     cipSend +=webpage.length();
    
     sendData(cipSend,1000);
     sendData(webpage,4000);
     String closeCommand = "AT+CIPCLOSE=";
     closeCommand+=uid; // append connection id
     sendData(closeCommand,1000);
     sendData(closeCommand,1000);
    
}else{
String finalstring = readString.substring(readString.indexOf("=")+1, readString.indexOf("HTTP"));
String ssid = finalstring.substring(0, finalstring.indexOf('&'));
String pass = finalstring.substring(finalstring.indexOf('&')+6, finalstring.indexOf(' '));
if(pass!=""){ 
Serial.print("---ssid=");
Serial.println(ssid);
Serial.print("---pass=");
Serial.println(pass);
//send_html(1);
}
}
}

void APMODE(){
sendData("AT+CWMODE=3",1000);
sendData("AT+CWSAP=\"micronn\",\"1234567890\",10,4",4000);
sendData("AT+CIPMUX=1",100);
if(sendData("AT+CIPSERVER=1,80",100).indexOf('OK')!=-1){ Serial.println("AP 'micron' Created"); }else{ Serial.println("AP CREATE ERROR"); }
}
String ssid = EEPROMRead(0);
String pass = EEPROMRead(20);
void WIFI(){
Serial.println("WIFI LOADING");
if(sendData("AT+RST",2000).indexOf('OK')!=-1){ Serial.println("RESET OK"); }else{ Serial.println("RESET ERROR"); }
if(ssid!=NULL || pass!=NULL){
sendData("AT+CWMODE=1",1000);
if(sendData("AT+CWJAP=\""+ssid+"\",\""+pass+"\"\r",8000).indexOf('OK')!=-1){ Serial.println("CONNECTED TO '"+ssid+"' WIFI"); }else{ Serial.println("CONNECTED ERROR"); Serial.println("SWITCH TO AP"); APMODE(); }
}else{
Serial.println("WIFI NOT SETUP");
APMODE();
}
}
void setup(){
  Serial.begin(9600);
  esp8266.begin(9600);
  WIFI();
}
String respo;
void loop(){
    long int mils = millis();
    while((2000+mils) > millis()){
      while(esp8266.available()){   
        char b = esp8266.read();
        respo+=b;
      }
    }
  if(respo!="" && respo!="Unlink\r\n"){
  respo.replace("\r\n"," ");
  respo.replace(" ","");
  respo.replace("Link","");
  respo.replace("Unlink","");
  Serial.println("-----------uid-----------");
  Serial.println(uid);
  Serial.println("---------response--------");
  Serial.print(respo);
  get_resp(respo);
  respo = "";
  }
}
String sendData(String command, const int timeout){
    String response = "";
    esp8266.print(command+"\r\n"); // send the read character to the esp8266
    long int time = millis(); 
    while( (time+timeout) > millis()){
      while(esp8266.available()){   
        char c = esp8266.read();
        response+=c;
      } 
    }
    Serial.print(response);
    return response;
}
 

Foutnain

New member
Столкнулся с аналогичной проблемой. Так же сразу после включения может нормально отработать, а дальше отказывается. Или один раз включишь - работает. Второй раз - капризничает.
Скорее всего связано это с тем, что не соблюдены все требования по подключению выводов и/или согласованию уровней.
Сам еще сегодня буду экспериментировать, может чего-то и добьюсь.
 
Сверху Снизу