title: How to switch to normal wifi mode to access-point mode ESP8266
body: <p>I am using ESP8266-12 wifi module for accessing my home wifi network to control lights. For uploading new firmware(OTA: Over the Air) update, I want to use ESP8266's hotspot AccessPoint because after changing the password of my wifi network, I will not able to do that. This is my Arduino code:</p>
  
  <pre><code>#include &lt;ESP8266WiFi.h&gt;
  #include &lt;ESP8266mDNS.h&gt;
  #include &lt;ArduinoOTA.h&gt;
  #include &lt;ESP8266WebServer.h&gt;
  
  //ssid and password of your wifi network
  const char* ssid = "wifi_ssid";
  const char* password = "wifi_password";
  
  //ssid and password to connect to local hotspot of ESP8266
  const char *esp_ssid = "your_desired_ssid";
  const char *esp_password = "your_desired_password";
  
  IPAddress ip(192, 168, 1, xx); // where xx is the desired IP Address
  IPAddress gateway(192, 168, 1, 254); // set gateway to match your wifi network
  IPAddress subnet(255, 255, 255, 0); // set subnet mask to match your wifi network
  
  ESP8266WebServer server(80);
  int status = LOW;
  const int pin = 5;
  
  const char* serverIndex = "&lt;form method='POST' action='/update' enctype='multipart/form-data'&gt;&lt;input type='file' name='update'&gt;&lt;input type='submit' value='Update'&gt;&lt;/form&gt;";
  
  //Authorization username and password before updating firmware
  const char* www_username = "admin";
  const char* www_password = "esp8266";
  
  void connectToWifi() {
    Serial.print("Connecting to ");
    Serial.println(ssid);
  
    WiFi.config(ip, gateway, subnet);
    WiFi.begin(ssid, password);
    while(WiFi.waitForConnectResult() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
      //ESP.restart();
    }
    Serial.print("WiFi connected to ");
    Serial.println(WiFi.localIP());
  }
  
  void createAccessPoint() {
    Serial.println("Configuring access point for wifi network *your_desired_ssid*...");
    WiFi.softAP(esp_ssid, esp_password);
    IPAddress accessIP = WiFi.softAPIP();
    Serial.print("ESP AccessPoint IP address: ");
    Serial.println(accessIP);
    /* Go to http://192.168.4.1 in a web browser
     * connected to this access point to see it.
     */
  }
  
  void serverResponse(){
    server.sendHeader("Connection", "close");
    server.sendHeader("Access-Control-Allow-Origin", "*");
    server.send(200, "text/plain", String(status));
  }
  
  
  void setup() {
    Serial.begin(115200);
    pinMode(pin, OUTPUT);
    connectToWifi();
    ArduinoOTA.begin();
    server.on("/fupdate", [](){
      if(server.authenticate(www_username, www_password)){
        createAccessPoint();
        server.sendHeader("Connection", "close");
        server.sendHeader("Access-Control-Allow-Origin", "*");
        server.send(200, "text/html", serverIndex);
      }
      else{
         return server.requestAuthentication();
      }
  
    });
    server.on("/status", [](){
      serverResponse();
    });
    server.on("/on", [](){
      status = HIGH;
      serverResponse();
    });
    server.on("/off", [](){
      status = LOW;
      serverResponse();
    });
    server.on("/update", HTTP_POST, [](){
        server.sendHeader("Connection", "close");
        server.sendHeader("Access-Control-Allow-Origin", "*");
        server.send(200, "text/plain", (Update.hasError())?"FAIL":"OK");
        ESP.restart();
      },[](){
        HTTPUpload upload = server.upload();
        if(upload.status == UPLOAD_FILE_START){
          Serial.setDebugOutput(true);
          WiFiUDP::stopAll();
          Serial.printf("Update: %s\n", upload.filename.c_str());
          uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) &amp; 0xFFFFF000;
          if(!Update.begin(maxSketchSpace)){//start with max available size
            Update.printError(Serial);
          }
        } else if(upload.status == UPLOAD_FILE_WRITE){
          if(Update.write(upload.buf, upload.currentSize) != upload.currentSize){
            Update.printError(Serial);
          }
        } else if(upload.status == UPLOAD_FILE_END){
          if(Update.end(true)){ //true to set the size to the current progress
            Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
          } else {
            Update.printError(Serial);
          }
          Serial.setDebugOutput(false);
        }
        yield();
      });
    server.begin();
    MDNS.addService("http", "tcp", 80);
  
    Serial.print("Open http://");
    Serial.print(WiFi.localIP());
    Serial.println("/ in your browser to see it working");
  }
  
  void loop() {
    digitalWrite(pin, status);
    ArduinoOTA.handle();
    server.handleClient();
    delay(1);
  }
  </code></pre>
  
  <p>I have a simple WifiWebServer which handles the requests. When I send <code>/fupdate</code> request, ESP module should create hotspot and I can connect my computer through the access-point to update firmware. For updating firmware I have set authorization. If authorization will be done only T can upload the new firmware. <strong>But my ESP8266 module is creating the hotspot before sending</strong> <code>/fupdate</code> **request or authorization. It's enabling hotspot when I am giving power. Can someone how to resolve this problem?</p>