Обнаружение wifi сетей

#include <WiFi.h>

const int led = 13;

void setup() {

pinMode (led, OUTPUT) ;
int d = WiFi. scanNetworks() ;

}

void loop() {

int d = WiFi. scanNetworks() ;

if ( d > 0) {digitalWrite(led, HIGH) ; delay(10000) ;}
else { digitalWrite(led, LOW)}

}

Почему не работает? Суть в том, что если рядом есть сеть вайфая, то светодиод горит. Не понимаю, почему криво работает

Потомушто нужно читать, что написано в окне ввода для начала. А потом - правильно копипастить пример в IDE.

и переменная должна быть волатильная

#ifdef WIFI
volatile  int n;
#define Time_WiFiScan 30000

void WiFi_Scan(void) {
  clearDisplay(); // инициализируем вывод на дисплей

  #ifdef ST7735
  tft.setCursor(20, 40);
  tft.setTextSize(2);
  tft.setTextColor(ST77XX_YELLOW, ST77XX_BLACK);
  tft.print("   SCAN");
  tft.setCursor(20, 70);
  tft.print(" NETWORKS"); 
  #else // ILI9341
  tft.setCursor(95, 80);
  tft.setTextSize(2);
  tft.setTextColor(ST77XX_YELLOW, ST77XX_BLACK);
  tft.print("   SCAN");
  tft.setCursor(95, 120);
  tft.print(" NETWORKS");
  blinks.attach(blinkPeriod,blinker);
  #endif

  Serial.println("scan start");
  // WiFi.scanNetworks will return the number of networks found
  n = WiFi.scanNetworks();
  blinks.detach();
  tft.fillScreen(ST77XX_BLACK);
  tft.invertDisplay(false);
  tft.setTextSize(1);
  tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK); 
  Serial.println("scan done");
  if (n == 0) {
    Serial.println("no networks found");
  } else {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i) {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      String ssid = (WiFi.SSID(i));

      tft.setCursor(3, 20 + (i * 12));
      tft.print(i + 1);
      tft.print(": ");
      tft.print(ssid);

      // выравнивание текста
      int s = ssid.length(); //sizeof(ssid);
      s = 10 - s;
      if (s >= 0) {
        for (int j = 0; j < s; j++) {
          Serial.print(" ");
          tft.print(" ");
        }
      }
      Serial.print(" (");
      tft.print(" (");
      Serial.print(WiFi.RSSI(i));
      tft.print(WiFi.RSSI(i));
      Serial.print(" CH-");
      tft.print(" CH-");
      if (WiFi.channel(i) < 10) {
        Serial.print(" ");
        //tft.print(" ");
      }
      if(WiFi.channel(i) <10) {
        Serial.print("0");
        tft.print("0");
      }
      Serial.print(WiFi.channel(i));
      tft.print(WiFi.channel(i));
      
      #ifndef ST7735
      tft.print(" F=");
      tft.print(CH[(WiFi.channel(i)) - 1]);
      tft.print("M");
      tft.print(" ");
      //tft.print(" MAC::");
      tft.print(WiFi.BSSIDstr(i));
      //tft.print(" ");
      #endif
       
      Serial.print(" Freq=");
      Serial.print(CH[(WiFi.channel(i)) - 1]);
      Serial.print("MHz MAC::");
      Serial.print(WiFi.BSSIDstr(i));
      Serial.print(" ");
      
      int e = WiFi.encryptionType(i);
      if (e == 0) {
        Serial.print("No Encrypton");
      } else if (e == 1) {
        Serial.print("WEP");
      } else if (e == 2) {
        Serial.print("WPA");
      } else if (e == 3) {
        Serial.print("WPA2/PSK (CCMP)");
      } else if (e == 4) {
        Serial.print("WPA2/PSK (TKIP,CCMP)");
      }
      Serial.println(")");
      tft.println(")");
      delay(10);
    }
  }
  Serial.println("");
  delay(10000);
  tft.fillScreen(ST77XX_BLACK);
  dispHello();
}

Во-первых, вставьте код как положено. Подсказка: обратный апостроф расположен на той же кнопке, что и буква ё
Во-вторых, что значит “не работает”? И что значит “криво”?

Не подскажите, это идет с выводом на отдельный дисплей? Просто я хотел сделать такой проект, что если рядом есть сеть wifi ,хотя бы одна, то светодиод загорается, если же рядом сетей wifi нет, то светодиод не горит

А если рядом шпиён мырыканский - светодиод танцует в присядку ))

1 лайк

Спасибо. Когда загрузил скетч в плату, светодиод загорается и просто горит (по сути рядом есть сети wifi) и горит так постоянно, чтобы не происходило. Если на плате нажать ресет, то светодиод потухнет и никаких действий больше не совершается. При повторном нажатии светодиод загорается и все так по кругу. Вопрос: как правильно указать в программе, чтобы светодиод загорался, когда сети есть, и затухал, когда их нет рядом. Для проверки работы кода, что можно сделать со светодиодом, может заставить его несколько раз помигать, что если рядом есть сети wifi. Просто я не понимаю, верно ли я написал и что я сделал не так

Можно! Пусть мигает.

Не понимаю
Он считает сети
Если хотя бы одна есть, он загорается, ести нет, то не горит, хорошо
С точки зрения правильности написания кода и алгоритмизации я верно сделал? Не допустил ошибки?
Мне кажется, что работает не верно, потому что он просто горит и все. А если в начале сети будут, но потом их рядом не будет, он поменяет свое значение - потухнет?

Да хрен его знает, ты же так и не вставил код правильно.
(Обратные апастрафы там где буква ё на клавиатуре, вот так выглядят - `)

Кстати - тебе это зачем? Так на раз «безделушку» сделать «нужную»?

Удобно будет фоткой?
Да, для себя хочу сделать, ну и так начать более подробно знакомиться с ардуино. Первая работа, но вот все не понимаю, делаю я ее верно или нет. Плата, кстати, WeMos D1 R1 со встроенным esp8266.

Не подскажите, а когда плата один раз выполнит сканироварие и либо загорится светодиод, либо нет. Она будет по новой повторяться? Снова начиная поиском и тд? Как бы все действия в loop , по сути должно ведь?

Вам трудно код выложить или как?
Вы надеетесь взять форум измором? - не рассчитывайте

Извините
Подскажите, что не так может быть и правильно ли написал код. Суть в том, что если по близости есть сеть wifi, светодиод загорается, иначе не горит

#include <WiFi.h> //Подключение библиотеки

void setup() {
  
  pinMode(LED, OUTPUT); //Настройка диода на вывод 
  byte numSsid = WiFi.scanNetworks(); //Функция, определяющая наличие попблизости WiFi сети
  digitalWrite(LED, LOW);
  
}

void loop() {
  
  byte numSsid = WiFi.scanNetworks();
  if (numSsid > 0){  digitalWrite(LED, HIGH); delay(10000);} // если сети есть, светодиод - свети!
  else{ //иначе
  digitalWrite(LED, LOW); delay(10000);} // не гори вообще!
  
}

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

Лишние строки оставил для себя с целью удобства чтения. Кол-во обнаруженных сетей не выводит. Если, например, писать, вывод поиска сетей в ком порт, о том, что поиск начался, то только в таком состоянии и остается, постоянно это сообщение и выдавал. Непонятные символы при выводе в ком порт, это по причине не правильнт указанной скорости? И как ее определить, подобрать или об этом может что в интернете есть?

Если не знаете, в чем ошибка, всегда начинайте со штатных примеров: https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/WiFiScan/WiFiScan.ino

Затем сравнивайте с проблемным - что потеряли сами или авторы сайтов, откуда сделана копипаста.

1 лайк

что считать рядом, у меня к примеру видно 95 точек, какие рядом, видимо надо определиться с уровнем сигнала? смартфон расшаривающий интернет в кармане это рядои или не очень?