Skip to content

Instantly share code, notes, and snippets.

@argrento
Last active October 14, 2016 12:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save argrento/dd2764e9f1da307e9534b5596f65f7fa to your computer and use it in GitHub Desktop.
Save argrento/dd2764e9f1da307e9534b5596f65f7fa to your computer and use it in GitHub Desktop.
#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