Switch project from STA to AP mode?

Before creating the topic

  1. Search forum for similar topics
  2. Check http://docs.blynk.cc and http://help.blynk.cc/
  3. Add details :
    • Hardware model + communication type. For example: Arduino UNO with Ethernet Shield
    • Smartphone OS (iOS or Android) + version
    • Blynk server or local server
    • Blynk Library version
    • Add your sketch code. :point_up:Code should be formatted as example below.

Simply paste your code between ``` If you don’t format your code, your topic can be deleted by moderators.

#define BLYNK_TEMPLATE_ID "TMPID"
#define BLYNK_TEMPLATE_NAME "ESP32 TRUCK"

#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <BlynkSimpleEsp32.h>
#include <Update.h>
#include <HTTPClient.h>


#define BLYNK_AUTH_TOKEN "TOKEN"
#define BLYNK_PRINT Serial
#define BLYNK_FIRMWARE_VERSION        "0.1.0"
#define USE_ESP32_DEV_MODULE

#define rainLED 21 // Yellow
#define battV 39  //Orange
int updn=16;  //Green/Wht 
#define ign 17  // Gray 
#define rollupPin 18 //Green 
#define rolldnPin 23  //Blu/Wht

#define rainSensor 36 //Purple
#define DHTTYPE DHT11
#define DHTPIN 19  //Sensor Green

DHT dht(DHTPIN, DHTTYPE);

WiFiMulti wifiMulti;

char auth[] = BLYNK_AUTH_TOKEN;
String ssid = "yourNetwork";

int previousMillis;
int runOnce = 1; // starts void loop() once, upon loading program changes.
volatile int stopRoll = 0;
int roll_pin = 0;
int RollIt = 0;
int RollTime = 3000; //window motor activation period
int waitFlag = 0;
int ventTime = 500; // set roll dn interval for vent
int venteD = 0;
int FullVent = 0;
volatile int up_dn = 1;
volatile int doneFlag = 1;
int raineD = 0;
int RS = 955;
int RAW = 0;
int RSlow = 1024;  //lowest rain sensor value recorded
int RSthresh = 700; //rain sensor threshold
int RSoffset = 0;
int RSNow = 1023;
int RSdiv = 1023;
int Maxhumidity = 0;
float Mintemp = 110;
float Maxtemp = 0;
int Hyst = 200; //rain sensor hysteresis setting
int humidHyst = 5; // Humidity sensor Hysteresis
int ct; // counter variable

float humeCal = 1.0; // Humidity sensor calibration offset multiplier
float pressNow = 0;
float tempF = 0;
float tempCal = -3;
float humid =65;
float tempSet = 50; //set temprature threshold in F
float battSet = 11.0; //battery alarm threshhold 
int Debug = 1; // set to 0 to skip delay
int interval = 10000;
int connectTimeoutMs = 10000;

int EnableIntr = 1; // enable interrupts = 1

unsigned long cntNow = 0; // VARIABLES FOR Millis()
unsigned long cntInit = millis();
unsigned long cntInterv = 5000; // 5 sec

unsigned long cntNow1 = 0; // VARIABLES FOR Millis(1)
unsigned long cntInit1 = millis();
unsigned long cntInterv1 = 86400000; // 24 hrs

volatile int rain = 0;
float vout = 0.0;
float correctionfactor = -1.75;
float vin = 0;
float Vtot = 0;
int Vcc = 0;
int R1 = 68000; //volt div resistor
int R2 = 22000; //volt div resistor
int h = 0;
float t = 0;
volatile int test = 0; //flag to restart after Ign Off

// Declare global variables for sensor data
int RAINSENSOR = 1023; 
int MsenseEnable = 1;
float TEMP = 32;
float HUMIDITY = 0;
volatile int ROLLUP;
volatile int ROLLDN;
volatile int STALLVAL;
float BATTV = 13.5;
int RAINING;
int VENTED;
int tempValue;
volatile int UpDn;
int UPDN = 0;
int BATTALARM = 0;


 BLYNK_WRITE(V8)
{   
  tempSet = param.asInt(); // Get value as integer
  }

BLYNK_WRITE(V10)
{   
  humid = param.asInt(); // Get value as integer
}

BLYNK_WRITE(V12)
{   
  RollIt = param.asInt(); // Get value as integer
  if (RollIt==1) {
  stopRoll = 1;
  RollPin();
  }
}

BLYNK_WRITE(V14)
{   
  waitFlag = param.asInt(); // Get value as integer
}

BLYNK_WRITE(V15)
{   
  MsenseEnable = param.asInt(); // Get value as integer
}

BLYNK_CONNECTED() { // when device is conneceted to Blynk Cloud... 

 Blynk.syncAll(); // request the values for all datastreams that has "sync" setting enabled 
  }

// This function creates the timer object. It's part of Blynk library 
BlynkTimer timer; 

void myTimer() 
{
  // This function describes what will happen with each timer tick
  // e.g. writing sensor value to datastream V5
  

  Blynk.virtualWrite(V0, RAINSENSOR);  
  Blynk.virtualWrite(V1, TEMP);
  Blynk.virtualWrite(V2, HUMIDITY);
  Blynk.virtualWrite(V6, BATTV);
  Blynk.virtualWrite(V4, ROLLUP);
  Blynk.virtualWrite(V5, ROLLDN);
  Blynk.virtualWrite(V3, RSNow);
  Blynk.virtualWrite(V7, RAINING);
  Blynk.virtualWrite(V11, BATTALARM);
  Blynk.virtualWrite(V9, VENTED);
  Blynk.virtualWrite(V13, WiFi.SSID()+" "+WiFi.RSSI());
  Blynk.virtualWrite(V14, waitFlag);

  if (ct < 11) {
    Vtot = Vtot+vin;
    ct=ct+1;
  }
  if (ct==11) {
    ct=0;
  BATTV = Vtot/10;
  Vtot=0;
  }

}


void RollPin() // roll window up or down alternatley
{
  
  if (digitalRead(ign)==1 || stopRoll==0) goto endIt;  //if ign is ON or Motors active, exit RollPin, goto label

      switch(up_dn) // check up_dn flag
        {
        case 0:
                        
       Serial.println("Rolling UP");
       digitalWrite(rollupPin,HIGH);
       ROLLUP = 1;
       ROLLDN = 0;
       up_dn = 1;
       doneFlag = 0;
       stopRoll = 0;
       
       break;
          

          case 1:
        if(rain==0)  {

        Serial.println("Rolling DN");
        digitalWrite(rolldnPin,HIGH); 
        ROLLUP = 0;
        ROLLDN = 1;
        up_dn = 0;
        doneFlag = 0;
        stopRoll = 0;
        
        break;
        } // close if raining
        } // close switch up_dn
       
       endIt: // Label for Goto
       Serial.println("switch up/dn check finished -press any key");

}
String overTheAirURL = "";
BLYNK_WRITE(InternalPinOTA) {
  overTheAirURL = param.asString();
  HTTPClient http;
  http.begin(overTheAirURL);
  int httpCode = http.GET();
  if (httpCode != HTTP_CODE_OK) {return;}
  int contentLength = http.getSize();
  if (contentLength <= 0) {return; }
  bool canBegin = Update.begin(contentLength);
  if (!canBegin) { return;}
  Client& client = http.getStream();
  int written = Update.writeStream(client);
  if (written != contentLength) {return;}
  if (!Update.end()) {return;}
  if (!Update.isFinished()) {return;}
reboot();
}

void reboot()
{
#if defined(ARDUINO_ARCH_MEGAAVR)
  wdt_enable(WDT_PERIOD_8CLK_gc);
#elif defined(__AVR__)
  wdt_enable(WDTO_15MS);
#elif defined(__arm__)
  NVIC_SystemReset();
#elif defined(ESP8266) || defined(ESP32)
  ESP.restart();
#else
  #error "MCU reset procedure not implemented"
#endif
  for (;;) {}
}

void setup() { // open setup
//dubug_init();
  pinMode(rolldnPin, OUTPUT);        //rolldn pin
  pinMode(updn, INPUT_PULLUP);         //connected to "Trunk Unlock" output from remote start -updn
  pinMode(rollupPin,OUTPUT);          //rollup pin
  pinMode(ign,INPUT);           //ign sense pin
  pinMode(rainLED,OUTPUT);         //rain led ;
  pinMode(battV,INPUT);        // Battery Voltage
  pinMode(rainSensor,INPUT);        //rain sensor input
  pinMode(DHTPIN,INPUT);        // DHT11 Data In
  pinMode(RAINING,OUTPUT);
  
   Serial.begin(115200);
    delay(10);
    

    wifiMulti.addAP("NETGEAR44-pro", "PWD");
    wifiMulti.addAP("NETGEAR44", "PWD");
    wifiMulti.addAP("DottieL", "PWD");
    wifiMulti.addAP("DottieL_EXT", "PWD");
    wifiMulti.addAP("ICM Guest", "PWD");
    wifiMulti.addAP("Bay Ridge Resort", "PWD");
    wifiMulti.addAP("Bay Ridge Resort Guest", "PWD");
    wifiMulti.addAP("Bay Ridge Resort Guest", "PWD");
    wifiMulti.addAP("oyowifi", "PWD");
    wifiMulti.addAP("oyo wifi", "PWD");
    wifiMulti.addAP("John's Galaxy A02s", "PWD");

    Serial.println("Connecting Wifi...");
    if(wifiMulti.run() == WL_CONNECTED) {
        Serial.println("");
        Serial.print("Connected to : ");
        Serial.println(WiFi.SSID());
        ssid = WiFi.SSID();       
        Serial.print("IP address: ");
        Serial.println(WiFi.localIP());
           }
    else
      { Serial.println("");
        Serial.print("Connected to : ");
        Serial.println(ssid);}

  timer.setInterval(700L, myTimer);
  Blynk.config(auth);
  Blynk.connect(0);
  
  
  runOnce = 1;
  dht.begin();
  
  raineD = 0;
 if (EnableIntr==1) attachInterrupt(digitalPinToInterrupt(updn),RollPin, FALLING);

   
} //close setup

void disable() {
  while (digitalRead(ign)== 1){ //if ign is ON, chase your tail
   digitalWrite(rollupPin,LOW);
   digitalWrite(rolldnPin,LOW);
   test = 1;
   waitFlag = 1;
   raineD = 0;
   rain = 0;
   Vcc = analogRead(battV);
   vout = (Vcc * 3.3) / 1023;
   vin = vout / (R2/float(R1+R2));
   vin = vin - correctionfactor;
   RAW = analogRead(rainSensor);
   RS = (RAW) + RSoffset;
   RSNow = 100-(RS/10.23);

   Blynk.run();
   Blynk.virtualWrite(V6, vin);
   Blynk.virtualWrite(V3, RSNow);
   Blynk.virtualWrite(V14, waitFlag);
   
   delay(700);
   doneFlag = 1;
if (EnableIntr==1) noInterrupts();
          venteD = 0;
   } 
if (EnableIntr==1) attachInterrupt(digitalPinToInterrupt(updn),RollPin, FALLING);
if (test==1) ESP.restart();

}

void initialize() {
  if (runOnce == 1) {
    runOnce = 0;
    Serial.print("runOnce = ");
    Serial.println(runOnce);
    stopRoll = 1; //ch to 1
    venteD = 0;
    doneFlag = 1;
  }

 if (waitFlag == 1) {
    delay(30000) ;
    waitFlag = 0;
    stopRoll = 1; //ch to 1
    venteD = 0;
    doneFlag = 1;
   }   
    
}

void stall() {

  cntInit = millis();
  if (doneFlag == 0) {
  delay(RollTime);
  digitalWrite(rollupPin,LOW); // turn off window motors
  digitalWrite(rolldnPin,LOW); // turn off window motors
  stopRoll = 1;
  test = 0;
  doneFlag = 1;
  }

}

void rainchk() { 

   if (MsenseEnable == 1) { 

    if (stopRoll == 1){ 

      if (RS<RSlow) RSlow = RS;
   if (RS<RSthresh) {
     rain = 1;
      if (raineD == 0) {
      digitalWrite(rollupPin,HIGH);
      ROLLUP = 1;
      ROLLDN = 0;
      venteD = 0;
      doneFlag = 0;
      raineD = 1; 
      FullVent = 0; // set flag
 
  if (RS<=RSthresh-Hyst) {
     venteD=0; //reset venteD
     rain = 1;
  }
      //rollcheck()
      }
   }   
    
  if (dht.readHumidity()*humeCal>=humid) { // open humidity test
  Serial.print("rain is ");
  Serial.println(rain);
   rain = 1;
      if (raineD == 0) {
      digitalWrite(rollupPin,HIGH);
      ROLLUP = 1;
      ROLLDN = 0;
      venteD = 0;
      doneFlag = 0;
      raineD = 1; 
      FullVent = 0; // set flag
      }

     if (dht.readHumidity()*humeCal>=humid) {
     venteD=0; //reset venteD
     rain = 1;
  } 
   } // close humid test
 else
 {
 if(RS>RSthresh+Hyst && dht.readHumidity()*humeCal<=humid-humidHyst)
 {
  rain = 0;
  raineD = 0;
  } 
  
 } // close else
  }// close stopRoll
  
   }
   else if (MsenseEnable == 0) {
   RSlow = 1024; //reset moisture memory value
   rain = 0;
   raineD = 0;
   }
} //close Raincheck

void Vent() {
if (dht.readTemperature(true)+tempCal>=tempSet && raineD ==0) { //check for Vent temp 
  if (venteD == 0) {
  Serial.println("Over Temp!!!!!!!!!");
  digitalWrite(rolldnPin,HIGH); // roll down for ventTime seconds
  delay(ventTime);
  digitalWrite(rolldnPin,LOW); // stop roll down
  venteD = 1; // set flag
  FullVent = 0; // set flag
  RSlow = 1024;
  ROLLUP = 0;
  ROLLDN = 0;
  stopRoll = 1;
  } // close vented test
 } // close overtemp test

}

void Fullvent() {
if (dht.readTemperature(true)+tempCal>=(tempSet+10) && raineD ==0) { //check for Vent temp 
  
  if (FullVent == 0 && WiFi.SSID()=="NETGEAR44") {
  Serial.println("Over Temp!!!!!!!!!");
  digitalWrite(rolldnPin,HIGH); // roll down for ventTime seconds
  delay(RollTime);
  digitalWrite(rolldnPin,LOW); // stop roll down
  venteD = 1;
  RSlow = 1024;
  FullVent = 1; // set flag
  ROLLUP = 0;
  ROLLDN = 1;
  stopRoll = 1;
  } //close FullVent test
  
 } // close overtemp test

}

void rollcheck() {
roll_pin = digitalRead(updn);
Serial.println("IN ROLL CHECK ROUTINE"); // !!!!!!!!!!!

if (doneFlag == 1) {   
   roll_pin = !digitalRead(updn);   
   switch(roll_pin)
   {
    case (0): {
    Serial.println("switch rollpin = 0 - Idling");
    Serial.print(F("Humidity: "));
    Serial.println(dht.readHumidity()*humeCal);
    if (dht.readHumidity()*humeCal>Maxhumidity) Maxhumidity = dht.readHumidity()*humeCal;
    if (dht.readTemperature(true)<Mintemp) Mintemp = dht.readTemperature(true);
    Serial.print("Maxhumidity = ");
    Serial.print(Maxhumidity);
    Serial.println("%");
    Serial.print("Temp = ");
    Serial.println(dht.readTemperature(true)+tempCal);
    Serial.print("Max Temp = ");
    Serial.println(Maxtemp);
    Serial.print("Mintemp = ");
    Serial.println(Mintemp);
    Serial.print(" ");
    Serial.print(tempSet);
    Serial.print(" ");
    Serial.println(humid);
    Serial.print("rain sensor = ");
    Serial.print(100-(RS/10.23));
    Serial.println("%");
    Serial.print("Max Rain Sensor Value = ");
    Serial.print(100-((RSlow/10.23)));
    Serial.println("%");
    Serial.print("Raw Rain Sensor = ");
    Serial.println(RAW, 0);
    Serial.print("RS = ");
    Serial.println(RS);
    Serial.print("rain = ");
    Serial.println(rain);
    Serial.print("raineD = ");
    Serial.println(raineD);
    Serial.print("venteD = ");
    Serial.println(venteD);
    Serial.print("up_dn = ");
    Serial.println(up_dn);
    Serial.print("Sensors ");
    if (MsenseEnable == 1) Serial.println("Enabled");
    if (MsenseEnable == 0) Serial.println("Disabled");
    Serial.print("Battery Voltage = ");
    Serial.print(BATTV);
    Serial.println("v");
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.println("switch rollpin finished");
    Serial.println("");
   //Vent(); // call Vent Function !!

  break;
    }
    
    case (1): {// else check up_dn flag
    Serial.println("IN UP/DN TEST");
    Serial.print("A1 triggered ******* = ");
    Serial.println(digitalRead(updn));
    RollPin();
    break;
    }
       //while (Serial.available()<=0); {Serial.read();}
   } // CLOSE ROLL_PIN TEST
  
  test = 0;

} // close doneflag
} //close rollcheck

void update() {
if (test == 1){ // open test humidity/temp
    int h = dht.readHumidity();
    // Read temperature as Celsius (the default)
   float f = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
   float t = dht.readTemperature(true);
    // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) { // open check
     Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }
  } // close check
}

void loop() { //open MAIN loop !!!!!!!!!!!!!!!!!!!!

Blynk.run();
timer.run();
analogReadResolution(10);

//if the connection to the stongest hotspot is lost, it will connect to the next network on the list
  if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED) {
    
    Serial.print("WiFi connected: ");
    Serial.print(WiFi.SSID());
    Serial.print(" ");
    Serial.println(WiFi.RSSI());
    Serial.println("");
  }
  else {
    Serial.println("WiFi not connected!");
  }
  delay(1000);
RAW = analogRead(rainSensor);
RS = (RAW) + RSoffset;
RSNow = 100-(RS/10.23);
if (RS<RSlow) RSlow = RS;
RAINSENSOR = (100-(RSlow/10.23));
TEMP = dht.readTemperature(true)+tempCal;
HUMIDITY = dht.readHumidity()*humeCal;
RAINING = raineD;
VENTED = venteD;
 digitalWrite(rainLED,rain);

 Vcc = analogRead(battV);
 vout = (Vcc * 3.3) / 1023;
 vin = vout / (R2/float(R1+R2));
 vin = vin - correctionfactor;
  
  if (BATTV<battSet) {
   BATTALARM = 1; 
 }
 else
 {
   BATTALARM = 0;
 }
 
  if (cntNow < cntInit) cntInit = cntNow; //allow for millis() rollover every 39 days
  if (dht.readHumidity()*humeCal>Maxhumidity) Maxhumidity = dht.readHumidity()*humeCal;
  if (dht.readTemperature(true)<Mintemp) Mintemp = dht.readTemperature(true);
  if (dht.readTemperature(true)>Maxtemp) Maxtemp = dht.readTemperature(true);
     
    delay(100);
          
    disable();
    initialize();
    update();
    stall();
    rainchk();
    Vent();
    Fullvent();
    rollcheck();

unsigned long currentMillis = millis();

 }// close loop

I am wondering if I could modify this project to work in AP mode, as a lot of the places I go with this, use 5Ghz WiFi and so I can not connect?

The Project rolls up my vehicles windows if it starts to rain and also rolls them down if the vehicle interiour temperature gets too hot.

you can’t use Blynk IoT without connection to Internet

To get this working you can incorporate few sensors which detect rain and temperatures and upon reaching the set point, it performs the required actions.
To achieve this you will not need internet.

But if you want to control and monitor parameters, then internet is must.

That’s kind of what I thought.
I guess I’ll have to just use a hotspot, in those situations.
Thank You.