Jump to content

    
Sign in to follow this  
addi II

Кто работал с DS1820?

Recommended Posts

Здравствуйте!

 

Подскажите пожалуйста как на Си можно правильно преобразовать данные для вывода их на матричный индикатор

У меня пока получается + 10 градусов

Share this post


Link to post
Share on other sites

Считайте температуру в int16_t. Это будет температура со знаком, умноженная на 10. Другими словами, вы ситали +255 градусов. На самом деле это будет +25.5.

Share this post


Link to post
Share on other sites
10 часов назад, addi II сказал:

Подскажите пожалуйста как на Си можно правильно преобразовать данные для вывода

Еще есть большая разница между DS1820 и DS18B20.

Share this post


Link to post
Share on other sites
19 часов назад, Droid 77 сказал:

В чем отличие?

Если в двух словах, то это - два разных датчика. :yes3:

Другой формат данных.

Другие регистры.

И т.д. (подробности можно посмотреть в ДШ).

Share this post


Link to post
Share on other sites
В 03.09.2019 в 17:28, haker_fox сказал:

На самом деле это будет +25.5

Выходит у автора стабильно отображается +1.0 градус :umnik2:

Edited by Droid 77

Share this post


Link to post
Share on other sites

Проблема именно с температурой? Или в принципе с 1-Wire?

Возможно, найдете что-то полезное в аппноуте по интерфейсу http://www.gaw.ru/html.cgi/txt/app/micros/avr/avr318.htm

Share this post


Link to post
Share on other sites

Вот вам пример работы с DS18 на STM8, а здесь - для STM32. На "железную" реализацию не смотрите - она у меня с косяками (надо было на полноценном КА делать, а у меня черт-те что).

Ничего сложного там нет. Получили данные, преобразовали. Вот так проще всего:

int32_t gettemp(uint8_t *scratchpad){
	// detect DS18S20
	int32_t t = 0;
	uint8_t l,m;
	int8_t v;
	if(scratchpad[7] == 0xff) // 0xff can be only if there's no such device or some other error
		return ERR_TEMP_VAL;
	m = scratchpad[1];
	l = scratchpad[0];
	if(scratchpad[4] == 0xff){ // DS18S20
		v = l >> 1 | (m & 0x80); // take signum from MSB
		t = ((int32_t)v) * 10L;
		if(l&1) t += 5L; // decimal 0.5
	}else{ // DS18B20
		v = l>>4 | ((m & 7)<<4) | (m & 0x80);
		t = ((int32_t)v) * 10L;
		m = (l & 0x0f) >> 1; // add decimal
		// 0   0   1   1   2   2   3   3   4   4   5   5   6   6   7   7 ->
		// 0   1   1   2   3   3   4   4   5   6   6   7   8   8   9   9
		t += (int32_t)m; // t = v*10 + l*0.625 -> convert
		if(m) ++t; // 1->1, 2->3, 3->4, 4->5, 5->6
		if(m > 5) ++t; // 6->8, 7->9
	}
	return t;
}
Edited by Eddy_Em
Какой идиот писал движок этого сайта?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this