Тема: Работа с WIFI ESP8266(gyverPortal)

Добрый день делаю проект на ESP8266. Её использую для вывода информации на дисплей OLED 128x64 и отправки на сайт некоторых значений, для простой постройки WEB странички куда будет приходить информация использую библиотеку GyverPortal.h. Столкнулся со следующей проблемой, а именно в скетче я указал название и пароль от своей wifi сети, когда ESP находится в зоне действия вай фай сети-то всё ок(ESP без проблем к ней подключается и запускается основной скетч и функция void loop). Но когда домашняя сеть не добивает до ESP она бесконечно пытается подключиться к ней и блокирует основной цикл программы. Хотелось бы узнать, можно ли сделать так чтобы ESP сначала полностью запускалась и выполняла задали скетча, а затем уже пыталась подключиться к сети WIFI (а если подключиться не удается,то повторить попытку через определенный промежуток времени).

#include <Wire.h>                       // Подключение библиотеки Wire
#include <Adafruit_GFX.h>               // Подключение библиотеки Adafruit_GFX
#include <Adafruit_SSD1306.h>           // Подключение библиотеки Adafruit_SSD1306
#include <microDS18B20.h>
#include <Servo.h>
#include <ESP8266WiFi.h>
#include <GyverPortal.h>

#define AP_SSID "iPhone" //имя сети
#define AP_PASS "12345678" //пароль
GyverPortal ui;

MicroDS18B20<0> sensor;
Servo myservo;

int temp, pos,i_dig,i_sum,i_iz,n;
float v,i_su,i_di,i_i,f,tempera;
long V;
#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 64 
#define OLED_RESET     13 
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int nmin = 25;
int nmax = 60;

int analogInput = A0; 

float vout = 0.0;
float vin = 0.0;
float R1 = 98700;                // Resistor R1 100k 
float R2 = 9740;                 // Resistor R2 10k
int value = 0;

void build() {
  GP.BUILD_BEGIN(GP_DARK);
GP.ONLINE_CHECK();
GP.UPDATE("tempr,voltes,position");
  GP.TITLE("IZH Jupiter-4", "t1");
  GP.HR();

GP_MAKE_BLOCK_TAB(
"Блок настроек",
GP.LABEL("Настройки холостого хода");
GP_MAKE_BOX(GP.LABEL("Мин.температура");     GP.NUMBER("num", "", nmin);    );
GP_MAKE_BOX(GP.LABEL("Макс.температура");    GP.NUMBER("num1","",nmax);     );
);
GP_MAKE_BLOCK_TAB(
"Блок показателей",
GP.LABEL("Показатели");
GP_MAKE_BOX(GP.LABEL("Температура");       GP.LABEL("tempr", "tempr");         );
GP_MAKE_BOX(GP.LABEL("Напряжение");        GP.LABEL("voltes", "voltes");       );
GP_MAKE_BOX(GP.LABEL("Положение серво");   GP.LABEL("position", "position");   );
)

  GP.BUILD_END();
}
void setup() {
  Serial.begin(115200);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3c); // Указываем адрес дисплея
  pinMode(analogInput, INPUT);

  WiFi.mode(WIFI_STA);
  WiFi.begin(AP_SSID, AP_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(WiFi.localIP());

  // подключаем конструктор и запускаем
  ui.attachBuild(build);
  ui.attach(action);
  ui.start();

    myservo.attach(2);
    myservo.write(0);
}
ui.updateFloat("tempr", tempera);
ui.updateFloat("voltes",i_i);
ui.updateInt("position",temp);

  if (ui.clickInt("num", nmin)) {
      Serial.print("Number: ");

      Serial.println(nmin);
    }
     if (ui.clickInt("num1", nmax)) {
      Serial.print("Number1: ");

      Serial.println(nmax);
    }
}
void loop() {
ui.tick();
sensor.requestTemp();

pos=map(i_iz,nmin,nmax,180,0);//map полодения сервы в завимости от температуры 
myservo.write(pos);
/////чтение температуры и отделение десятой части/////
v=sensor.getTemp();
V=round(v*10);
i_iz=V/10;
//////мин. и макс. значение температуры для map////
if(i_iz>60){i_iz=60;}
if(i_iz<nmin){i_iz=nmin;}
/////////вольтметр///////////////
 i_di = analogRead(analogInput);
 i_su = i_su+i_di;
 f++;if(f>9){f=0;i_i=i_su/293.0;i_su=0;}
 
tempera = sensor.getTemp();

draw();//вывод на дисплей
}
void draw(){
display.clearDisplay(); 
display.setTextColor(WHITE);

display.setCursor(26,0);  
display.setTextSize(1);                  
display.println("temperature:");//текст "температура:"

display.setCursor(15,33);  
display.setTextSize(1);                  
display.println("pos:");// текст "положение серво машинки 0-180*"

display.setCursor(78,33);  
display.setTextSize(1);                  
display.println("volts:");// текст "напряжение:"

display.setCursor(56,42);  
display.setTextSize(3);                  
display.println(i_i,1);//вывод напряжения             

display.setCursor(25,10);  
display.setTextSize(3);                  
display.println(sensor.getTemp(),1);//вывод температуры 
  
display.setCursor(0,42);                    
display.setTextSize(3);                       
display.println(pos); // вывод положения сервы           
display.display(); 
}

2

Re: Работа с WIFI ESP8266(gyverPortal)

Выход из цикла через три попытки подключения 

while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
   n++;
  if(n>3){break;}
  }

Re: Работа с WIFI ESP8266(gyverPortal)

А как сделать чтобы в самом скетче ESP делала  попытки подключения, если не получилось то в консоль писалось connect(в дальнейшем я выведу статичное слово connect на дисплей), а если не удалось подключиться то на экране раз в секунду мигало "no connect".

4

Re: Работа с WIFI ESP8266(gyverPortal)

Создать переменные

unsigned long times;
bool w=0;
int n;

В основной цикл вставить

if(w==0 && millis()-times>10000){
  times = millis();
while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
   n++;
  if(n>3){break;w=0;}else{w=1;}
  }}

каждые 10 секунд будет попытка подключения

5

Re: Работа с WIFI ESP8266(gyverPortal)

if(w==0){
выводим на экран - нет подключения
}

if(w==1){
выводим на экран -  подключено
}

6

Re: Работа с WIFI ESP8266(gyverPortal)

#include <Wire.h>                       // Подключение библиотеки Wire
#include <Adafruit_GFX.h>               // Подключение библиотеки Adafruit_GFX
#include <Adafruit_SSD1306.h>           // Подключение библиотеки Adafruit_SSD1306
#include <microDS18B20.h>
#include <Servo.h>
#include <ESP8266WiFi.h>
#include <GyverPortal.h>

#define AP_SSID "iPhone" //имя сети
#define AP_PASS "12345678" //пароль
GyverPortal ui;

MicroDS18B20<0> sensor;
Servo myservo;

int temp, pos,i_dig,i_sum,i_iz,n;
float v,i_su,i_di,i_i,f,tempera;
long V;
#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 64 
#define OLED_RESET     13 
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int nmin = 25;
int nmax = 60;

int analogInput = A0; 

float vout = 0.0;
float vin = 0.0;
float R1 = 98700;                // Resistor R1 100k 
float R2 = 9740;                 // Resistor R2 10k
int value = 0;





void setup() {
  Serial.begin(115200);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3c); // Указываем адрес дисплея
  pinMode(analogInput, INPUT);

  WiFi.mode(WIFI_STA);
  WiFi.begin(AP_SSID, AP_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(WiFi.localIP());
  Serial.println(WiFi.status());
}


void loop() {

}

Re: Работа с WIFI ESP8266(gyverPortal)

это если включен режим wifi_sta, а на режим wifi_ap есть такая команда