// Attention : Le fonctionnement du programme requiert la DLL nommée : mcHID.dll. // N'oubliez pas d'inclure dans le même répertoire de votre programme cette fameuse DLL !!! unit FormMain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls; const // input and out buffer size constants... BufferInSize = 8; BufferOutSize = 8; type // input and output buffers... TBufferIn = array[0..BufferInSize] of byte; TBufferOut = array[0..BufferOutSize] of byte; // main form TForm1 = class(TForm) SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; Label1: TLabel; GroupBox1: TGroupBox; Label2: TLabel; SpeedButton3: TSpeedButton; SpeedButton4: TSpeedButton; Label3: TLabel; Label4: TLabel; Label5: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure SpeedButton3Click(Sender: TObject); procedure SpeedButton4Click(Sender: TObject); private FBufferIn:TBufferIn; FBufferOut:TBufferOut; function USBEvent(var Msg: TMessage): Boolean; public end; var Form1: TForm1; CONVERT : Integer; RH : Real; RHc : String; implementation uses cUSBInterface, cUSBInterfaceTypes; const // VENDOR et PRODUCT ID. // Attention, ne pas changer ces 2 constantes sinon l'interface Thermometre / Hygrometre ne sera plus reconnue. VENDOR_ID = 1240; PRODUCT_ID = 0006; {$R *.DFM} //****************************** //* Démarrage de l'application * //****************************** procedure TForm1.FormCreate(Sender: TObject); begin //** Ne supprimez pas les deux lignes suivantes ** Application.HookMainWindow(USBEvent); Connect(Application.Handle); //************************************************ // ... Votre CODE ... SpeedButton1.Enabled:=False; SpeedButton2.Enabled:=False; SpeedButton3.Enabled:=False; SpeedButton4.Enabled:=False; Label2.Caption:='Interface USB non détectée'; // FIn de votre CODE ... end; //********************************** //* Ne pas supprimer ces 3 lignes. * //********************************** procedure TForm1.FormDestroy(Sender: TObject); begin Application.UnHookMainWindow(USBEvent); end; //************************************************************* //* Fonction dédiée à la réception données du PIC vers le PC. * //************************************************************* function TForm1.USBEvent(var Msg: TMessage): Boolean; var DevHandle:cardinal; begin result := False; if Msg.Msg = WM_HID_EVENT then begin case Msg.WParam of // L'interface USB a été connectée au PC... NOTIFY_PLUGGED : begin DevHandle := Msg.LParam; if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then begin //... Votre CODE ... Label2.Caption:='Félicitations, interface USB détectée !!!'; SpeedButton1.Enabled:=True; SpeedButton2.Enabled:=True; SpeedButton3.Enabled:=True; SpeedButton4.Enabled:=True; //... Fin de votre CODE... end; result := true; end; // L'interface USB a été déconnectée du PC... NOTIFY_UNPLUGGED : begin DevHandle := Msg.LParam; if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then begin //... Votre CODE ... Label2.Caption:='Interface USB déconnectée'; Application.Terminate; // Arrêt du programme. //... Fin de votre CODE... end; result := true; end; //** Ne retirez pas 6 lignes suivantes, elles sont indispensables !!! ** NOTIFY_CHANGED : begin DevHandle := GetHandle(VENDOR_ID,PRODUCT_ID); SetReadNotify(DevHandle,true); result := true; end; //********************************************************************** // L'interface thermometre / hygromètre a envoyé des données... NOTIFY_READ : begin DevHandle := Msg.LParam; // handle of HID device in this message if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then begin // lecture des données. Read(DevHandle,@FBufferIn); //... Votre CODE ... //**** Gestion et affichage de la température. **** { Cases mémoires contenant les données envoyées par le PIC. TEMPERATURE : FBufferIn[1] indique si la température est > à 0 ou < à 0. FBufferIn[1] = 1 pour les températures positives. FBufferIn[1] = 2 pour les températures négatives. FBufferIn[2] contient la température comprise entre -55 et +125°C sur 1 digit (-9°C à +9°C), deux digits (-55°C à +99°C) ou trois digits (+100°C à +125°C). FBufferIn[3] contient le chiffre après la virgule. FBufferIn[3] contient 0 pour xx,0°C ou 5 pour xx,5°C. } if FBufferIn[1]=1 then // Température positive. begin Label1.Caption:=IntToStr(FBufferIn[2])+'.'+IntToStr(FBufferIn[3])+'°C'; // Affichage pour les températures comprises entre 0°C et +128°C. end; if FBufferIn[1]=2 then // Température négative. begin Label1.Caption:='-'+IntToStr(FBufferIn[2])+'.'+IntToStr(FBufferIn[3])+'°C'; // Affichage pour les températures comprises entre -55°C et -0.5°C. end; //**** FIN Gestion et affichage de la température. **** //**** Gestion et affichage de l'humidité. *** { Cases mémoires contenant les données envoyées par le PIC. Humidité : FBufferIn[4] octet de poid faible de la valeur convertie sur 12 bits. FBufferIn[5] octet de poid fort de la valeur convertie sur 12 bits. } // Label3.Caption:=IntToStr((256*FBufferIn[5])+FBufferIn[4])+'%'; CONVERT:=((256*FBufferIn[5])+FBufferIn[4]); // Restitution de la valeur sur 12 bits mesurées par le MAX187. RH:=CONVERT / 33; // Pente de la caractérisque du capteur d'humidité. Str(RH:0:1,RHc); // Tronque le résultat à 1 chiffre après la virgule. Label3.Caption:=RHc+'%'; // Affiche la valeur du taux d'humidité en % //**** Fin Gestion et affichage de l'humidité. *** //... Fin de votre CODE... end; result := true; end; end; end; end; //***** Gestion des boutons avec transfert des données du PC vers le PIC **** procedure TForm1.SpeedButton1Click(Sender: TObject); // Activation de l'acquisition var DevHandle:cardinal; begin FBufferOut[1] := 1; // Active l'acquisition de la température et de l'humidité DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; procedure TForm1.SpeedButton2Click(Sender: TObject); // Désativation de l'acquisition var DevHandle:cardinal; begin FBufferOut[1] :=2; // Arrêt de l'acquisition de la température et de l'humidité DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); // On quitte l'application en cliquant sur la croix de la fenêtre. var DevHandle:cardinal; begin FBufferOut[1] :=2; // Arrêt de l'acquisition de la température et de l'humidité DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; procedure TForm1.SpeedButton3Click(Sender: TObject); // Le Buzzer emet un bip lors de chaque acquisition des données. var DevHandle:cardinal; begin FBufferOut[1] := 3; // Active du buzzer DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; procedure TForm1.SpeedButton4Click(Sender: TObject); // Le buzzer reste muet. var DevHandle:cardinal; begin FBufferOut[1] := 4; // Désactive le buzzer DevHandle := GetHandle(VENDOR_ID, Product_ID); // Transfert USB PC vers PIC. Write(DevHandle,@FBufferOut); end; end.