Иероглифы вместо показания датчика

Тема в разделе "Arduino & Shields", создана пользователем Bluff159, 2 июн 2016.

  1. Bluff159

    Bluff159 Нуб

    Код (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".
    Заранее спасибо !
     
  2. ZAZ-965

    ZAZ-965 Гуру

    Попробуйте так
    Код (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
     
     
  3. Bluff159

    Bluff159 Нуб

    Теперь выводит просто "Т" вместо значения. Я заметил в консоле что когда я обращяюсь к серверу приходит 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

    ----
     
     
  4. ZAZ-965

    ZAZ-965 Гуру

    В EtherCard.cpp расскомментируйте строку 19
    Код (C++):
    //#define FLOATEMIT // uncomment line to enable $T in emit_P for float emitting
     
    Bluff159 нравится это.
  5. Bluff159

    Bluff159 Нуб

    Спасибо, сейчас попробую. Пока решил проблему таким образом

    Код (C++):
    int temp = sensors.getTempCByIndex(0);
    char T1[6];
    ////

    dtostrf(temp,5,2,T1);
    bfill.emit_p(PSTR("Temp: $S *C <br />"),T1);
    Но ваш способ лучше, сейчас проверю
     
  6. Bluff159

    Bluff159 Нуб

    Так выводит:
    Код (Text):
    0.000