Почему показывает "0"

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
// This is a demo of the RBBB running as webserver with the Ether Card
// 2010-05-28 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php
#define ANALOG_PIN A0
#define OUT_A 2
#define OUT_B 3
#define OUT_C 4
#include <EtherCard.h>
int ran=0;
// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192,168,1,203 };


byte Ethernet::buffer[500];
BufferFiller bfill;

void setup () {
  if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0)
    Serial.println(F("Failed to access Ethernet controller"));
  ether.staticSetup(myip);

pinMode(OUT_A, OUTPUT);
pinMode(OUT_B, OUTPUT);
pinMode(OUT_C, OUTPUT);
Serial.begin(9600);
}




static word homePage() {
    for (int i = 0b000; i <= 0b111; i++) {
     digitalWrite(OUT_A, bitRead(i, 0));
     digitalWrite(OUT_B, bitRead(i, 1));
     digitalWrite(OUT_C, bitRead(i, 2));
     ran=analogRead(ANALOG_PIN);
     Serial.print(analogRead(ran));
Serial.print(" | ");
   } 
Serial.println();

  bfill = ether.tcpOffset();
  bfill.emit_p(PSTR(

    
    "HTTP/1.0 200 OK\r\n"
    "Content-Type: text/html\r\n"
    "Pragma: no-cache\r\n"
    "\r\n"
   "<title>Gauge Test</title>"
"$D"),
ran);

  return bfill.position();
}

void loop () {
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  
  if (pos)  // check if valid tcp data is received
    ether.httpServerReply(homePage()); // send web page data



 
}

Подскажите, почему в браузере у меня вместо 10230000001023   у меня просто "0", а в мониторе порта всё как и должно быть.

К контроллеру подключена микросхема 4051

JasKo
Offline
Зарегистрирован: 21.11.2015

Может разность показаний связана с разностью написанного в строках 36, 37?

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Разобрался, забыл про цикл.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
Код Ардуино
#include <EtherCard.h>
 #define ANALOG_PIN A0
#define OUT_A 2
#define OUT_B 3
#define OUT_C 4
int r;
// мак адрес вашего устройства
static byte mymac[] = { 0x74, 0x69, 0x69, 0x2D, 0x30, 0x31 };
// ИП вашего устройства
static byte myip[] = { 192, 168, 1, 200 };
 
byte Ethernet::buffer[500];
BufferFiller bfill;

void setup () {
 
   pinMode(OUT_A, OUTPUT);
  pinMode(OUT_B, OUTPUT);
  pinMode(OUT_C, OUTPUT); 
 
Serial.begin(9600);
// так как по умолчанию CS должен коннектиться к 8 порту, а у нас к 10 указываем это 
// (последний аргумент - номер порта)
 ether.begin(sizeof Ethernet::buffer, mymac, 10);
 ether.staticSetup(myip);
}
void loop () {
   digitalWrite(OUT_A, bitRead(1, 0));
     digitalWrite(OUT_B, bitRead(1, 1));
     digitalWrite(OUT_C, bitRead(1, 2));
   r=analogRead(ANALOG_PIN);

word pos = ether.packetLoop(ether.packetReceive());

    

 if (pos){
 bfill = ether.tcpOffset();
 bfill.emit_p(PSTR(
 "HTTP/1.0 200 OK\r\n"
 "Content-Type: text/html\r\n"
 "\r\n"

"<title>Gauge Test</title>"

"<script>var CANV_GAUGE_FONTS_PATH = 'http://test1.ru/canv-gauge-master/fonts'</script>"
"<script src=\"http://test1.ru/canv-gauge-master/gauge.min.js\"></script>"
"<canvas id=\"gauge\"></canvas>"
"<div id=\"console\"></div>"
"<script src=\"http://test1.ru/canv-gauge-master/1.js\"></script>"
"<script>"
"gauge.onready = function() {"
"setInterval( function() {"
//"gauge.setValue( Math.random() * 1200);"
"gauge.setValue($D);"
"}, 1000);"
"};"
"</script>"
),
r);
ether.httpServerReply(bfill.position());
 }
}

 

Код 1.js

	var gauge = new Gauge({
		renderTo    : 'gauge',
		width       : 200,
		height      : 200,
		glow        : true,
		units       : 'Pin A0',
		title       : false,
		minValue    : 0,
		maxValue    : 1200,
		majorTicks  : ['100','200','300','400','500','600','700','800','900','1000','1100','1200'],
		minorTicks  : 2,
		strokeTicks : false,
		highlights  : [
			{ from : 0,   to : 100, color : 'rgba(0,   255, 0, .15)' },
			{ from : 100, to : 200, color : 'rgba(255, 255, 0, .15)' },
			{ from : 200, to : 300, color : 'rgba(255, 30,  0, .25)' },
			{ from : 300, to : 400, color : 'rgba(255, 0,  225, .25)' },
			{ from : 400, to : 1200, color : 'rgba(0, 0,  255, .25)' }
		],
		colors      : {
			plate      : '#222',
			majorTicks : '#f5f5f5',
			minorTicks : '#ddd',
			title      : '#fff',
			units      : '#ccc',
			numbers    : '#eee',
			needle     : { start : 'rgba(240, 128, 128, 1)', end : 'rgba(255, 160, 122, .9)' }
		}
	});



	gauge.draw();

window.onresize= function() {
	gauge.updateConfig({
		width  : document.body.offsetWidth,
		height : document.body.offsetHeight
	});
};

Если включено

"gauge.setValue( Math.random() * 1200);"

Всё работает как и должно, стрелка прыгает в зависимости от сгенерированного числа.

Если делаю

"gauge.setValue($D);"

То стрелка кажет показания пина A0, но немяет его, только после перезагрузки страници.

Как исправить?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что выводите, то и показывает.

Просто подумайте, что означает глубокомысленная конструкция в строках 35-36? 

 ran=analogRead(ANALOG_PIN);
 Serial.print(analogRead(ran));

Например, на пние ANALOG_PIN напряжение 3В, ran получает значение примерно 615. И что Вы выводите? Значение напряжения на 615-ом пине? У Вас есть такой?

UPD: ох, тут Вы уже всё поменяли ... ну, ладно, моё замечание относилось к первому посту. Всё равно посмотрите, чтобы впредь такого не писать.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Помогите со второй проблемой)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не могу. Я понятия не имею, что за скрипты Вы включаете в строка 47, 48 и 51. Вам виднее.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Почему-то показания обновляются только после обновления страницы

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не, ну это Вы сами самотрите. Ваш код я глянул, про ошибку Вам написал, а скачивать какие-то скрипты, изучать их, простите, не могу.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

 

 

 

 r=analogRead(ANALOG_PIN);

это чтение происходит в void loop 

но ответ html ответ происходит только тогда, когда я захожу 192.168.1.200

И получается что я беру данные analogRead(ANALOG_PIN); только в момент обращения к 192.168.1.200

как сделать чтобы это значение analogRead(ANALOG_PIN); динамически отображалось на html страничке без её перезагрузки?

 

 

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, насколько я понимаю, делать это вручную по-простому Вы не умеете и Вам нужна готовая "бмблиотека". Таковая существует. Погуглите по слову ajax - эта библиотека как раз для таких дел предназначена.

Только сразу предупреждаю, она прядка 70КБайт и живёт на сервере. Если у Вас сервер - Ардуино, то Вам необходимо будет иметь либо SD карту, либо внешний EEPROM достаточного размера, короче, Вам где-то надо эти 70КБ хранить, чтобы раздавать клиентам.

Ну или можно тоже самое сделать руками в несколько строк, тут Вам надо гуглить по словам "связывание данных". Например, здесь (но сам не читал и не знаю насколько понятно изложено).

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Нашёл статью как раз про то что мне нужно.

http://startingelectronics.org/projects/arduino-projects/web-server-two-temperature-gauges/

Не понимаю как мне сделать передачу, у меня html страницы нет, она в самом коде ардуино

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, правильно. Вот в коде и всталяёте все нужные тэги.

Сначала отладьте на обычной странице (сервер не нужен, сделайте страницу в любом редакторе и грузите в браузер прямо из файла). Грузите, смотрите как работает, правьте, отлаживайте.

А как буде всё нормально работать, выдайте точно такой текст страницы из своего скетча.

И всё. Всё будет нормально.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

С HTML страницей всё ясно, всё работает.


"<title>Gauge Test</title>"
"<script src=\"http://test1.ru/3.js\"></script>"
"<body onload='GetArduinoInputs()'>"
"<canvas id=\"an_gauge_1\" data-title=\"Inside\" data-units=\"Temp. &deg;C\" width=\"500\" height=\"500\""
"data-major-ticks=\"-40 -30 -20 -10 0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150\" "
"data-type=\"canv-gauge\" data-min-value=\"-40\" data-max-value=\"150\" "
"data-highlights=\"-40 0 #4D89F2, 0 10 #25B8D9, 10 30 #0BB950, 30 40 #cc5, 40 150 #f33\" "
"data-onready=\"setInterval( function() { Gauge.Collection.get('an_gauge_1').setValue(data_val);}, 200);\"></canvas>"
"</body>"),

Текст страницы из ардуинки выдаёт нормально, работает, кажет.

Это всё понимаю.

"<?xml version = \"1.0\" ?>"
"<inputs>"
"<analog>"
"50"
"</analog>"
"<analog>"
"50" 
"</analog>"
"</inputs>"
 
C этим как быть? Как передать?
Lion777
Offline
Зарегистрирован: 20.05.2016

куда и кому это передавать ? есть метод POST, например... Тут и GET можно передать, не совсем понятно, вернее - совсем не понятно, куда ты это передать собрался.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sergeyevd пишет:

Текст страницы из ардуинки выдаёт нормально, работает, кажет.

Это всё понимаю.

"<?xml version = \"1.0\" ?>"
"<inputs>"
"<analog>"
"50"
"</analog>"
"<analog>"
"50" 
"</analog>"
"</inputs>"
 
C этим как быть? Как передать?

Вы сделали страницу на диске, как я говорил? Если нет, то в дальнейшем помогайте себе сами. Если же сделали, то этот XML у Вас лежит отдельным файлом рядом с HTM, правильно? И он (данные из него) нормально показываются в браузере. Правильно? Но, похоже, Вы не понимаете, как это работает, иначе не было бы этого вопроса.

Давайте разбирать внимательно.

  1. Браузер шлёт серверу запрос на страницу.
  2. Сервер отдаёт браузеру текст страницы
  3. Браузер разбирает страницу для показа и находит команду «загрузить XML данные»
  4. Браузер шлёт серверу запрос на XML файл
  5. Сервер отдаёт браузеру XML файл
  6. Браузер показывает данные
  7. Через некоторое время (определеляется JScrip'ом на странице) браузер снова переходит к п.4

Тепереь Вы понимаете, как отдавать XML?

После того, как Ва сервер (Ардуино) отдал основную страницу, он должен ждать запросв на XML файл и отдавать XML. Потом снова ждать и снова отдавать. Разумеется при каждом запросе XML файла, Ваш сервер должен отдавать актуальные данные. Так и получится, что данные на странице постоянно обновляются.

Только обязательно отладьте всё на файлах и только когда всё будет Вас устраивать, переходите к ардуино. Иначе Вы не будете знать где не работает.

Lion777
Offline
Зарегистрирован: 20.05.2016

во 2 строке твоего хтмл, что за бред ? <script src=\"<a href="http://test1.ru/3.js%5C" rel="nofollow">http://test1.ru/3.js\</a>"></script>

 

да и в первой бредовато, тег титл не там где надо.. дальше и не смотрел.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
Эти строчки добавились когда я выбрал тег кода
 
#include <EtherCard.h>
 #define ANALOG_PIN A0
#define OUT_A 2
#define OUT_B 3
#define OUT_C 4
int r;
// мак адрес вашего устройства
static byte mymac[] = { 0x74, 0x69, 0x69, 0x2D, 0x30, 0x31 };
// ИП вашего устройства
static byte myip[] = { 192, 168, 1, 100 };
 
byte Ethernet::buffer[500];
BufferFiller bfill;
 
void setup () {
 
   pinMode(OUT_A, OUTPUT);
  pinMode(OUT_B, OUTPUT);
  pinMode(OUT_C, OUTPUT); 
 
Serial.begin(9600);
// так как по умолчанию CS должен коннектиться к 8 порту, а у нас к 10 указываем это 
// (последний аргумент - номер порта)
 ether.begin(sizeof Ethernet::buffer, mymac, 10);
 ether.staticSetup(myip);
}
void loop () {
   digitalWrite(OUT_A, bitRead(1, 0));
     digitalWrite(OUT_B, bitRead(1, 1));
     digitalWrite(OUT_C, bitRead(1, 2));
   r=analogRead(ANALOG_PIN);
 
word pos = ether.packetLoop(ether.packetReceive());
 
    
 
 if (pos){
 bfill = ether.tcpOffset();
 bfill.emit_p(PSTR(
 "HTTP/1.0 200 OK\r\n"
 "Content-Type: text/html\r\n"
 "\r\n"
"<title>Gauge Test</title>"
"<script>var CANV_GAUGE_FONTS_PATH = 'http://test1.ru/canv-gauge-master/fonts'</script>"
"<style>body{padding:0;margin:0;background:#222}</style>"
"</head>"
"<body style=\"width:20%;height:20%\">"
"<canvas id=\"gauge\"></canvas>"
"<div id=\"console\"></div>"
"<script src=\"http://test1.ru/canv-gauge-master/1.js\"></script>"
"<script>"
"gauge.setValue($D);"
"</script></html>"),
r);
 
 
 
 ether.httpServerReply(bfill.position());
 }
}
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

del

Lion777
Offline
Зарегистрирован: 20.05.2016

В ответе от сервера нужно указать сколько байт передаешь, тип так Content-Length: 15\r\n

с AJAX разобрался ? если нет, то по простому можешь вставить между тегов

<head>

<meta http-equiv="refresh" content="10">

</head>

и страница будет обновлятся каждые 10 сек.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Спасибо что помогаете.

ЕвгенийП, разобрался я только с Html. Создал файл, всё работает, кажет 0, изначальное значение переменной. С файлом xml не разобрался, не знаю как. 

Я решил пойти немного по другому пути, авось получится...

Подключил модуль SD карты. 

Загрузил на карту файл index.htm

В ардуинку загрузил код из выше указанной статьи.

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ   50

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177); // IP address, may need to change depending on network
EthernetServer server(80);  // create a server at port 80
File webFile;               // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer

void setup()
{
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);

    Serial.begin(9600);       // for debugging
    
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for index.htm file
    if (!SD.exists("index.htm")) {
        Serial.println("ERROR - Can't find index.htm file!");
        return;  // can't find index file
    }
    Serial.println("SUCCESS - Found index.htm file.");
    
    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients
}

void loop()
{
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                // buffer first part of HTTP request in HTTP_req array (string)
                // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
                if (req_index < (REQ_BUF_SZ - 1)) {
                    HTTP_req[req_index] = c;          // save HTTP request character
                    req_index++;
                }
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                if (c == '\n' && currentLineIsBlank) {
                    // send a standard http response header
                    client.println("HTTP/1.1 200 OK");
                    // remainder of header follows below, depending on if
                    // web page or XML page is requested
                    // Ajax request - send XML file
                    if (StrContains(HTTP_req, "ajax_inputs")) {
                        // send rest of HTTP header
                        client.println("Content-Type: text/xml");
                        client.println("Connection: keep-alive");
                        client.println();
                        // send XML file containing input states
                        XML_response(client);
                    }
                    else {  // web page request
                        // send rest of HTTP header
                        client.println("Content-Type: text/html");
                        client.println("Connection: keep-alive");
                        client.println();
                        // send web page
                        webFile = SD.open("index.htm");        // open web page file
                        if (webFile) {
                            while(webFile.available()) {
                                client.write(webFile.read()); // send web page to client
                            }
                            webFile.close();
                        }
                    }
                    // display received HTTP request on serial port
                    Serial.print(HTTP_req);
                    // reset buffer index and all buffer elements to 0
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                } 
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)
}

// send the XML file containing analog value
void XML_response(EthernetClient cl)
{
    int analog_val_1 = 0;
    int analog_val_2 = 0;
    char sample;
    
    // get the sum of 10 samples from analog inputs 2 and 3
    for (sample = 0; sample < 10; sample++) {
        analog_val_1 += analogRead(2);
        delay(2);
        analog_val_2 += analogRead(3);
        delay(2);
    }
    // calculate the average of the 10 samples
    analog_val_1 /= 10;
    analog_val_2 /= 10;
    
    cl.print("<?xml version = \"1.0\" ?>");
    cl.print("<inputs>");
    // read analog pin A2
//    analog_val = analogRead(2);
    cl.print("<analog>");
    cl.print(analog_val_1);
    cl.print("</analog>");
//    analog_val = analogRead(3);
    cl.print("<analog>");
    cl.print(analog_val_2);
    cl.print("</analog>");
    cl.print("</inputs>");
}

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}

// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
    
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;
}

Запускаю.

Монитор порта выдаёт следующее:

Initializing SD card...
SUCCESS - SD card initialized.
SUCCESS - Found index.htm file.
 
192.168.1.777 недоступен
Превышено время ожидания ответа от сайта 192.168.1.177.

 

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Lion777, это да, это знаю Но хочется без обновления страницы, хочется разобраться.

Lion777
Offline
Зарегистрирован: 20.05.2016

ну тогда АЯКС напрямую или через JQuery или т.п.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
Lion777, объясните пожалуйста на более простом примере.
Данный скетч считывает данные с пина A0 и выдаёт это значение на экране. Происходит это каждую секунду, но с обновлением страницы. Покажите как это сделать без обновления страницы.
#include <EtherCard.h>
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192,168,1,203 };
byte Ethernet::buffer[500];
BufferFiller bfill;

void setup () {
if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0)
Serial.println(F("Failed to access Ethernet controller"));
ether.staticSetup(myip);
Serial.begin(9600);
}

static word homePage() {
bfill = ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n"
"\r\n"
"<title>Znachenie pin A0</title>"
"<meta http-equiv=\"Refresh\" content=\"1\"/>"
"<p>Znachenie pin A0 = $D</p>"),
analogRead(0));

return bfill.position();
}
void loop () {
word len = ether.packetReceive();
word pos = ether.packetLoop(len);
if (pos)  // check if valid tcp data is received
ether.httpServerReply(homePage()); // send web page data
}

 

 

Lion777
Offline
Зарегистрирован: 20.05.2016

ну почитать можно про АЯКС ? код ЯваСкрипт Си-подобный, похож на ардуино, примеров с АЯКС полно, вот ссылка почитать, похожее как у тебя, на англ. языке https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-AJAX-XML-web-server/

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/AJAX-read-switches-analog/

Взял вот этот пример:

#include <SPI.h>
#include <Ethernet.h>

// MAC address from Ethernet shield sticker under board
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(10, 0, 0, 20); // IP address, may need to change depending on network
EthernetServer server(80);  // create a server at port 80

String HTTP_req;            // stores the HTTP request

void setup()
{
    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients
    Serial.begin(9600);       // for diagnostics
    pinMode(7, INPUT);        // switch is attached to Arduino pin 7
    pinMode(8, INPUT);        // switch is attached to Arduino pin 8
}

void loop()
{
    EthernetClient client = server.available();  // try to get client

    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                HTTP_req += c;  // save the HTTP request 1 char at a time
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                if (c == '\n' && currentLineIsBlank) {
                    // send a standard http response header
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                    client.println("Connection: keep-alive");
                    client.println();
                    // AJAX request for switch state
                    if (HTTP_req.indexOf("ajax_switch") > -1) {
                        // read switch state and analog input
                        GetAjaxData(client);
                    }
                    else {  // HTTP request for web page
                        // send web page - contains JavaScript with AJAX calls
                        client.println("<!DOCTYPE html>");
                        client.println("<html>");
                        client.println("<head>");
                        client.println("<title>Arduino Web Page</title>");
                        client.println("<script>");
                        client.println("function GetSwitchAnalogData() {");
                        client.println(
                            "nocache = \"&nocache=\" + Math.random() * 1000000;");
                        client.println("var request = new XMLHttpRequest();");
                        client.println("request.onreadystatechange = function() {");
                        client.println("if (this.readyState == 4) {");
                        client.println("if (this.status == 200) {");
                        client.println("if (this.responseText != null) {");
                        client.println("document.getElementById(\"sw_an_data\")\
.innerHTML = this.responseText;");
                        client.println("}}}}");
                        client.println(
                        "request.open(\"GET\", \"ajax_switch\" + nocache, true);");
                        client.println("request.send(null);");
                        client.println("setTimeout('GetSwitchAnalogData()', 1000);");
                        client.println("}");
                        client.println("</script>");
                        client.println("</head>");
                        client.println("<body onload=\"GetSwitchAnalogData()\">");
                        client.println("<h1>Arduino AJAX Input</h1>");
                        client.println("<div id=\"sw_an_data\">");
                        client.println("</div>");
                        client.println("</body>");
                        client.println("</html>");
                    }
                    // display received HTTP request on serial port
                    Serial.print(HTTP_req);
                    HTTP_req = "";            // finished with request, empty string
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                } 
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)
}

// send the state of the switch to the web browser
void GetAjaxData(EthernetClient cl)
{
    int analog_val;
    
    if (digitalRead(7)) {
        cl.println("<p>Switch 7 state: ON</p>");
    }
    else {
        cl.println("<p>Switch 7 state: OFF</p>");
    }
    if (digitalRead(8)) {
        cl.println("<p>Switch 8 state: ON</p>");
    }
    else {
        cl.println("<p>Switch 8 state: OFF</p>");
    }
    // read analog pin A2
    analog_val = analogRead(2);
    cl.print("<p>Analog A2: ");
    cl.print(analog_val);
    cl.println("</p>");
}

Не хочет соединяться с сервером

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Sergeyevd пишет:

Не хочет соединяться с сервером

Ну, может, не в духе, или настроения нет - чего докопались к железке-то? Может, у неё голова болит?

А если серьёзно, то "не хочет соединяться с сервером" - говорит мне ровно столько же, как и фраза "нет настроения у железки". Может - при коннекте отваливается по таймауту, может - ещё тыщу причин: ни схемы подключения, ничего.

Если хотите грамотного ответа - правильно формулируйте вопрос. В правильно сформулированном, обычно, половина ответа уже содержится по определению.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Схема подключения.

 

Не удается получить доступ к сайту

Превышено время ожидания ответа от сайта 192.168.1.177

 

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Жёлтый диодик на плате моргает

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Таймаут, значит, что-то идёт не так. Попробуйте добавить отладочный код, распихайте Serial.println("тут сообщение") по коду и посмотрите в мониторе порта - происходит ли вообще что-либо при попытке соединиться.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sergeyevd, Так Вы никогда не сделаете. У Вас подход неправильный.

Вам же говорили и я, и другие коллеги - почитайте про ajax, а ещё лучше сделайте свой короткий скрипт, чтобы не тащить аяксовские 70 КБ и на городить SD карту ради пустяков.

Вы же не хотите читать, а всё надеетесь найти волшебный готовый код.

Ну, смотрите, как это просто, чёрт возьми!

Делаете такую страницу:

<html>
   <head>
      <title>Cool dynamic page!!!</title>
       <script language="JavaScript">
         var oReq = new XMLHttpRequest();
         oReq.addEventListener("load", transferComplete);

         function transferComplete () {
            var array = (""+this.responseText).replace(/[\s\r\n]+/g, "=").match( /([^=]+)/g);
            for (var i=0, len = array.length; i < len; i += 2) document.getElementById(array[i]).innerText = array[i+1];
         }

         function dataRefresh() {
            oReq.open("GET", "data.txt", true);
            oReq.send();
         }

       </script>
   </head>
   <body onload="setInterval('dataRefresh()', 1000)">
     Temperature on the Mars surface is <span id="temperature"></span>.</br>
     Humidity is <span id="humidity"></span>.
   </body>
</html>

К ней прилагается текстовый файл data.txt с данными, вот такой

temperature=56
humidity=31

Если их положить рядышком на сервере и HTM файл загрузить в браузер, то он покажет. текст

Temperature on the Mars surface is 56.
Humidity is 31.

а теперь, если файл с данными открыть (в лбом редактеоре) и менять значения, то в браузере эти значения будут меняться сами (обновляются раз в секунду или реже, если сеть тормозная).

Это то, что Вам нужно?

Если то, то сделайте следующее: Разместите эти два файла на сервере (любом, можно localhost) и убедитесь, что всё работает как я сказал.

После этого я подскажу как их можно менять по Вашему усмотрению и как из запихать в ардуино.

Только давайте Вы будете делать, что говорят. Если сразу начнёте пихать в Ардуино - помогайте себе сами.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Это то, что Вам нужно?

Если то, то сделайте следующее: Разместите эти два файла на сервере (любом, можно localhost) и убедитесь, что всё работает как я сказал.

Да, это то, что мне нужно.

Всё попробовал, всё работает.

После этого я подскажу как их можно менять по Вашему усмотрению и как из запихать в ардуино.

Внимательно читаю.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Евгений, сейчас хотел попробовать добавить это всё в свой код, но столкнулся с вопросом как загнать значение temperature в переменную джаваскрипта. Перепробовал столько всего....

 

//data_val  = this.responseXML.getElementsById('a1');

//data_val2 = this.responseXML.getElementsByTagName('a2');

//val a1 = document.getElementById("a1");
//rate_num = (document.getElementById(vote+'_span').innerHTML*1);
//var  data_val = document.getElementById('a1');
//var data_val = (document.getElementById('a1').innerHTML);   
//var data_val = request.responseXML.getElementsById('a1'); 
//var data_val = xml.getElementsById("a1");      
//data_val = this.responseXML.getElementsById('a')[1].childNodes[0].nodeValue;  
//var data_val = xmlhttp.responseXML.getElementById('a1');
//var response = xmlhttp.responseText;
//alert(response);

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, теперь давайте попробуете с ардуино. Потом снова вернёмся к серверу. Но пока убедимся, что Вы можете это в ардуино перенести.

Вам надо сделать такой скетч сервера.

Шаг первый

1. Если пришёл GET запрос на файл HTM - Вы просто возвращаеете мой НТМ файл ничего не меняя. 

2. Если пришёл GET запрос на файл data.txt - Вы возвращаете мой файл. Запросы на этот файл Вам будут валиться каждую секунду. Вот каждую секунду и возвращайте одно и тоже.

Если Вы всё сделаете правильно, будут показываться постоянные значения темпаратуры и влажности. Если показываются, значит всё нормально, преходим к 

Шаг второй

1. Если пришёл GET запрос на файл HTM - Вы по-прежнему возвращаеете мой НТМ файл ничего не меняя. 

2. Если пришёл GET запрос на файл data.txt - Вы возвращаете мой файл, но на этот раз какую-нибудь цифру (например, температуру) в нём постоянно меняете (например, поставьте глобальный счётчик и возвращайте каждый раз следующее число: 1, 2, 3 и т.д.)

Если Вы сделаете всё правильно, Вы в браузере будете видеть меняющееся каждую секунду число.

Если у Вас и это получится, дальше Вы знаете что делать. Если не знаете, завтра поговорим. Завтра же я помсотрю свой файл и поправлю его, чтобы меньше памяти жрал и вообще посмотрю, а то сегодня я его очень быстро писал, посмотрим, поправим. Также завтра я объясню всё, что в нём написано, чтобы Вы могли легко менять его под свои нужды.

Пока же попробуйте сделать два шага, которые я описал.

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sergeyevd пишет:

Евгений, сейчас хотел попробовать добавить это всё в свой код, но столкнулся с вопросом как загнать значение temperature в переменную джаваскрипта. Перепробовал столько всего....

Никак. Их там нет и не будет.  Они будут дозапрашиваться каждую секунду. А файл HTM Вам вообще пока не надо менять.

Сделайте как я описал в двух шагах в предыдущем посте.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
#include <EtherCard.h>
 
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192,168,1,100 };
 
const char website[] PROGMEM = "192.168.1.100";
byte Ethernet::buffer[500];
 
BufferFiller bfill;
 
void setup () {
 ether.begin(sizeof Ethernet::buffer, mymac, 10);
 ether.staticSetup(myip);
 Serial.begin(9600);}
 
void loop () {
 word pos = ether.packetLoop(ether.packetReceive());
 if (pos){
// получаем заголовки
 char *data = (char *) Ethernet::buffer + pos;
// проверяем на наличие в заголовках нужных нам строк
 if (strstr(data, "index.htm")){
Serial.println(data);
bfill = ether.tcpOffset();
 bfill.emit_p(PSTR(
 "HTTP/1.0 200 OK\r\n"
 "Content-Type: text/html\r\n"
 "\r\n"
 "<html>"
"<head>"
"<title>Cool dynamic page!!!</title>"
"<script language=\"JavaScript\">"
"var oReq = new XMLHttpRequest();"
"oReq.addEventListener(\"load\", transferComplete);"
"function transferComplete () {"
"var array = (\"\"+this.responseText).replace(/[\s\r\n]+/g, \"=\").match( /([^=]+)/g);"
"for (var i=0, len = array.length; i < len; i += 2) document.getElementById(array[i]).innerText = array[i+1];"
"}"
"function dataRefresh() {"
"oReq.open(\"GET\", \"data.txt\", true);"
"oReq.send();"
"}"
"</script>"
"</head>"
"<body onload=\"setInterval('dataRefresh()', 1000)\">"
"Temperature on the Mars surface is <span id=\"temperature\"></span>.</br>"
"Humidity is <span id=\"humidity\"></span>."
"</body>"
"</html>"

 ));
}
  if (strstr(data, "data.txt")){
Serial.println(data);
bfill = ether.tcpOffset();
 bfill.emit_p(PSTR(
 "HTTP/1.0 200 OK\r\n"
 "Content-Type: text/html\r\n"
 "\r\n"
"что-то как-то"
 ));
}

 
 ether.httpServerReply(bfill.position());
 }
}

Соорудил скетч. Всё таки жду объяснений, не очень то получается у меня..

fogary
Offline
Зарегистрирован: 05.03.2016

Sergeyevd пишет:
Не удается получить доступ к сайту

Превышено время ожидания ответа от сайта 192.168.1.177

У Вас в коде указан адрес 10.0.0.20

IPAddress ip(10, 0, 0, 20); // IP address, may need to change depending on network

А адрес 192.168.1.177 от куда?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sergeyevd пишет:

Соорудил скетч. Всё таки жду объяснений, не очень то получается у меня..

Не, Сергей Вы толком объясняйте, что не получается.

Например, Саму страницу без данных Вы в браузере видите или нет? Если нет, то проблема совсем не моих делах, а если видите, то в моих. Соответсвенно и искать проблему надо в разных местах. Так что подробнее, пожалуйста.

Пока же то, что сразу заметил.

1
В строке 58 должно быть text/plain а не text/html

2
Вместо строки 60, Вы должны возвращать нормальный документ, как было у меня, т.е. там должно быть не

"что-то как-то"

а

"temperature=56\nhumidity=31"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сергей, более аккуратная версия скрипта, а также подробная инструкция как с ним работать в новой теме http://arduino.ru/forum/programmirovanie/microajax-dlya-arduino

Посмотрите.

Если не будет получаться, можете задавать вопросы хоть там, хоть здесь, только описывайте проблему подробнее, как я Вас просил.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

У Вас в коде указан адрес 10.0.0.20

1 IPAddress ip(10, 0, 0, 20); // IP address, may need to change depending on network

А адрес 192.168.1.177 от куда?

 

fogary, прошу прощенья, естественно в скетче адрес был 192.168.1.177, а сюда скопировал исходный вариант.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Sergeyevd пишет:

fogary, прошу прощенья, естественно в скетче адрес был 192.168.1.177, а сюда скопировал исходный вариант.

Сюда копируйте только тот вариант, который загружаете в ардуину. Вот прямо из окошка Arduino IDE и копируйте.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Jeka_M, соответственно

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

DIYMan пишет:

Таймаут, значит, что-то идёт не так. Попробуйте добавить отладочный код, распихайте Serial.println("тут сообщение") по коду и посмотрите в мониторе порта - происходит ли вообще что-либо при попытке соединиться.

 

Не работает наверное потому что ENC28J60 не работает со штатной библиотекой ентернет