Arduino библиотека WiFi

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

Стандартные модели Arduino такие как Uno, Nano или Mega не поддерживают такое подключение сами по себе, но можно добавить такую возможность для них при помощи WiFi шилда. Или можно использовать другие контроллеры с поддержкой WiFi: ESP32, ESP 8266, Arduino Uno WiFi, Arduino Yún, Arduino Tian и множество других.

WiFi шилд использует протокол SPI для коммуникации с Ардуино. На плате Uno и Nano он располагается на пинах 10, 11, 12 и 13, и на 50, 51, 52, 53 на плате Mega. Подробнее о распиновке вы можете почитать на страницах с описанием Arduino Uno, Arduino Nano и Arduino Mega. WiFi библиотека имеет множество сходств с библиотекой Ethernet, в том числе и одинаковые функции.

Скачать Arduino библиотеку WiFi.h

WiFi идет в комплекте стандартных библиотек и устанавливается вместе с Arduino IDE. Но ее можно скачать и отдельно по ссылке ниже.

Скачать Ардуино библиотеку WiFi

Для установки библиотеки просто распакуйте zip архив в папку «C:\Program Files (x86)\Arduino\libraries» или в то место, где у вас установлена среда разработки Arduino IDE. Если у вас запущена программа Arduino IDE, то для работы с новой библиотекой её необходимо перезапустить.

В состав библиотеки WiFi входит несколько классов:

  • WiFi — инициализация подключения и настроек сети
  • IPAddress — предоставление информации о настройках сети
  • Server — создание сервера, который может отправлять и принимать данные от клиента (программы запущенной на другом устройстве)
  • Client — создание клиента который может подключаться к серверам и отправлять и принимать данные
  • UDP — класс для отправки и принятия UDP сообщений

Примеры работы Arduino и ESP с WiFi.h

Далее я приведу примеры использования библиотеки WiFi.h. В примерах будут разобраны базовые задачи. Код примеров можно использовать на любой Arduino с wifi шилдом и на всех платах с чипами ESP 8266 и ESP32. Описание использованных команд вы найдете по ссылкам выше, но я постараюсь оставить в коде примеров подробные комментарии.

Подключение к WiFi сети с шифрованием WPA2.

Этот пример показывает как подключиться к домашней WiFi сети, использующей протокол шифрования WPA2. Так же помимо подключения к сети мы отправим информацию о текущем подключении в монитор последовательного порта.

#include <SPI.h>   // Библиотека для связи с wifi шилдом 
#include <WiFi.h>  // Библиотека для работы с wifi подключением

char ssid[] = "yourNetwork";     // SSID вашей сети (имя)
char pass[] = "secretPassword";  // пароль от вашей сети
int status = WL_IDLE_STATUS;     // переменная для статуса подключения

void setup() {
  // Открываем серийный порт
  Serial.begin(9600);

  while (!Serial) {
    ; // ждем установки связи
  }

  // Проверяем статус подключения wifi shield. Не нужно для плат на базе esp
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield не найден");
    // дальше не продолжаем
    while (true);
  }

  // пробуем подключиться к Wifi сети
  while (status != WL_CONNECTED) {
    Serial.print("Подключение к: ");
    Serial.println(ssid);

    // Подключаемся
    status = WiFi.begin(ssid, pass);
    // даем 10 секунд на подключение
    delay(10000);
  }

  // Подключение прошло успешно
  Serial.print("Вы подключены к сети");
  printCurrentNet();  // Выводим наш IP и MAC
  printWifiData();    // IP, MAC роутера и сила сигнала
}

void loop() {
  // Проверяем подключение каждые 10 секунд
  delay(10000);

  printCurrentNet();
}

// Функция для вывода в серийный монитор IP и MAC адресов нашего WiFi шилда
void printWifiData() {
  // узнаем и отправляем наш IP
  IPAddress ip = WiFi.localIP();

  Serial.print("Локальный IP адрес: ");
  Serial.println(ip);

  // узнаем и отправляем наш MAC адрес
  byte mac[6];
  WiFi.macAddress(mac);

  Serial.print("MAC адрес: ");
  Serial.print(mac[5], HEX);
  Serial.print(":");
  Serial.print(mac[4], HEX);
  Serial.print(":");
  Serial.print(mac[3], HEX);
  Serial.print(":");
  Serial.print(mac[2], HEX);
  Serial.print(":");
  Serial.print(mac[1], HEX);
  Serial.print(":");
  Serial.println(mac[0], HEX);
}

// Функция для отправки в серийный монитор имени сети к которой мы сейчас подключены
void printCurrentNet() {
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // Так же отправим МАС адрес роутера
  byte bssid[6];
  WiFi.BSSID(bssid);

  Serial.print("BSSID: ");
  Serial.print(bssid[5], HEX);
  Serial.print(":");
  Serial.print(bssid[4], HEX);
  Serial.print(":");
  Serial.print(bssid[3], HEX);
  Serial.print(":");
  Serial.print(bssid[2], HEX);
  Serial.print(":");
  Serial.print(bssid[1], HEX);
  Serial.print(":");
  Serial.println(bssid[0], HEX);

  // А так же отправим силу сигнала
  long rssi = WiFi.RSSI();

  Serial.print("signal strength (RSSI):");
  Serial.println(rssi);

  // Ну и тип шифрования
  byte encryption = WiFi.encryptionType();

  Serial.print("Encryption Type:");
  Serial.println(encryption, HEX);
  Serial.println();
}

Arduino WiFi web клиент

В этом примере мы отправим HTTP запрос с нашего микроконтроллера. Мы получим в ответ страницу Google поиска с результатами по запросу Arduino. Результатом будет HTML текст, который можно будет просмотреть в окне серийного монитора на компьютере. Так же можно скопировать этот текст в текстовый файл с расширением .html и открыть этот файл с помощью браузера.

#include <SPI.h>
#include <WiFi.h>
char ssid[] = "yourNetwork";		// SSID вашей сети (имя)
char pass[] = "secretPassword";	// пароль от вашей сети
int keyIndex = 0;								// индекс ключа (нужно только для WEP шифрования с использованием нескольких ключей)
int status = WL_IDLE_STATUS;		// переменная для статуса подключения

//IPAddress server(74,125,232,128);  // IP Google если не хотите использовать DNS
char server[] = "www.google.com";    // адрес Google с использованием DNS

// Инициализируем библиотеку интернет клиента
WiFiClient client;

void setup() {
	// Открываем серийный порт
	Serial.begin(9600);
	while (!Serial) {
		; // ждем подключения
	}

	// проверяем работу wifi шилда
	if (WiFi.status() == WL_NO_SHIELD) {
		Serial.println("WiFi shield не подключен");
		while (true);
	}

	// пытаемся подключиться к wifi
	while (status != WL_CONNECTED) {
		Serial.print("Подключение к: ");
		Serial.println(ssid);
		status = WiFi.begin(ssid, pass);
		// ждем подключения
		delay(10000);
	}

	Serial.println("Подключен к wifi");
	printWifiStatus();

	Serial.println("\nНачинаем подключение к серверу...");

	if (client.connect(server, 80)) {
		Serial.println("подключились к серверу");

		// Составляем HTTP запрос:
		client.println("GET /search?q=arduino HTTP/1.1");
		client.println("Host: www.google.com");
		client.println("Connection: close");
		client.println();
	}
}

void loop() {
	// если есть входящие данные от сервера
	// то считываем их и выводим в серийный порт
	while (client.available()) {
		char c = client.read();
		Serial.write(c);
	}

	// если сервер отключился то останавливаем клиент
	if (!client.connected()) {
		Serial.println();
		Serial.println("отключение от сервера");
		client.stop();
		while (true);
	}
}

// Функция для вывода информации о wifi подключении
void printWifiStatus() {
	// выводим имя сети к которой мы подключены
	Serial.print("SSID: ");
	Serial.println(WiFi.SSID());

	// выводим наш локальный IP адрес
	IPAddress ip = WiFi.localIP();
	Serial.print("IP адрес: ");
	Serial.println(ip);

	// выводим силу сигнала
	long rssi = WiFi.RSSI();
	Serial.print("сила сигнала (RSSI):");
	Serial.print(rssi);
	Serial.println(" dBm");
}

Простейший web сервер на Arduino

В этом примере мы запусти свой веб сервер прямо на нашем микроконтроллере. Он будет отдавать простейшую HTML страницу с показаниями, считываемыми с аналоговых пинов. С любого устройства в этой локальной сети можно будет подключиться к серверу и получить эти данные. А если настроить сеть и пробросить порты, то можно подключаться к вашему серверу через интернет из любой точки мира, но это тема для отдельной статьи.

#include <SPI.h>
#include <WiFi.h>

char ssid[] = "yourNetwork";		// SSID вашей сети (имя)
char pass[] = "secretPassword";	// пароль от вашей сети
int keyIndex = 0;								// индекс ключа (нужно только для WEP шифрования с использованием нескольких ключей)
int status = WL_IDLE_STATUS;		// переменная для статуса подключения

WiFiServer server(80);

void setup() {
	// Открываем серийный порт
	Serial.begin(9600);
	while (!Serial) {
		; // ждем подключения
	}

	// проверяем работу wifi шилда
	if (WiFi.status() == WL_NO_SHIELD) {
		Serial.println("WiFi shield не подключен");
		while (true);
	}

	// пытаемся подключиться к wifi
	while (status != WL_CONNECTED) {
		Serial.print("Подключение к: ");
		Serial.println(ssid);
		status = WiFi.begin(ssid, pass);
		// ждем подключения
		delay(10000);

	}

	Serial.println("Подключен к wifi");
	printWifiStatus();

	// Запускаем сервер
	server.begin();
}

void loop() {
	// слушаем входящие клиенты
	WiFiClient client = server.available();
	if (client) {
		Serial.println("Новый клиент");

		bool currentLineIsBlank = true;

		while (client.connected()) {
			if (client.available()) {
				char c = client.read();
				Serial.write(c);

				// если пришла пустая строка значит запрос закончился
				// тогда мы можем отправлять ответ
				if (c == '\n' && currentLineIsBlank) {
					// отправляем стандартные http заголовки
					client.println("HTTP/1.1 200 OK");
					client.println("Content-Type: text/html");
					client.println("Connection: close");  // закрыть соединение после получения ответа
					client.println("Refresh: 5");  // автоматическое обновление ответа каждые 5 секунд
					client.println();
					client.println("<!DOCTYPE HTML>");
					client.println("<html>");

					// выводим данные каждого аналогово пина 
					for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
						int sensorReading = analogRead(analogChannel);
						client.print("Значение пина ");
						client.print(analogChannel);
						client.print(": ");
						client.print(sensorReading);
						client.println("<br />");
					}

					client.println("</html>");
					break;
				}

				if (c == '\n') {
					// вы начали новую линию
					currentLineIsBlank = true;
				} else if (c != '\r') {
					// вы получили символ на текущей линии
					currentLineIsBlank = false;
				}
			}
		}

		// небольшая задержка на то что бы браузер получил данные
		delay(1);

		// закрываем подключение
		client.stop();
		Serial.println("Клиент отключен");
	}
}

// Функция для вывода информации о wifi подключении
void printWifiStatus() {
	// выводим имя сети к которой мы подключены
	Serial.print("SSID: ");
	Serial.println(WiFi.SSID());

	// выводим наш локальный IP адрес
	IPAddress ip = WiFi.localIP();
	Serial.print("IP адрес: ");
	Serial.println(ip);

	// выводим силу сигнала
	long rssi = WiFi.RSSI();
	Serial.print("сила сигнала (RSSI):");
	Serial.print(rssi);
	Serial.println(" dBm");
}
Ардуино