ESP8266, ESP32 автоматическое подключение к разным WIFI сетям

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Вопрос простой, кто и как реализует задачу автоматического подключения к разным WiFi cетям (по логину, паролю) при перемещении девайса. Скан сетей, проверка Точек по имени, определение и выбор точки с наибольшей силой сигнала?
 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Не могу сказать за esp32, но дома две точки WiFi и на даче три. Решил тему вышеописанную просто. Одинаково назвал все точки доступа. Задал одинаковые имя и пароль. Я не знаю как это работает, но работает отлично и стабильно. Где бы я не находился с планшетом в зоне доступа любой из точек - все подключается и работает. Есть ещё репитеры WiFi, но они (вроде бы) по тому же принципу работают. 
Или я не про то подумал?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

можно и так, но если нет возможности переименования, то интересует, кто и как эту проблему решал

b707
Offline
Зарегистрирован: 26.05.2017

У меня тоже так, все роутеры с одним и тем же ssid и паролем

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:
У меня тоже так, все роутеры с одним и тем же ssid и паролем

это не наш метод, так что буду решать задачу далее, думал, может уже кто озадачился и сделал давно
Видится, набить и далее сравнивать имя и скан_имя:
 

char * ssid[] = {"NODE1","NODE2","NODE3"};         // your network SSID (name)
char * password[] = {"pass1","pass2","pass3"};     // your network key

 

Прямое сравнение компилируется но не работает, как надо правильно?
 

 if(WiFi.SSID(j) == ssid[i])

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

strcmp

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

Прямое сравнение компилируется но не работает, как надо правильно?

if(WiFi.SSID(j) == ssid[i])

так ты сравниваешь не саму строку, а только ссылки на них, которые, очевидно, не равны никогда

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

Прямое сравнение компилируется но не работает, как надо правильно?

if(WiFi.SSID(j) == ssid[i])

так ты сравниваешь не саму строку, а только ссылки на них, которые, очевидно, не равны никогда

а как по этим ссылкам взять строки и их сравнить?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

xDriver пишет:

strcmp

error: cannot convert 'String' to 'const char*' for argument '1' to 'int strcmp(const char*, const char*)'

         if(strcmp(s1, s2) == 0 )

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Вам же выше написали: http://all-ht.ru/inf/prog/c/func/strcmp.html

Если ещё не догоняете, то как бэ вот так:

if ( ! strcmp((char*)WiFi.SSID(j), (char*)ssid[i] ) { // что то делаем }

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Капец, вы же (вроде бы) умеете с указателями работать?

Посмотрите внимательнее мой пример. 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ua6em пишет:

xDriver пишет:

strcmp

error: cannot convert 'String' to 'const char*' for argument '1' to 'int strcmp(const char*, const char*)'

         if(strcmp(s1, s2) == 0 )

ты вроде дядька взрослый и не глупый, но тут тебя хочется послать... в раздел новичков:))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

xDriver пишет:

ua6em пишет:

xDriver пишет:

strcmp

error: cannot convert 'String' to 'const char*' for argument '1' to 'int strcmp(const char*, const char*)'

         if(strcmp(s1, s2) == 0 )

ты вроде дядька взрослый и не глупый, но тут тебя хочется послать... в раздел новичков:))

второй день конкретно туплю )))
у меня пока не сложится на уровне машинных кодов, что там и как преобразовывается, не укладывается в голове...
 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

Вам же выше написали: http://all-ht.ru/inf/prog/c/func/strcmp.html

Если ещё не догоняете, то как бэ вот так:

if ( ! strcmp((char*)WiFi.SSID(j), (char*)ssid[i] ) { // что то делаем }

 

 invalid cast from type 'String' to type 'char*'

   if(!strcmp((char*)WiFi.SSID(j), (char*)ssid[i]))

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ua6em пишет:

BOOM пишет:

Вам же выше написали: http://all-ht.ru/inf/prog/c/func/strcmp.html

Если ещё не догоняете, то как бэ вот так:

if ( ! strcmp((char*)WiFi.SSID(j), (char*)ssid[i] ) { // что то делаем }

 

 invalid cast from type 'String' to type 'char*'

   if(!strcmp((char*)WiFi.SSID(j), (char*)ssid[i]))

ептать, ну сравнивать надо два указателя, а не стринг и указатель, последний раз

WiFi.SSID(j).c_str()

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

У меня при компиляции

WiFi.SSID(j).c_str()

ошибка:

request for member 'c_str' in 'WiFi.WiFiClass::SSID(((uint8_t)j))', which is of non-class type 'char*'

А вот как я написал - компилируется:

 if ( ! strcmp((char*)WiFi.SSID(j), (char*)ssid[i]) )

Может разные версии wifi.h для дуни и ESP32?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

если запустится IDE (сто лет не запускал) проверю, вечером...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

Может разные версии wifi.h для дуни и ESP32?

да!

Вот универсальный код для библиотек

#define ESP32   // Для ESP32 размаркировать
#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
const uint16_t ports = 8000;
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>              // https://github.com/me-no-dev/ESPAsyncTCP
const uint16_t ports = 8000;
#endif
#include <ESPAsyncWebServer.h>

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

xDriver пишет:

если запустится IDE (сто лет не запускал) проверю, вечером...

Хорошо! а если и код поправите буду премного благодарен...
PS вот как-то сложно верится, что никто не реализовывал автоматизацию подключения к РАЗНЫМ точкам доступа

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

О! Так ESP еще и подглядывает за нами:
Заливаю код:
 

#include "Adafruit_Sensor.h"
#include "Adafruit_AM2320.h"

Adafruit_AM2320 am2320 = Adafruit_AM2320();

void setup() {
  Serial.begin(115200);
  while (!Serial) {
    delay(10); // hang out until serial port opens
  }

  Serial.println("Adafruit AM2320 Basic Test");
  am2320.begin();
}

void loop() {
  Serial.print("Temp: "); Serial.println(am2320.readTemperature());
  Serial.print("Hum: "); Serial.println(am2320.readHumidity());

  delay(5000);
}

Включен DEBUG и что видим:
 

SDK:2.2.2-dev(38a443e)/Core:2.7.3-3-g2843a5ac=20703003/lwIP:STABLE-2_1_2_RELEASE/glue:1.2-30-g92add50/BearSSL:5c771be
Adafruit AM2320 Basic Test
Temp: 26.50
Hum: 31.90
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 1
cnt 

connected with OpenWrt, channel 11
dhcp client start...
ip:192.168.1.224,mask:255.255.255.0,gw:192.168.1.1
Temp: 26.40
Hum: 31.90
Temp: 26.70
Hum: 31.90

 

gfx125
Offline
Зарегистрирован: 27.05.2017
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

gfx125 пишет:

Посмотрите здесь https://esp8266.ru/forum/threads/esp8266-podkljuchenie-k-neskolkim-setja...

Как вариант, рабочее решение, но хочется через сканирование сетей и потом добавить подключаться к точке в списке и с наибольшим RSSI

Код скину сюда:
 

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

char auth[] = "your_token";
char* ssid[] = {"ssid_1","ssid_2","ssid_Mobil"}; //list a necessary wifi networks
char* pass[] = {"pass_1","pass_2","pass_Mobil"}; //list a passwords

void setup()
{
  Serial.begin(9600);
  MultyWiFiBlynkBegin(); //instead Blynk.begin(auth, ssid, pass);
}

void MultyWiFiBlynkBegin() {
  int ssid_count=0;
  int ssid_mas_size = sizeof(ssid) / sizeof(ssid[0]);
  do {
    Serial.println("Trying to connect to wi-fi " + String(ssid[ssid_count]));
    WiFi.begin(ssid[ssid_count], pass[ssid_count]);   
    int WiFi_timeout_count=0;
    while (WiFi.status() != WL_CONNECTED && WiFi_timeout_count<50) { //waiting 10 sec
      delay(200);
      Serial.print(".");
      ++WiFi_timeout_count;
    }
    if (WiFi.status() == WL_CONNECTED) {
      Serial.println("Connected to WiFi! Now I will check the connection to the Blynk server");
      Blynk.config(auth);
      Blynk.connect(5000); //waiting 5 sec
    }
    ++ssid_count;
  }
  while (!Blynk.connected() && ssid_count<ssid_mas_size);
  if (!Blynk.connected() && ssid_count==ssid_mas_size) {
    Serial.println("I could not connect to blynk =( Ignore and move on. but still I will try to connect to wi-fi " + String(ssid[ssid_count-1]));
  }
}

void loop()
{
  Blynk.run();
}

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

 библиотека сия - #include <WiFiMulti.h> под esp8266 подходит?

Чтобы было информативней, чуток поправил:
 

/*
 *  This sketch trys to Connect to the best AP based on a given list
 *
 */

#include <WiFi.h>
//#include <ESP8266WiFi.h>
#include <WiFiMulti.h>

WiFiMulti wifiMulti;

void setup()
{
    Serial.begin(115200);
    delay(10);

    wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1");
    wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
    wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");


    Serial.println("Connecting Wifi...");
    if(wifiMulti.run() == WL_CONNECTED) {
        Serial.println("");
        Serial.println("WiFi connected");
        Serial.print("IP address: ");
        Serial.println(WiFi.localIP());
        Serial.print("SSID: ");
        Serial.println(WiFi.SSID());
        Serial.print("RSSI: ");
        Serial.println(WiFi.RSSI());
    }
}

void loop()
{
    if(wifiMulti.run() != WL_CONNECTED) {
        Serial.println("WiFi not connected!");
        delay(1000);
    }
}

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Дык почитай.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Дык почитай. Скорее нет, чем да. Но половину твоего вопроса решает.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

Дык почитай. Скорее нет, чем да. Но половину твоего вопроса решает.

я из тех парней, что "проверяет, какого пола твой сосед"
Да, выбирает лучшую точку:
 

WiFi connected
IP address: 192.168.10.101
SSID: Rostelecom_73
RSSI: -17
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6352
entry 0x400806b8
Connecting Wifi...

WiFi connected
IP address: 192.168.10.101
SSID: Rostelecom_73
RSSI: -15
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6352
entry 0x400806b8
Connecting Wifi...

WiFi connected
IP address: 192.168.10.101
SSID: Rostelecom_73
RSSI: -18
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6352
entry 0x400806b8
Connecting Wifi...

WiFi connected
IP address: 192.168.1.142
SSID: OpenWrt
RSSI: -10
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6352
entry 0x400806b8
Connecting Wifi...

WiFi connected
IP address: 192.168.1.142
SSID: OpenWrt
RSSI: -21
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6352
entry 0x400806b8
Connecting Wifi...

WiFi connected
IP address: 192.168.10.101
SSID: Rostelecom_73
RSSI: -21

Поправить библиотеку под ESP8266 точно выше моих возможностей

в ESP8266 эта библиотека называется -ESP8266WiFiMulti.h )))

посмотрел библиотеку, по мне очень красиво сделано

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

ua6em пишет:

Поправить библиотеку под ESP8266 точно выше моих возможностей

в ESP8266 эта библиотека называется -ESP8266WiFiMulti.h )))

посмотрел библиотеку, по мне очень красиво сделано

Да, тем более, что это библиотека от производителя чипа :) Ничего не скажу про качество библиотеки, но при обнаружении ошибок правят их они достаточно быстро. Правда сколько эти еспшки живут столько в них ошибки и находят :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

ua6em пишет:

Поправить библиотеку под ESP8266 точно выше моих возможностей

в ESP8266 эта библиотека называется -ESP8266WiFiMulti.h )))

посмотрел библиотеку, по мне очень красиво сделано

Да, тем более, что это библиотека от производителя чипа :) Ничего не скажу про качество библиотеки, но при обнаружении ошибок правят их они достаточно быстро. Правда сколько эти еспшки живут столько в них ошибки и находят :)

это да, задача решена, сделал универсально и для ESP8266 и для ESP32, нашел один глюк, но как они его могут принципиально решить пока не знаю. Глюк следующий, если видятся несколько точек доступа с одним именем и пытается подключиться не на отраженную в скетче (пароль не совпадает) долбит в чужую ноду до посинения...

 

Благодарю!!!

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

нашел один глюк, но как они его могут принципиально решить пока не знаю. Глюк следующий, если видятся несколько точек доступа с одним именем и пытается подключиться не на отраженную в скетче (пароль не совпадает) долбит в чужую ноду до посинения...

ну можно добавить логику - если в текущую сеть пароль не подошел, после трех-пяти попыток переходим к следующей в списке. Если сети закончились - делаем перерыв, потом по новой

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Пока не представляю, как в рамках этого кода это можно реализовать?

//#define ESP32   // Для ESP32 размаркировать
#ifdef ESP32
#include <WiFi.h>
#include <WiFiMulti.h>
#include <AsyncTCP.h>      // https://github.com/me-no-dev/AsyncTCP
const uint16_t httpPort = 8000;
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESPAsyncTCP.h>  // https://github.com/me-no-dev/ESPAsyncTCP
const uint16_t httpPort = 8000;
#endif

#include <ESPAsyncWebServer.h> // https://github.com/me-no-dev/ESPAsyncWebServer

#ifdef ESP32
WiFiMulti wifiMulti;
#else
ESP8266WiFiMulti wifiMulti;
#endif


void setup()
{
    Serial.begin(115200);
    delay(10);
    
    wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1");
    wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
    wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");


    Serial.println("Connecting Wifi...");
    if(wifiMulti.run() == WL_CONNECTED) {
        Serial.println("");
        Serial.println("WiFi connected");
        Serial.print("IP address: ");
        Serial.println(WiFi.localIP());
        Serial.print("SSID: ");
        Serial.println(WiFi.SSID());
        Serial.print("RSSI: ");
        Serial.println(WiFi.RSSI());
    }
}

void loop()
{
    if(wifiMulti.run() != WL_CONNECTED) {
//        Serial.println("WiFi not connected!");
        Serial.print(".");
        delay(500);
    }else{
        Serial.println("");
        Serial.println("WiFi connected");
        Serial.print("IP address: ");
        Serial.println(WiFi.localIP());
        Serial.print("SSID: ");
        Serial.println(WiFi.SSID());
        Serial.print("RSSI: ");
        Serial.println(WiFi.RSSI());
        delay(1000);
    }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

У меня при компиляции

WiFi.SSID(j).c_str()

ошибка:

request for member 'c_str' in 'WiFi.WiFiClass::SSID(((uint8_t)j))', which is of non-class type 'char*'

А вот как я написал - компилируется:

 if ( ! strcmp((char*)WiFi.SSID(j), (char*)ssid[i]) )

Может разные версии wifi.h для дуни и ESP32?

И что, сравнивает строки?

У меня нет

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

И что, сравнивает строки?

У меня нет

для ЕСП32 правильная запись

if ( ! strcmp((char*)WiFi.SSID(j).c_str(), (char*)ssid[i]) )

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

И что, сравнивает строки?

У меня нет

для ЕСП32 правильная запись

if ( ! strcmp((char*)WiFi.SSID(j).c_str(), (char*)ssid[i]) )

можешь пояснить почему так?
 

 

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

b707 пишет:

для ЕСП32 правильная запись

if ( ! strcmp((char*)WiFi.SSID(j).c_str(), (char*)ssid[i]) )

можешь пояснить почему так?

strcmp хочет такие параметры:

strcmp(const char* one, const char* two)

а WiFi.SSID(j) возвращает String. поэтому нужно его конвертировать в char* посредством c_str()

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

b707 пишет:

для ЕСП32 правильная запись

if ( ! strcmp((char*)WiFi.SSID(j).c_str(), (char*)ssid[i]) )

можешь пояснить почему так?

strcmp хочет такие параметры:

strcmp(const char* one, const char* two)

а WiFi.SSID(j) возвращает String. поэтому нужно его конвертировать в char* посредством c_str()

ну я протупил, а ведь видел жеж, что надо char*...как всё просто оказывается )))

на ESP8266 получается полная хрень:
код сканирования сетей:
 

   // Set WiFi to station mode and disconnect from an AP if it was Previously connected

  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  
 // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  int i = 0;
  int j = 0;
  
  Serial.println("scan done");
  if (n == 0) {
    Serial.println("no networks found");
  } else {
    for( j = 1; j <= n; j++ )
    {
      for ( i = 0; i < n; i++ )
      {
       
        Serial.print(WiFi.SSID(i));
        Serial.print(" = ");
        Serial.println(ssid[i]);
        
        if(strcmp((char*)(WiFi.SSID(j).c_str()), (char*)ssid[i]) != 0 )

        { 
        WiFi.begin(ssid[i], password);
        Serial.print(WiFi.SSID(j));
        Serial.print(" = + = ");
        Serial.println(ssid[i]);
        }
      }
     }
    }

Вывод в монитор порта:
 

OpenWrt = IPAD4
⸮ = + = IPAD4
Connecting Wifi: OpenWrt 1234
......
WiFi connected

 

b707
Offline
Зарегистрирован: 26.05.2017

блин, ну что за бардак в коде...

- почему в строке 16 условие <= n, а в 18 - < n

- почему вообще оба цикла до n, если мы сравниваем два разных списка разного размера - список запомненных и список сканированных сетей?

- почему в строке 21 ты печатаешь WiFi.SSID(i), а в строке 25 сравниваешь уже WiFi.SSID(j) ?

- функция strcmp() выдает ноль, если строки РАВНЫ. а у тебя условие наоборот...

Нельзя так...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

Нельзя так...

не понял ты полёт мысли свободного художника

сканирование даст количество сетей > 1
SSID храню в массиве чаров с нуля (цикл перебора из массива получается смещён вниз на 1)
По J - да, правил я сей косяк, видимо взял не правленный скетч, вылез опять
!= сделано намерено, вывести в порт, что и с чем сравнивается...

PS можно было конечно и забить...но я зануда...хочу понять...

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

но я зануда...хочу понять...

ну тогда разбирайся

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ну тогда разбирайся

эта борьба пока не в мою пользу )))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

b707 пишет:

ua6em пишет:

И что, сравнивает строки?

У меня нет

для ЕСП32 правильная запись

if ( ! strcmp((char*)WiFi.SSID(j).c_str(), (char*)ssid[i]) )

Спорить не буду, так как нет таких контроллеров и ничего в IDE не настроено под них.

b707
Offline
Зарегистрирован: 26.05.2017

BOOM пишет:

Спорить не буду, так как нет таких контроллеров и ничего в IDE не настроено под них.

я в исходник библиотеки смотрю

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

b707 пишет:

ua6em пишет:

И что, сравнивает строки?

У меня нет

для ЕСП32 правильная запись

if ( ! strcmp((char*)WiFi.SSID(j).c_str(), (char*)ssid[i]) )

Спорить не буду, так как нет таких контроллеров и ничего в IDE не настроено под них.

завтра проверю на esp32, их есть у меня, тока скетч перепишу на универсальный

Код проверен, скетчик сделан универсальным и для ESP32 и для ESP8266...строка разбора - РАБОТАЕТ!!!
Так как сам код практического смысла не имеет, не выкладываю...

hitcher
Offline
Зарегистрирован: 29.07.2021

Добрый день!

Видно, что тема подзаглохла. Наверное для программистов это не проблема, но для меня это все очень сложно.

Может кто поможет с готовым кодом для есп8266 (V3 Nodemcu). Если кратко хотелось иметь несколько подключений, если у меня роутер зависает, то переключалось на другую сеть, а если с ней связь теряется, то еще на одну)

С программированием я не знаком (закончил школу еще в СССР, т.ч. сами понимаете.....) Есть скетч кое как работающий на одно соединение, но оно теряется из-за дальности.

Может кто поделится готовой наработкой или поможет с моей?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

hitcher пишет:

Может кто поможет с готовым кодом для есп8266 (V3 Nodemcu).

Это Вы ошиблись разделом. Для готового кода существует раздел "Ищу исполнителя".

Цитата:

С программированием я не знаком (закончил школу еще в СССР, т.ч. сами понимаете.....)

Я тоже закончил школу еще в СССР. И институт - в СССР. И кандидатскую - тоже в СССР. Так что, честно говоря, не очень понимаю.

hitcher
Offline
Зарегистрирован: 29.07.2021

Имеется в виду готовый "кусок" кода, про который писал UA6EM.

Про раздел с исполнителями все понятно.

 

rkit
Онлайн
Зарегистрирован: 23.11.2016

Программы не склеивают из кусков, тем более такие сложные.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

hitcher пишет:

Имеется в виду готовый "кусок" кода, про который писал UA6EM.

Про раздел с исполнителями все понятно.

все сети известны, так что реализовано простым перебором, нужны подробности?

hitcher
Offline
Зарегистрирован: 29.07.2021

ua6em пишет:

hitcher пишет:

Имеется в виду готовый "кусок" кода, про который писал UA6EM.

Про раздел с исполнителями все понятно.

все сети известны, так что реализовано простым перебором, нужны подробности?

Добрый вечер.

Использовал из поста #30 , пытался внедрить в свой скетч, у меня только одно соединение. Телефон с раздачей находится на чердаке (иначе не ловит), сигнал  доходит до WiFI репитера на 2 эт., с репитера уже на первый. Но увы моих знаний не хватает. Отдельно ваш скетч с подключением работает, при потере сигнала с одной сети переходит на другую. Что в общем и нужно. 

Правильней здесь опубликовать мой скетч? Может кто чего подскажет.

73!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

видимо да

hitcher
Offline
Зарегистрирован: 29.07.2021


#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

#include "DHT.h" 
#define DHTPIN D4   //D1 ojriginal pin  my chang pin D4
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);  

// Замените на свои сетевые данные
#define WIFI_SSID "cqcq"
#define WIFI_PASSWORD "qth1234"

// Инициализация Telegram бота
#define BOT_TOKEN "123:XXXXXX"  // Ваш Токен
#define CHAT_ID "123123"        // ID чата

const unsigned long BOT_MTBS = 1000; // среднее время между сообщениями сканирования

X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
unsigned long bot_lasttime; // последнее сканирование сообщений было сделано

const int Relay1 = D5;      //Реле1 подключено к D5
const int Relay2 = D6;      //Реле2 подключено к D6
int Relay1Status = 0;       //Переменная для хранения статуса Реле1
int Relay2Status = 0;       //Переменная для хранения статуса Реле2
int t = dht.readTemperature()-2; // 
int h = dht.readHumidity();  // 

void handleNewMessages(int numNewMessages)
{
//  Serial.println("handleNewMessages"); // 
  Serial.print("обработка Новых Сообщений ");
  Serial.println(numNewMessages);

  for (int i = 0; i < numNewMessages; i++)
  {
    String chat_id = bot.messages[i].chat_id;
    String text = bot.messages[i].text;

    String from_name = bot.messages[i].from_name;
    if (from_name == "")
      from_name = "Guest";

    if (text == "/on")
    {
      digitalWrite(Relay1, LOW);  // включить Свет (НИЗКИЙ уровень реле)
      Relay1Status = 1;           // меняем статус на 1
      bot.sendMessage(chat_id, "Свет включен", "");
      
    }

    if (text == "/off")
    {
      digitalWrite(Relay1, HIGH);   // выключить Свет (ВЫСОКИЙ уровень реле)
      Relay1Status = 0;             // меняем статус на 0      
      bot.sendMessage(chat_id, "Свет выключен", "");
      
    }
        if (text == "/on2")
    {
      digitalWrite(Relay2, LOW);    // включить Реле (НИЗКИЙ уровень реле)
      Relay2Status = 1;             // меняем статус на 1
      bot.sendMessage(chat_id, "Реле включено", "");
    }
    if (text == "/off2")
    {
      digitalWrite(Relay2, HIGH);   // выключить Реле (ВЫСОКИЙ уровень реле)
      Relay2Status = 0;             // меняем статус на 0      
      bot.sendMessage(chat_id, "Реле выключено", "");
    }
    if (text == "/offall")
    {
      digitalWrite(Relay1, HIGH);   // выключить Свет (ВЫСОКИЙ уровень реле)
      digitalWrite(Relay2, HIGH);   // выключить Реле (ВЫСОКИЙ уровень реле)
      Relay1Status = 0;             // меняем статус на 0  
      Relay2Status = 0;             // меняем статус на 0     
      bot.sendMessage(chat_id, "Всё выключено", "");
    }
    if (text == "/status")
    {
      if (Relay1Status)bot.sendMessage(chat_id, "Свет включен", "");
      else bot.sendMessage(chat_id, "Свет выключен", "");
      if (Relay2Status)bot.sendMessage(chat_id, "Реле включено", "");
      else bot.sendMessage(chat_id, "Реле выключено", "");
    }
    if (text == "/temperatura") 
    {
      int t = dht.readTemperature()-2;
       String temp = "Температура: ";
       temp += int(t);
       temp +=" *C\n";
       bot.sendMessage(chat_id,temp, "");
    }
    if (text == "/humidity")
    {
      int h = dht.readHumidity();
       String temp = "Влажность: ";
       temp += int(h);
       temp += " %";
       bot.sendMessage(chat_id,temp, "");
    }
    if (text == "/start")
    {
      String welcome = "Добро пожаловать, " + from_name + ".\n\n";
      welcome += "Включить-выключить реле.\n";
      welcome += "------------------------------\n";
      welcome += "/on : включить свет\n";
      welcome += "------------------------------\n";
      welcome += "/off : выключить свет\n";
      welcome += "------------------------------\n";
      welcome += "/on2 : включить реле\n";
      welcome += "------------------------------\n";
      welcome += "/off2 : выключить реле\n";
      welcome += "------------------------------\n";
      welcome += "/offall : выключить всё\n";
      welcome += "------------------------------\n";
      welcome += "/status : показывает включено или выключено\n";
      welcome += "------------------------------\n";
      welcome += "/temperatura : Температура\n";  // mi
      welcome += "------------------------------\n";
      welcome += "/humidity : Влажность\n";  //mi
      welcome += "------------------------------\n";
      bot.sendMessage(chat_id, welcome, "");
    }
  }
}


void setup()   
{
  Serial.begin(115200);
  Serial.println();
  dht.begin(); // mi
  pinMode(Relay1, OUTPUT);                  // Инициализируем как Выход
  pinMode(Relay2, OUTPUT);                  // Инициализируем как Выход
  digitalWrite(Relay1, HIGH);               // Выключаем свет
  digitalWrite(Relay2, HIGH);               // Выключаем реле

  // attempt to connect to Wifi network:
  configTime(0, 0, "pool.ntp.org");         // Сервер точного времени UTC NTP
  secured_client.setTrustAnchors(&cert);    // Добавляем сертификат api.telegram.org
  Serial.print("Соединяемся с Wifi ");
  Serial.print(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nСоединились. IP адрес: ");
  Serial.println(WiFi.localIP());

  Serial.print("Получение времени: ");
  time_t now = time(nullptr);
  while (now < 24 * 3600)
  {
    Serial.print(".");
    delay(100);
    now = time(nullptr);
  }
  Serial.println(now);
}

void loop()
{
  if (millis() - bot_lasttime > BOT_MTBS)
  {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    while (numNewMessages)
    {
      Serial.println("Ответ получен");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
     }

    bot_lasttime = millis();
  }
}