<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sascha-Kimmel.de &#187; php</title>
	<atom:link href="http://www.saschakimmel.de/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.saschakimmel.de</link>
	<description></description>
	<lastBuildDate>Sun, 21 Feb 2010 08:00:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Lichtmessung mit AVR-NET-IO, Fototransistor und PHP</title>
		<link>http://www.saschakimmel.de/2010/02/lichtmessung-mit-avr-net-io-fototransistor-und-php/</link>
		<comments>http://www.saschakimmel.de/2010/02/lichtmessung-mit-avr-net-io-fototransistor-und-php/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 09:02:40 +0000</pubDate>
		<dc:creator>Sascha</dc:creator>
				<category><![CDATA[AVR-NET-IO]]></category>
		<category><![CDATA[Elektronik]]></category>
		<category><![CDATA[avr]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.saschakimmel.de/?p=72</guid>
		<description><![CDATA[Nachdem ich zuvor schon geschrieben habe wie man einen LM35 Temperatursensor an das AVR-NET-IO anschließt, um diesen mit der Originalfirmware von Pollin auszulesen hier nun die Beschreibung, um einen Fototransistor anzuschließen. Diesen kann man z.B. zur Helligkeitsmessung verwenden.
Es sei angemerkt, dass der hier verwendete Fototransistor BPW 40 (BPW 96C, Conrad Electronic Bestellnummer 184055) mehr auf [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich zuvor schon geschrieben habe wie man einen <a href="/2010/02/temperaturmessung-mit-lm35-mit-avr-net-io-und-php/">LM35 Temperatursensor an das AVR-NET-IO anschließt</a>, um diesen mit der <strong>Originalfirmware </strong>von Pollin auszulesen hier nun die Beschreibung, um einen Fototransistor anzuschließen. Diesen kann man z.B. zur Helligkeitsmessung verwenden.</p>
<p>Es sei angemerkt, dass der hier verwendete Fototransistor BPW 40 (BPW 96C, <a href="http://www.conrad.de" target="_blank">Conrad Electronic</a> Bestellnummer <span id="mc_info_184055_artikelnummer">184055</span>) mehr auf den Infrarotbereich anspricht als auf Wellenlängen, die das menschliche Auge sieht. Daher ist diese Schaltung eher als &#8220;Proof Of Concept&#8221; zu verstehen &#8211; andere Fototransistoren können entsprechend ebenfalls verwendet werden.</p>
<p>Die Schaltung ist sehr einfach gehalten &#8211; natürlich können auch andere Anschlüsse (ADC1-4, GND, 5V) verwendet werden als hier dargestellt:</p>
<p><a href="http://www.saschakimmel.de/wp-content/uploads/2010/02/avrnetio-fototransistor.gif"><img class="aligncenter size-full wp-image-73" title="avrnetio-fototransistor" src="http://www.saschakimmel.de/wp-content/uploads/2010/02/avrnetio-fototransistor.gif" alt="AVR-NET-IO Anschluss eine Fototransistors" width="488" height="215" /></a></p>
<p>Die Schaltung ist nicht für die direkte Messung der Lichtintensität (z.B. in Lux, Lumen) ausgelegt, kann aber gut relative Lichtunterschiede erkennen. Der Wert eines ADC-Eingang kann sich zwischen 0 und 1024 bewegen, daher errechnet sich der prozentuale Wert wie folgt:</p>
<p><strong>100-(100/(1024/ADC-Wert))</strong></p>
<p>Hier der entsprechende Beispielcode für die Verwendung mit der <a href="./2010/02/avr-net-io-mit-php-ansteuern/">PHP-Klasse</a>:</p>
<pre>$avr = new AvrNetIo('192.168.0.90');
if ($avr-&gt;connect()) {
    $light = 100-(100/(1024/$avr-&gt;getAdc(2)));
    echo "Licht: $light%";
    $avr-&gt;disconnect();
} else {
        die("Verbindungsfehler!");
}</pre>
<p>Viel Spaß damit <img src='http://www.saschakimmel.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">
<h1>Temperaturmessung mit LM35 mit AVR-NET-IO und PHP</h1>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.saschakimmel.de/2010/02/lichtmessung-mit-avr-net-io-fototransistor-und-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AVR-NET-IO mit PHP ansteuern</title>
		<link>http://www.saschakimmel.de/2010/02/avr-net-io-mit-php-ansteuern/</link>
		<comments>http://www.saschakimmel.de/2010/02/avr-net-io-mit-php-ansteuern/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 15:33:30 +0000</pubDate>
		<dc:creator>Sascha</dc:creator>
				<category><![CDATA[AVR-NET-IO]]></category>
		<category><![CDATA[Elektronik]]></category>
		<category><![CDATA[elektronik.avr]]></category>
		<category><![CDATA[mikrocontroller]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pollin]]></category>

		<guid isPermaLink="false">http://2010.sascha-kimmel.de/?p=5</guid>
		<description><![CDATA[Vor einigen Tagen habe ich mir das AVR-NET-IO von Pollin bestellt. Eine sehr interessante kleine Schaltung &#8211; schon vor einigen Jahren hätte ich gerne auf einfache Weise über Ethernet gemessen und geschaltet &#8211; das AVR-NET-IO macht es endlich möglich. Für C-Control von Conrad Electronic, das ich vor allem für den PropController für Halloween verwendet habe, [...]]]></description>
			<content:encoded><![CDATA[<p>Vor einigen Tagen habe ich mir das <a href="http://www.pollin.de/shop/dt/NjI5OTgxOTk-/Bausaetze/Diverse/AVR_NET_IO_Fertigmodul.html" target="_blank">AVR-NET-IO von Pollin</a> bestellt. Eine sehr interessante kleine Schaltung &#8211; schon vor einigen Jahren hätte ich gerne auf einfache Weise über Ethernet gemessen und geschaltet &#8211; das AVR-NET-IO macht es endlich möglich. Für C-Control von Conrad Electronic, das ich vor allem für den PropController für Halloween verwendet habe, war das nicht so einfach möglich.</p>
<p>Als PHP-Entwickler musste ich natürlich gleich eine Klasse zur Ansteuerung erstellen, so dass man direkt alle Befehle der Standard-Firmware ausführen kann. Später werde ich vermutlich auch andere Firmware wie etwa <a href="http://www.ethersex.de/index.php/Ethersex" target="_blank">Ethersex</a> dafür verwenden, aber erst einmal möchte ich einfach anfangen.</p>
<p>Langer Rede, kurzer Sinn &#8211; hier ist die Beschreibung der PHP-Klasse <img src='http://www.saschakimmel.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Verfügbare Methoden</h2>
<p>Zusätzlich zu den direkten Mappings der Befehle auf PHP-Methoden gibt es auch einige Methoden, die aggregierte Informationen zurückliefern.</p>
<h3>Verbindung herstellen und trennen</h3>
<pre>$avr = new AvrNetIo('192.168.0.90');
$avr-&gt;connect();
$avr-&gt;disconnect();</pre>
<h3>Versionsinformationen abfragen</h3>
<pre>$avr-&gt;getVersion();</pre>
<p>liefert ein assoziatives Array der Form</p>
<pre>array('uc' =&gt; "ATMega32", 'ver' =&gt; "1.03", 'nic' =&gt; "ENC28J60");</pre>
<h3>Netzwerkeinstellungen</h3>
<h4>Lesen</h4>
<pre>$avr-&gt;getIp();</pre>
<pre>$avr-&gt;getMask();</pre>
<pre>$avr-&gt;getGw();</pre>
<h4>Schreiben</h4>
<pre>$avr-&gt;setIp("192.168.0.200")
$avr-&gt;setMask("255.255.255.0")
$avr-&gt;setGw("192.168.0.1");</pre>
<h3>Kumulierte Informationen abrufen</h3>
<pre>$avr-&gt;getData();</pre>
<p>liefert als Convenience-Funktion ein assoziatives Array der Form</p>
<pre>array('ip' =&gt; '192.168.0.90', 'gateway' =&gt; '192.168.0.1', 'netmask' =&gt; '255.255.255.0', 'controller' =&gt; 'AtMega32', 'firmware' =&gt; '1.03', 'nic' =&gt; 'ENC28J60');</pre>
<h3>Status abfragen</h3>
<p>$avr-&gt;getStatus($returnType);</p>
<p>liefert den Status wie der Befehl STATUS zurück, in der Standardform exakt so, also z.B. als S00000000.<br />
Manchmal ist es aber sinnvoll, direkt ein Array mit den Werten der einzelnen Ports zu erhalten. Diese kann man sich entwder als Array mit booleschen Werten (true, false) oder als Integer-Array zurückliefern lassen:</p>
<pre>// Boolesches Array</pre>
<pre>$avr-&gt;getStatus(AvrNetIo::STATUS_ARRAY_BOOL);</pre>
<p>liefert z.B.</p>
<pre>array(true, false, false, false, false, false, true, false);</pre>
<pre>// Integer-Array</pre>
<pre>$avr-&gt;getStatus(AvrNetIo::STATUS_ARRAY_STRING);</pre>
<p>liefert z.B.</p>
<pre>array(1, 0, 0, 0, 0, 0, 1, 0);</pre>
<h3>Digitalports abfragen</h3>
<p>Das AVR-NET-IO verfügt über 8 digitale Eingänge. Diese können wie folgt abgefragt werden:</p>
<pre>$avr-&gt;getPort($number);</pre>
<h3>Analogports abfragen</h3>
<p>Die 4 Analog-/Digital-Konverter-Eingänge (ADC) können wie folgt abgefragt werden:</p>
<pre>$avr-&gt;getAdc($number);</pre>
<h3>Digitalports setzen</h3>
<p>Die 4 digitalen Ausgänge können so geschaltet werden:</p>
<pre>$avr-&gt;setPort($number, $value);</pre>
<h3>LCD-Funktionen</h3>
<p>Der Befehl INITLCD muss im Prinzip einmalig vor Verwendung des LCDs aufgerufen werden, wird aber von der PHP-Klasse automatisch ausgeführt:</p>
<pre>$avr-&gt;initLcd();
$avr-&gt; writeLcd($line, $text);
$avr-&gt;clearLcd();</pre>
<h2>Beispielcode</h2>
<pre>&lt;?php</pre>
<pre>require "AvrNetIo.php";</pre>
<pre>$avr = new AvrNetIo('192.168.0.90');
if ($avr-&gt;connect()) {
     echo "IP: ".$avr-&gt;getIp()."&lt;br /&gt;\r\n";
     echo "Gateway: ".$avr-&gt;getGw()."&lt;br /&gt;\r\n";
     echo "Netmask: ".$avr-&gt;getMask()."&lt;br /&gt;\r\n";
     var_dump($avr-&gt;getVersion());
     echo "&lt;br /&gt;";
     echo "Port 1:".$avr-&gt;getPort(1)."&lt;br /&gt;\r\n";
     echo "ADC1 1:".$avr-&gt;getAdc(1)."&lt;br /&gt;\r\n";</pre>
<pre>     var_dump($avr-&gt;getData());
     echo "&lt;br /&gt;\r\n";
     var_dump($avr-&gt;getStatus(AvrNetIo::STATUS_RAW));
     echo "\r\n";</pre>
<pre>     for ($i=1; $i&lt;5; $i++) {
         echo "ADC #$i: ".$avr-&gt;getAdc($i)."&lt;br /&gt;\r\n";
     }</pre>
<pre>     $avr-&gt;disconnect();</pre>
<pre>} else {
     die("Verbindung nicht möglich!");
}
?&gt;</pre>
<p><a href="/assets/AvrNetIo.phps" target="_blank">Download der Klasse</a></p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 99px; width: 1px; height: 1px;">class AvrNetIo<br />
{<br />
protected $ip;<br />
protected $conn;<br />
protected $timeout = 5;</p>
<p>protected $lcdInitialized;</p>
<p>const STATUS_RAW          = 1;<br />
const STATUS_ARRAY_BOOL   = 2;<br />
const STATUS_ARRAY_STRING = 3;</p>
<p>public function __construct($ip)<br />
{<br />
$this-&gt;ip = $ip;<br />
}</p>
<p>public function connect()<br />
{<br />
$this-&gt;conn = fsockopen($this-&gt;ip, 50290, $errno, $errstr, $this-&gt;timeout);<br />
return (bool)$this-&gt;conn;<br />
}</p>
<p>public function disconnect()<br />
{<br />
return fclose($this-&gt;conn);<br />
}</p>
<p>protected function read($cmd, $lines)<br />
{<br />
fputs($this-&gt;conn, trim($cmd).&#8221;\r\n&#8221;);<br />
$results = array();<br />
for ($i=0; $i&lt;$lines; $i++) {<br />
$results[] = trim(fgets($this-&gt;conn, 65535));<br />
}<br />
return $results;<br />
}</p>
<p>public function getVersion()<br />
{<br />
$info = $this-&gt;read(&#8220;VERSION&#8221;, 3);<br />
$data = array();<br />
foreach ($info as $l) {<br />
list($n, $v) = explode(&#8220;:&#8221;, $l);<br />
$v = trim($v);<br />
$data[strtolower($n)] = $v;</p>
<p>}<br />
return $data;<br />
}</p>
<p>public function getData()<br />
{<br />
$data      = array();<br />
$boardInfo = $this-&gt;getVersion();</p>
<p>$data['ip']         = $this-&gt;getIp();<br />
$data['gateway']    = $this-&gt;getGw();<br />
$data['netmask']    = $this-&gt;getMask();<br />
$data['controller'] = $boardInfo['uc'];<br />
$data['firmware']   = $boardInfo['ver'];<br />
$data['nic']        = $boardInfo['nic'];</p>
<p>return $data;<br />
}</p>
<p>public function getStatus($returnType = self::STATUS_RAW)<br />
{<br />
$r    = $this-&gt;read(&#8220;GETSTATUS&#8221;, 1);<br />
$data = $r[0];</p>
<p>if ($returnType == self::STATUS_RAW) {<br />
return $r[0];<br />
} else {<br />
$array = array();<br />
if ($returnType == self::STATUS_ARRAY_BOOL) {<br />
for ($i=1; $i&lt;strlen($data); $i++) {<br />
$char = substr($data, $i, 1);<br />
$array[] = (bool)$char;<br />
}<br />
} else if ($returnType == self::STATUS_ARRAY_STRING) {<br />
for ($i=1; $i&lt;strlen($data); $i++) {<br />
$char = substr($data, $i, 1);<br />
$array[] = (int)$char;<br />
}<br />
}<br />
}<br />
return $array;<br />
}</p>
<p>public function getIp()<br />
{<br />
$r = $this-&gt;read(&#8220;GETIP&#8221;, 1);<br />
return $r[0];<br />
}</p>
<p>public function setIp($value)<br />
{<br />
$r = $this-&gt;read(&#8220;SETIP &#8220;.($value), 1);<br />
return $this-&gt;resultToBool($r[0]);<br />
}</p>
<p>public function getMask()<br />
{<br />
$r = $this-&gt;read(&#8220;GETMASK&#8221;, 1);<br />
return $r[0];<br />
}</p>
<p>public function setMask($value)<br />
{<br />
$r = $this-&gt;read(&#8220;SETMASK &#8220;.($value), 1);<br />
return $this-&gt;resultToBool($r[0]);<br />
}</p>
<p>public function getGw()<br />
{<br />
$r = $this-&gt;read(&#8220;GETGW&#8221;, 1);<br />
return $r[0];<br />
}</p>
<p>public function setGw($value)<br />
{<br />
$r = $this-&gt;read(&#8220;SETGW &#8220;.($value), 1);<br />
return $this-&gt;resultToBool($r[0]);<br />
}</p>
<p>public function getPort($number)<br />
{<br />
$r = $this-&gt;read(&#8220;GETPORT &#8220;.(int)$number, 1);<br />
return (int)$r[0];<br />
}</p>
<p>public function setPort($number, $value)<br />
{<br />
if ($value) {<br />
$value = 1;<br />
} else {<br />
$value = 0;<br />
}<br />
$r = $this-&gt;read(&#8220;SETPORT &#8220;.(int)$number.&#8221;.&#8221;.(int)$value, 1);<br />
return $this-&gt;resultToBool($r[0]);<br />
}</p>
<p>public function getAdc($number)<br />
{<br />
$r = $this-&gt;read(&#8220;GETADC &#8220;.(int)$number, 1);<br />
return (int)$r[0];<br />
}</p>
<p>public function initLcd()<br />
{<br />
if ($this-&gt;lcdInitialized) {<br />
return true; // already initialized<br />
}<br />
$r   = $this-&gt;read(&#8220;INITLCD&#8221;, 1);<br />
$res = $this-&gt;resultToBool($r[0]);<br />
if ($res) {<br />
$rhis-&gt;lcdInitialized = true;<br />
}<br />
return $res;<br />
}</p>
<p>public function writeLcd($line, $text)<br />
{<br />
$this-&gt;initLcd();<br />
$r = $this-&gt;read(&#8220;WRITELCD &#8220;.(int)$line.&#8221;.&#8221;.$text, 1);<br />
return $this-&gt;resultToBool($r[0]);<br />
}</p>
<p>public function clearLcd()<br />
{<br />
$this-&gt;initLcd();<br />
$r = $this-&gt;read(&#8220;CLEARLCD&#8221;, 1);<br />
return $this-&gt;resultToBool($r[0]);<br />
}</p>
<p>protected function resultToBool($result)<br />
{<br />
return ($result == &#8216;ACK&#8217;);<br />
}<br />
}<br />
?&gt;</p>
</div>
<p><a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/de/"><img style="border-width: 0;" src="http://i.creativecommons.org/l/by-sa/3.0/de/88x31.png" alt="Creative Commons License" /></a><br />
<span>AvrNetIo PHP Class</span> von <a rel="cc:attributionURL" href="http://www.sascha-kimmel.de/2010/02/avr-net-io-mit-php-ansteuern/">Sascha Kimmel</a> steht unter einer <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/de/">Creative Commons Namensnennung-Weitergabe unter gleichen Bedingungen 3.0 Deutschland Lizenz</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.saschakimmel.de/2010/02/avr-net-io-mit-php-ansteuern/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
