[Ź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:
- void setup()
- {
- Serial.begin(115200);
- initOutPinsSetState(GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3, GPIO_PIN_4, GPIO_PIN_5, DEFAULT_PIN_STATE);
- connectToWifi();
- }
Ustawienie pinów:
- void initOutPinsSetState(const int pin1, const int pin2, const int pin3, const int pin4, const int pin5, const int defaultState)
- {
- pinMode(pin1, OUTPUT);
- pinMode(pin2, OUTPUT);
- pinMode(pin3, OUTPUT);
- pinMode(pin4, OUTPUT);
- pinMode(pin5, OUTPUT);
- digitalWrite(pin1, OUTPUT);
- digitalWrite(pin2, OUTPUT);
- digitalWrite(pin3, OUTPUT);
- digitalWrite(pin4, OUTPUT);
- digitalWrite(pin5, OUTPUT);
- }
Uruchomienie Wifi wraz z serwerem:
- void connectToWifi(void)
- {
- Serial.print("Connecting to ");
- Serial.println(ssidForWifi);
- WiFi.begin(ssidForWifi, passwordForWifi);
- while (WiFi.status() != WL_CONNECTED)
- {
- delay(1000);
- Serial.print(".");
- }
- Serial.println("Wifi Connection established.");
- Serial.println("IP: " + WiFi.localIP());
- server.begin();
- }
Obsługa strony internetowej:
- void setPinState(char* indexOfString_1, char* indexOfString_2, String* glob_state, const int pinToSet, char gpioNumber)
- {
- if (headerData.indexOf(indexOfString_1) >= 0)
- {
- Serial.print("GPIO ");
- Serial.print(gpioNumber);
- Serial.println(" on");
- *glob_state = "on";
- digitalWrite(pinToSet, HIGH);
- }
- else if (headerData.indexOf(indexOfString_2) >= 0)
- {
- Serial.print("GPIO ");
- Serial.print(gpioNumber);
- Serial.println(" off");
- *glob_state = "off";
- digitalWrite(pinToSet, LOW);
- }
- }
- void displayBtnOnWebPage(WiFiClient *client, String outputState, String gpioPin, String pinNumber)
- {
- client->println("<p><b>" + gpioPin + " - " + outputState + "</b></p>");
- if (outputState=="off")
- {
- client->println("<p><a href=\"/" + pinNumber + "/on\"><button class=\"button\">ON</button></a></p>");
- }
- else
- {
- client->println("<p><a href=\"/" + pinNumber + "/off\"><button class=\"button button2\">OFF</button></a></p>");
- }
- }
- void enableClientData(WiFiClient *client)
- {
- client->println("HTTP/1.1 200 OK");
- client->println("Content-type:text/html");
- client->println("Connection: close");
- client->println();
- setPinState("GET /1/on", "GET /1/off", &output1State, GPIO_PIN_1, '1');
- setPinState("GET /2/on", "GET /2/off", &output2State, GPIO_PIN_2, '2');
- setPinState("GET /3/on", "GET /3/off", &output3State, GPIO_PIN_3, '3');
- setPinState("GET /4/on", "GET /4/off", &output4State, GPIO_PIN_4, '4');
- setPinState("GET /5/on", "GET /5/off", &output5State, GPIO_PIN_5, '5');
- client->println("<!DOCTYPE html><html>");
- client->println("<body bgcolor=\"#E6E6FA\">");
- client->println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
- client->println("<link rel=\"icon\" href=\"data:,\">");
- client->println("<style>html { font-family: Times New Roman; display: inline-block; margin: 0px auto; text-align: center;}");
- client->println(".button { background-color: #80ff00; border: double; color: white; padding: 40px 80px;");
- client->println("text-decoration: none; font-size: 60px; margin: 10px;}");
- client->println(".button2 {background-color: #ff4000;}</style></head>");
- client->println("<body><h1><b>ESP8266 - Arduino - Relay Control</b></h1>");
- displayBtnOnWebPage(client, output1State, "GPIO 1", "1");
- displayBtnOnWebPage(client, output2State, "GPIO 2", "2");
- displayBtnOnWebPage(client, output3State, "GPIO 3", "3");
- displayBtnOnWebPage(client, output4State, "GPIO 4", "4");
- displayBtnOnWebPage(client, output5State, "GPIO 5", "5");
- client->println();
- }
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.