Перейти к содержанию
    

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, addi II сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 часов назад, Droid 77 сказал:

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 03.09.2019 в 17:28, haker_fox сказал:

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

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

Изменено пользователем Droid 77

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот вам пример работы с 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;
}
Изменено пользователем Eddy_Em
Какой идиот писал движок этого сайта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...