Mega + enc28j60, как обработать нажатие из браузера?

Тема в разделе "Arduino & Shields", создана пользователем hypersash, 28 окт 2015.

  1. hypersash

    hypersash Нуб

    Всем доброго времени суток! Имею Mega2560 и Ethernet shield enc28j60, был рабочий код на библиотеках "etherShield.h" и "ETHER_28J60.h", в силу надобности авторизации для доступа из интернета перешел на библиотеку <UIPEthernet.h>. Пытаюсь перенести старый код на новую либу, но не могу разобраться как обрабатывать нажатия кнопок в браузере.

    Старый рабочий код:
    Код (C++):
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include "etherShield.h"
    #include "ETHER_28J60.h"

    LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    #define ONE_WIRE_BUS 2
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);



    static uint8_t mac[6] = {0x52, 0x55, 0x58, 0x11, 0x22, 0x29};   // this just needs to be unique for your network,
                                                             
    static uint8_t ip[4] = {192, 168, 0, 109};                       // the IP address for your board. Check your home hub

    static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP

    ETHER_28J60 ethernet;

    int brightness = 3;
    int a = 255;

    void setup()
    {
      pinMode(40, OUTPUT);                           // realy
    pinMode(brightness, OUTPUT);              // lcd brightness
    pinMode(13, OUTPUT);                          //requests vizualization
      ethernet.setup(mac, ip, port);
      lcd.begin(20,4);
      analogWrite(brightness, a);
      digitalWrite(40, HIGH);
    }

    void loop()
    {
      sensors.requestTemperatures();
      lcd.setCursor(0,0);
      lcd.print("bT1=");
      lcd.setCursor(4,0);
      lcd.print(sensors.getTempCByIndex(0));
      lcd.setCursor(11,0);
      lcd.print("bT2=");
      lcd.setCursor(15,0);
      lcd.print(sensors.getTempCByIndex(2));
      lcd.setCursor(0,1);
      lcd.print("pT1=");
      lcd.setCursor(4,1);
      lcd.print(sensors.getTempCByIndex(3));
      lcd.setCursor(11,1);
      lcd.print("pT2=");
      lcd.setCursor(15,1);
      lcd.print(sensors.getTempCByIndex(1));

    if (digitalRead (40) == LOW)
        {lcd.setCursor(0,3);
        lcd.print("Realy is ON ");}
        else
        {lcd.setCursor(0,3);
        lcd.print("Realy is OFF"); }

      char* params;
      if (params = ethernet.serviceRequest())
     
      { digitalWrite(13, HIGH);

        ethernet.print("<H2>Температура датчика 1 на плате = ");
        ethernet.print(sensors.getTempCByIndex(0));
        ethernet.print("C°");
        ethernet.print("<br><H2>Температура датчика 2 на плате = ");
        ethernet.print(sensors.getTempCByIndex(2));
        ethernet.print("C°");
        ethernet.print("<br><H2>Температура внешнего датчика 1 = ");
        ethernet.print(sensors.getTempCByIndex(3));
        ethernet.print("C°");
        ethernet.print("<br><H2>Температура внешнего датчика 2 = ");
        ethernet.print(sensors.getTempCByIndex(1));
        ethernet.print("C°");
        ethernet.print("<br>");
        ethernet.print("<br>");
        ethernet.print("<H1><a href=\"/rel=on\"><button>Включить нагрузку</button></a>");
        ethernet.print("<br>");
        ethernet.print("<H1><a href=\"/rel=off\"><button>Отключить нагрузку</button></a>");

        if (strcmp(params, "rel=on") == 0)
      {digitalWrite(40, LOW);  }
        if (strcmp(params, "rel=off") == 0)
      {digitalWrite(40, HIGH); }
     
        ethernet.print("<br>");
        ethernet.print("<H1><a href=\"/lcd=100\"><button>Включить подсветку LCD на 100%</button></a>");
        ethernet.print("<br>");
        ethernet.print("<H1><a href=\"/lcd=50\"><button>Включить подсветку LCD на 50%</button></a>");
        ethernet.print("<br>");
        ethernet.print("<H1><a href=\"/lcd=0\"><button>Отключить подсветку LCD</button></a>");
        ethernet.print("<br>");
     
       if (strcmp(params, "lcd=100") == 0)
    {analogWrite(brightness, 255);
    a = 255; }
        if (strcmp(params, "lcd=0") == 0)
      {analogWrite(brightness, 0);
    a = 0;  }
    if (strcmp(params, "lcd=50") == 0)
      {analogWrite(brightness, 127);
    a = 127;  }

    if (digitalRead (40) == LOW)
        {ethernet.print("<H1><br>Нагрузка включена");}
        else
        {ethernet.print("<H1><br>Нагрузка отключена");}
    ethernet.print("<br>");
    if (a == 0)
        {ethernet.print("<br>Подсветка LCD отключена");}
    if (a == 127)
        {ethernet.print("<br>Подсветка LCD 50%");}
    if (a == 255)
        {ethernet.print("<br>Подсветка LCD включена");}  
     
       ethernet.respond();
     
    digitalWrite(13, LOW);
      }
    }
     
     
  2. hypersash

    hypersash Нуб

    Новый код (закомментированы места, требующие вашей помощи):

    Код (C++):

    #include <SPI.h>
    #include <UIPEthernet.h> // Used for client
    #include <Base64.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    /*
      Настройки сети
    */

    byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x32 };
    IPAddress ip(192, 168, 0, 109);                      

    EthernetServer server(80);
    /*
      Переменные для авторизации через web
    */

    String readString;                // Буфер для данных от пользователя Web сервера
    String auth_hash;                 // Тут храним полноценную строку авторизации, которую ожидаем от браузера в таком виде "Authorization: Basic bG9naW46cGFzc3dvcmQ="
    char login[] = "admin";           // Логин по дефолту. В дальнейшем необходимо измененные данные авторизации в Web морде хранить в EPROM
    char password[] = "admin";     // Пароль по умолчанию. -/-
    /*
      SETUP
    */

    LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    #define ONE_WIRE_BUS 2
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);

    int brightness = 3;
    int a = 255;

    void setup() {
      Serial.begin(9600);
      lcd.begin(20,4);
      analogWrite(brightness, a);
      pinMode(40, OUTPUT);
      digitalWrite(40, HIGH);
    pinMode(brightness, OUTPUT);
      auth_hash = auth_update(login, password);
      // Поднимаем сеть
      Ethernet.begin(mac, ip);
      server.begin();
      Serial.println("started");
    }
    /*
      LOOP
    */

    void loop() {

      sensors.requestTemperatures();
      lcd.setCursor(0,0);
      lcd.print("bT1=");
      lcd.setCursor(4,0);
      lcd.print(sensors.getTempCByIndex(0));
      lcd.setCursor(11,0);
      lcd.print("bT2=");
      lcd.setCursor(15,0);
      lcd.print(sensors.getTempCByIndex(2));
      lcd.setCursor(0,1);
      lcd.print("pT1=");
      lcd.setCursor(4,1);
      lcd.print(sensors.getTempCByIndex(3));
      lcd.setCursor(11,1);
      lcd.print("pT2=");
      lcd.setCursor(15,1);
      lcd.print(sensors.getTempCByIndex(1));

    if (digitalRead (40) == LOW)
        {lcd.setCursor(0,3);
        lcd.print("Realy is ON ");}
        else
        {lcd.setCursor(0,3);
        lcd.print("Realy is OFF"); }
     
     
      EthernetClient client = server.available();
      if (client) {
        boolean currentLineIsBlank = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
            Serial.println(c);
            readString += c;
            if (c == '\n' && currentLineIsBlank) {
              if (readString.lastIndexOf(auth_hash)>-1) {
                if (readString.lastIndexOf("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.println(F("<html><head><meta charset=UTF-8\"><title>Arduino Home Server</title>"));
           
    //            char* params;
    //            if (params = (client.connected())
     
        client.print("<H2>Температура датчика 1 на плате = ");
        client.print(sensors.getTempCByIndex(0));
        client.print("C°");
        client.print("<br><H2>Температура датчика 2 на плате = ");
        client.print(sensors.getTempCByIndex(2));
        client.print("C°");
        client.print("<br><H2>Температура внешнего датчика 1 = ");
        client.print(sensors.getTempCByIndex(3));
        client.print("C°");
        client.print("<br><H2>Температура внешнего датчика 2 = ");
        client.print(sensors.getTempCByIndex(1));
        client.print("C°");
        client.print("<br>");
        client.print("<br>");
        client.print("<H1><a href=\"/rel=on\"><button>Включить нагрузку</button></a>");
        client.print("<br>");
        client.print("<H1><a href=\"/rel=off\"><button>Отключить нагрузку</button></a>");

        /* if (strcmp( "rel=on") == 0)
      {digitalWrite(40, LOW);  }
        if (strcmp(params, "rel=off") == 0)
      {digitalWrite(40, HIGH); }  */

     
        client.print("<br>");
        client.print("<H1><a href=\"/lcd=100\"><button>Включить подсветку LCD на 100%</button></a>");
        client.print("<br>");
        client.print("<H1><a href=\"/lcd=50\"><button>Включить подсветку LCD на 50%</button></a>");
        client.print("<br>");
        client.print("<H1><a href=\"/lcd=0\"><button>Отключить подсветку LCD</button></a>");
        client.print("<br>");
      /*
       if (strcmp(params, "lcd=100") == 0)
    {analogWrite(brightness, 255);
    a = 255; }
        if (strcmp(params, "lcd=0") == 0)
      {analogWrite(brightness, 0);
    a = 0;  }
    if (strcmp(params, "lcd=50") == 0)
      {analogWrite(brightness, 127);
    a = 127;  }
    */

    if (digitalRead (40) == LOW)
        {client.print("<H1><br>Нагрузка включена");}
        else
        {client.print("<H1><br>Нагрузка отключена");}
    client.print("<br>");
    if (a == 0)
        {client.print("<br>Подсветка LCD отключена");}
    if (a == 127)
        {client.print("<br>Подсветка LCD 50%");}
    if (a == 255)
        {client.print("<br>Подсветка LCD включена");}
                  client.println(F("</body></html>"));
                }
              }
              else {
                client.println(F("HTTP/1.0 401 Unauthorized"));
                client.println(F("WWW-Authenticate: Basic realm=\"Please log in!\""));
              }
              break;
            }

            if (c == '\n') {
              currentLineIsBlank = true;
            }
            else if (c != '\r') {
              currentLineIsBlank = false;
            }
          }
        }
        delay(10);

        readString = "";
        client.stop();
      }
    }
    /*
      Функция подготавливает строку авторизации с хэшем учетных данных, для сравнения её с данными в HEADER браузера которые мы получим
    */

    String auth_update(char login[], char password[]) {
      // Строка для будущего хэша
      String hash = strcat(strcat(login, ":"),password);
      int buf_size = hash.length()+1;
      char buf_char[buf_size];
      // Переводим строку в char для дальнейшей обработки base64
      hash.toCharArray(buf_char, buf_size);
      char encoded[base64_enc_len(buf_size-1)];
      // Получаем хэш для авторизации
      base64_encode(encoded, buf_char, buf_size-1);
      // Формируем полную строку поиска "Authorization: Basic <BASE64-HASH>" чтобы не могли подсунуть хэш в GET или POST
      return "Authorization: Basic " + String(encoded);
    }
     
     
  3. hypersash

    hypersash Нуб

    Кажеться разобрался, код теперь работает, но команды
    Код (C++):
    if (readString.lastIndexOf("rel=on")>-1)
     
    и
    Код (C++):
    if (readString.lastIndexOf("lcd=100")>-1)
     
    срабатывают только после второго нажатия в браузере, при том что остальные обрабатываються с первого, например
    Код (C++):
    if (readString.lastIndexOf("rel=off")>-1) {
        digitalWrite(40, HIGH);  }
    if (readString.lastIndexOf("lcd=0")>-1)
      {analogWrite(brightness, 0);
    if (readString.lastIndexOf("lcd=50")>-1)
      {analogWrite(brightness, 127);
    В чем может быть причина?
     
  4. hypersash

    hypersash Нуб

    Вот весь код:
    Код (C++):

    #include <SPI.h>
    #include <UIPEthernet.h> // Used for client
    #include <Base64.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    /*
      Настройки сети
    */

    byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x32 };
    IPAddress ip(192, 168, 0, 109);                      

    EthernetServer server(80);
    /*
      Переменные для авторизации через web
    */

    boolean incoming = 0;
    String readString;                // Буфер для данных от пользователя Web сервера
    String auth_hash;                 // Тут храним полноценную строку авторизации, которую ожидаем от браузера в таком виде "Authorization: Basic bG9naW46cGFzc3dvcmQ="
    char login[] = "admin";           // Логин по дефолту. В дальнейшем необходимо измененные данные авторизации в Web морде хранить в EPROM
    char password[] = "admin";     // Пароль по умолчанию. -/-
    /*
      SETUP
    */

    LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    #define ONE_WIRE_BUS 2
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);

    int brightness = 3;
    int a = 255;

    void setup() {
      lcd.begin(20,4);
      lcd.setCursor(3,1);
      lcd.print("Starting UP...");
      analogWrite(brightness, a);
      pinMode(40, OUTPUT);
      digitalWrite(40, HIGH);
    pinMode(brightness, OUTPUT);
      auth_hash = auth_update(login, password);
      // Поднимаем сеть
      Ethernet.begin(mac, ip);
      server.begin();
      delay(450);
      lcd.clear();
      Serial.print("started at ip ");
      Serial.print(Ethernet.localIP());
    }
    /*
      LOOP
    */

    void loop() {
     
      sensors.requestTemperatures();
      lcd.setCursor(0,0);
      lcd.print("bT1=");
      lcd.setCursor(4,0);
      lcd.print(sensors.getTempCByIndex(0));
      lcd.setCursor(11,0);
      lcd.print("bT2=");
      lcd.setCursor(15,0);
      lcd.print(sensors.getTempCByIndex(2));
      lcd.setCursor(0,1);
      lcd.print("pT1=");
      lcd.setCursor(4,1);
      lcd.print(sensors.getTempCByIndex(3));
      lcd.setCursor(11,1);
      lcd.print("pT2=");
      lcd.setCursor(15,1);
      lcd.print(sensors.getTempCByIndex(1));
     
      lcd.setCursor(0,2);
      lcd.print("ip is");
      lcd.setCursor(6,2);
      lcd.print(Ethernet.localIP());
     

    if (digitalRead (40) == LOW)
        {lcd.setCursor(0,3);
        lcd.print("Realy == ON ");}
        else
        {lcd.setCursor(0,3);
        lcd.print("Realy == OFF"); }
       
       
      EthernetClient client = server.available();
      if (client) {
        boolean currentLineIsBlank = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
            readString += c;
            if (c == '\n' && currentLineIsBlank) {
              if (readString.lastIndexOf(auth_hash)>-1) {
                if (readString.lastIndexOf("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.println(F("<html><head><meta charset=UTF-8\"><title>Arduino Home Server</title>"));

        client.print("<H2>Температура датчика 1 на плате = ");
        client.print(sensors.getTempCByIndex(0));
        client.print("C°");
        client.print("<br><H2>Температура датчика 2 на плате = ");
        client.print(sensors.getTempCByIndex(2));
        client.print("C°");
        client.print("<br><H2>Температура внешнего датчика 1 = ");
        client.print(sensors.getTempCByIndex(3));
        client.print("C°");
        client.print("<br><H2>Температура внешнего датчика 2 = ");
        client.print(sensors.getTempCByIndex(1));
        client.print("C°");
        client.print("<br>");
        client.print("<br>");
        client.print("<H1><a href=\"/rel=on\"><button>Включить нагрузку</button></a>");
        client.print("<br>");
        client.print("<H1><a href=\"/rel=off\"><button>Отключить нагрузку</button></a>");
       
        if (readString.lastIndexOf("rel=on")>-1) {
        digitalWrite(40, LOW);  }
        if (readString.lastIndexOf("rel=off")>-1) {
        digitalWrite(40, HIGH);  }
        client.print("<br>");
        client.print("<H1><a href=\"/lcd=100\"><button>Включить подсветку LCD на 100%</button></a>");
        client.print("<br>");
        client.print("<H1><a href=\"/lcd=50\"><button>Включить подсветку LCD на 50%</button></a>");
        client.print("<br>");
        client.print("<H1><a href=\"/lcd=0\"><button>Отключить подсветку LCD</button></a>");
        client.print("<br>");
     
       if (readString.lastIndexOf("lcd=100")>-1)
    {analogWrite(brightness, 255);
    a = 255; }
        if (readString.lastIndexOf("lcd=0")>-1)
      {analogWrite(brightness, 0);
    a = 0;  }
    if (readString.lastIndexOf("lcd=50")>-1)
      {analogWrite(brightness, 127);
    a = 127;  }

    if (digitalRead (40) == LOW)
        {client.print("<H1><br>Нагрузка включена");}
        else
        {client.print("<H1><br>Нагрузка отключена");}
    client.print("<br>");
    if (a == 0)
        {client.print("<br>Подсветка LCD отключена");}
    if (a == 127)
        {client.print("<br>Подсветка LCD 50%");}
    if (a == 255)
        {client.print("<br>Подсветка LCD включена");}
                  client.println(F("</body></html>"));
                }
              }
             
              else {
                client.println(F("HTTP/1.0 401 Unauthorized"));
                client.println(F("WWW-Authenticate: Basic realm=\"Please log in!\""));
              }
              break;
            }

            if (c == '\n') {
              currentLineIsBlank = true;
            }
            else if (c != '\r') {
              currentLineIsBlank = false;
            }
          }
        }
        delay(30);

        readString = "";
        client.stop();
      }
    }
    /*
      Функция подготавливает строку авторизации с хэшем учетных данных, для сравнения её с данными в HEADER браузера которые мы получим
    */

    String auth_update(char login[], char password[]) {
      // Строка для будущего хэша
      String hash = strcat(strcat(login, ":"),password);
      int buf_size = hash.length()+1;
      char buf_char[buf_size];
      // Переводим строку в char для дальнейшей обработки base64
      hash.toCharArray(buf_char, buf_size);
      char encoded[base64_enc_len(buf_size-1)];
      // Получаем хэш для авторизации
      base64_encode(encoded, buf_char, buf_size-1);
      // Формируем полную строку поиска "Authorization: Basic <BASE64-HASH>" чтобы не могли подсунуть хэш в GET или POST
      return "Authorization: Basic " + String(encoded);
    }
     
     
  5. hypersash

    hypersash Нуб

    Есть идея! Как сюда добавить переадресацию на главную страницу (192.168.0.109) после выполнения условия?
    Код (C++):
    if (readString.lastIndexOf("rel=on")>-1) {
        digitalWrite(40, LOW);  }
     
  6. hypersash

    hypersash Нуб

    Всем спасибо, разоблрался! =)

    Код (C++):

    #include <SPI.h>
    #include <UIPEthernet.h> // Used for client
    #include <Base64.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    /*
      Настройки сети
    */

    byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x32 };
    IPAddress ip(192, 168, 0, 109);                      

    EthernetServer server(80);
    /*
      Переменные для авторизации через web
    */

    String readString;                // Буфер для данных от пользователя Web сервера
    String auth_hash;                 // Тут храним полноценную строку авторизации, которую ожидаем от браузера в таком виде "Authorization: Basic bG9naW46cGFzc3dvcmQ="
    char login[] = "admin";           // Логин по дефолту. В дальнейшем необходимо измененные данные авторизации в Web морде хранить в EPROM
    char password[] = "admin";     // Пароль по умолчанию. -/-
    /*
      SETUP
    */

    LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    #define ONE_WIRE_BUS 2
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);

    int brightness = 3;
    int a = 255;

    void setup() {
      lcd.begin(20,4);
      lcd.setCursor(3,0);
      lcd.print("Starting UP...");
      analogWrite(brightness, a);
      pinMode(40, OUTPUT);
      digitalWrite(40, HIGH);
    pinMode(brightness, OUTPUT);
      auth_hash = auth_update(login, password);
      // Поднимаем сеть
      Ethernet.begin(mac, ip);
      server.begin();
      lcd.setCursor(5,2);
      lcd.print("Local ip is");
      lcd.setCursor(4,3);
      lcd.print(Ethernet.localIP());
      delay(1200);
      lcd.clear();
    }
    /*
      LOOP
    */

    void loop() {
     
      sensors.requestTemperatures();
      lcd.setCursor(0,0);
      lcd.print("bT1=");
      lcd.setCursor(4,0);
      lcd.print(sensors.getTempCByIndex(0));
      lcd.setCursor(11,0);
      lcd.print("bT2=");
      lcd.setCursor(15,0);
      lcd.print(sensors.getTempCByIndex(2));
      lcd.setCursor(0,1);
      lcd.print("pT1=");
      lcd.setCursor(4,1);
      lcd.print(sensors.getTempCByIndex(3));
      lcd.setCursor(11,1);
      lcd.print("pT2=");
      lcd.setCursor(15,1);
      lcd.print(sensors.getTempCByIndex(1));
     
      lcd.setCursor(0,2);
      lcd.print("ip is");
      lcd.setCursor(6,2);
      lcd.print(Ethernet.localIP());
     

    if (digitalRead (40) == LOW)
        {lcd.setCursor(0,3);
        lcd.print("Realy == ON ");}
        else
        {lcd.setCursor(0,3);
        lcd.print("Realy == OFF"); }
       
       
      EthernetClient client = server.available();
      if (client) {
        boolean currentLineIsBlank = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
            readString += c;
            if (c == '\n' && currentLineIsBlank) {
              if (readString.lastIndexOf(auth_hash)>-1) {
                if (readString.lastIndexOf("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.println(F("<html><head><meta charset=UTF-8\"><title>Управляющий контроллер</title>"));
                 
                   client.print("<H3>Локальный IP адрес = ");
        client.print(Ethernet.localIP());
        client.print("<H2><br>Температура датчика 1 на плате = ");

    if (sensors.getTempCByIndex(0) > 26)
    {  
        client.print("<font color='red' >");
        client.print(sensors.getTempCByIndex(0));
        client.print("</font>");
    }
    else
    {
        client.print("<font color='green' >");
        client.print(sensors.getTempCByIndex(0));
        client.print("</font>");
    }

       client.print("C°");
       client.print("<br><H2>Температура датчика 2 на плате = ");
     
    if (sensors.getTempCByIndex(2) > 26)
    {  
        client.print("<font color='red' >");
        client.print(sensors.getTempCByIndex(2));
        client.print("</font>");
    }  
    else
    {
        client.print("<font color='green' >");
        client.print(sensors.getTempCByIndex(2));
        client.print("</font>");
    }
     
       client.print("C°");
       client.print("<br><H2>Температура внешнего датчика 1 = ");
     
    if (sensors.getTempCByIndex(3) > 26)
    {
        client.print("<font color='red' >");
        client.print(sensors.getTempCByIndex(3));
        client.print("</font>");
    }
    else
    {
        client.print("<font color='green' >");
        client.print(sensors.getTempCByIndex(3));
        client.print("</font>");
    }
       
        client.print("C°");
        client.print("<br><H2>Температура внешнего датчика 2 = ");
       
    if (sensors.getTempCByIndex(1) > 26)
    {  
        client.print("<font color='red' >");
        client.print(sensors.getTempCByIndex(1));
        client.print("</font>");
    }
    else
    {
        client.print("<font color='green' >");
        client.print(sensors.getTempCByIndex(1));
        client.print("</font>");
    }
       
        client.print("C°");

        client.print("<br>");
        client.print("<br>");
        client.print("<H1><a href=\"/rel=on\"><button>Включить нагрузку</button></a>");
        client.print("<br>");
        client.print("<H1><a href=\"/rel=off\"><button>Отключить нагрузку</button></a>");
       
        if (readString.lastIndexOf("rel=on")>-1)
        {
        digitalWrite(40, LOW);
        client.print("<meta HTTP-EQUIV='REFRESH' CONTENT='0; URL=http://192.168.0.109'>");
      }
     
        if (readString.lastIndexOf("rel=off")>-1)
        {
        digitalWrite(40, HIGH);
        client.print("<meta HTTP-EQUIV='REFRESH' CONTENT='0; URL=http://192.168.0.109'>");
      }
     
        client.print("<br>");
        client.print("<H1><a href=\"/lcd=100\"><button>Включить подсветку LCD на 100%</button></a>");
        client.print("<br>");
        client.print("<H1><a href=\"/lcd=50\"><button>Включить подсветку LCD на 50%</button></a>");
        client.print("<br>");
        client.print("<H1><a href=\"/lcd=0\"><button>Отключить подсветку LCD</button></a>");
        client.print("<br>");
     
        if (readString.lastIndexOf("lcd=100")>-1)
    {
       analogWrite(brightness, 255);
    a = 255;
    client.print("<meta HTTP-EQUIV='REFRESH' CONTENT='0; URL=http://192.168.0.109'>");
    }
       
        if (readString.lastIndexOf("lcd=0")>-1)
      {
        analogWrite(brightness, 0);
    a = 0;
    client.print("<meta HTTP-EQUIV='REFRESH' CONTENT='0; URL=http://192.168.0.109'>");
    }

        if (readString.lastIndexOf("lcd=50")>-1)
      {
        analogWrite(brightness, 127);
    a = 127;
    client.print("<meta HTTP-EQUIV='REFRESH' CONTENT='0; URL=http://192.168.0.109'>");
    }

    if (digitalRead (40) == LOW)
        {client.print("<H1><br>Нагрузка <font color='red' >включена</font>");}
        else
        {client.print("<H1><br>Нагрузка <font color='green' >отключена</font>");}
    client.print("<br>");

    if (a == 0)
        {client.print("<br>Подсветка LCD отключена");}
    if (a == 127)
        {client.print("<br>Подсветка LCD 50%");}
    if (a == 255)
        {client.print("<br>Подсветка LCD включена");}
                  client.println(F("</body></html>"));
                }
              }
             
              else {
                client.println(F("HTTP/1.0 401 Unauthorized"));
                client.println(F("WWW-Authenticate: Basic realm=\"Please log in!\""));
              }
              break;
            }

            if (c == '\n') {
              currentLineIsBlank = true;
            }
            else if (c != '\r') {
              currentLineIsBlank = false;
            }
          }
        }
        delay(30);

        readString = "";
        client.stop();
      }
    }
    /*
      Функция подготавливает строку авторизации с хэшем учетных данных, для сравнения её с данными в HEADER браузера которые мы получим
    */

    String auth_update(char login[], char password[]) {
      // Строка для будущего хэша
      String hash = strcat(strcat(login, ":"),password);
      int buf_size = hash.length()+1;
      char buf_char[buf_size];
      // Переводим строку в char для дальнейшей обработки base64
      hash.toCharArray(buf_char, buf_size);
      char encoded[base64_enc_len(buf_size-1)];
      // Получаем хэш для авторизации
      base64_encode(encoded, buf_char, buf_size-1);
      // Формируем полную строку поиска "Authorization: Basic <BASE64-HASH>" чтобы не могли подсунуть хэш в GET или POST
      return "Authorization: Basic " + String(encoded);
    }