USB HID термометр на ATmega8
Этот термометр выполнен на основе микроконтроллера ATmega8
и датчика температуры DS18B20
Программа для контроллера была написанна и отладена в среде Bascom-AVR 1.11.9.8 с использованием USB драйвера swusb.LBX Программа для компьютера была разработана и отладена в среде PureBasic с использованием библиотеки HID_Lib. Для установки библиотеки, нужно извлечь содержимое архива в папку со средой PureBasic.
Код программы для компьютера
#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
Repeat
If DeviceHandle ; Установлена ли связь с USB термометром?
In.l=0
HID_Lib_ReadDevice(DeviceHandle, @In, 3) ; Чтение данных из USB термометра
In=In>>8 ; Сдвиг вправо на 8 позиций
Result.f=In/16
If Result-50 ; Отсеиваем возможные глюки!
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 ; Прерывание главного цикла при закрытии окна
Скриншот скомпилированой программы
Для компиляции, требуется версия 4.40 или 4.41 компилятора PureBasic.
Скачать бесплатную демоверсию PureBasic441
В папке "Examples", вы найдёте примеры устройств на PIC и AVR контролерах.
Отправитель | Нити |
---|