PDA

Ver la Versión Completa : ayuda con un codigo


gaston260
26-10-2010, 03:41:42
hola amigos tengo un codigo para usar con un sensor de temperatura y humedad por el puerto serie pero no puedo ver los datos , y la verdad que e estado alejado de la programacion por mucho tiempo y del puerto casi nunca lo e usado pero me seria de mucha utilidad poder usarlo , adjunto el circuito tambien !.

El codigo completo :

unit Finish;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, CPort;

type
TForm1 = class(TForm)
LblStatusCom: TLabel;
ComPort: TComPort;
Timer1: TTimer;
BtnSetting: TButton;
BtnConnect: TButton;
Label1: TLabel;
Label2: TLabel;
LblTemp: TLabel;
LblHumi: TLabel;
Label3: TLabel;
Label4: TLabel;
Timer2: TTimer;
Label5: TLabel;
procedure BtnSettingClick(Sender: TObject);
procedure BtnConnectClick(Sender: TObject);
procedure IntSerialRX(Sender: TObject; Count: Integer);
// procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure IntTim2(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
DataSerial: Integer;
DataSerialTemp: Integer;
FlagRX: Integer;
DataTrans: Integer;
DataSHT: Real;
Temp: Real;
implementation

{$R *.DFM}

procedure TForm1.BtnSettingClick(Sender: TObject);
begin
ComPort.ShowSetupDialog;
end;

procedure TForm1.BtnConnectClick(Sender: TObject);
begin
if ComPort.Connected = true then
begin
ComPort.Close;
LblStatusCom.Caption := ComPort.Port + ' Disconnected';
BtnConnect.Caption := 'Connect';
BtnSetting.Enabled := true;
end
else
begin
ComPort.Open;
LblStatusCom.Caption := ComPort.Port + ' Connected';
BtnConnect.Caption := 'Disconnect';
BtnSetting.Enabled := False;
// timer1.Enabled:=true;
Timer2.Enabled := True;
DataTrans := $01;
end;

end;

procedure TForm1.IntSerialRX(Sender: TObject; Count: Integer);
begin
ComPort.Read(DataSerial,1);

FlagRX := FlagRX + 1;
if (FlagRX = 1) then
begin
DataSerialTemp := DataSerial;
end;
if (FlagRX = 2) then
begin
DataSerialTemp := DataSerialTemp SHL 8;
DataSerialTemp := DataSerialTemp OR DataSerial;
FlagRX := 0;
DataSHT := DataSerialTemp;

//Konversi Temperature dari SHT11
// Celcius = (SOt * d2) + d1
// dengan d2 = 0.01 (14-bit) dan d1 = -40 (VDD = 5Volt)
// Celcius = (ADC_Temp * 0.01) - 40 -- dikalikan dengan 100
// Celcius = (ADC_Temp - 4000)
//Catatan: Faktor konversi pada rumus dikalikan dengan 100 untuk
// memperoleh hasil pengukuran temperature per-100 derajat (0,01)
// dengan adanya pembulatan

if (DataTrans = 1) then
begin
DataSHT := (DataSHT-4000) / 100;
LblTemp.Caption := CurrToStr(DataSHT);
DataTrans := 2;
end

//Konversi Relative Humidity dari SHT11
// Relatitive Humidity (linear)
// RHLin = c1 + (c2 * SORH) + (c3 * SORH^2)
// Untuk pengukuran 12-bit: c1 = -4; c2 = 0,0405 dan c3 = -2,8*10^-6
// RHLin = (ADC_RH * 0,0405) - (ADC_RH^2 * 0,0000028) - 4

else if (DataTrans = 2) then
begin
Temp := DataSHT;
DataSHT := (Temp * 0.0405) - (Temp * Temp * 0.0000028) - 4;
LblHumi.Caption := CurrToStr(DataSHT);
DataTrans := 1;
end

else DataTrans := 1;
Timer2.Enabled := True;
end;
end;

{procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.Enabled := False;
end;}

procedure TForm1.FormCreate(Sender: TObject);
begin
Label3.Caption := '%RH';
Label4.Caption := '*C';
end;

procedure TForm1.IntTim2(Sender: TObject);
begin
if ComPort.Connected = True then
begin
ComPort.Write(DataTrans,1);
FlagRX := 0;
end;
Timer2.Enabled := False;
end;
end.

saludos y gracias por su ayuda !.

Casimiro Notevi
26-10-2010, 03:44:56
Hola gaston260, por favor, recuerda poner títulos decriptivos a las preguntas, gracias por tu colaboración.

Neftali [Germán.Estévez]
26-10-2010, 10:58:57
Antes de meterte en temas de programación, utiliza por ejemplo, el HyperTerminal de Windows. Con eso podrás saber si recibes datos correctamente por el puerto serial y en qué formato los revives. Con él también podrás probar diferentes configuraciones para el puerto (sin tener que preocuparte de otros temas).
Cuando ya tengas lecturas correctas, puedes comenzar a programar.

Haz la prueba y coloca aquí una muestra de las lecturas que obtienes.

gaston260
27-10-2010, 01:10:55
Hola muchas gracias ! nunca use el HyperTerminal de windows pero ya me pongo a buscar informacion ! , te explico mejor lo que estoy tratando de hacer ! ; Tengo un circuito que es el que adjunte y va al puerto serie ya lo probe con un software y me da lecturas correctas a mi entender pero yo quiero tener mi codigo para modelarlo a mi antojo , pasa que no entiendo nada de puertos serie y el codigo que encontre no funciona , creo que puede estar echo para comunicarse con un pic pero no estoy seguro aunque tambien creo que si mi circuito funciona con un programa tambien puede funcionar con este codigo y como no se nada de puertos ni de protocolos I2c que es el que usa mi sensor estoy muy limitado probablemente neftali o alguien sepa en donde puedo encontrar toda la informacion que necesito para usar el puerto serie y con el protocolo I2c voy a ver donde consigo informacion !.

el hiperterminal de windows esta ubicado en :

Menú inicio -> Programas -> Accesorios -> Comunicaciones -> Hyperterminal

o tambien

Ejecutar, y poner gpedit.msc

saludos y ya estare molestando de nuevo :) !.