Hallo Zusammen,
ich habe jetzt mal die "Klasse" zum Aufruf des Ultraschallsensors umgeschrieben.
Pfiffikus hat geschrieben:
Von anderen Softwareteilen (Jobs, Grafiken) aufgerufen werden wie bei allen Sensoren:
Get() - zur Ermittlung eines kalibrierten Messwertes
Kalibriere() - zum Kalibrieren
Diese Funktionen haben noch Optimierungsbedarf.
Diese habe ich jetzt umgeschrieben
Pfiffikus hat geschrieben:
Nur intern von cPegelHCSR04Sensor verwendet werden:
Messen()
Diese habe ich geringfügig angepasst, indem ich einfach einen Parameter für die Widerholungen eingefügt habe
----------------------------------------------------------------------------------------------------------------------------------------
Nach anfänglichen Problemen, wo ich mal wieder Schreibfehler im Programm hatte und so Blind war diese nicht zu sehen
Funktioniert bei mir erst einmal ohne Probleme:
Geändert wurden nur die roten Bereiche
Code:<?php
/** *************************************************************************
* Copyright (C) 2014 by Pfiffikus *
* pfiffikus@zahlengenie.de *
Klasse zur Ansteuerung eines US-Sensors
***************************************************************************/
include_once ("quellen/sensoren/cSensor.php");
class cPegelHCSR04Sensor extends cSensor {
var $myKalib =0;
/** ********************
*cPegelHCSR04Sensor::Get
Liefert die Entfernung des Sensors zum Wasserstand oder Hindernis in mm
**********************/
function Get() {
$Abweichung = 8; //max Abweichung der Messwerte in +-%
$MeasureMAX = 4; //wie oft soll das Messen wiederholt werden, wenn die Werte zu stark voneinander abweichen
if ($this->myKalib == 0) return '- Nicht kalibriert -'; //Wenn der Sonsor nicht kalibriert wurde, wird eine Fehlermeldung ausgegeben
for ($i=0;$i<$MeasureMAX;$i++) {
//Erstes mal Messen
$FIRST=$this->Messen();
//Zweites mal Messen
$SECOND=$this->Messen();
//Pruefen ob der zweite Wert und der erste Wert max 5 % ($Abweichung) voneinander abweichen
if (($SECOND < ($FIRST+$Abweichung/2)) AND ($SECOND > ($FIRST-$Abweichung/2))) break;
}
if ($SECOND == 0) return $SECOND;
return $this->myKalib - $SECOND; //Hier könnte man jetzt ausgeben, dass zB eine Warnung ausgegeben wird oder ein Flag gesetzt wird, wenn die Messung ungenau war
}
/** ********************
* cPegelHCSR04Sensor::Kalibriere
*Stellt fest, wie hoch ueber dem Nullpegel der Sensor befestigt ist
**********************/
function Kalibriere($iNull) {
$iAnz = 10;
echo " <pre>"; //Ausgabe Fenster in der Webseite aufrufen
echo "Kalibrierung Ultraschallsensor\n"; //print KAlibrierung Ultraschallsensor
//Pro Sensor so oft messen wie in $iAnz angegeben
for($i=0;$i<$iAnz;$i++) {
$wert[$i]=$this->Messen();
}
// Ungenauigkeit Bereich festlegen, default == 6mm (+-3mm)
$RANGE = 6;
// Min und Max Wert der gemessenen Werte ermitteln, vorher
$MAXIMUM = max($wert);
$MINIMUM = min($wert);
//Schiebe das Intervall von min gemessenen mm bis max 3000 mm
$maxtreffer=0;
$Mittelwert=0;
for ( $i= $MINIMUM; $i<$MAXIMUM; $i++) {
$treffer=0;//Zaehle die Treffer
foreach ($wert AS $Pkt) {
if (($Pkt > $i-$RANGE/2) AND ($Pkt < $i+$RANGE/2)) $treffer++;
}
//Wenn mehr Treffer als $maxtreffer, dann aktualisiere $Mittelwert und $maxtreffer
if ($treffer > $maxtreffer) {
$maxtreffer=$treffer;
$Mittelwert=$i;
}
//Wenn alle Werte innerhalb der Genauigkeit liegen, wird die Schleife vorzeitig verlassen sonst wird bis zum max Wert ($MAXIMUM) der im Python skript auf 3000
if (($maxtreffer == $iAnz) OR ($i > 3000)) break;
}
echo " </pre>"; //Schliesse Fenster in der Webseite
//Bei defektem Sensor
if ($Mittelwert < 1) return 0;
//Das ist etwa die Mitte des Intervalls, liefert die in PHPUnit vorgegebenen Messwerte
$this->myKalib=$Mittelwert - $iNull;
return $this->myKalib;
}
/** ********************
* cPegelHCSR04Sensor::Messen
Liefert die Entfernung des Sensors in mm
**********************/
function Messen() {
//Wie oft soll im Python Skript gemessen werden
$loop = 10;
// Haben wir einen vorgegbenen Messwert?
if ($ret = parent::Get()) return $ret;
$datei = cHerz::Dateipfad(). '/quellen/sensoren/echolot.py';
$id = fileperms($datei);
if ((($id & 1) == 0) AND (!cHorch::Text('PHPUnit', 1))) {
$Text = 'Die Datei echolot.py ist nicht ausfuehrbar. ';
$Text .= 'Auf der Konsole muss ein Befehl eingegeben werden: '."<br />\n";
$Text .= 'sudo chmod +x '.$datei;
cSekretaer::Alarm($Text, PROT_SENSOR);
$this->myHash['Fehler'] = $Text."<br />\n";
return 0;
}
$pins = explode('-', $this->myKennung);
$Befehl = 'sudo '.$datei.' '.$pins[0].' '.$pins[1].' '.$loop;
error_reporting(0);
$resultat = system($Befehl, $retval);
error_reporting(1);
$res = (int)($resultat);
return $res;
}
/** ********************
* cPegelHCSR04Sensor::GetTyp
**********************/
function GetTyp() {
return 'HC-SR04';
}
/** ********************
* cSensor::GetEinheit
**********************/
function GetEinheit() {
return 'mm';
}
/** ********************
* cPegelHCSR04Sensor::GetBeschreibung
**********************/
function GetBeschreibung() {
$ret = 'Ulrtaschallsensor vom Typ HC-SR04 ';
$ret .= 'mit der Kennung '.$this->myKennung."<br />\n";
$ret .= 'Aktuell '.$this->Get()." Millimeter<br />\n";
return $ret;
}
/** ********************
* cPegelHCSR04Sensor::SetKalib
**********************/
function SetKalib($iKalib) {
$this->myKalib = $iKalib;
}
/** ********************
* cPegelHCSR04Sensor::cPegelHCSR04Sensor
**********************/
function cPegelHCSR04Sensor() {
$this->myKalib == 0;
}
}
?>Hier noch einmal als Quelltext
Code:
<?php
/** *************************************************************************
* Copyright (C) 2014 by Pfiffikus *
* pfiffikus@zahlengenie.de *
Klasse zur Ansteuerung eines US-Sensors
***************************************************************************/
include_once ("quellen/sensoren/cSensor.php");
class cPegelHCSR04Sensor extends cSensor {
var $myKalib =0;
/** ********************
*cPegelHCSR04Sensor::Get
Liefert die Entfernung des Sensors zum Wasserstand oder Hindernis in mm
**********************/
function Get() {
$Abweichung = 8; //max Abweichung der Messwerte in +-%
$MeasureMAX = 4; //wie oft soll das Messen wiederholt werden, wenn die Werte zu stark voneinander abweichen
if ($this->myKalib == 0) return '- Nicht kalibriert -'; //Wenn der Sonsor nicht kalibriert wurde, wird eine Fehlermeldung ausgegeben
for ($i=0;$i<$MeasureMAX;$i++) {
//Erstes mal Messen
$FIRST=$this->Messen();
//Zweites mal Messen
$SECOND=$this->Messen();
//Pruefen ob der zweite Wert und der erste Wert max 5 % ($Abweichung) voneinander abweichen
if (($SECOND < ($FIRST+$Abweichung/2)) AND ($SECOND > ($FIRST-$Abweichung/2))) break;
}
if ($SECOND == 0) return $SECOND;
return $this->myKalib - $SECOND; //Hier könnte man jetzt ausgeben, dass zB eine Warnung ausgegeben wird oder ein Flag gesetzt wird, wenn die Messung ungenau war
}
/** ********************
* cPegelHCSR04Sensor::Kalibriere
*Stellt fest, wie hoch ueber dem Nullpegel der Sensor befestigt ist
**********************/
function Kalibriere($iNull) {
$iAnz = 10;
echo " <pre>"; //Ausgabe Fenster in der Webseite aufrufen
echo "Kalibrierung Ultraschallsensor\n"; //print KAlibrierung Ultraschallsensor
//Pro Sensor so oft messen wie in $iAnz angegeben
for($i=0;$i<$iAnz;$i++) {
$wert[$i]=$this->Messen();
}
// Ungenauigkeit Bereich festlegen, default == 6mm (+-3mm)
$RANGE = 6;
// Min und Max Wert der gemessenen Werte ermitteln, vorher
$MAXIMUM = max($wert);
$MINIMUM = min($wert);
//Schiebe das Intervall von min gemessenen mm bis max 3000 mm
$maxtreffer=0;
$Mittelwert=0;
for ( $i= $MINIMUM; $i<$MAXIMUM; $i++) {
$treffer=0;//Zaehle die Treffer
foreach ($wert AS $Pkt) {
if (($Pkt > $i-$RANGE/2) AND ($Pkt < $i+$RANGE/2)) $treffer++;
}
//Wenn mehr Treffer als $maxtreffer, dann aktualisiere $Mittelwert und $maxtreffer
if ($treffer > $maxtreffer) {
$maxtreffer=$treffer;
$Mittelwert=$i;
}
//Wenn alle Werte innerhalb der Genauigkeit liegen, wird die Schleife vorzeitig verlassen sonst wird bis zum max Wert ($MAXIMUM) der im Python skript auf 3000
if (($maxtreffer == $iAnz) OR ($i > 3000)) break;
}
echo " </pre>"; //Schliesse Fenster in der Webseite
//Bei defektem Sensor
if ($Mittelwert < 1) return 0;
//Das ist etwa die Mitte des Intervalls, liefert die in PHPUnit vorgegebenen Messwerte
$this->myKalib=$Mittelwert - $iNull;
return $this->myKalib;
}
/** ********************
* cPegelHCSR04Sensor::Messen
Liefert die Entfernung des Sensors in mm
**********************/
function Messen() {
//Wie oft soll im Python Skript gemessen werden
$loop = 10;
// Haben wir einen vorgegbenen Messwert?
if ($ret = parent::Get()) return $ret;
$datei = cHerz::Dateipfad(). '/quellen/sensoren/echolot.py';
$id = fileperms($datei);
if ((($id & 1) == 0) AND (!cHorch::Text('PHPUnit', 1))) {
$Text = 'Die Datei echolot.py ist nicht ausfuehrbar. ';
$Text .= 'Auf der Konsole muss ein Befehl eingegeben werden: '."<br />\n";
$Text .= 'sudo chmod +x '.$datei;
cSekretaer::Alarm($Text, PROT_SENSOR);
$this->myHash['Fehler'] = $Text."<br />\n";
return 0;
}
$pins = explode('-', $this->myKennung);
$Befehl = 'sudo '.$datei.' '.$pins[0].' '.$pins[1].' '.$loop;
error_reporting(0);
$resultat = system($Befehl, $retval);
error_reporting(1);
$res = (int)($resultat);
return $res;
}
/** ********************
* cPegelHCSR04Sensor::GetTyp
**********************/
function GetTyp() {
return 'HC-SR04';
}
/** ********************
* cSensor::GetEinheit
**********************/
function GetEinheit() {
return 'mm';
}
/** ********************
* cPegelHCSR04Sensor::GetBeschreibung
**********************/
function GetBeschreibung() {
$ret = 'Ulrtaschallsensor vom Typ HC-SR04 ';
$ret .= 'mit der Kennung '.$this->myKennung."<br />\n";
$ret .= 'Aktuell '.$this->Get()." Millimeter<br />\n";
return $ret;
}
/** ********************
* cPegelHCSR04Sensor::SetKalib
**********************/
function SetKalib($iKalib) {
$this->myKalib = $iKalib;
}
/** ********************
* cPegelHCSR04Sensor::cPegelHCSR04Sensor
**********************/
function cPegelHCSR04Sensor() {
$this->myKalib == 0;
}
}
?>
Pfiffikus hat geschrieben:
Nur intern von cPegelHCSR04Sensor verwendet werden:
Messen()
GetGenau() - (Ob diese Funktion nach Deinen Arbeiten noch gebraucht wird?)
Diese Funktion habe ich entfernt und direkt in die Kalibrierung eingebaut