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

hypersash
Offline
Зарегистрирован: 07.12.2011

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

Старый рабочий код:

#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);
  }
}

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


#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);
}
 

 

hypersash
Offline
Зарегистрирован: 07.12.2011

Кажеться разобрался, код теперь работает, но команды

if (readString.lastIndexOf("rel=on")>-1)

и

if (readString.lastIndexOf("lcd=100")>-1)

срабатывают только после второго нажатия в браузере, при том что остальные обрабатываються с первого, например

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);

В чем может быть причина?

hypersash
Offline
Зарегистрирован: 07.12.2011

Весь код:


#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);
}
 

 

hypersash
Offline
Зарегистрирован: 07.12.2011

Есть идея! Как сюда добавить переадресацию на главную страницу (192.168.0.109) после выполнения условия? 

if (readString.lastIndexOf("rel=on")>-1) {
    digitalWrite(40, LOW);  }

 

hypersash
Offline
Зарегистрирован: 07.12.2011

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


#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);
}