Вывод данных в WEB
- Войдите на сайт для отправки комментариев
Вс, 09/06/2013 - 08:42
#include "DHT.h"
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,10);
EthernetServer server(80);
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
Ethernet.begin(mac, ip);
server.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
EthernetClient client = server.available();
client.println ("Humidity: ");
client.println (h);
client.println (" %");
client.println ("Temperature: ");
client.println (t);
client.println (" *C");
client.println ("</html>");
delay (1000);
}
Проблема собственно вот в чем, client.println ("</html>"); не чистит страницу, а выводится как текст. Браузер GCHROOM и IExplorer
а что вы хотите получить?
написав </html>
браузеру вы не очистите страницу
у вас неправильно сформирована страница и браузер не понимает что делать с этим тегом и выводит его на экран
вы хоите что бы в браузере обновлялась постоянно инфа на странице?
ingener.solovyev, почитайте тут http://ru.wikipedia.org/wiki/Html
ingener.solovyev
А что за устройство Вы делаете? По моему нечто похожее на мой вопрос в другом разделе: http://arduino.ru/forum/ishchu-ispolnitelya/kontrol-klimata-v-teplitse
ingener.solovyev
А что за устройство Вы делаете? По моему нечто похожее на мой вопрос в другом разделе: http://arduino.ru/forum/ishchu-ispolnitelya/kontrol-klimata-v-teplitse
Я пока просто эксперементирую.
а что вы хотите получить?
написав </html>
браузеру вы не очистите страницу
у вас неправильно сформирована страница и браузер не понимает что делать с этим тегом и выводит его на экран
вы хоите что бы в браузере обновлялась постоянно инфа на странице?
Да, я хочу что бы страница обнавлялась и показывала актуальные данные на данный момент времени.
Пока сделал так, но F5 приходиться держать постоянно.
#include "DHT.h" #include <SPI.h> #include <Ethernet.h> byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1,10); EthernetServer server(80); #define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); Ethernet.begin(mac, ip); server.begin(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); EthernetClient client = server.available(); client.println ("<!DOCTYPE HTML>"); client.println ("<html>"); client.println ("<body>"); client.println ("Humidity: "); client.println (h); client.println (" %"); client.println ("Temperature: "); client.println (t); client.println (" *C"); client.println ("</body>"); client.println ("</html>"); client.stop(); }добавь мета тег refresh
что бы браузер перезапрашивал сам новые данные
добавь мета тег refresh
что бы браузер перезапрашивал сам новые данные
после какой строки?
разобрался, теперь это выглядит так:
#include "DHT.h" #include <SPI.h> #include <Ethernet.h> byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1,10); EthernetServer server(82); #define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); Ethernet.begin(mac, ip); server.begin(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); EthernetClient client = server.available(); client.println ("<!DOCTYPE HTML>"); client.println ("<html>"); client.println ("<body>"); client.println ("Humidity: "); client.println (h); client.println (" %"); client.println ("Temperature: "); client.println (t); client.println (" *C"); client.println ("<meta http-equiv= refresh content=5;>"); client.println ("</body>"); client.println ("</html>"); client.stop(); }Новый вопрос, как корректно выводить кирилицу? Пока что выводится вот так: Влажность: 47.00 % Температура: 24.70 *C
ingener.solovyev, переместите 45 строку после 37.
добавьте <head> и </head>.
добавьте информацтю о кодировке utf-8.
мету в хедер нужно а не в боди
все сделал, вот теперь все Ок!
Буду думать теперь о кнопке вкл/выкл
Выключатель поставь на провод питания и все
сколько милиампер потребляет такой эзернет модуль?
не в этом дело. Управление пинами через web я имел ввиду.
#include "DHT.h" #include <SPI.h> #include <Ethernet.h> #include <String.h> byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1,10); EthernetServer server(82); #define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); int ledPin = 3; String readString = String(30); //string for fetching data from address boolean LEDON = false; //изначальный статус светодиода - выключен void setup() { Serial.begin(9600); dht.begin(); Ethernet.begin(mac, ip); server.begin(); pinMode(ledPin, OUTPUT); pinMode(4, INPUT); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); //read char by char HTTP request if (readString.length() < 30) { //store characters to string readString.concat( c); } //output chars to serial port Serial.print( c); //if HTTP request has ended if (c == '\n') { //Проверяем включили ли светодиод? //Level=1 - включен //Level=0 - выключен if(readString.indexOf("Level=1") >=0) { //Включаем светодиод digitalWrite(ledPin, HIGH); // set the LED on LEDON = true; }else{ //Выключаем светодиод digitalWrite(ledPin, LOW); // set the LED OFF LEDON = false; } client.println ("<!DOCTYPE HTML>"); client.println ("<html>"); client.println ("<head> "); client.println ("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> "); client.println("</head> "); client.println ("<body>"); client.println ("Влажность: "); client.println (h); client.println (" %"); client.println ("<br> "); client.println ("Температура: "); client.println (t); client.println (" *C"); client.println ("</body>"); client.println ("<body>"); client.println("<h1>Управление светодиодом 3pin</h1>"); if (LEDON){ client.println("<form method=get name=LED><input type=radio name=Level value=1 CHECKED>Включить<input type=radio name=Level value=0>Выключить<input type=submit value=Применить></form>"); client.println("<font size=’5′>LED-статус: "); client.println("<font size=’5′>Вкл."); }else{ client.println("<form method=get name=LED><input type=radio name=Level value=1>Включить<input type=radio name=Level value=0 CHECKED>Выключить<input type=submit value=Применить></form>"); client.println("<font size=’5′>LED-статус: "); client.println("<font size=’5′>Выкл"); } client.println("<hr />"); client.println("</body></html>"); //clearing string for next read readString=""; client.println ("</body>"); client.println ("</html>"); client.stop(); } } } } }Нашел пример кнопки, вставил код. Получилась ерунда.
Светодиод подключил на 3 пин, на 4 сделал землю (чтоб не париться). При нажатии кнопки вкл. светодиод загорается и тут же гаснет. Получается так, что он горит только в момент обмена данными браузера и ардуино. При использовании метатега refresh светодиод мигает. В общем ерунда а не управление питанием получается. Что не так?
Вроде разобрался, убрал 46 строку.
И вот снова я.
Ситуация следующая. Светодиод на 3-4 пине загорается, как ему и положенно, через браузер. Но через некоторое время гаснет. Это сопровождается кратковременной вспышкой светодиодов RX TX. Хотя я уже убрал любое упоминание Serial из скетча и отсоединил uno от usb оставив питание от б/п. Что это может быть? Дребезг? Как бороться?
при закрытых браузерах есть такое?
а при отключённом кабеле LAN ?
строки 85-87 желательно удалить.
if(readString.indexOf("Level=1") >=0) {061//Включаем светодиод062digitalWrite(ledPin, HIGH);// set the LED on063LEDON =true;064}else{065//Выключаем светодиод066digitalWrite(ledPin, LOW);// set the LED OFF067LEDON =false;068}если не будет в запросе параметра Level то он выключится, соответственно при авторефреше он не передается и диод выключается
верни сериал, и перед 60-той строко( if (readString...))
lj
Добавь Serial.println(readString);
и помонитроь как ведет себя переменная
if(readString.indexOf("Level=1") >=0) {061//Включаем светодиод062digitalWrite(ledPin, HIGH);// set the LED on063LEDON =true;064}else{065//Выключаем светодиод066digitalWrite(ledPin, LOW);// set the LED OFF067LEDON =false;068}если не будет в запросе параметра Level то он выключится, соответственно при авторефреше он не передается и диод выключается
верни сериал, и перед 60-той строко( if (readString...))
lj
Добавь Serial.println(readString);
и помонитроь как ведет себя переменная
Домой приду вечером, сделаю. Рефреш убрал еще вчера. Светодиод гаснет все равно, секунд чере 10.
Добавь Serial.println(readString);
и помонитроь как ведет себя переменная
Сделал. Вот что в сериале
#include "DHT.h" #include <SPI.h> #include <Ethernet.h> #include <String.h> byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1,10); EthernetServer server(82); #define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); int ledPin = 3; String readString = String(30); //string for fetching data from address boolean LEDON = false; //изначальный статус светодиода - выключен void setup() { Serial.begin(9600); dht.begin(); Ethernet.begin(mac, ip); server.begin(); pinMode(ledPin, OUTPUT); pinMode(4, INPUT); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); EthernetClient client = server.available(); if (client) { if (client.available()) { char c = client.read(); //read char by char HTTP request if (readString.length() < 30) { //store characters to string readString.concat( c); } //if HTTP request has ended if (c == '\n') { //Проверяем включили ли светодиод? //Level=1 - включен //Level=0 - выключен Serial.println(readString); if(readString.indexOf("Level=1") >=0) { //Включаем светодиод digitalWrite(ledPin, HIGH); // set the LED on LEDON = true; }else{ //Выключаем светодиод digitalWrite(ledPin, LOW); // set the LED OFF LEDON = false; } client.println ("<!DOCTYPE HTML>"); client.println ("<html>"); client.println ("<head> "); client.println ("<meta http-equiv= refresh content=5;>"); client.println ("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> "); client.println("</head> "); client.println ("<body>"); client.println ("Влажность: "); client.println (h); client.println (" %"); client.println ("<br> "); client.println ("Температура: "); client.println (t); client.println (" *C"); client.println ("<br>"); client.println("3 pin"); if (LEDON){ client.println("<form method=get name=LED><input type=radio name=Level value=1 CHECKED>ON<input type=radio name=Level value=0>OFF<input type=submit value=OK></form>"); client.println("<font size=’5′>LED-статус: "); client.println("<font size=’5′>ON"); }else{ client.println("<form method=get name=LED><input type=radio name=Level value=1>ON<input type=radio name=Level value=0 CHECKED>OFF<input type=submit value=OK></form>"); client.println("<font size=’5′>LED-статус: "); client.println("<font size=’5′>OFF"); } client.println("<hr />"); client.println("</body></html>"); //clearing string for next read readString=""; client.stop(); } } } } Актуальный скетчКак оптимизировать вот эту часть скетча,
if (client) { if (client.available()) { char c = client.read(); Serial.println("c"); Serial.println(c); //read char by char HTTP request if (readString.length() < 30) { //store characters to string readString.concat( c); } //if HTTP request has ended if (c == '\n') { //Проверяем включили ли светодиод? //Level=1 - включен //Level=0 - выключен if(readString.indexOf("Level=1") >=0) { /Включаем светодиод digitalWrite(ledPin, HIGH); // set the LED on LEDON = true; }else{ //Выключаем светодиод digitalWrite(ledPin, LOW); // set the LED OFF LEDON = false; }что бы светодиод не выключался
когда доходиит до этой строки
Я бы вывел куда-нибудь в отладочную печать текущее значение millis(), чтобы убедиться в том, что это не перезагрузка ардуины от просадки питания...
Я бы вывел куда-нибудь в отладочную печать текущее значение millis(), чтобы убедиться в том, что это не перезагрузка ардуины от просадки питания...
Строки вида
GET /favicon.ico HTTP/1.1гасят диод
Строки вида
GET /favicon.ico HTTP/1.1гасят диод
как с этим бороться?
Нажата Off, смотрим Serial
Нажат ON, смотрим Serial:
Откуда вообще GET /favicon.ico HTTP/1.1 вылазит?
Все-ё-ё--ё-ёёё разобрался!!!!!
Шилд посылает 2 строки. В строке GET /favicon.ico HTTP/1.1 нет "?", добавляем в анализ строки этот регистр. Если "?" нет, пропускаем строку., а если есть, то анализируем. Выкладываю скетч:
#include "DHT.h" #include <SPI.h> #include <Ethernet.h> #include <String.h> byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1,10); EthernetServer server(82); #define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); int ledPin = 3; String readString = String(30); //string for fetching data from address boolean LEDON = false; //изначальный статус светодиода - выключен void setup() { Serial.begin(9600); dht.begin(); Ethernet.begin(mac, ip); server.begin(); pinMode(ledPin, OUTPUT); pinMode(4, INPUT); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); //read char by char HTTP request if (readString.length() < 30) { //store characters to string readString.concat( c); } Serial.println (readString); //if HTTP request has ended if (c == '\n') { //dirty skip of "GET /favicon.ico HTTP/1.1" if (readString.indexOf("?") <0) { //skip everything } else{ //lets check if LED should be lighted //Проверяем включили ли светодиод? //Level=1 - включен //Level=0 - выключен if(readString.indexOf("Level=1") >=0) { //Включаем светодиод digitalWrite(ledPin, HIGH); // set the LED on LEDON = true; }else{ //Выключаем светодиод digitalWrite(ledPin, LOW); // set the LED OFF LEDON = false; } } client.println ("<!DOCTYPE HTML>"); client.println ("<html>"); client.println ("<head> "); client.println ("<meta http-equiv= refresh content=5;>"); client.println ("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> "); client.println("</head> "); client.println ("<body>"); client.println ("Влажность: "); client.println (h); client.println (" %"); client.println ("<br> "); client.println ("Температура: "); client.println (t); client.println (" *C"); client.println ("<br>"); client.println(readString); if (LEDON){ client.println("<form method=get name=LED><input type=radio name=Level value=1 CHECKED>ON<input type=radio name=Level value=0>OFF<input type=submit value=OK></form>"); client.println("<font size=’5′>LED-статус: "); client.println("<font size=’5′>ON"); }else{ client.println("<form method=get name=LED><input type=radio name=Level value=1>ON<input type=radio name=Level value=0 CHECKED>OFF<input type=submit value=OK></form>"); client.println("<font size=’5′>LED-статус: "); client.println("<font size=’5′>OFF"); } client.println("<hr />"); client.println("</body></html>"); //clearing string for next read readString=""; client.stop(); } } } } }но при рефреше мигает все равно.
>> Откуда вообще GET /favicon.ico HTTP/1.1 вылазит?
современные браузеры так получают иконку сайта.
как с этим бороться?
Наверное следовало бы включать и гасить диод в явном виде. Тогда остальные "залетевшие дятлы" не будут влиять на него никоим образом.
как с этим бороться?
Наверное следовало бы включать и гасить диод в явном виде. Тогда остальные "залетевшие дятлы" не будут влиять на него никоим образом.
Вы могли бы расширить свой ответ явным примером?
if(readString.indexOf("Level=1") >=0) {063//Включаем светодиод064digitalWrite(ledPin, HIGH);// set the LED on065LEDON =true;066}elseif(readString.indexOf("Level=1") =0){067//Выключаем светодиод068digitalWrite(ledPin, LOW);// set the LED OFF069LEDON =false;070}if(readString.indexOf("Level=1") >=0) { //Включаем светодиод digitalWrite(ledPin, HIGH); // set the LED on LEDON = true; }else if(readString.indexOf("Level=0") >=0){ //Выключаем светодиод digitalWrite(ledPin, LOW); // set the LED OFF LEDON = false; }так более правильно