ESP8266 WiFi OneWire AP Client Server HTML Scheme Eagle DS18B20 Thermometer

Термометр Wi-Fi в режиме STA / AP с ESP8266


  • В термометре используется плата Wi-Fi ESP8266 версии 12E на плате разработки NodeMCU v3 Lolin. Чип Wifi, в дополнение к получению данных от датчиков температуры, также содержит веб-сервер, на котором он считывает измеренные данные. Данные всегда измеряются при загрузке страницы. Данные о неактивности не записываются. Веб-сервер позволяет запускать код HTML + CSS, который позволяет каким-то образом создать красивый графический интерфейс для отображения температуры для пользователя, например, в таблице.
  •   
  • Существует две версии этого проекта, и функциональность веб-сайта одинакова. В обоих случаях ESP8266 запускает веб-сервер, который отображает температуру в таблице. Версии отличают связь. В одном случае можно использовать уже существующую сеть LAN, к которой плата подключается и поддерживает веб-сервер на статическом или динамическом IP-адресе. Когда вы вводите IP-адрес в окне браузера, пользователь может получить доступ к нужной странице из ESP с температурой, или даже имя хоста - имя домена также можно использовать при использовании mDNS.
  • В последнем случае плата отправляет свой собственный SSID в режиме AP в качестве точки доступа. Пользователь получает доступ к плате, вводя пароль в сеть (входит в ESP8266). Плата передает SSID с шифрованием WPA / WPA2 PSK или через открытую сеть Wi-Fi. Данные доступны только в пределах досягаемости этой сети Wi-Fi за пределами локальной сети домашней сети. ESP также запускает DHCP-сервер, который после успешной аутентификации пользователя назначает IP-адрес из диапазона. Веб-страница находится на IP-адресе шлюза - ESP.
  • Данные о температуре записываются с пары датчиков температуры DS18B20, которые подключены к шине OneWire, что позволяет собирать данные по одному проводу с возможностью перемещения драйвера на расстояние от десяти до сотен метров. DS18B20 выпускаются в двух основных вариантах - внутренний датчик в транзисторной упаковке или водонепроницаемый - внешний дизайн в алюминиевой трубке. Шина OneWire подходит для помех, и к ней можно подключить до 2 56 датчиков. Отдельные датчики делятся по заводскому адресу - серийному номеру. Есть 2 основных варианта подключения датчиков. Нормальное и паразитное соединение, в обоих может быть подано напряжение 3,3 - 5,5 В. При нормальной проводке результат будет более надежным для больших расстояний.
  • Различия уже видны из схемы:
    Параметры проекта:
  • NodeMCU в задаче точки доступа (AP) или в качестве клиента в вашей локальной сети
  • Пользовательское шифрование SSID и WPA2 PSK или без шифрования
  • Пользовательский IP-адрес (статический), разверните флаг DNS
  • Безопасная сеть, доступная через сеть ESP, и ее доступ с адаптивным дизайном
  • Когда страница загружает текущую информацию
  • Другие возможные варианты:

    Исходный код для ESP8266 - открытая сеть Wi-Fi - AP

    ESP8266 + DS18B20 WiFi teplomer - WPA/WPA2 PSK Client - Webserver:

    /*|---------------------------------|*/
    /*|Projekt: WiFi teplomer - ESP8266 |*/
    /*|Autor: Martin Chlebovec          |*/
    /*|E-mail: martinius96@gmail.com    |*/
    /*|Web: https://arduino.php5.sk     |*/
    /*|Licencia pouzitia: MIT           |*/
    /*|---------------------------------|*/
    
    #include <ESP8266WiFi.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #define ONE_WIRE_BUS 2
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    const char* ssid  = "MenoWifi";
    const char* password = "Heslo";
    WiFiServer server(80);
    String header;
    
    void setup() {
      Serial.begin(115200);
      Serial.println(ip);
      Serial.print("Connecting to ");
      Serial.println(ssid);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("WiFi connected.");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      server.begin();
    }
    
    void loop(){
      WiFiClient client = server.available();
      if (client) {
        sensors.begin(); 
        sensors.requestTemperatures();  
        String currentLine = "";
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();           
            header += c;
            if (c == '\n') { 
              if (currentLine.length() == 0) {
                client.println("HTTP/1.1 200 OK");
                client.println("Content-type:text/html");
                client.println("Connection: close");
                client.println();
                client.println("<head><meta charset='UTF-8'><meta name='author' content='Martin Chlebovec'><meta name='viewport' content='width=device-width, initial-scale=1.0'></head><style>body{  display: table;width: 100%;background: #dedede;text-align: center;}*{ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */-moz-box-sizing: border-box;    /* Firefox, other Gecko */box-sizing: border-box;         /* Opera/IE 8+ */}.aa_h2{  font:100 5rem/1 Roboto;  text-transform: uppercase;}table{   background: #fff;}table,thead,tbody,tfoot,tr, td,th{  text-align: center;  margin: auto;  border:1px solid #dedede;  padding: 1rem;  width: 50%;}.table    { display: table; width: 50%; }.tr       { display: table-row;  }.thead    { display: table-header-group }.tbody    { display: table-row-group }.tfoot    { display: table-footer-group }.col      { display: table-column }.colgroup { display: table-column-group }.td, .th   { display: table-cell; width: 50%; }.caption  { display: table-caption }.table,.thead,.tbody,.tfoot,.tr,.td,.th{ text-align: center; margin: auto; padding: 1rem;}.table{  background: #fff;  margin: auto;  border:none;  padding: 0; margin-bottom: 5rem;}.th{font-weight: 700;border:1px solid #dedede;&:nth-child(odd){border-right:none;}}.td{font-weight: 300;border:1px solid #dedede;border-top:none;&:nth-child(odd){border-right:none;}}.aa_htmlTable{background: tomato;padding: 5rem;display: table;width: 100%;height: 100vh;vertical-align: middle;}.aa_css{background: skyblue;padding: 5rem;display: table;width: 100%;height: 100vh;vertical-align: middle;}.aa_ahmadawais{display: table;width: 100%;font: 100 1.2rem/2 Roboto;margin: 5rem auto;}</style><div class='aa_htmlTable'><table width=100%><thead><tr><th>Teplota</th><th>Hodnota</th></tr></thead><tbody><tr><td>Dnu</td><td>"+(String)sensors.getTempCByIndex(0)+" °C</td></tr><tr><td>Von</td><td>"+(String)sensors.getTempCByIndex(1)+" °C</td></tr></tbody></table></div>");
                client.println();
                break;
              }else { // if you got a newline, then clear currentLine
                currentLine = "";
              }
              }else if (c != '\r') {  // if you got anything else but a carriage return character,
                currentLine += c;      // add it to the end of the currentLine
              }
            }
          }
      header = "";
      client.stop();
      Serial.println("");
      }
    }
    

    Schéma

    Schéma - WiFi teplomer - ESP8266

    Termostat - Tester - Offline

    //Projekt: Minimálna implementácia - termostat
    //Autor: Martin Chlebovec
    //Hardver: Arduino Uno + DS18B20 (1x OneWire bus)
    //Revizia: 23. Mar. 2020
    
    #include <OneWire.h>
    #include <DallasTemperature.h>
    
    #define ONE_WIRE_BUS 5 //datovy vovod OneWire zbernica na pin D5
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensorsA(&oneWire);
    float nastavena_teplota = 24.50;
    float hystereza = 0.50;
    //float hystereza2 = 0.50;
    const int rele = 6;
    //const int rele2 = 7;
    unsigned long timer = 0;
    unsigned long interval = 15000; //ako casto chceme logiku spustit --> v ms (milisekundy)
    void setup() {
      sensorsA.begin();
      Serial.begin(115200);
      Serial.println("UART ready");
      pinMode(rele, OUTPUT);
      // pinMode(rele2, OUTPUT);
    }
    
    void loop() {
      if ((millis() - timer) >= interval || timer == 0) {
        timer = millis();
        sensorsA.requestTemperatures();
        delay(2000); //cakame na teploty
        float  teplota1 = sensorsA.getTempCByIndex(0);
        //float  teplota2 = sensorsA.getTempCByIndex(1);
        float rozdiel = nastavena_teplota - teplota1;
        if (rozdiel > hystereza) {
          digitalWrite(rele, HIGH); //zopnutie rele
          Serial.println("Rele bolo zopnute - Vystup aktivny");
        } else if (rozdiel < (-1 * hystereza)) {
          digitalWrite(rele, LOW); //rozopnutie rele
          Serial.println("Rele bolo rozopnute - Vystup neaktivny");
        }
    
        /*
          float rozdiel2 = nastavena_teplota2 - teplota2;
          if (rozdiel2 > hystereza2) {
          digitalWrite(rele2, HIGH); //zopnutie rele
          } else if (rozdiel2 < (-1 * hystereza2)) {
          digitalWrite(rele2, LOW); //rozopnutie rele
          }
        */
      }
    }