Sterowanie diodami LED przez WiFi z wykorzystaniem ESP8266
Przykład pokazuje jak przesłać dane przez stronę internetową WWW do modułu ESP8266 z wykorzystaniem Arduino. Program steruje diodami LED podłączonymi do płytki Arduino.
W przykładzie zostały zastosowane następujące elementy:
- Arduino Uno
- Moduł oparty na układzie ESP8266, np. ESP-01
- Diody LED
- Rezystory
- Płytka stykowa oraz przewody
- Komputer wyposażony w kartę WiFi
Podłączenie ESP-01 z Arduino
Do komunikacji pomiędzy modułem WiFi opartym na układzie ESP8226 a płytką Arduino służy interfejs szeregowy UART. W tym wypadku zostanie wykorzystana jego programowa wersja, sprzętowy UART, czyli piny 1 i 0 pozostaną do dyspozycji użytkownika. Układy należy połączyć, np. za pomocą przewodów żeńsko-męskich w następujący sposób:
| Pin ESP8266 | Pin Arduino |
|---|---|
| Tx | 2 |
| Rx | 3 |
| Vcc | 3,3 V |
| CH_PD |
3,3 V |
| GND | GND |

Do pinów 11, 12 oraz 13 Arduino należy podłączyć diody LED przez rezystor ograniczający prąd diody. Od jego wartości zależy jasność diody LED, zbyt mała rezystancja może uszkodzić diodę, przy zbyt dużej nie będzie ona świeciła. Proponujemy wybrać wartość rezystancji z zakresu od 220 Ω do 1,5 kΩ.
Program do Arduino
W przykładzie został wykorzystany następujący kod:
#include <SoftwareSerial.h> //dolaczenie biblioteki do obsługi programowego interfejsu UART
SoftwareSerial esp01(2,3); // Inicjalizacja programowego interfejsu UART: 2-RX (polaczyc z Tx modulu ESP); 3-TX (polaczyc z Rx modulu ESP)
void setup()
{
Serial.begin(9600); // Inicjalizacja sprzetowego interfejsu UART z prędkościa 9600 bps - do komunikacji z komputerem poprzez USB
esp01.begin(9600); // Inicjalizacja programowego interfejsu UART z prędkościa 9600 bps - do komunikacji z modulem ESP
pinMode(11,OUTPUT); //ustawienie pinu 11 jako wejście dla diody LED nr 1
digitalWrite(11,LOW); //podanie stanu niskiego na pin 11 - dioda 1 domyślnie wyłączone
pinMode(12,OUTPUT); //ustawienie pinu 12 jako wejście dla diody LED nr 2
digitalWrite(12,LOW); //podanie stanu niskiego na pin 12 - dioda 2 domyślnie wyłączone
pinMode(13,OUTPUT); //ustawienie pinu 13 jako wejście dla diody LED nr 3
digitalWrite(13,LOW); //podanie stanu niskiego na pin 13 - dioda 3 domyślnie wyłączone
//Wysyłanie komend incjalizacyjnych dla modulu ESP
sendData("AT+RSTrn",2000); //reset modułu
sendData("AT+CWMODE=2rn",1000); //ustawienie w trybie Access Point
sendData("AT+CIFSRrn",1000); //uzyskanie adresu IP (domyślnie 192.168.4.1)
sendData("AT+CIPMUX=1rn",1000); //włączenie trybu połączeń wielokrotnych
sendData("AT+CIPSERVER=1,80rn",1000); //ustawienie serwera na porcie 80
}
void loop()
{
if(esp01.available()) // sprawdzenie czy moduł otrzymał dane
{
if(esp01.find("+IPD,"))
{
delay(1000); // czekanie na zapełnienie bufora danymi
// odczytanie ID połączenia
int connectionId = esp01.read()-48; //odczytanie wartosci ASCI: odjęto 48 ponieważ funkcja read() zwraca wartość dziesiętną ASCII na pozycji 48
esp01.find("pin="); // wyszukanie frazy "pin=" oraz ustawienie tam "kursora"
int pinNumber = (esp01.read()-48)*10; // pobranie pierwszej cyfry, np. dla pinu 13, pierwsza cyfra to 1, należy ją pomnożyć przez 10
pinNumber += (esp01.read()-48); //pobranie drugiej cyfry, np. dla pinu 13, druga cyfra to 3, należy ją dodać do poprzedniego wyniku
digitalWrite(pinNumber, !digitalRead(pinNumber)); // zmiana stanu wybranego pinu
// zamknięcie połączenia
String closeCommand = "AT+CIPCLOSE=";
closeCommand+=connectionId; // ID połączenia odczytane na początku
closeCommand+="rn";
sendData(closeCommand,1000); // wyslanie komend zakoczenia polaczenia
}
}
}
/*
* Funkcja wysyłająca komendy do modułu ESP01
* Parametry:
* command - komenda do wysłania
* timeout - czas oczekiwania na odpowiedź
*/
String sendData(String command, const int timeout)
{
String response = "";
esp01.print(command); // wysłanie polecenia do ESP01
long int time = millis();
while( (time+timeout) > millis())
{
while(esp01.available()) //jeśli są jakieś dane z modułu, wtedy następuje ich odczyt
{
char c = esp01.read(); // odczyt kolejnego znaku
response += c;
}
}
Serial.print(response);
return response;
}
Kod HTML do wysyłania danych
Należy skopiować poniższy kod i wykorzystując np. systemowy Notatnik zapisać go z rozszerzeniem .html.
| <html> <head> <title>Kontrola LED przez ESP8266</title> </head> <body> <!-- Atrybut ID zawiera wartość do wysłania do Arduino --> <button id="11" class="led">Zmiana pinu 11</button> <!-- przycisk dla pinu 11 --> <button id="12" class="led">Zmiana pinu 12</button> <!-- przycisk dla pinu 12 --> <button id="13" class="led">Zmiana pinu 13</button> <!-- przycisk dla pinu 13 --> <script src="jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ $(".led").click(function(){ var p = $(this).attr('id'); // pobranie wartości (dla jednego z pinów) // wysłanie HTTP GET request do adresu IP z parametrem "pin" i wartością "p" $.get("http://192.168.4.1:80/", {pin:p}); // wykonanie polecenia }); }); </script> </body> </html> |
Program używa również biblioteki JQuery. Należy ją pobrać i zapisać w katalogu gdzie znajduje się powyższy plik .html.
Uruchomienie programu
Na początek należy połączyć się z modułem jako punktem dostępowym (podobnie jak np. z bezprzewodowym routerem). Po ustanowieniu połączenia należy otworzyć utworzoną stronę internetową za pomocą dowolnej przeglądarki. Korzystając z jednego z trzech przycisków możemy zapalać lub gasić diody.
