Страницы

31 мая 2017 г.

NodeMcu. Wi-Fi Web-сервер. Демонстрационный стенд

Демонстрационный стенд 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. Упрощен запрос и вывод температуры
На стенде присутствуют:
Модуль 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>&nbsp;<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>&nbsp;<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>&nbsp;<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>&nbsp;<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>&nbsp;<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);
}


Все микроконтроллеры беру тут.

Комментариев нет:

Отправить комментарий