sobota, 14 kwietnia 2018

[2] ESP8266 - Arduino - Sterowanie przekaźnikami przez stronę internetową

Ten post chciałbym poświęcić na przygotowanie serwera HTTP na ESP8266, za pomocą którego będzie można kontrolować diody czy przekaźniki.

[Źródło: https://www.banggood.com/V3-NodeMcu-Lua-WIFI-Development-Board-p-992733.html]


Program:


Cały program można pobrać z dysku Google pod tym linkiem (folder Arduino a następnie ESP8266). Poniżej opiszę poszczególne funkcje.

Funkcja główna uruchamiająca peryferia:

  1. void setup()
  2. {
  3.   Serial.begin(115200);
  4.   initOutPinsSetState(GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3, GPIO_PIN_4, GPIO_PIN_5, DEFAULT_PIN_STATE);
  5.   connectToWifi();
  6. }

Ustawienie pinów:

  1. void initOutPinsSetState(const int pin1, const int pin2, const int pin3, const int pin4, const int pin5, const int defaultState)
  2. {
  3.     pinMode(pin1, OUTPUT);
  4.     pinMode(pin2, OUTPUT);
  5.     pinMode(pin3, OUTPUT);
  6.     pinMode(pin4, OUTPUT);
  7.     pinMode(pin5, OUTPUT);
  8.     digitalWrite(pin1, OUTPUT);
  9.     digitalWrite(pin2, OUTPUT);
  10.     digitalWrite(pin3, OUTPUT);
  11.     digitalWrite(pin4, OUTPUT);
  12.     digitalWrite(pin5, OUTPUT);
  13. }

Uruchomienie Wifi wraz z serwerem:

  1. void connectToWifi(void)
  2. {
  3.   Serial.print("Connecting to ");
  4.   Serial.println(ssidForWifi);
  5.   WiFi.begin(ssidForWifi, passwordForWifi);
  6.   while (WiFi.status() != WL_CONNECTED)
  7.   {
  8.     delay(1000);
  9.     Serial.print(".");
  10.   }
  11.   Serial.println("Wifi Connection established.");
  12.   Serial.println("IP: " + WiFi.localIP());
  13.   server.begin();
  14. }

Obsługa strony internetowej:

  1. void setPinState(char* indexOfString_1, char* indexOfString_2, String* glob_state, const int pinToSet, char gpioNumber)
  2. {
  3.   if (headerData.indexOf(indexOfString_1) >= 0)
  4.   {
  5.     Serial.print("GPIO ");
  6.     Serial.print(gpioNumber);
  7.     Serial.println(" on");
  8.     *glob_state = "on";
  9.     digitalWrite(pinToSet, HIGH);
  10.   }
  11.   else if (headerData.indexOf(indexOfString_2) >= 0)
  12.   {
  13.     Serial.print("GPIO ");
  14.     Serial.print(gpioNumber);
  15.     Serial.println(" off");
  16.     *glob_state = "off";
  17.     digitalWrite(pinToSet, LOW);
  18.   }
  19. }
  20. void displayBtnOnWebPage(WiFiClient *client, String outputState, String gpioPin, String pinNumber)
  21. {
  22.   client->println("<p><b>" + gpioPin + " - " + outputState + "</b></p>");
  23.   if (outputState=="off")
  24.   {
  25.     client->println("<p><a href=\"/" + pinNumber + "/on\"><button class=\"button\">ON</button></a></p>");
  26.   }
  27.   else
  28.   {
  29.     client->println("<p><a href=\"/" + pinNumber + "/off\"><button class=\"button button2\">OFF</button></a></p>");
  30.   }
  31. }
  32. void enableClientData(WiFiClient *client)
  33. {
  34.   client->println("HTTP/1.1 200 OK");
  35.   client->println("Content-type:text/html");
  36.   client->println("Connection: close");
  37.   client->println();
  38.   setPinState("GET /1/on""GET /1/off"&output1State, GPIO_PIN_1, '1');
  39.   setPinState("GET /2/on""GET /2/off"&output2State, GPIO_PIN_2, '2');
  40.   setPinState("GET /3/on""GET /3/off"&output3State, GPIO_PIN_3, '3');
  41.   setPinState("GET /4/on""GET /4/off"&output4State, GPIO_PIN_4, '4');
  42.   setPinState("GET /5/on""GET /5/off"&output5State, GPIO_PIN_5, '5');
  43.   client->println("<!DOCTYPE html><html>");
  44.   client->println("<body bgcolor=\"#E6E6FA\">");
  45.   client->println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
  46.   client->println("<link rel=\"icon\" href=\"data:,\">");
  47.   client->println("<style>html { font-family: Times New Roman; display: inline-block; margin: 0px auto; text-align: center;}");
  48.   client->println(".button { background-color: #80ff00; border: double; color: white; padding: 40px 80px;");
  49.   client->println("text-decoration: none; font-size: 60px; margin: 10px;}");
  50.   client->println(".button2 {background-color: #ff4000;}</style></head>");
  51.   client->println("<body><h1><b>ESP8266 - Arduino - Relay Control</b></h1>");
  52.   displayBtnOnWebPage(client, output1State, "GPIO 1""1");
  53.   displayBtnOnWebPage(client, output2State, "GPIO 2""2");
  54.   displayBtnOnWebPage(client, output3State, "GPIO 3""3");
  55.   displayBtnOnWebPage(client, output4State, "GPIO 4""4");
  56.   displayBtnOnWebPage(client, output5State, "GPIO 5""5");
  57.   client->println();
  58. }

Funkcja setPinState ustawia początkowy stan pinu w zależności od wysłanej wiadomości do układu. Kolejna wyświetla przyciski na ekranie. Główna funkcja enableClientData przygotowuje całą stronę internetową do wyświetlenia.

W celu usprawnienia można wprowadzić pamiętanie stanu pinu poprzez zapisywanie danych o stanie pinu do pamięci EEPROMU. Odczytanie wtedy można przeprowadzić przy ustawianiu stanu początkowego. Natomiast zapis po wysłaniu danych o zmianie przez http.