Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > USB HID термометр Delphi


Автор: maloicds 18.1.2012, 17:38
Собрал устройство 
user posted image
Сама http://bascom.at.ua/publ/usb_termometr_na_2_datchika/1-1-0-33.
Возникли проблемы с отрицательными температурами. Ни одна из найденных программ не смогла корректно отобразить эти значения. Решил написать свою на Delphi с использованием JvHidDeviceController. 
Вот код программы

Код

procedure TForm1.JvHidDeviceController1Arrival(HidDev: TJvHidDevice);
begin
 If not Assigned(WorkDev) then JvHidDeviceController1.Enumerate;
end;

function TForm1.JvHidDeviceController1Enumerate(HidDev: TJvHidDevice;
  const Idx: Integer): Boolean;
begin
 Result:= True;                      // продолжать поиск
 If (Trim(HidDev.ProductName) = ProductName)
    then  If  (HidDev.Attributes.VendorID  = VID) and
              (HidDev.Attributes.ProductID = PID)
            then
                   begin
                    Result:= False;   // поиск закончен
                    JvHidDeviceController1.CheckOutByIndex(WorkDev, Idx);
                    Label1.Caption:= 'подключено';
                    end;
end;

procedure TForm1.JvHidDeviceController1Removal(HidDev: TJvHidDevice);
begin
begin
  If HidDev = WorkDev then
    begin
      WorkDev:= nil;
      Label1.Caption:= ' отключено'
    end
end;
end;

procedure TForm1.JvHidDeviceController1DeviceData(HidDev: TJvHidDevice;
  ReportID: Byte; const Data: Pointer; Size: Word);
var i: integer;
    s: string;
begin
 for i:= 0 to Size - 1 do
  s:= s + Format('%.2x ', [Cardinal(PChar(Data)[i])]);
 caption:= s;
end;

Как получить значение температуры из JvHidDeviceController1DeviceData?? Переменной s присваивается значение типа A1 FF FE FE. Что делать дальше с ним я не знаю

Автор: Romikgy 22.1.2012, 14:30
а что в меге происходит ?

Автор: maloicds 22.1.2012, 14:36
Судя повсему мега нормально работает, нашел прогу на pure basic, она показывает с минусом.

Автор: Romikgy 22.1.2012, 17:16
что показывает ?
какой формат выдачи данных из меги ?

Автор: maloicds 22.1.2012, 17:23
Программа, написанная кем то под эту прошивку показывает нормальную температуру (датчик за окном, зима...). С меги я данные получаю через JvHidDeviceController1DeviceData, на выходе что то типа A1 FF FE FE, а вот формат выдачи с меги я не знаю, скорее всего http://digit-el.com/files/open/ds18x20/ds18x20.html.

Автор: Romikgy 22.1.2012, 18:13
это обмен с DS18S20 а мега может отдавать все что угодно .....

если посмотреть в исходники .... то 

Код

 caption:= Format('%.1f C', [PByte(Data)[0]/16.0+PByte(Data)[1]*16.0]);

попробуй так 

Автор: maloicds 22.1.2012, 18:26
ругается, array type required.

Автор: Romikgy 22.1.2012, 18:48
Код

Caption:= Format('%0.1f', [PSmallInt(Data)^/16.0]);

Автор: maloicds 22.1.2012, 20:01
Работает. Спасибо!! А каким образом можно узнать код датчика? (для работы с несколькими датчиками).

Автор: maloicds 22.1.2012, 20:23
Подпаял второй термометр параллельно первому, показания идут с уличного (на длинном проводе). Показания со второго проскочили один раз и всё. Судя по приёму данных, каждую секунду мега снимает данные с термометров. Попутно с показаниями температуры приходит значение -0.1 градус (FF FF 6A 01, FF FF FF FF, FF FF 67 01). Как быть?

Автор: Romikgy 22.1.2012, 21:13
смотреть исходники меги 
там есть алгоритм работы с несколькими датчиками .... 
возможно данные идуть поочереди 

Автор: maloicds 22.1.2012, 21:21
Судя по исходнику есть работа с 2мя датчиками, запрос их номеров. А вот про мегу ничего не могу сказать, не разбираюсь.

Добавлено через 14 минут и 59 секунд
Нашел вот такое
Код

'опрос 1 датчика
       If W_1wire >= 1 Then
          1wverify Dsid1(1)
          1wwrite &HBE
          1wire_array(1) = 1wread()
          1wire_array(2) = 1wread()
       Else
          1wire_array(1) = 254
          1wire_array(2) = 254
       End If
       'опрос 2 датчика
       If W_1wire >= 2 Then
          1wverify Dsid2(1)
          1wwrite &HBE
          1wire_array(3) = 1wread()
          1wire_array(4) = 1wread()
       Else
          1wire_array(3) = 254
          1wire_array(4) = 254
       End If

       1wreset                                              ' reset the bus
       1wwrite &HCC                                         ' skip rom


Я так понимаю что данная прошивка расчитана на 2 датчика не более, если нужно больше, необходимо править прошивку заранее под определённое кол-во датчиков. Насколько я знаю 1-wire позволяет работать с большим количеством устройст. Послали запрос, получили номера устройств, послали запрос конкретному ус-ву на измерение температуры, получили ответ. Планирую данную схему к использованию в квартире. Температура пола, в комнате, отопление, балкон, улица.... Каждый раз при добавлении нового датчика править прошивку????

Автор: Romikgy 22.1.2012, 21:42
если самому написать прогу к меге ... то можно сделать и опрос любого числа датчиков

Автор: maloicds 22.1.2012, 21:51
В общем хочу сделать что то http://www.masterkit.ru/main/set.php?code_id=565375 и http://www.sinava.ru/images/MP707_pc_many.jpg. Но вот прошивку сделать не смогу. Может пойдёт такой вариант: USB UART на ATTINY45 или ATMEGA2313, соединяю TxD, RxD резисторами (видел схему) и на линию сажаю датчики подключённые по схеме с паразитным питанием. С COM портом попроще будет работать то smile Где то попадалась схема на мега45 с исходником на delphi. Поищу ссылку.

Добавлено через 4 минуты и 30 секунд
Вот http://radiokot.ru/circuit/digital/pcmod/16/

Автор: maloicds 22.1.2012, 22:16
А случайно вторые два числа это не вторая ли температура? Потому что значение FF FF это как раз та ошибка измерений -0.1 градус.

Автор: Romikgy 22.1.2012, 23:08
не исключено 

Автор: maloicds 22.1.2012, 23:11
как тогда это преобразовать в температуру? и что по предыдущему сообщению?

Автор: Romikgy 22.1.2012, 23:18
Код

Caption:= Format('Temp1=%0.1f C ; Temp2=%0.1f C', [PSmallInt(Data)^/16.0,PSmallInt(pchar(Data)+2)^/16.0]);


Цитата(maloicds @  22.1.2012,  22:11 Найти цитируемый пост)
 и что по предыдущему сообщению? 


Цитата(maloicds @  22.1.2012,  20:51 Найти цитируемый пост)
 Может пойдёт такой вариант: USB UART на ATTINY45 или ATMEGA2313, соединяю TxD, RxD

можно , только работать потом надо будет через ком порт 
или имелось что то другое?

Автор: maloicds 22.1.2012, 23:23
Отлично! Работает.С виртуальным COM портом имел в виду. Спасибо за помощь!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)