• Система автоматизации с открытым исходным кодом на базе 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
Столкнулся с аналогичной проблемой. Так же сразу после включения может нормально отработать, а дальше отказывается. Или один раз включишь - работает. Второй раз - капризничает.
Скорее всего связано это с тем, что не соблюдены все требования по подключению выводов и/или согласованию уровней.
Сам еще сегодня буду экспериментировать, может чего-то и добьюсь.
 
Сверху Снизу