ГлавнаяПрограммыПоискКонтактыФорум

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

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

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

В качестве датчиков – 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, только в этом устройстве уже нужны будут драйверы. Большинство всех процессов я сделал в отдельных функциях, чтобы код был более наглядным.

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

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

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

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

usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE |USB_ENDPOINT_IN,  		тип_запроса, wValue, wIndex, буффер, длина буффера, 5000)

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

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

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

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

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

Введите сюда новое название и нажмите ОК.

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

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

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

Теперь выберите метод управления "Автоматически":

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Также, окно можно сделать поверх всех окон (соответствующая опция).
Если окно где то потерялось (например, было на втором мониторе и вы этот монитор отключили), нажмите кнопку «Установить первоначальное положение» – мини-окно появится в левом верхнем углу монитора.
Еще в программу добавил Запуск вместе в Windows.
Кстати, в мини окно, для наглядности применен шрифт terminator_cyr_v4, он находится в архиве с программой.

Скачать прошивку, исходный код на С, исходный код программы для компьютера, драйвера, схемы (DipTrace).

Если Вам надо прошитый микроконтроллер, или готовое устройство, обращайтесь на почту!
Внимание! Автор проекта принимает заказы на разработку устройств на микроконтроллерах, по вопросам разработки обращайтесь на devices2000 {собака} ya.ru .

Автор статьи Бражников Михаил. Сайт автора.

Обсудить статью на форуме

итальянские кухни продажа в москве . Аренда квартир г. Москва. Аренда квартир в Москве, аренда Новослободская. . Туры в Pandanus Resort

Если вы разработали схему или написали статью, и хотите чтобы о ней узнали все, пишите нам и мы разместим вашу статью (схему). Подробнее...
Сайт eldigi.ru При копировании материала с данного сайта, обязательна ссылка на сайт eldigi.ru и на первоисточник!
Администрация сайта eldigi.ru