Ethernet Web Server
Управление светодиодом при нажатии кнопки on/off (вводе разных URL адресов) в браузере
Адрес включения светодиода:
IP-АДРЕС - тот IP, полученный при запуске примера DhcpAdressPrinter
http://IP-АДРЕС/$1
Для того, чтобы выключить:
http://IP-АДРЕС/$2
*/
#include <SPI.h> //библиотека для работы с SPI
#include <Ethernet.h> //библиотека для работы с Ethernet
#include <Base64.h>
boolean newInfo = 0; //переменная для новой информации
//MAC адрес вашего Ethernet-модуля, если его у вас нет, введите любой
//или оставьте тот, что в примере
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//указываем IP адрес
//будьте внимательны! IP адрес указывается тот, который вы получили запустив пример DhcpAdressPrinter
IPAddress ip(192,168,100,177); //пример МОЕГО IP адреса, вы вводите сюда СВОЙ
//инифиализация библиотеки Ethernet server library
EthernetServer server(80);
void setup()
{
pinMode(8, OUTPUT); //инициализируем 8 пин как выход для светодиода
pinMode(7, OUTPUT); //инициализируем 7 пин как выход для светодиода
//запускаем сервер с указанными ранее MAC и вашим IP
Ethernet.begin(mac, ip);
server.begin();
Serial.begin(9600);
}
void loop()
{
//принимаем данные, посылаемые клиентом
EthernetClient client = server.available();
if(client){ //если запрос оканчивается пустой строкой
boolean currentLineIsBlank = true; //ставим метку об окончании запроса (дословно: текущая линия чиста)
while (client.connected()) { //пока есть соединение с клиентом
if (client.available()) { //если клиент активен
char c = client.read(); //считываем посылаемую информацию в переменную "с"
if(newInfo && c == ' '){ //если переменная новой информации = 1 и "с", в которой записан запрос, равен пустой строке
newInfo = 0; //то обнуляем переменную поступления новой информации
}
if(c == '$'){ //если переменная "с", несущая отправленный нам запрос, содержит символ $
//(все новые запросы) - "$" подразумевает разделение получаемой информации (символов)
newInfo = 1; //то пришла новая информация, ставим метку новой информации в 1
}
/************************************************************************************************
Примечание:
Символ $ используется как обычный символ, который разделяет 1 от 2
На практике применяют символ &, который разделяет новые переменные от последующих
Это использьуется, например, в GET-запросах, которые выглядят подобным образом:
client.print("GET /controlbar/wp-content/data.php?uid=" + ID + "&type=" + type + "&value=" + value);
как видите, знак & разделяет значение переменной - ID и переменную type
***************************************************************************************************/
//Проверяем содержание URL - присутствует $1 или $2
if(newInfo == 1){ //если есть новая информация
Serial.println(c);
if(c == '1'){ //и "с" содержит 1
Serial.println("ON");
digitalWrite(8, HIGH); //то зажигаем светодиод на 8 пине
}
if(c == '2'){ //если "с" содержит 2
Serial.println("OFF");
digitalWrite(8, LOW); //гасим светодиод на 8 пине
}
}
//Проверяем содержание URL - присутствует $1 или $2
if(newInfo == 1){ //если есть новая информация
Serial.println(c);
if(c == '3'){ //и "с" содержит 1
Serial.println("ON");
digitalWrite(7, HIGH); //то зажигаем светодиодна 7 пине
}
if(c == '4'){ //если "с" содержит 2
Serial.println("OFF");
digitalWrite(7, LOW); //гасим светодиодна 7 пине
}
}
if (c == '\n') { //если "с" равен символу новой строки
currentLineIsBlank = true; //то начинаем новую строку
}
else if (c != '\r') { //иначе, если "с" не равен символу возврата курсора на начало строки
currentLineIsBlank = false; //то получаем символ на текущей строке
}
if (c == '\n' && currentLineIsBlank) { //выводим HTML страницу
client.println("HTTP/1.1 200 OK"); //заголовочная информация
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 30"); //автоматическое обновление каждые 30 сек
client.println();
client.println("<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN"">"); //HTML тип документа
client.println("<html><head>"); //открытие тега HTML
client.println("<META content=""text/html; charset=utf-8"" http-equiv=""Content-Type"">");
client.print("<title>My web Server</title>"); //название страницы
client.print("<H1>Мой веб сервер</H1>"); //заголовок на странице
client.print("<a href=\"/$1\"><button><h3>Включить1</h3></button></a>"); //кнопка включить 8 пин
client.print(" "); // добавляем 5 пробелов между кнопками,( - один пробел)
client.print("<a href=\"/$2\"><button><h3>Выключить1</h3></button></p>"); //кнопка выключить 8 пин, в конце поставлен атрибут параграфа </p>, который переносит текст на следующую строку.
client.print("<a href=\"/$3\"><button><h3>Включить2</h3></button></a>"); //кнопка включить 7 пин
client.print(" "); // добавляем 5 пробелов между кнопками,( - один пробел)
client.print("<a href=\"/$4\"><button><h3>Выключить2</h3></button></a>"); //кнопка выключить 7 пин
client.println("<br />");
client.println("</html>"); //закрываем тег HTML
break; //выход
}
}
}
delay(1); //время на получение новых данных
client.stop(); //закрываем соединение
}
}
/*
Ethernet Web Server
Управление светодиодом при нажатии кнопки on/off (вводе разных URL адресов) в браузере
Адрес включения светодиода:
IP-АДРЕС - тот IP, полученный при запуске примера DhcpAdressPrinter
Для того, чтобы выключить:
http://IP-АДРЕС/$2
*/
#include <SPI.h> //библиотека для работы с SPI
#include <Ethernet.h> //библиотека для работы с Ethernet
#include <Base64.h>
/*
Настройки сети
*/
boolean newInfo = 0; //переменная для новой информации
//MAC адрес вашего Ethernet-модуля, если его у вас нет, введите любой
//или оставьте тот, что в примере
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//указываем IP адрес
//будьте внимательны! IP адрес указывается тот, который вы получили запустив пример DhcpAdressPrinter
IPAddress ip(192, 168, 100, 177);
EthernetServer server(80); //инифиализация библиотеки Ethernet server library
String readString; // Буфер для данных от пользователя Web сервера
void setup()
{
pinMode(8, OUTPUT); //инициализируем 8 пин как выход для светодиода
pinMode(7, OUTPUT); //инициализируем 7 пин как выход для светодиода
Serial.begin(9600);
// Поднимаем сеть
Ethernet.begin(mac, ip);
server.begin();
Serial.println(Ethernet.localIP());
}
void loop() {
EthernetClient client = server.available();
if(client){ //если запрос оканчивается пустой строкой
boolean currentLineIsBlank = true; //ставим метку об окончании запроса (дословно: текущая линия чиста)
while (client.connected()) { //пока есть соединение с клиентом
if (client.available()) { //если клиент активен
char c = client.read(); //считываем посылаемую информацию в переменную “с”
readString += c;
if(newInfo && c == ' '){ //если переменная новой информации = 1 и "с", в которой записан запрос, равен пустой строке
newInfo = 0; //то обнуляем переменную поступления новой информации
}
if(c == '$'){ //если переменная "с", несущая отправленный нам запрос, содержит символ $
newInfo = 1; //(все новые запросы) - "$" подразумевает разделение получаемой информации (символов)
} //то пришла новая информация, ставим метку новой информации в 1
/************************************************************************************************
Примечание:
Символ $ используется как обычный символ, который разделяет 1 от 2
На практике применяют символ &, который разделяет новые переменные от последующих
Это использьуется, например, в GET-запросах, которые выглядят подобным образом:
client.print(“GET /controlbar/wp-content/data.php?uid=” + ID + “&type=” + type + “&value=” + value);
как видите, знак & разделяет значение переменной - ID и переменную type
***************************************************************************************************/
//Проверяем содержание URL - присутствует $1 или $2
if(newInfo == 1){ //если есть новая информация
Serial.println(c);
if(c == '1'){ //и "с" содержит 1
Serial.println("ON");
digitalWrite(8, HIGH); //то зажигаем светодиод на 8 пине
}
if(c == '2'){ //если "с" содержит 2
Serial.println("OFF");
digitalWrite(8, LOW); //гасим светодиод на 8 пине
}
}
//Проверяем содержание URL - присутствует $1 или $2
if(newInfo == 1){ //если есть новая информация
Serial.println(c);
if(c == '3'){ //и "с" содержит 3
Serial.println("ON");
digitalWrite(7, HIGH); //то зажигаем светодиод на 8 пине
}
if(c == '4'){ //если "с" содержит 4
Serial.println("OFF");
digitalWrite(7, LOW); //гасим светодиод на 8 пине
}
}
if (c == ‘\n’ && currentLineIsBlank) {
if (readString.lastIndexOf(F(“Authorization: Basic Tmljb2xhaV82MzpOaU5hRXY3NTMx”))>-1) {
if (readString.lastIndexOf(F(“GET /favicon.ico”))>-1)
{
client.println(F(“HTTP/1.0 404 Not Found”));
}
else {
client.println(F("HTTP/1.0 200 OK"));
client.println(F("Content-Type: text/html"));
client.println(F("Pragma: no-cache\r\nRefresh: 30\r\n"));
client.print(F("<title>My web Server</title>")); //название страницы
client.print(F("<H1>Мой веб сервер</H1>")); //заголовок на странице
client.println(F("<META content=""text/html; charset=utf-8"" http-equiv=""Content-Type"">"));
client.print(F("Yandex Яндекс <a href=\"https://esp8266.ru\">esp8266.ru</p>"));
client.println(F("</body></html>"));
client.print(F("<a href=\"/$1\"><button><h3>Включить1</h3></button></a>")); //кнопка включить 8 пин
client.print(F(" ")); // добавляем 5 пробелов между кнопками,( - один пробел)
client.print(F("<a href=\"/$2\"><button><h3>Выключить1</h3></button></p>")); //кнопка выключить 8 пин, в конце поставлен атрибут параграфа </p>, который переносит текст на следующую строку.
client.print(F("<a href=\"/$3\"><button><h3>Включить2</h3></button></a>")); //кнопка включить 7 пин
client.print(F(" ")); // добавляем 5 пробелов между кнопками,( - один пробел)
client.print(F("<a href=\"/$4\"><button><h3>Выключить2</h3></button></a>")); //кнопка выключить 7 пин
}
}
else {
client.println(F("HTTP/1.0 401 Unauthorized"));
client.println(F("WWW-Authenticate: Basic realm=\"esp8266.ru\""));
}
break;
}
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
readString = "";
client.stop();
}
}