Ethernet + датчик температуры 18D20
- Войдите на сайт для отправки комментариев
Втр, 29/04/2014 - 14:46
Добрый день.
Подскажите, написал программку которая по запросу клиента выдает в браузере показания датчика температуры. Работает она нормально до тех пор, пока я не постучусь к Ethernet модулю по IP, чтоб он мне показал температуру в браузере. По ходу дебага пришел к тому, что программа виснит после обращения к функции возврата температуры во время формирования Http-ответа клиенту.
int TemperatureClass::GetTemperature(int pin)
{
OneWire ds(pin);
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}
ds.reset();
ds.select(addr);
//ds.write(0x44,1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
byte present = ds.reset();
ds.select(addr);
//ds.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
ds.reset();
byte MSB = data[1];
byte LSB = data[0];
float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;
return TemperatureSum;
}
EthernetClient client = server.available();
if (client) {
Serial.println("Подключился новый клиент ");
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n' && currentLineIsBlank) {
// отправляем стандартный ответ
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println("Refresh: 5"); // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
/*float temperature=Temperature.GetTemperature(10);
Serial.println(temperature);
client.println(temperature);*/
client.println("</html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// даем время браузеру, чтоб получить данные
delay(1);
client.stop();
Serial.println("Клиент отключен");
}
Если Temperature.GetTemperature(10) то все работает нормально.
Подскажите в чем может быть проблема???
немного опечатался, датчик температуры 18B20
сделайте delay(100) в ожидании отдачи странички браузеру, а вообще - температуру лучше мерять по расписанию, а при запросе отдавать уже измеренные данные.
Спасибо за ответ, но это не помогало, я пробовал. Решение нашел. Нужно было просто выбрать другой пин для считывания данных с датчика. Я выбрал 7-ой и все заработало.