Hlavní stránka‎ > ‎

Teploměr LM75A (Delphi, I2C)

Zde můžete stáhnout program (Windows) digit.teploměru  s čidlem LM75A (I2C).
 
K zapojení: Adresové vstupy A0-2 uzemnit na vývod GND.
 
          
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Náhled do výpisu programu:
 
unit Unit1;
interface
uses
 I2Ccom1,PORTINC,
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, XPMan, ExtCtrls, Gauges, StdCtrls, Menus, Spin, ComCtrls;
type
  TForm1 = class(TForm)
    Gauge1: TGauge;
    Gauge2: TGauge;
    Timer1: TTimer;
    Label1: TLabel;
    MainMenu1: TMainMenu;
    Menu1: TMenuItem;
    Volbacom1: TMenuItem;
    com11: TMenuItem;
    com21: TMenuItem;
    Label2: TLabel;
    Label3: TLabel;
    XPManifest1: TXPManifest;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Memo1: TMemo;
    Timer2: TTimer;
    TrackBar1: TTrackBar;
    Label8: TLabel;
    Statistika1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure com11Click(Sender: TObject);
    procedure com21Click(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Statistika1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  nasobek, pocbit: Extended;
implementation
{$R *.dfm}
function RoundNumber(Value: Extended; Precision: Word): Extended;
begin
  Result := StrToFloat(Format('%.*f',[Precision,Value]));
end;
 
function nacteniDAT :Word;
var hodnotabitu, hodnota :Word;
    n : Byte;
begin
  RTS(0); DTR(1);   { SDA=1, SCL=0 }
  hodnotabitu := 32768;
  hodnota := 0;
  for n:= 1 to 16 do begin
  RTS(1);         { SCL=1, číst SDA }
  Delayus (10);   { čekací smyčka }
  If CTS= 1 then hodnota := hodnota + hodnotabitu;
  RTS(0);         { SCL=0 }
  hodnotabitu := hodnotabitu div 2;
  if (n = 8) then Acknowledge;
  if (n = 1) and (hodnota = 0) then  nasobek :=  0.125;
  if (n = 1) and (hodnota = 32768) then nasobek := - 0.125;

  //if (n = 1) and (hodnota = 32768) then  hodnota := hodnota - 2048;
  end;
   if (hodnota < 65535) and (hodnota > 32768) then pocbit := 0.03125; {oddělí posledních pět bitů}
  if (hodnota < 32767) and (hodnota > 16384) then pocbit := 0.0625;
  if (hodnota < 16383) and (hodnota >  8192) then pocbit := 0.125;
  if (hodnota <  8191) and (hodnota >  4096) then pocbit := 0.25;
  if (hodnota <  4095) and (hodnota >  2048) then pocbit := 0.5;
  if (hodnota <  2047) and (hodnota >     1) then pocbit := 1;

  nacteniDAT := hodnota  ;
end;
 
procedure TEMPzapis (ridici_bajt: Byte);
begin
  Start;
  vystup (72*2);      { adresa 72, zápis  }
  vystup (ridici_bajt);
  Stop;
end;
 
function TEMPcteni: Word;
begin
  TEMPzapis(0);   {zápis do POINT REGISTRU LM75A}
  Start;
  vystup (72*2+1);  { adresa 72, zápis }
  RealTime(true);
  TEMPcteni:= nacteniDAT ;
  RealTime(false);
  NoAcknowledge;
  Stop;
end;
 

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.Width := 141;
  I2C_Init;
  Timer1.Interval := 100;
  Timer1.Enabled := true;
 
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Gauge2.Progress := StrToInt(FloatToStr(RoundNumber((TEMPcteni * pocbit) * nasobek  ,(0))));
Label1.Caption :=FloatToStr((TEMPcteni * pocbit) * nasobek )+ ' °C';
Timer2.Interval := TrackBar1.Position;
Label8.Caption := 'Záznam teploty každých '+ FloatToStr(TrackBar1.Position div 1000)+ ' sec.';
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
with Memo1 do
begin
 SelText := DateTimeToStr(now)+ ':  '+ FloatToStr ((TEMPcteni * pocbit) * nasobek )+ ' °C ';
 end;
end;
 
procedure TForm1.com11Click(Sender: TObject);
begin
   OPENCOM('COM1, 9800,N,8,1');
   com11.Checked := True;
   com21.Checked := False;
end;
procedure TForm1.com21Click(Sender: TObject);
begin
  OPENCOM('COM2, 9800,N,8,1');
  com21.Checked := True;
  com11.Checked := False;
end;
 
procedure TForm1.Statistika1Click(Sender: TObject);
begin
If Statistika1.Checked = false then
   Statistika1.Checked := true else
   Statistika1.Checked := false;
If Statistika1.Checked = false then
            Form1.Width := 141 else
            Form1.Width := 334;
end;
end.