Verb начинающего
- Войдите на сайт для отправки комментариев
Пт, 29/09/2017 - 21:16
Доброе время суток, уважаемый 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 °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()); } }
Хотелконечно же назвать тему "Муки начинающего", но, пунто-свитчер решил по своему. Но и Verb Начинающего (verb - слово) получилось хорошо. :-)
В 96-ой строке 'D' - означает беззнаковое число. Вот она Ваше отрицательное число как беззнаковое и печатает.
И пользоваться нужно объектом sensors, раз вы его создали - там проверки CRC уже встроены, корректировка отрицательной температуры тоже унутре.
корректировка отрицательной температуры тоже унутре.
И неонка
корректировка отрицательной температуры тоже унутре.
И неонка
и, чорный дым
Ну вот вы тут гуры все, а я совсем-пресовсем начинающий. И, честно сказать код этот нашёл на просторах всемирной сети. А ткните носом (покажите как ловить рыбу) как сделать, пожалуйста. Буду премного благодарен.
Думаю, что никто этот адский ад c использованием EtherCard переписывать с OneWire на DallasTemperature вам никто за здорово живешь не будет. А объяснений тут втрое больше, чем переписывания.
Я честно поискал вам что попроще, но не нашел. Так что остается только посоветовать найти скетчи по фразе "DallasTemperature и Ethernet Shield", а вместо библиотеки Ethernet подключить UIPEthernet (она для ENC28J60, но совместима по командам со стоковой).