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, но совместима по командам со стоковой).