Jump to content

    

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

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

 

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

У меня пока получается + 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

В чем отличие? Вопрос возник т. к. DS1820 не встречал, не приходилось использовать.

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

Вот вам пример работы с 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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now