Многоканальный USB-Термометр (Обновленно)

Когда то давно я написал статью о том, как сделать USB Термометр и разместил ее на двух сайтах. Девайс очень простой, но спустя пару дней, на мой имейл повалилось огромное количество сообщений с разнообразными вопросами и предложениями. С момента написания прошло уже около 2 лет, а мне все еще как минимум, раз в неделю приходит подобное письмо, но я уже давно перестал на них отвечать, так как вопросы порой слишком примитивны. Но вот примерно 70% народа интересуются двумя вопросами: можно ли подключить второй датчик и можно ли сделать в термометре функцию термостата. Сейчас у меня появилось немного свободного времени и я решил создать термометр с этими функциями.

Добавлено 31.10.2011: В устройство добавил новые полезные функции, подробности ЗДЕСЬ.

Характеристики такие:

  • Максимальное количество датчиков — 32, один датчик установлен прямо на устройстве, все остальные подключаются к отдельному разъему.
  • Пределы измерения от -55С до +125°C, точность при 85°C и ниже не менее 0,5°C.
  • 2 канала управления внешними нагрузками. Возможно ручное и автоматическое (для термостата) управление.
  • Работа на операционных системах Windows 2000 и выше (включая Vista и 7).
  • Сохранение настроек программы в реестре.
  • Возможность задавать отображаемое имя датчика.
  • Мини-окно с возможностью установки размера и отображения поверх всех окон. NEW!
  • Отображение программы в трее. NEW!
  • Запуск программы вместе с Windows. NEW!
  • Перепрошивка через USB без использования внешнего программатора.

В качестве датчиков — DS18B20 — это трехвыводные (или 8 если в SO). Подключаются параллельно. Микроконтроллер — ATmega8, работающий на частоте 16МГц.
Схема:
Обычно, DS18B20, как и остальные однопроводные устройства, подключается к одной ножке МК, которая является как входом, так и выходом, но тут есть явные недостатки — ток ножки МК очень маленький, поэтому много датчиков на него навешать не получиться, поэтому, для большей надежности, ножку МК подключают через транзистор. Но есть еще одна проблема: интерфейс 1-wire требует очень точных задержек, а у нас параллельно работает софтовый USB, для которого задержки должны быть не менее точными. В  инете видел схемы где комп давал МК команду Измерить температуру, ждал некоторое время, пока 1-wire освободится, и потом запрашивал данные. Это вариант глючный и тормознутый. К счастью, эмулировать работу 1-wire можно с помощью UARTa, что я и сделал. На схеме ножка TXD подключена к транзисторам, выход с которых подключен к шине 1-wire (OW_DQ), вместо транзисторов можно просто соединить TXD и OW_DQ через резистор 2-3кОм.
Перемычка BOOTLOADER активирует встроенный загрузчик, чтобы для перепрошивки не нужен был программатор. Светодиод USB_RQ мигает, когда МК отвичает на запросы с компа.
Распиновка 5 контактного разъема:
  1. GND.
  2. Канал 1
  3. Канал 2
  4. 1-Wire. Сюда подключаем сигнальную линию DS18B20.
  5. +5V.
Печатная плата:
Готовое устройство:
Теперь нам нужно написать прошивку для микроконтроллера и компа.

Микроконтроллер.

Очень советую прочитать статью Управление электрическими цепями через USB, только в этом устройстве уже нужны будут драйверы. Большинство всех процессов я сделал в отдельных функциях, чтобы код был более наглядным.

Содержимое функции main, до бесконечного цикла:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DDRB = 0b00000110; PORTB = 0b00111000;
DDRC = 0b00000001; PORTC = 0b11111110;
DDRD = 0b00000010; PORTD = 0b11100010;
 
TCCR0 = (1<<CS02) | (1<<CS00); // prescaler = 1024
TCNT0 = 0;
 
usbInit();
usbDeviceDisconnect();
timerDelayMs(250);
usbDeviceConnect();	
 
sei();
 
nSensors = search_sensors(); // ищем датчики
 
wdt_enable(WDTO_2S);

Все задержки я делаю на таймере, так можно немного повысить эффективность так как во время задержки выполняется какой то код. Функция search_sensors() выполняет поиск датчиков, их адреса записывает в массивы, возвращает количество датчиков.

Бесконечный цикл:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while(1)
{
	RunTasks(0xFF);
 
	DS18x20_StartMeasure(); // запускаем преобразование на всех датчиках
 
	timerDelayMs(800); // ждем минимум 750 мс.
 
	cbi(LED_PORT, LED_USB); // тушим USB светодиод
 
	for(unsigned char i=0; i<nSensors; i++) { // считаваем результаты с каждого датчика
		RunTasks(0xFF);
		DS18x20_ReadData(gSensorIDs[i], gSensorData[i]);
	}
 
}

DS18x20_StartMeasure() запускает преобразование на всех датчиках, после запуска нужно подождать минимум 750 мс(пока измеряется температура), и только потом считывать данные.

Теперь разберем, как микроконтроллер обрабатывает запросы с компа. С ПК мы можем передать микроконтроллеру 3 параметр  (bRequestwIndex и wValue), а также, буфер с данными.  После запроса вызывается вот эта функция:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
usbMsgLen_t usbFunctionSetup(uchar data[8])
{
	usbRequest_t    *rq = (void *)data;
	static uchar    dataBuffer[4];
 
	unsigned char	wIndex = rq->wIndex.bytes[0];
	unsigned char	wValue = rq->wValue.bytes[0];
 
	switch(rq->bRequest)
	{
	case USBRQ_HID_SET_REPORT:
			//wIndex - номер канала (1 или 2), wValue - новое состояние (0 или 1)
			if (wValue) sbi(PORTB, wIndex);
			else  cbi(PORTB, wIndex);
		return 0;
 
	case USBRQ_HID_GET_REPORT:
		switch(wIndex)
		{
			case USB_GET_nSensors: usbMsgPtr = &nSensors;	return 1;
			case USB_GET_gSensorIDs: usbMsgPtr = gSensorIDs[0];	return (nSensors*8);
			case USB_GET_gSensorData: usbMsgPtr = gSensorData[0];	return (nSensors*2);
			case USB_GET_Chanels: usbMsgPtr = &channels_port;	return 1;
		}
 
	return 0;
}

Чтобы изменить состояние канала, нужно передать с ПК в качестве параметра bRequest = USBRQ_HID_SET_REPORT, wIndex = номер канала (1 или 2), wValue = значение (0 или 1).

А чтобы запросить какие то данные, нужно в качестве параметра bRequest  передать USBRQ_HID_SET_REPORT, wIndex = название того, что мы хотим получить (гляньте на код, та все понятно). В программе микроконтроллера нужно установить указатель usbMsgPtr на начало буффера, который нужно передать, и вернуть (return) размер буффера.

Чтобы не приходилось постоянно мучаться с внешним программатором, загрузим в Атмегу8 бутлоадер. Подключите микроконтроллер к программатору, установите фьюзы как на скрине:

В прикрепленном архиве, в папке MCU, лежит файл bootloader.hex, залейте его в МК. Установите на устройстве перемычку BOOTLOADER и подключите к ПК, если комп нашел новое HID устройство, то бутлоадер прошит успешно, внешний программатор больше не нужен. В папке MCU\default\ запустите boot.bat чтобы прошить микроконтроллер прошивкой USB Термометра, после успешной прошивки уберите перемычку. Комп найдет новое устройство, когда запросит драйверы, укажите папку Soft\windows-driver\, после успешной установки в диспетчере появится новое устройство.

Софт для ПК.

Я не буду подробно описывать, как работает программа, хотя бы потому что код небольшой и с комментариями. Я расскажу как запрашивать данные с МК и как работать с программой.

Драйвер основан на библиотеке LibUSB-Win32, взглянув на код, можно понять, как работает функция открытия устройства, а вот на счет запроса чуть посложней.

Для любого запроса, нужно воспользоваться функцией usb_control_msg

1
2
usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE |USB_ENDPOINT_IN,
		тип_запроса, wValue, wIndex, буффер, длина буффера, 5000)
  • тип_запроса — USBRQ_HID_GET_REPORT или USBRQ_HID_SET_REPORT.
  • буффер — массив, в который будут записаные данные при запросе.
  • wValue, wIndex и длина буффера думаю объяснять не надо))))

Функция возвращает размер буффера, переданного с МК (то, что возвращает функция usbFunctionSetup).

Работа с устройством.

В результате недолгих мучений, я написал програмку, которую назвал USB Thermometer.

При запуске программа запрашивает количество термодатчиков и их адреса, затем, каждые 500мс запрашивает температуру и состояние каналов. если прокрутить табличку вправо, то можно увидеть максимальную и минимальную температуру для каждого датчика с момента запуска программы, а также дату и время, когда они зафиксированны. 

Для наглядности, каждому датчику можно назначить имя, для этого, кликните по колонке «Название», напротив нужного датчика, выскочит вот такое окошко:Введите сюда новое название и нажмите ОК.

Название поменяется, а настройки сохранятся в реестре, при следующем запуске название останется такое же. Название назначается не по номеру, а по адресу.

Теперь разберемся с управлением каналами.

Если индикатор красного света, то канал выключен, зеленого — включен. Управлять ими можно вручную или автоматически. Выберите метод управления «Вручную» и нажмите «Изменить» — индикатор засветится зеленым цветом.Теперь выберите метод управления «Автоматически«:

Установите номер датчика, с которым будет сравниваться температура. Далее установите граничную температуру(только целые значения, без запятой) и условие управления, их всего 4:

  1. Включать выше граничной температуры.
  2. Включать ниже граничной температуры.
  3. Включать когда температура равна граничной.
  4. Включать когда температура не равна граничной.

Нажмите кнопку «Установить«, настройки сохранятся в реестре.

Если, к примеру, вы выбрали первый датчик, граничная температура 30 и условие «Включать выше граничной температуры», то канал будет включаться когда температура на первом датчике будет выше 30 , после понижения опять отключиться.

Как это может пригодиться в реальной жизни? к примеру, есть у вас обогреватель без термостата. Подключите канал к обогревателю (естественно не на прямую, а через реле например) разместите термодатчик где то рядом с обогревателем. Установите граничную температуру 25, условие «Включать ниже граничной температуры» нажмите кнопку «Установить». Теперь обогреватель будет включаться, когда температура упадет ниже 25 градусов и выключаться, когда достигнет 25.

Оба каналы работают независимо.

Дополнение в новой версии.

При запуске программа сразу сворачивается в трей:

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

Теперь температура может отображаться постоянно у вас на мониторе в виде небольшого прозрачного окошка. Нажмите на кнопку «Мини-окно«, вот что вы увидите:

Это небольшое окошко, которое можно разместить на мониторе в любом месте, просто перетянув его мышкой. Сверху отображается название выбранного датчика, посередине — текущая температура, снизу слева — минимальная, справа — максимальная. Чтобы изменить отображаемый датчик, покрутите колесико мыши вверх или вниз (следующий/предыдущий). Размер окна можно изменять. Нажмите «Настройки«:

При минимальном размере, окно будет вот таким:

При максимальном:

Даже бабушка увидит)))).

Также, окно можно сделать поверх всех окон (соответствующая опция).

Если окно где то потерялось (например, было на втором мониторе и вы этот монитор отключили), нажмите кнопку «Установить первоначальное положение» — мини-окно появится в левом верхнем углу монитора.

Еще в программу добавил Запуск вместе в Windows.

Кстати, в мини окно, для наглядности применен шрифт terminator_cyr_v4, он находится в архиве с программой.

Приобрести готовое устройство можно здесь.

Скачать файлы статьи (1,62 Mb).

Вливайтесь в общение

108 комментариев

  1. Ты на писал что один датчик есть прямо на устройстве! Но я его не вижу.

    1. Посмотри на фото готового устройства. Там сверху почти в правом углу стоит трехногий DS18B20 (возле кондера).

  2. а почему ни на печатной плате, ни на готовом устройстве нету ни резистора, ни диода, ни транзистора? ведь на схеме их достаточно

    1. Они все в SMD корпусах, которые размещены внизу платы. На скрине печатной платы это хорошо заметно.

  3. а фьюзы нужны именно для бутлоадера? а если прошивать не через бутлоадер, то будет работать? нужны ли в таком случае фьюзы? и через какую вообще программу фьюзы ставить?

    1. Без бутладера будет работать, но фьюзы всеравно надо ставить (кроме BOOTEN). Фьюзы ставьте через ту же программу, через которую прошиваете МК

  4. как быть владельцам win7 64 bit ??? все собрал. дрова не ставятся (((

    1. К сожалению, драйвер работает только под 32-битными системами, возможно, вскоре сделаю и под 64, но пока что у меня времени нет.

      1. под Х64 запустилось и работает, правда только первая версия программы

        1. Вторая версия программы и не должна работать с этой прошивкой

        2. Прошивка второй версии стала общедоступной!

  5. какова точность покзаний?? с простым термометром на 2-3 разница. причем больше показывает в компутере ))

    1. от чего вернее точность зависит? от какого компонента в устройстве, помимо датчика

    2. Если у Вас DS18B20, то у него точность, заявлена производителем в пределах -10…+85 будет 0,5С. Я вот сейчас поставил на улице ртутный термометр и DS18b20, там расхождения почти 1С, но где больше я хз так как у ртутного панель с делениями шатается.

  6. а можно ли вместо софтового обмена по usb поставить какую-нибудь микросхемку-преобразователь?

    1. А зачем? этот способ более надежный чем всякие UART-USB преобразователи

  7. мне все-таки хотелось бы аппаратно чтоб не зависеть от драйверов
    я так понял раз uart тут занят, преобразователь никак уже не поставить?
    или можно модифицировать это дело для мк с аппаратным usb?

    1. Переделать конечно можно. Можно просто переписать программу, чтобы обмен был через HID, ему драйвера не нужны

  8. было бы замечательно еслиб на HID сделали, очень нужно

  9. помогите разобраться с прогой для компа, не пойму как дробная часть переводится
    в Themperature.cpp:
    //Store decimal digits
    decimal = TL & 0xF; — это понятно, старший байт обнуляется и остается только дробная часть (4 младших бита), а что дальше происходит не совсем понимаю
    decimal *= 5;

    if (decimal<100) Temperature = digit + ((double)decimal/100);
    else Temperature = digit + ((double)decimal/1000);
    может кто пояснить?

  10. для чего умножается на 5 и потом делится на 100 или 1000?

    1. DS18B20 возвращает 2 байта со значением температуры, их надо перевести в понятный вид. О том, как это сделать, написано в DataSheet на странице 5.

  11. это то я понял насчет формата итд
    проблема в том что почему то показания всегда на 0,1 меньше получаются
    проверял в протеусе на исходниках из соседней темы про 1-wire, по-моему что-то не так именно в этом умножении на 5 — не понимаю для чего оно

    1. если честно, я сам не помню для чего оно:) Я года три назад с какого то примера взял функцию для перевода в температуру и досихпор ею пользуюсь.

      1. Наверное, стоило разобраться, прежде, чем копировать что-то, откуда-то 😉
        Дробная часть переводится не верно, убедится в этом очень просто — запустите программу и медленно нагрейте или остудите датчик на 1-2 градуса. Температура будет изменяться с шагом 0.05, однако при достижения значения, допустим 22.75 следующим значением будет уже 23.00 (при повышении температуры), при понижении же, после 23.00 будет следовать 22.75.

        Шаг показаний температуры DS18B20 в 12-битном режиме (по-умолчанию) составляет 0.0625, а не 0.05, отсюда и расхождение. Так же, некорректно дробная часть будет отображаться и при отрицательных значениях температуры. Проще говоря, алгоритм примененный в прошивке микроконтроллера к датчику DS18B20 не подходит.

        На мой взгляд в преобразовании значения температуры с помощью контроллера (в функции therm_read_temperature) нет никакого смысла. Такое преобразование имело бы смысл при наличии у устройства индикатора, однако в данном устройстве индикатор не предусмотрен, и преобразование вполне может выполнить программа на компьютере.

        Тем не менее автору спасибо за его труды!

  12. Приветствую. Можно версию usb термометра под hid устройство. Я так понимаю будет только другая прошивка? Собрал устройство с подключением по версии 2 (4.7к на ноги 2 и 3 мк), остальные не захотели работать. Тоже самое и с прошивками. Устройство определяется, программа работает только на включение\выключение каналов. Самих датчиков не видно. Почему так может быть?

    1. Для HID еще не делал. Если делаете без усилительного каскада, соединив резистором 2 и 3 ногу, то лучше поставьте резистор 2,2К. В этом случае, средняя нога датчиков должна подключаться к 2 ноге МК.
      Если все работает нормально, но датчиков не видно, то у Вас явно 1-wire не коректно работает.

      1. Ок. У меня резюк на 4.7к соединяет ноги мк (видел в других схемах 4.7к на +5). Попробую на 2.2к. Буду ждать версию HID (хочу софт под delphi сделать). Спасибо!

        1. Да кстати светодиод при опросах еле горит а не мигает в обоих версиях прошивки почему то…

          1. сделайте уже лучше на двух транзисторах, если 2N7002 нет, то поставьте BC547, только на базу каждого по 10ком.

  13. BC337 пойдёт? (остальных нет в наличии)

  14. А как быть со светодиодом при опросе датчиков?

    1. может вы его куда то не туда прицепили? он полюбом должен мигать. Если светодиод рабочий, то может у вас ножка МК выгорела.

  15. Собрал устройство с подключением по версии 2. Устройство определяется, программа работает только на включение\выключение каналов. Самих датчиков не видно. Светодиод горит постоянно. В чем может быть причина?

  16. Если убрать DS18B20 светодиод начинает мигать.

  17. Зачетный проект, почти как мастеркитовский MP707, но есть небольшие недоработки в логике термостата, видно человек не сталкивался с системами регулирования.
    Если есть возможность обязательно добавьте гистерезис для управления температурой.
    Ваша схема будет работать хорошо при большой инерционности процесса регулирования, как например водяной многолитровый бойлер или электробогреватель помещения.
    Но если процесс быстрый, то нужна обязательно настройка предела включения температуры и выключения. Попробуйте этим устройством управлять холодильником, он будет включаться и выключаться каждую минуту, что приведет к сгоранию компрессора, штатный механический термостат холодильника имеет разницу (гистерезис)между включением и выключением до 5-7 градусов.
    Для примера подсмотрите как это реализовано в том же мастеркитовском MP707.
    http://s2.ipicture.ru/uploads/20120509/B4wA3U35.jpg

  18. Здравствуйте, Кибермастер. Мы хотим подключить устройство к дисплею, а напряжение подавать с блока питания (самодельного), на какую силу тока необходимо расчитать этот блок? И обязательно ли нужен стабилизатор напряжения на нём(без него вроде греться не будет)?

    1. максимум 0,5А.
      стабилизатор не нужен, если напряжение блока питания 4,5-5,5В, если лучше, то поставьте стабилизатора. Чтобы не грелся, используйте импульсный, вместо линейного

  19. А сильно нужно изменить схему, чтоб прошивать через ISP, без бутлоадера, и при этом весь функционал сохранился? Достаточно ли просто выкинуть ту часть, где 5-контактный разъём и перемычка, и к лапам MOSI, MISO, SCK, RESET, GND, Vcc подключить ISP?

    1. изменять ничего не надо, просто подключите программатор к этим лапам и прошивайте, перемычка мешать не будет

  20. Здравствуй! Хочу спросить, а какой ток и напряжение должны быть на DQ выводе термодатчика? И на какую мощность должен быть резистор 4.7КОм?

    1. напряжение наверно вольта 4, ток не знаю, не считал. Резистора в корпусе 1206 хватит

  21. А с чем может быть связано, что нпряжение на DQ всего 0,14 Вольт?

    1. напряжение можно увидеть только осциллографом, это же линия данных

    1. отсоедини провод от третей ноги атмеги, потом подсоедини к +5, на DQ должно быть 4-5 вольт, потом подсоедини к земле, на DQ должно быть 0. А может наоборот, не помню точно. Если напряжение вообще не меняется(или меняется не значительно), то проблема где то в транзюках.
      PS: убежал, вернусь часа через 2

  22. скажите пожалуйста как подключать дополнительные датчики.

    1. Через штыревые соединители параллельно датчику, устновленному на плате

  23. извяните за глупые вопросы, но я совсем новичек в этом. каким образом возможно подключить 32 датчика к этому разьёму?

    1. Через штыревые соединители, параллельно датчику, установленному на плате

  24. скажите пажалуйста в какой версии c++ builder вы делали программу, пробовал в XE вылазием моря ошибок.

  25. извените за настойчивость, судя по схеме 6 штырьков 1 из них земля. для подключения дополнительного датчика достаточно подключить к одному из 5 dq(date) а другие 2 ножки датчика к земле. всё верно?

    1. Над картинкой же написано:
      GND.
      Канал 1
      Канал 2
      1-Wire. Сюда подключаем сигнальную линию DS18B20.
      +5V.
      Штырей там 5 а не 6.
      Пишите через Reply, иначе Ваши комменты буду удалять

      1. да действительно перепутал версии устройства. все что я писал выше относилось к Многоканальный USB-термометр (Продвинутая версия).

        1. на продвинутой датчик и контактные выходы подключается к клемникам (там, где в этой версии штыри), а на штырях размещены контактные входы

  26. Здравствуйте, я уже и не знаю что делать. Проверял все. Но все равно вылазит неопознаное усб устройство. Я уже просто на прямую контролер цеплял без навески, все равно ничего не работает. Грешу на программатор, usbasp программировал через sinaprog, прошиваю с начала основную программу потом фьюзи, вроде все ок, но потом ничего не работает. Забыл написать что светодиод вообще не светиться, даже не мигает. В чем может быть проблема?

    1. прошивать надо бутлоадер и фьюзы. Покажите скрин фьюзов

  27. Собрал , работает на ура,запустился сразу,все красиво. Доволен. Недостатки есть, постоянно на граничной температуре щелкают релюшки в режиме термостата,(программный баг)Без компа не работает ,(комп пинает контролер)те нет автомата как у MP707. Автору спасибо большое!Недостатки будем допиливать самостоятельно.

  28. Добрый день, Собрал схему все работает хорошо, а подскажите пожалуйста на Delphi реально написать софт для этого устройства?

      1. Помогите пожалуйста, если писалась данная программа на Delphi или подскажите в какую сторону копать, с HID устройством было бы все понятно, но тут увы, я как то затрудняюсь((, Спасибо

        1. наберите в гугле «delphi hid» и посмотрите 3-5 первых ссылок

          1. Дело в том, что это не HID устройство, поэтому я и не могу разобраться как считать данные, и как опросить датчик! уже неделю бьюсь над этой темой )))

          2. Видел я этот код, много кто еще задавался таким же вопросом! ответов не нашел ) Думаю просто надо перейти на USB HID термометр )) спасибо за терпение…

  29. Добрый день. Подскажите пожалуйста, запустил проект в borland builder 2010, и при компиляции выдает сообщение:

    [BCC32 Error] main.cpp(84): E2316 ‘SpinEdit_sensorNumber’ is not a member of ‘TForm_main’
    [BCC32 Error] main.cpp(343): E2451 Undefined symbol ‘SpinEdit_sensorNumber’
    [BCC32 Error] main.cpp(366): E2451 Undefined symbol ‘SpinEdit_sensorNumber’

    Как можно решить данную проблему. Заранее благодарен

    1. получается, что среда разработки не та. Используйте C++ builder 2010

      1. C++Builder 2010 это название программы скопированное с ярлыка.

        Embarcadero® C++Builder® 2010 Version 14.0.3513.24210
        Copyright © Embarcadero Technologies, Inc. All Rights Reserved

        Это копия из окна About.

          1. Решил проблему, в проекте не хватало компонента.

  30. в мейк файле желательно включить оптимизацию по коду
    CFLAGS += -Wall -gdwarf-2 -std=gnu99 -DF_CPU=12000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
    иначе при использовании временных задержек не хватает памяти. столкнулся при переделке схемы без использования аппаратного UART

  31. P.S.
    -DF_CPU=16000000UL — должно быть так. но при замене кварца на 12МГц схема тоже корректно работает

  32. вопрос к автору. без подключения к компьютеру схема будет работать в режиме термостата? или условия срабатывания термостата прописаны в программе для ПК

    1. без компа термостат не работает.

  33. при одном подключенном датчике устройство работает нормально. а вот если подключить два датчика, то адреса датчиков определяются не правильно. а если подключить три датчика то изменяются адреса и первых двух датчиков.
    в чем может быть проблема?

    P.S.
    датчики подключены к плате без длинных проводов
    схема включения не использует USART для эмуляции 1-wire

    1. Потому что там тупо при подключении происходит поиск термодатчиков, если подключить новые, список меняется в зависимости от ID датчиков.

      1. это понятно. но при подключении новых датчиков адреса старых искажаются. вот в чем проблема.
        а если адрес считан не правильно, то при обращении к этому датчику контроллер не сможет получить данные температуры

        1. А почему эт он может адрес считать не правильно?

          1. не знаю. датчики распаяны на плате рядом. без дополнительных проводов.
            кстати у меня кварц на 12МГц но в конфигах вроди все переправил да и USB-шная часть программы работает исключительно. по каким причинам Вы отказались от кварца на 12МГц?

          2. у меня 16 самые ходовые))) Чтобы не путать, вобщем.

          3. так где ж собака зарыта? а схему без транзисторов Вы проверяли на 20 метрах в реальных условиях или только в протеусе?

          4. да, и даже больше. На нескольких промышленных котлах работает даже при сильных наводках

  34. здравствуйте. подскажите пожалуйста, мне нужно немного модернизировать эту схему, термометр должен иметь возможность самокалибровки, как это возможно осуществить?.

    1. DS18B20 калибровать смысла нет. Если хотите большую точность, нужно ставить платиновый.

      1. можете пожалуйста обьяснить. я не понял куда или что подключается в 5-и контактный разьем. зачем там 1 и 2 каналы? заранее спасибо

        1. C помощью них можно управлять двумя нагрузками. К примеру, можете подключить к ним реле (через транзистор) и управлять светом.

          1. еще один вопрос. сброс микроконтролера подключен к питанию через резистор, он ведь будет вечно скидывать?

  35. Добрый день! Будет ли работать в режиме автоматического управления каналами без компа, если запитаь лишь?

  36. Добрый день! А прошивка с гистерезисом есть?

  37. USB-Термометр, просьба к автору, необходимо второе мини-окно для датчика, можно организовать? Заранее спасибо, Ispolnitel_Group@mail.ru

        1. за отдельную плату, конечно, могу сделать, но стоить будет 50-100$

  38. Добрый ден!
    Собрал плату, контроллер прошил по инструкции, драйвер установил. Датчик не определяется. Монтаж проверил.
    что делать дальше, чтобы термометр заработал. Индикатор светит постоянно. Ручноц авто режим переключаются.

Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *