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-ой и все заработало.