Ethernet + датчик температуры 18D20

pashaiva
Offline
Зарегистрирован: 29.04.2014

Добрый день. 

Подскажите, написал программку которая по запросу клиента выдает в браузере показания датчика температуры. Работает она нормально до тех пор, пока я не постучусь к 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) то все работает нормально. 

 

Подскажите в чем может быть проблема???

pashaiva
Offline
Зарегистрирован: 29.04.2014

немного опечатался, датчик температуры 18B20

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

сделайте delay(100) в ожидании отдачи странички браузеру, а вообще - температуру лучше мерять по расписанию, а при запросе отдавать уже измеренные данные.

pashaiva
Offline
Зарегистрирован: 29.04.2014

Спасибо за ответ, но это не помогало, я пробовал. Решение нашел. Нужно было просто выбрать другой пин для считывания данных с датчика. Я выбрал 7-ой и все заработало.