-
-
Save argrento/dd2764e9f1da307e9534b5596f65f7fa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Arduino.h> | |
#include <ESP8266WiFi.h> | |
#include <WiFiClient.h> | |
#include <ESP8266WebServer.h> | |
#include <ESP8266mDNS.h> | |
#include <SoftwareSerial.h> | |
#include <SPI.h> | |
#include <Adafruit_GFX.h> | |
#include <Adafruit_PCD8544.h> | |
#include "string.h" | |
// Пины, к которым подключается экран | |
#define DISPLAY_SCLK_PIN D1 | |
#define DISPLAY_DIN_PIN D5 | |
#define DISPLAY_DC_PIN D6 | |
#define DISPLAY_CS_PIN D8 | |
#define DISPLAY_RST_PIN D7 | |
// Параметры сети для подключения esp8266 | |
const char* ssid = "testtest"; | |
const char* password = "testtest123"; | |
MDNSResponder mdns; | |
ESP8266WebServer server(80); | |
// Состояния светодиодов | |
bool led1State = false; | |
bool led2State = false; | |
Adafruit_PCD8544 display = Adafruit_PCD8544(DISPLAY_SCLK_PIN, DISPLAY_DIN_PIN, | |
DISPLAY_DC_PIN, DISPLAY_CS_PIN, DISPLAY_RST_PIN); | |
// Веб-страница с кнопками и состоянием светодиодов | |
String mainPage = "<html>" | |
"<form action=\"/ledControl\" method=\"GET\">" | |
"<button name=\"led\" type=\"submit\" value=\"led1_on\">Switch on led 1!</button>" | |
"<button name=\"led\" type=\"submit\" value=\"led1_off\">Switch off led 1!</button><br>" | |
"<button name=\"led\" type=\"submit\" value=\"led2_on\">Switch on led 2!</button>" | |
"<button name=\"led\" type=\"submit\" value=\"led2_off\">Switch off led 2!</button><br>" | |
"</form>" | |
"<br><br>Led 1 is _LED_1_STATE_, led 2 is _LED_2_STATE_." | |
"</html>" | |
"</body>"; | |
// Функция для настройки дисплея | |
void setupDisplay(void) { | |
display.begin(); | |
display.setContrast(50); | |
display.setRotation(2); // Всилу специфики моего экрана, необходимо повернуть изображение | |
display.clearDisplay(); | |
display.setTextSize(1); | |
display.setTextColor(BLACK); | |
showStatus("Disconnected", led1State, led2State); | |
} | |
// Отображение на экране статуса подключения и состояний светодиодов на дисплее | |
void showStatus(String topMessage, bool led1State, bool led2State) { | |
display.clearDisplay(); | |
display.setCursor(0,0); | |
display.println(topMessage); | |
display.setCursor(0, 20); | |
display.println(F("LED1 LED2")); | |
display.setCursor(0, 30); | |
led1State?display.print("ON"):display.print("OFF"); | |
display.setCursor(48, 30); | |
led2State?display.print("ON"):display.print("OFF"); | |
display.display(); | |
} | |
// Преобразование ip-адреса из массива в строку для более красивого отображения | |
// на экране | |
String ipToString(const IPAddress& ipAddress) { | |
return String(ipAddress[0]) + String(".") +\ | |
String(ipAddress[1]) + String(".") +\ | |
String(ipAddress[2]) + String(".") +\ | |
String(ipAddress[3]) ; | |
} | |
// Сохраняем на веб-странице состояние каждого светодиода | |
String formatWebPage(String page, bool led1State, bool led2State) { | |
String newPage = page; | |
newPage.replace("_LED_1_STATE_", led1State?"ON":"OFF"); | |
newPage.replace("_LED_2_STATE_", led2State?"ON":"OFF"); | |
return newPage; | |
} | |
void handleRoot() { | |
server.send(200, "text/html", formatWebPage(mainPage, led1State, led2State)); | |
} | |
void setup(void){ | |
Serial.begin(115200); | |
WiFi.begin(ssid, password); | |
Serial.println(""); | |
setupDisplay(); | |
// Ждём соединения | |
while (WiFi.status() != WL_CONNECTED) { | |
delay(500); | |
Serial.print("."); | |
} | |
// Выводим данные подключения в консоль | |
Serial.println(""); | |
Serial.print(F("Connected to ")); | |
Serial.println(ssid); | |
Serial.print(F("IP address: ")); | |
Serial.println(WiFi.localIP()); | |
showStatus(ipToString(WiFi.localIP()), led1State, led2State); | |
if (mdns.begin("esp8266", WiFi.localIP())) { | |
Serial.println(F("MDNS responder started")); | |
} | |
server.on("/", handleRoot); | |
// При нажатии на какую-либо из кнопок на веб-странице, браузер посылает | |
// esp8266 get-запрос в виде ip/ledControl?led=state, где параметр state -- | |
// новое состояние одного из светодиодов. | |
server.on("/ledControl", []() { | |
String state=server.arg("led"); | |
if (state == "led1_on") { | |
led1State = true; | |
} else if (state == "led1_off") { | |
led1State = false; | |
} else if (state == "led2_on") { | |
led2State = true; | |
} else if (state == "led2_off") { | |
led2State = false; | |
}; | |
// Изменяем информацию на дисплее | |
showStatus(ipToString(WiFi.localIP()), led1State, led2State); | |
// Поскольку запрос GET, то браузер ожидает ответа от esp8266 | |
server.send(200, "text/html", formatWebPage(mainPage, led1State, led2State)); | |
}); | |
server.onNotFound(handleRoot); | |
server.begin(); | |
Serial.println("HTTP server started"); | |
} | |
void loop(void){ | |
server.handleClient(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment