Вот схема HID термометра с интерфейсом USB.

Он выполнен на микроконтроллере ATmega8-16PI фирмы Atmel.
В этом контроллере нет встроеного аппаратного модуля USB и связь с компьютером по этому интерфейсу, возложена на программу, написаную в среде Bascom (бейсик).
При прошивке контроллера, нужно выставить такую конфигурацию (прога AvrProg). Если у вас нет возможности прошить микроконтроллер, то есть другой вариант термометра, подключаемый через COM порт компьютера. Термометр на DS18B20 (подключение через COM порт)

Для получения данных из термометра, была разработана программа для компьютера, код которой показан ниже
; Для компиляции программы, нужна библиотека HID_Lib http://pure-basic.narod.ru/libs.html#HID_Lib
#USB_PID=$EF04
#USB_VID=$AAAA
#NO_Device="Нет связи с термометром"
LoadFont(2,"Arial",22,#PB_Font_Bold)
Procedure FindDevice_Timer() ; Периодическая (каждые 400 мс.) проверка доступности термометра
Shared DeviceHandle
Static Old_Test
Test=HID_Lib_DeviceTest(#USB_PID, #USB_VID) ; Есть ли требуемое USB HID устройство?
If Test<>Old_Test
Old_Test=Test
If Test
HID_Lib_CloseDevice(DeviceHandle)
DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID) ; Подключение к USB HID устройству
SetGadgetText(0,"Термометр подключён")
Else
HID_Lib_CloseDevice(DeviceHandle) ; Разрыв связи с USB HID устройством
DeviceHandle=0
SetGadgetText(0,#NO_Device)
SetGadgetText(1,"OFF")
EndIf
EndIf
EndProcedure
Procedure Thread(*x) ; Эта процедура работает в отдельном потоке
Shared DeviceHandle
Dim In.c(4) ; Байтовый массив, используемый как бцфер приёма данных.
Temp.w ; Переменная типа Word.
Repeat
If DeviceHandle ; Установлена ли связь с USB термометром?
In(0)=0
HID_Lib_ReadDevice(DeviceHandle, @In(), 3) ; Чтение данных из USB термометра
Temp=In(2)
Temp<<8 ; Сдвиг влево на 8 пизиций
Temp | In(1)
Result.f=Temp/16
If Result<150 And Result>-58 ; Отсеиваем возможные глюки!
SetGadgetText(1,StrF(Result,1)+" °C") ; Отображение температуры в окне
EndIf
EndIf
Delay(100)
ForEver
EndProcedure
; Открываем окно
OpenWindow(0,0,0,170,70,"USB_Termo", #PB_Window_MinimizeGadget|#PB_Window_Invisible|#PB_Window_ScreenCentered)
StickyWindow(0,1)
TextGadget(0,4,4,162,16,#NO_Device,#PB_Text_Center)
StringGadget(1,16,24,140,40,"OFF",#PB_Text_Center|#PB_String_ReadOnly)
SetGadgetFont(1,FontID(2))
SetGadgetColor(1,#PB_Gadget_FrontColor,$DF0000)
FindDevice_Timer()
HideWindow(0,0)
AddWindowTimer(0,1,400) ; Запуск таймера
CreateThread(@Thread(),0) ; Создание отдельного потока из процедуры Thread()
Repeat ; Главный цикл проги Repeat - Until
Event=WaitWindowEvent() ; Идентификатор события
If Event=#PB_Event_Timer
If EventTimer()=1
FindDevice_Timer() ; Вызов процедуры по таймеру, каждые 400 мс.
EndIf
EndIf
Until Event=#PB_Event_CloseWindow ; Прерывание главного цикла при закрытии окнаДля компиляции проги, нужна библиотека HID_Lib и компилятор PureBasic, версии 4.40 или выше.
Скрин проги.
(((
все отлично работает!

