Thema: Delphi I2C LM75 sensor

Einzelnen Beitrag anzeigen

yacdrak

Registriert seit: 22. Dez 2020
7 Beiträge
 
#1

I2C LM75 sensor

  Alt 22. Dez 2020, 15:51
Hallo zusammen,
Ich habe ein Problem mit der slave ACK. Hier möchte ich der Temperatur messen, dafür benutze ich eine Bibliothek von Asynchron Pro (https://github.com/TurboPack/AsyncPro).
Das Problem ist, dass ich kein ACK von Slave schicken kann. Das ist mein Quellcode und Vielen Danke für eure Hilfe. LG

muss normalaweise so sein (Anhängen foto):


mein Delphi Code :




unit Unit1;

interface


uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs , i2cusb, Vcl.StdCtrls, Vcl.ComCtrls;



const
cTimeoutInMs = 1000;
cTimeoutInit = 5000;
SCL90 = 'A'; { SCL 90 kHz PCD8584 Clocktakt }
SCL45 = 'B'; { SCL 45 kHz }
SCL11 = 'C'; { SCL 11 kHz }
SCL1_5 = 'D'; { SCL 1.5kHz }
type
//Ti2cUsb = class(TObject);
TForm1 = class(TForm)
Button1: TButton;
StatusBar1: TStatusBar;
Label1: TLabel;
procedure Button1Click(Sender: TObject);





private
{ Déclarations privées }
public


end;

var
Form1: TForm1;
ic, slave : Ti2cUsb;
Temperatur1 : Byte;
Temperatur2 : Byte;
Wert : Double ;
Byte1, Byte2 :Byte;
a : Double;



implementation

{$R *.dfm}


Function i2cLM75_in(Var Temperatur1 , Temperatur2 : Byte):double; //Liest einen Wert (2 Byte) vom LM75 Temperatursensor
var Byte1, Byte2 :byte;
Wert : double ;

begin
Byte1 := Temperatur1; //1. Byte Wert vom LM75 lesen
Byte2 := Temperatur2;

If (Byte1 And 128) = 0 Then
Wert := Byte1 //Temperatur Vorkomma >= 0°C
Else
Wert := Byte1 - 255; //Temperatur Vorkomma < 0°C

If ((Byte2 And 128) <> 0) Then
Wert := Wert + 0.5;

i2cLM75_in := Wert;

End;



procedure TForm1.Button1Click(Sender: TObject);

begin
ic := Ti2cUsb.Create;
slave := Ti2cUsb.Create;
//Check if the I2C is Initialized

Repeat
ic.Init(4,SCL90);
Until ic.Is_Initialized = True;
ic.relais_on ;
Sleep(1000);


ic.start_iic(False,146,'w'); // Start LM75
ic.wr_byte_iic(0);
ic.stop_iic;


ic.restart_iic (False, 147 , 'r');

ic.rd_byte_iic(Temperatur1,False);
ic.rd_byte_iic(Temperatur2,True);

ic.relais_off ;
ic.stop_iic;


a := i2cLM75_in(Temperatur1 , Temperatur2 );

ShowMessage(a.ToString);

end;

End.
Miniaturansicht angehängter Grafiken
capture111.jpg   capture11122.jpg  
  Mit Zitat antworten Zitat