Спойлер: Скетч Код (C++): #include <EtherCard.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 10 OneWire oneWire(ONE_WIRE_BUS); // Передаем наши 1-Wire ссылки датчику температуры DallasTemperature sensors(&oneWire); // Enternet static byte mymac[] = { 0x00,0x01,0x01,0x01,0x01,0x01 }; static byte myip[] = { 192,168,0,177 }; #define BUFFER_SIZE 500 byte Ethernet::buffer[BUFFER_SIZE]; BufferFiller bfill; #define CS_PIN 53 const char http_OK[] PROGMEM = "HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n\r\n"; const char http_Found[] PROGMEM = "HTTP/1.0 302 Found\r\n" "Location: /\r\n\r\n"; const char http_Unauthorized[] PROGMEM = "HTTP/1.0 401 Unauthorized\r\n" "Content-Type: text/html\r\n\r\n" "<h1>401 Unauthorized</h1>"; // end enternet // rele #define RELAIS_1 22 #define RELAIS_2 24 bool relais1Status = false; bool relais2Status = false; // end rele //Домашняя страница void homePage() { sensors.requestTemperatures(); bfill.emit_p(PSTR("$F" "<title>Arduino Relais Webserver</title>" "Relais 1: <a href=\"?relais1=$F\">$F</a><br />" "Relais 2: <a href=\"?relais2=$F\">$F</a><br />" ), http_OK, relais1Status?PSTR("off"):PSTR("on"), relais1Status?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"), relais2Status?PSTR("off"):PSTR("on"), relais2Status?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>") ); float temp = sensors.getTempCByIndex(0); bfill.emit_p(PSTR("Temp: $F"),temp); Serial.println(temp); } void setup() { Serial.begin(115200); //Реле pinMode(RELAIS_1, OUTPUT); pinMode(RELAIS_2, OUTPUT); // Конец реле //Интернет if (ether.begin(BUFFER_SIZE, mymac, CS_PIN) == 0) Serial.println("Cannot initialise ethernet."); else Serial.println("Ethernet initialised."); ether.staticSetup(myip); Serial.println("Setting up DHCP"); if (!ether.dhcpSetup()) Serial.println( "DHCP failed"); ether.printIp("My IP: ", ether.myip); ether.printIp("GW IP: ", ether.gwip); ether.printIp("DNS IP: ", ether.dnsip); //Конец интернета sensors.begin(); } void loop() { //РПеле digitalWrite(RELAIS_1, relais1Status); digitalWrite(RELAIS_2, relais2Status); //Конец реле delay(1); // necessary for my system word len = ether.packetReceive(); // check for ethernet packet word pos = ether.packetLoop(len); // check for tcp packet // Сервер if (pos) { bfill = ether.tcpOffset(); char *data = (char *) Ethernet::buffer + pos; if (strncmp("GET /", data, 5) != 0) { // Unsupported HTTP request // 304 or 501 response would be more appropriate bfill.emit_p(http_Unauthorized); } else { Serial.print("----"); Serial.print(data); Serial.println("----"); data += 5; if (data[0] == ' ') { // Return home page homePage(); } else if (strncmp("?relais1=on ", data, 12) == 0) { relais1Status = true; bfill.emit_p(http_Found); } else if (strncmp("?relais2=on ", data, 12) == 0) { relais2Status = true; bfill.emit_p(http_Found); } else if (strncmp("?relais1=off ", data, 13) == 0) { relais1Status = false; bfill.emit_p(http_Found); } else if (strncmp("?relais2=off ", data, 13) == 0) { relais2Status = false; bfill.emit_p(http_Found); } else { // Page not found bfill.emit_p(http_Unauthorized); } } ether.httpServerReply(bfill.position()); // send http response } // Сервер конец } char * floatToString(char * outstr, double val, byte precision, byte widthp){ char temp[16]; //increase this if you need more digits than 15 byte i; temp[0]='\0'; outstr[0]='\0'; if(val < 0.0){ strcpy(outstr,"-\0"); //print "-" sign val *= -1; } if( precision == 0) { strcat(outstr, ltoa(round(val),temp,10)); //prints the int part } else { unsigned long frac, mult = 1; byte padding = precision-1; while (precision--) mult *= 10; val += 0.5/(float)mult; // compute rounding factor strcat(outstr, ltoa(floor(val),temp,10)); //prints the integer part without rounding strcat(outstr, ".\0"); // print the decimal point frac = (val - floor(val)) * mult; unsigned long frac1 = frac; while(frac1 /= 10) padding--; while(padding--) strcat(outstr,"0\0"); // print padding zeros strcat(outstr,ltoa(frac,temp,10)); // print fraction part } // generate width space padding if ((widthp != 0)&&(widthp >= strlen(outstr))){ byte J=0; J = widthp - strlen(outstr); for (i=0; i< J; i++) { temp[i] = ' '; } temp[i++] = '\0'; strcat(temp,outstr); strcpy(outstr,temp); } return outstr; } Подскажите пожалуйста почему в консоле я получаю нормальное значение температуры, а на веб сайте какой то иероглиф или букву "B". Заранее спасибо !
Попробуйте так Код (C++): bfill.emit_p(PSTR("Temp: $T"),temp); //Format string //$T double Decimal representation with 3 digits after decimal sign ([-]d.ddd) //$F PGM_P Copy null terminated string from program space
Теперь выводит просто "Т" вместо значения. Я заметил в консоле что когда я обращяюсь к серверу приходит 2 ответа, 1й с нормальными данными о температуре, а второй с пустыми данными. Подскажите пожалуйста и-за чего может приходить 2 ответа? Спасибо 1 запрос = 2 ответа Код (Text): 22.87 ----GET /favicon.ico HTTP/1.1 Host: 192.168.0.177 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36 Accept: */* Referer: http://192.168.0.177/ Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 ---- ----GET /favicon.ico HTTP/1.1 Host: 192.168.0.177 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36 Accept: */* Referer: http://192.168.0.177/ Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 ----
В EtherCard.cpp расскомментируйте строку 19 Код (C++): //#define FLOATEMIT // uncomment line to enable $T in emit_P for float emitting
Спасибо, сейчас попробую. Пока решил проблему таким образом Код (C++): int temp = sensors.getTempCByIndex(0); char T1[6]; //// dtostrf(temp,5,2,T1); bfill.emit_p(PSTR("Temp: $S *C <br />"),T1); Но ваш способ лучше, сейчас проверю