Verb начинающего

yapatha
Offline
Зарегистрирован: 29.09.2017

Доброе время суток, уважаемый All!

Потихонечку ковыряю температурный датчик ардуиной. Естественно что то где то взял, наковырял что то для себя и запустил в работу. Пока были положительные температуры все работало замечательно, как только в Сибири настало минус - при отрицательных значениях ардуинка стала выводить данные вида 65533 и т.д.

Прилагаю используемый скетч с просьбой объяснить что я делаю не так.

Спасибо.

#include <EtherCard.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS   2


static byte mymac[] = {0x00, 0x04, 0xA3, 0x21, 0xCA, 0x38};
static byte myip[] = { 192,168,89,120 };
static byte gwip[] = { 192,168,89,1 };
static BufferFiller bfill;
byte Ethernet::buffer[500];

OneWire ds(ONE_WIRE_BUS);
DallasTemperature sensors(&ds);

unsigned long previousMillis = 0;
static byte session_id;
byte actual_status;

void setConversionTime(byte conf) {
  ds.reset();
  ds.skip(); // skip ROM
  ds.write(0x4E); // write scratchpad
  ds.write(0); // Th
  ds.write(0); // Tl
  ds.write(conf); // configuration
}

void startConversionAll() {
  ds.reset();
  ds.skip(); // skip ROM
  ds.write(0x44,0); // start conversion
  delay(10);
}

void setup () {
 
  Serial.begin(57600);
  delay(2000);

 if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller");
        ether.staticSetup(myip, gwip);  
  Serial.println();
  ether.printIp("IP Address:\t", ether.myip);
  ether.printIp("Gateway:\t", ether.gwip);
  Serial.println();
}

const char okHeader[] PROGMEM =
  "HTTP/1.0 200 OK\r\n"
  "Content-Type: text/html\r\n"
  "Pragma: no-cache\r\n"
;

static void homePage (BufferFiller& buf) {
  
  buf.emit_p(PSTR("$F\r\n"
    "<title>Arduino web-thermometer</title>"
    "<h2>DS18B20 Network:</h2>"
    "<pre>"), okHeader);
  
  byte counter = 0; 
  byte addr[8]; 
  byte data[12];
  
  setConversionTime(0x7F);
  startConversionAll();
  delay(100);
  
  ds.reset_search();
  delay(250);
  while (ds.search(addr)) {
    buf.emit_p(PSTR("$D: "),++counter);
    for (byte i=0; i<8; i++) {  // считываем и выводим 9-байтный код
      buf.emit_p(PSTR("$H "), addr[i]);
    }
    if ( OneWire::crc8(addr, 7) != addr[7]) {
      buf.emit_p(PSTR("- address CRC is not valid!\n"));
      continue;
    } else if (addr[0] != 0x28) {
      buf.emit_p(PSTR("- is not a DS18B20 family device!\n"));
      continue;
    }
    ds.reset();
    ds.select(addr);
    ds.write(0xBE); // читаем scratchpad
    for (byte k=0; k<9; k++) {  // нам потребуется 9 байт‚
      data[k] = ds.read();
    }
    if ( OneWire::crc8( data, 8) != data[8]) {
      buf.emit_p(PSTR("- value CRC is not valid!\n"));
      continue;
    }
    buf.emit_p(PSTR(" - $D.$D &#176;C\n"), *(int *)data/16, (int) (abs(*(int *)data % 16) * 0.625));
  }
  buf.emit_p(PSTR("\nTotal: $D devices."), counter);
}


void loop(void)
{
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  if (pos) { 
    bfill = ether.tcpOffset();
    char* data = (char *) Ethernet::buffer + pos;
    if (strncmp("GET / ", data, 6) == 0) 
      homePage(bfill);
    else
      bfill.emit_p(PSTR(
        "HTTP/1.0 401 Unauthorized\r\n"
        "Content-Type: text/html\r\n"
        "\r\n"
        "<h1>401 Unauthorized</h1>"));
        
    // отправить ответ клиенту
    ether.httpServerReply(bfill.position());
  }
}

 

yapatha
Offline
Зарегистрирован: 29.09.2017

Хотелконечно же назвать тему "Муки начинающего", но, пунто-свитчер решил по своему. Но и Verb Начинающего (verb - слово) получилось хорошо. :-)

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

В 96-ой строке 'D' - означает беззнаковое число. Вот она Ваше отрицательное число как беззнаковое и печатает.

sadman41
Offline
Зарегистрирован: 19.10.2016

И пользоваться нужно объектом sensors, раз вы его создали - там проверки CRC уже встроены, корректировка отрицательной температуры тоже унутре.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

корректировка отрицательной температуры тоже унутре.

И неонка

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

DetSimen пишет:

sadman41 пишет:

корректировка отрицательной температуры тоже унутре.

И неонка

и, чорный дым

yapatha
Offline
Зарегистрирован: 29.09.2017

Ну вот вы тут гуры все, а я совсем-пресовсем начинающий. И, честно сказать код этот нашёл на просторах всемирной сети. А ткните носом (покажите как ловить рыбу) как сделать, пожалуйста. Буду премного благодарен.

sadman41
Offline
Зарегистрирован: 19.10.2016

Думаю, что никто этот адский ад c использованием EtherCard переписывать с OneWire на DallasTemperature вам никто за здорово живешь не будет. А объяснений тут втрое больше, чем переписывания.

Я честно поискал вам что попроще, но не нашел. Так что остается только посоветовать найти скетчи по фразе "DallasTemperature и Ethernet Shield", а вместо библиотеки Ethernet подключить UIPEthernet (она для ENC28J60, но совместима по командам со стоковой).