Home    Impressum / Datenschutz    Shop    Download    Links     Blog  

Ansteuerung der I2C-Slaves mit dem I2C-Koppler in PHP

Beispielcode für den I2C-Koppler mit Einbindung der port.dll in PHP unter Windows

 Zitat:

Hallo Hr. Horter,

um Ihre „Programmgalerie“ weiter aufzufüllen habe ich für das serielle Interface ein Beispiel für den LM75 in PHP gebaut. Die Bibliotheken sind so gemacht, dass sich beliebige andere Geräte damit programmieren lassen. Insofern ist nur die LM75-Funktionalität ein Beispiel der Anwendung.

Für PHP habe ich eine spezielle PHP-Extension geschrieben, welche die PORT-DLL auch unter PHP verfügbar macht. Deshalb funktionieren die PHP-Scripte nur unter Windows.

Viele Grüße, Thomas D.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<!-- Testprogramm für Horter & Kalb serielles I2C PC-Interface
V0.2 03.09.2006 (c) Thomas Dreßler -->

<head>
<meta name="author" content="Thomas Dreßler">
<title>I2C Test</title>
</head>
<body>

<h1>I2C-Testprogramm fuer LM75</h1>
<?
$debug=false;
$errtext="";
include ("i2c_seriell.php");
include ("lm75inc.php");

if(isset($_REQUEST['Port'])) { $port=$_REQUEST['Port'];}else { $port="COM1";}
if(isset($_REQUEST['Addr'])) { $addr=$_REQUEST['Addr'];}else { $addr=144;}

$checked[$port]="checked";
?>
<form method=POST>
<input type="radio" name="Port" value="COM1" <?print $checked['COM1'];
?>>Com1</input>
<input type="radio" name="Port" value="COM2" <?print $checked['COM2'];
?>>Com2</input>
<input type="radio" name="Port" value="COM3" <?print $checked['COM3'];
?>>Com3</input>
<input type="radio" name="Port" value="COM4" <?print $checked['COM4'];
?>>Com4</input>
<br>
Adresse:
<select name=Addr>
<?
for ($i=144;$i<160;$i+=2) {
if($i==$addr) {$s="selected";}else {$s='';}
print "<option value=$i $s >$i</option>\n";
}
?>
</select>
<?

if(i2copen($port)) {
  if(i2cCheck()) {
    $t=LM75_lesen($addr,LM75_Temp);
    $tf=sprintf ("%4.2f °C",$t);
    i2cclose($port);
  }
}
if($errtext>'') {$tf='';}
?>
<input type="text" name="LM75_Temp" value="<?print $tf;?>">
<input type="submit" value="LM75_Read">
</form>
<br>

<div style='color:red'><? print $errtext; ?></div>
</body>
</html>

/*
horter_seriell.php
Defines for Horter&Kalb Serial Interface
www.horter.de
PHP by (C) Thomas Dreßler 2006
V0.3 02.09.2006
*/


if (!extension_loaded('port')) {
 trigger_error ("IOPort Extension (php_ioport.dll) not loaded!",E_USER_ERROR);
 die;
}
$PortState=false;
$SCLState=false;

//open port
function opencom($port){
    $param=':1200,N,8,1';
    $param=$port.$param;
    $r=port_opencom($param);
    $PortState=$r;
    return $r;
}
//close port
function closecom ($port) {
    port_closecom();
    $PortState=false;
}

//set delay
function i2cdelay($ms) {
    port_delayus($ms);
}

//set SCL
function SCL($i) {
    global $SCLState;
//SCL is assigned to RTS-Line on COMx
port_rts ($i);
$SCLstate=$i;
}

//set SDA
function SDA($i) {
//SDA is assigned to DTR-Line on COMx
port_dtr($i);
}

//read SDA
function GetSDA() {
//SDA will be read out on DSR-Line of COMx
    return port_dsr();
}

//read INT
function GetINT() {
//INT will be checked on CTS-Line of COMx
    return port_cts() ;
}
//read SCL
function GetSCL(){
    global $SCLState;
//this value is faked;the last noticed output will be returned
return $SCLState;
}

//check, if Device available
function DeviceCheck() {
    debug_log("DeviceCheck".lf);
    $error=false;
    SDA (True);
    SCL (True);
    if (GetSDA()==0) {
        debug_log ("No Answer from I2C-Interface".lf);
        error_txt ("No Answer from I2C-Interface".lf);
        $error=true;
    }
    return !$error;
}

/*
Defines for LM75 Temperatur Sensor
PHP by (C) Thomas Dreßler 2006
V0.3 02.09.2006
*/

/*
LM75 operations
Register=0 Temperatur
Register=2 Schaltpunkt
Register=3 Hysterese
*/

define ('LM75_Temp',0);
define ('LM75_Conf',1);
define ('LM75_SP',2);
define ('LM75_Hyst',3);
Function i2cLM75_in() {
//Liest einen Wert (2 Byte) vom LM75 Temperatursensor

  debug_log ("i2cLM75In".lf); ;
  $Byte1 = i2cIn();                 //1. Byte Wert vom LM75 lesen
  i2cAck();
  $Byte2 = i2cIn();                 //2. Byte lesen
  i2cNoAck();
         
  If (($Byte1 & 128) == 0) {
          $Wert = $Byte1;           //Temperatur Vorkomma >= 0°C
  }Else{
          $Wert = $Byte1 - 255;     //Temperatur Vorkomma < 0°C
  }
     
  If (($Byte2 & 128) <> 0) {
          $Wert = $Wert + 0.5;
  }
  debug_log( "IN:$Byte1: $Byte2 -->$Wert".lf);
  return $Wert;
}

Function i2cLM75_out($Wert) {
//'Schreibt einen Wert (2 Byte) vom LM75 Temperatursensor


$VK = floor($wert);
$NK = $wert- $VK;

if($VK >= 0) {
        i2cOut ($VK);
}else{
        i2cOut (255 + $VK);
}

if($NK >= 0.5) {                         //Nachkommawert schreiben
        i2cOut (128);                     // xx,5 schreiben
}Else{        i2cOut (0);                 // xx,0 schreiben
}
}

Function LM75_Read($Adresse,$register)     {
//Werte vom LM75 lesen

i2cInit();
i2cStart();
if(i2cSlave($Adresse)){
    i2cOut ($register);         //Register auf Temperatur setzen
    i2cStop();
    i2cStart();
    i2cSlave ($Adresse + 1);    //Bus-Adresse des LM75 schreiben
$temperatur = i2cLM75_in();     //Temperatur auslesen
debug_log("Register:".$register."->".sprintf ("%4.2f °C",$temperatur).lf);
return $temperatur;
}
i2cAck();
i2cStop();
}

Function LM75_getTemp($adresse){
//Temperatur vom LM75 lesen
    $Temp = LM75_Read($adresse,LM75_Temp);
    printf("%4.2f °C",$Temp);
return $Temp;
}

Function LM75_getHyst($adresse){
//Hysterese vom LM75 lesen
    $Temp = LM75_Read($adresse,LM75_Hyst);
    printf("%4.2f °C",$Temp);
return $Temp;
}

Function LM75_getSP($adresse) {
//Schaltpunkt vom LM75 lesen
$Temp = LM75_Read($adresse,LM75_SP);
    printf("%4.2f °C",$Temp);
return $Temp;
}

Function LM75_getConf($adresse) {
//Konfiguration vom LM75 lesen
i2cInit();
i2cStart();
if(i2cSlave($adresse)) {
    i2cOut (LM75_Conf);        //Register auf "Config" setzen
    i2cStop();
    i2cStart();
    i2cSlave ($adresse + 1);   //Bus-Adresse des LM75 schreiben
    $config = i2cIn();         //Konfigurationsbyte lesen
}
i2cAck();
i2cStop();
}

Function LM75_Write($adresse,$register,$value) {
//Werte am LM75 setzen

i2cInit();
i2cStart();
if(i2cSlave($adresse)) {
    i2cOut ($register);            
    i2cLM75_out ($value);
}
i2cStop();
}
Function LM75_setHyst($adresse,$value) {
//Schaltpunkt am LM75 setzen
LM75_Write($adresse,LM75_Hyst,$value);
}

Function LM75_setSP($adresse,$value) {
//Schaltpunkt am LM75 setzen
LM75_Write($adresse,LM75_SP,$value);
}

Function LM75_setConf($adresse,$value) {
//Schaltpunkt am LM75 setzen
LM75_Write($adresse,LM75_Conf,$value);

}

 

 

PHP-Quellcode
php-tests.zip (249 kB)
Die PHP-Scripte funktionieren nur unter Windows. In der Zip-Datei befinden sich die DLLs sowie ein Readme mit Versions- und Installationshinweisen. (Autor: Thomas D.)