Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/26: Рейтинг темы: голосов - 26, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 28.10.2015
Сообщений: 3

Обработка нажатий из браузера (Arduino Mega 2560 + ENC28J60)

28.10.2015, 21:50. Показов 4977. Ответов 4
Метки нет (Все метки)

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

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#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);
  }
}
Новый код (закомментированы места, требующие вашей помощи):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#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("");
    client.print("<br><H2>Температура датчика 2 на плате = ");
    client.print(sensors.getTempCByIndex(2));
    client.print("");
    client.print("<br><H2>Температура внешнего датчика 1 = ");
    client.print(sensors.getTempCByIndex(3));
    client.print("");
    client.print("<br><H2>Температура внешнего датчика 2 = ");
    client.print(sensors.getTempCByIndex(1));
    client.print("");  
    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);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2015, 21:50
Ответы с готовыми решениями:

Arduino Mega 2560 vs Teensy 4.1
Информация о Teensy 4.1 есть практически только в англоязычных ресурсах. Teensy 4.1 позиционируется как Arduino совместимая, но с 3,3...

Arduino Mega 2560 и VB2010
Приветствую, кто-нибудь сталкивался с проблемой? Есть Arduino Mega 2560 через SerialPort соединю ее с программой в бейсике...

Проблема с AnalogWrite на arduino mega 2560
Добрый всем! Прошу помощи так как зашел в тупик. Есть две ардуино мега 2560 от robotdyn (Robotdyn Mega +WiFi R3...

4
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
29.10.2015, 07:38
...для браузера генерится HTML страничка с формой отправки на сервер из клиента (браузера) данных методом GET или POST с конкретным идентификатором, например кнопки. Сервер дуины, получив запрос, должен прасить этот идентификатор кнопы.

Чтобы понять, просто откройте исходный код страницы, которой генерит вам сервер дуины (ENC) прямо в браузере. У вас это '/rel=on' и '/rel=off'.
0
0 / 0 / 0
Регистрация: 28.10.2015
Сообщений: 3
29.10.2015, 23:55  [ТС]
Кажеться разобрался, код теперь работает, но команды
C++
1
if (readString.lastIndexOf("rel=on")>-1)
и
C++
1
 if (readString.lastIndexOf("lcd=100")>-1)
срабатывают только после второго нажатия в браузере, при том что остальные обрабатываються с первого, например
C++
1
2
3
4
5
6
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);
В чем может быть причина?

весь код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#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("");
    client.print("<br><H2>Температура датчика 2 на плате = ");
    client.print(sensors.getTempCByIndex(2));
    client.print("");
    client.print("<br><H2>Температура внешнего датчика 1 = ");
    client.print(sensors.getTempCByIndex(3));
    client.print("");
    client.print("<br><H2>Температура внешнего датчика 2 = ");
    client.print(sensors.getTempCByIndex(1));
    client.print("");  
    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);
}
Добавлено через 17 минут
Есть идея! Как сюда добавить переадресацию на главную страницу (192.168.0.109) после выполнения условия?
C++
1
2
if (readString.lastIndexOf("rel=on")>-1) {
    digitalWrite(40, LOW);  }
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
30.10.2015, 07:04
Что значит переадресацию? Если все внутри просто генерить HTML-код заданной страницы, если на внешний сервер, то в коде страницы пишем тег meta HTTP-EQUIV="REFRESH" CONTENT="1; URL=http://192.168.0.109" и оно само переадресует в браузере через секунду.
0
0 / 0 / 0
Регистрация: 28.10.2015
Сообщений: 3
01.11.2015, 13:54  [ТС]
Всем спасибо за помощь, разобрался! =)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
#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("");
   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("");
   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("");
    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("");
 
    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);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.11.2015, 13:54
Помогаю со студенческими работами здесь

Не загружаются скетчи в самодельный Arduino Mega 2560
Всем привет. 1. Сделал самодельный Arduino Miko 2560 (перерисовал схему с оригинала и переразвел плату в нужном мне формате). 2....

Не отвечает ATmega2560 в самодельном Arduino Mega 2560
Всем привет. 1. Сделал самодельный Arduino Mega 2560 (перерисовал схему с оригинала и переразвел плату в нужном мне формате). Схема –...

Внешний тактовый сигнал для CMOS сенсора OV7670 к Arduino Mega 2560
Имеется ATmega2560 и камера OV7670. Код пишу в Arduino IDE. Хочется подключить эту камеру, заставить работать её в черно-белом режиме. ...

Дисплей TFT 160x128 RGB и плата Arduino Mega 2560 + WiFi ESP8266 (micro usb)
Здравствуйте. Пользуясь случаем задам в этой теме вопрос. Есть дисплей TFT 160x128 RGB и плата Arduino Mega 2560 + WiFi ESP8266 (micro...

arduino mega 1280 замена чипа на 2560
Помогите разобраться, купил себе платку чистую на ебае ардуино мега 1280, купил комплектуху, и запаял только в место 1280 купил 2560 т.как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru