Демонстрационный стенд Wi-Fi Web-сервера на примере NodeMCU.
На стенде реализовано:
На стенде реализовано:
0. Поднят Web-сервер (NodeMcu в режиме клиента подключается к домашней Wi-Fi сети)
1. Управление светодиодами (включение/выключение 3-х светодиодов)
2. Отображение состояния (включено/выключено) для каждого из 3-х светодиодов
3. Включение/выключение 2-х реле
4. Отображение состояния (включено/выключено) для каждого из 2-х реле
5. Отображение температуры с 2-х датчиков DS18b20 по шине 1-Wire
6. Подсчет средней температуры
7. Вывод времени работы (дней/часов/минут/секунд) демонстрационного стенда с момента включения (uptime)
8. Упрощен запрос и вывод температуры
На стенде присутствуют:2. Отображение состояния (включено/выключено) для каждого из 3-х светодиодов
3. Включение/выключение 2-х реле
4. Отображение состояния (включено/выключено) для каждого из 2-х реле
5. Отображение температуры с 2-х датчиков DS18b20 по шине 1-Wire
6. Подсчет средней температуры
7. Вывод времени работы (дней/часов/минут/секунд) демонстрационного стенда с момента включения (uptime)
8. Упрощен запрос и вывод температуры
Модуль NodeMcu v1.0 - 1 шт.
2-х канальный реле-модуль - 1 шт.
Светодиоды - 3 шт.
Постоянный резистор на 220 Ом (для ограничения тока на светодиоде) - 3 шт.
Датчик температуры DS18b20 - 2 шт.
Постоянный резистор на 4,7 КОм (как подтягивающий резистор на DS18b20) - 1 шт.
Светодиоды подключены к пинам D2, D3 и D4 на NodeMcu через токоограничивающие резисторы на 220 Ом.
Реле модуль подключен к пинам D5 и D6 (IN1 и IN2 соответственно).Два температурных датчика DS18B20 подключены по протоколу 1-Wire на пин D1 NodeMcu, по схеме нормального подключения из DataSheet.
Схема нормального подключения DS18B20 |
Обратите внимание распиновка температурных датчиков может отличаться от указанной на схеме. Например, мои датчики имеют обратную распиновку относительно среза на одной стороне датчика.
Код скетча в Arduino IDE:
//Подключение необходимых библиотек
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//набор переменных для подсчета uptime
long secs, mins;
int hours, days;
//параметры для подключения к Wi-Fi сети
MDNSResponder mdns;
const char* ssid = "Your-SSID"; //Ввести SSID "домашней" WiFi сети
const char* password = "Passw0rd"; //Ввести ключ "домашней" WiFi сети
IPAddress ip(192, 168, 1, 100); //IP-адрес
IPAddress gateway(192, 168, 1, 1); //Шлюз
IPAddress subnet(255, 255, 255, 0); //Маска подсети
//параметры Web-сервера
ESP8266WebServer server(80); //Web-сервер будет работать на 80 порту
//пины LED
#define D2 2 //Светодиод 1 на пине D2
#define D3 3 //Светодиод 2 на пине D3
#define D4 4 //Светодиод 3 на пине D4 (при выключении зажигается LED на плате NodeMcu и наоборот)
//пины реле-модуля
#define D5 5 //IN1 реле на D5
#define D6 6 //IN2 реле на D6
//############### Параметры темпераратурных датчиков ###############
//адреса моих термометров
DeviceAddress Term01 = {0x28, 0xFF, 0x2E, 0x6E, 0xA3, 0x16, 0x03, 0x21};
DeviceAddress Term02 = {0x28, 0xFF, 0xC3, 0x94, 0xA4, 0x16, 0x05, 0xDA};
//пин на котором "висят" температурные датчики по 1-Wire
OneWire oneWire(D1);
DallasTemperature sensors (&oneWire);
//##################################################################
//Запускается один раз при загрузке
void setup(void) {
//Подготовка пинов
//для светодиодов
pinMode(D2, OUTPUT);
digitalWrite(D2, LOW);
pinMode(D3, OUTPUT);
digitalWrite(D3, LOW);
pinMode(D4, OUTPUT);
digitalWrite(D4, LOW);
//для реле
pinMode(D5, OUTPUT);
digitalWrite(D5, LOW);
pinMode(D6, OUTPUT);
digitalWrite(D6, LOW);
delay(100);
Serial.begin(115200);
WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet);
Serial.println("");
//ожидание соединений
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (mdns.begin("esp8266", WiFi.localIP())) {
Serial.println("MDNS responder started");
}
//############### Инициализация температурных датчиков ###############
sensors.begin();
//####################################################################
//############### Светодиод 1 ###############
server.on("/", []() {
server.send(200, "text/html", webPage());
});
server.on("/socket1On", []() {
digitalWrite(D2, HIGH);
server.send(200, "text/html", webPage());
delay(100);
});
server.on("/socket1Off", []() {
digitalWrite(D2, LOW);
server.send(200, "text/html", webPage());
delay(100);
});
//########################################
//############### Светодиод 2 ###############
server.on("/", []() {
server.send(200, "text/html", webPage());
});
server.on("/socket4On", []() {
digitalWrite(D3, HIGH);
server.send(200, "text/html", webPage());
delay(100);
});
server.on("/socket4Off", []() {
digitalWrite(D3, LOW);
server.send(200, "text/html", webPage());
delay(100);
});
//########################################
//############### Светодиод 3 ###############
server.on("/", []() {
server.send(200, "text/html", webPage());
});
server.on("/socket5On", []() {
digitalWrite(D4, HIGH);
server.send(200, "text/html", webPage());
delay(100);
});
server.on("/socket5Off", []() {
digitalWrite(D4, LOW);
server.send(200, "text/html", webPage());
delay(100);
});
//########################################
//############### Реле - IN1 ###############
server.on("/socket2On", []() {
digitalWrite(D5, HIGH);
server.send(200, "text/html", webPage());
delay(100);
});
server.on("/socket2Off", []() {
digitalWrite(D5, LOW);
server.send(200, "text/html", webPage());
delay(100);
});
//########################################
//############### Реле - IN2 ###############
server.on("/socket3On", []() {
digitalWrite(D6, HIGH);
server.send(200, "text/html", webPage());
delay(100);
});
server.on("/socket3Off", []() {
digitalWrite(D6, LOW);
server.send(200, "text/html", webPage());
delay(100);
});
//########################################
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
server.handleClient();
//########### Запрос температуры ###############
sensors.requestTemperatures();
//##############################################
//########### Пересчет millis для uptime ###############
secs = millis() / 1000;
mins = secs / 60;
hours = mins / 60;
days = hours / 24;
secs -= mins * 60;
mins -= hours * 60;
hours -= days * 24;
//######################################################
}
String webPage()
{
String web;
//Выводим заголовок вкладки
web += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/> <meta charset=\"utf-8\"><title>Web Server</title><style>button{color:red;padding: 10px 27px;}</style></head>";
//Выводим название страницы
web += "<h1 style=\"text-align: center;font-family: Open sans;font-weight: 100;font-size: 20px;\">Демонстрационный стенд: NodeMcu v3 + Web Server</h1><div>";
//Содержимое страницы
web += "<p style=\"text-align: left;margin-top: 0px;margin-bottom: 5px;\">Температура с датчиков DS18b20</p>";
web += "<p style=\"text-align: left;margin-top: 0px;margin-bottom: 5px;\">Датчик 1: " + String(sensors.getTempC (Term01)) + " °C</p>";
web += "<p style=\"text-align: left;margin-top: 0px;margin-bottom: 5px;\">Датчик 2: " + String(sensors.getTempC (Term02)) + " °C</p>";
web += "<p style=\"text-align: left;margin-top: 0px;margin-bottom: 5px;\">Средняя температура по датчикам: " + String((sensors.getTempC (Term01) + sensors.getTempC (Term02)) / 2) + " °C</p>";
web += "<p style=\"text-align: left;margin-top: 0px;margin-bottom: 5px;\">Время работы: " + String(days) + " дней " + String(hours) + " час. " + String(mins) + " мин. " + String(secs) + " сек. </p>";
//Блоки для перехода по ссылкам
//############### Светодиод 1 ###############
web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">[Светодиод 1]</p>";
if (digitalRead(D2) == 1)
{
web += "<div style=\"text-align: center;width: 98px;color:black ;padding: 10px 30px;background-color: #FFEB3B;margin: 0 auto;\">ВКЛ</div>";
}
else
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #000000;margin: 0 auto;\">ВЫКЛ</div>";
}
web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket1On\"><button>ВКЛ</button></a> <a href=\"socket1Off\"><button>ВЫКЛ</button></a></div>";
//########################################
//############### Светодиод 2 ###############
web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">[Светодиод 2]</p>";
if (digitalRead(D3) == 1)
{
web += "<div style=\"text-align: center;width: 98px;color:black ;padding: 10px 30px;background-color: #FFEB3B;margin: 0 auto;\">ВКЛ</div>";
}
else
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #000000;margin: 0 auto;\">ВЫКЛ</div>";
}
web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket4On\"><button>ВКЛ</button></a> <a href=\"socket4Off\"><button>ВЫКЛ</button></a></div>";
//########################################
//############### Светодиод 3 ###############
web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">[Светодиод 3]</p>";
if (digitalRead(D4) == 1)
{
web += "<div style=\"text-align: center;width: 98px;color:black ;padding: 10px 30px;background-color: #FFEB3B;margin: 0 auto;\">ВКЛ</div>";
}
else
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #000000;margin: 0 auto;\">ВЫКЛ</div>";
}
web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket5On\"><button>ВКЛ</button></a> <a href=\"socket5Off\"><button>ВЫКЛ</button></a></div>";
//########################################
web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">________________________________</p>";
//############### Реле - IN1 ###############
web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">[Реле 1]</p>";
if (digitalRead(D5) == 1)
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #8bc34a;margin: 0 auto;\">ВКЛ</div>";
}
else
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ff5722;margin: 0 auto;\">ВЫКЛ</div>";
}
web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket2On\"><button>ВКЛ</button></a> <a href=\"socket2Off\"><button>ВЫКЛ</button></a></div>";
//########################################
//############### Реле - IN2 ###############
web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">[Реле 2]</p>";
if (digitalRead(D6) == 0)
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #8bc34a;margin: 0 auto;\">ВЫКЛ</div>";
}
else
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ff5722;margin: 0 auto;\">ВКЛ</div>";
}
web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket3On\"><button>ВКЛ</button></a> <a href=\"socket3Off\"><button>ВЫКЛ</button></a></div>";
//########################################
//############### Кнопка обновить ###############
web += "<div style=\"text-align:center;margin-top: 20px;\"><a href=\"/\"><button style=\"width:158px;\">Обновить</button></a></div>";
//###############################################
web += "</div>";
return (web);
}
Все микроконтроллеры беру тут.
Комментариев нет:
Отправить комментарий