Fritzing
Von Fritzing ist schon vor einem knappen Monat Version 0.3.8. alpha erschienen. Mit Fritzing lassen sich elektronische Schaltungen im Arduino-Umfeld sehr gut und einfach darstellen.
Textsatz mit \LaTeX, Programmieren, Zahlen, etc.
Archive for the ‘Programmierung’ Category.
Von Fritzing ist schon vor einem knappen Monat Version 0.3.8. alpha erschienen. Mit Fritzing lassen sich elektronische Schaltungen im Arduino-Umfeld sehr gut und einfach darstellen.
Mein Arduiono hat bisher nur die Temperatur meines Wohnzimmers in einer Textdatei auf dem Server gespeichert, für Auswertungszwecke ist eine Datenbank natürlich besser. Daher hab ich den PHP-Code so erweitert, dass er eine der MySQL-Datenbanken meines Providers nutzt. Hier mal der Code für das setTemperature-Skript:
<?php header('Content-type: text/plain'); echo date("d.m.Y-H:i:s") . " Temperatur= " . $_GET['t']; $link = mysql_connect("<serverhost>", "<username>", "<password>") or die("Keine Verbindung möglich: " . mysql_error()); mysql_select_db("<Datenbank>") or die("Auswahl der Datenbank fehlgeschlagen"); $query = "INSERT INTO temperature(`temperature`) values(" . $_GET['t'] . ")"; $result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error()); mysql_close($link); ?> |
Im nächsten Schritt baue ich noch eine passende Auswertung, die den Temperaturverlauf auch grafisch darstellt.
Unter http://myitforum.com/cs2/blogs/yli628/archive/2008/01/16/powershell-script-to-list-installed-software-on-local-computer.aspx habe ich ein Skript gefunden, das anhand der Registry die installierte Software ausliest und in einer Excel-Datei auflistet.
Von Doug Finke gibt es ein interessantes Video, in dem er beschreibt wie man C# Code in Powershell Skripten direkt ausführen kann.
http://dougfinke.com/blog/?p=414
Extrem genial ist die Möglichkeit, den C# Code direkt in der Powershell laufen zu lassen, die einzige Erweiterung war das „public“ Setzen von Klasse und Methode und der passende Aufruf:
Add-Type ` @" using System; namespace ConsoleApplication1 { public class Program { public static void Main(string[] args) { Console.WriteLine("Hallo Welt"); Console.ReadLine(); } } } "@ [ConsoleApplication1.Program]::Main($null) |
Heute Nachmittag hab ich mich mal aufgemacht, ein eigenes Commandlet mit Visual Studio C# zu programmieren. Dazu bin ich einfach dem Tutorial von Alan Bradley gefolgt: http://www.gangleri.net/2009/04/21/BuildingPowerShellCmdletsWithVisualStudio2008.aspx. Die Projekt Template konnten zuerst nicht installiert werden, da in meinem Dokumente-Ordner folgende Unterordner fehlten:
Der Rest war einfach, nur die Zeile Set-Alias installutil C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe
wollte ich auf .Net 3.5 anpassen, fand aber die InstallUtil.exe nicht im entsprechenden Verzeichnis. Googeln ergab dann, dass Version 3.0 und 3.5 nur Aufsätze für die Version 2.0 sind und daher der obige Pfad richtig ist.
Folgende Zeile, gepostet in der Powershell-Newsgroup, gibt eine Übersicht über alle Netzwerkadapter des Systems:
get-wmiobject Win32_NetworkAdapterConfiguration |
März 2010 soll die zweite Ausgabe von Bruce Payettes Buch „Powershell in Action“ erscheinen. Auf der entsprechenden Homepage des Manning-Verlags gibt es ein paar Probekapitel: http://www.manning.com/payette2.
Standardmäßig hat Powershell keine Möglichkeit, die Rekursionstiefe von gci zu begrenzen. Über Textfilter bekommt man es aber doch hin, wie mir in der microsoft.public.windows.powershell Newsgroup gezeigt wurde. Der volle Pfad eines Items wird an den „\“ gesplittet, dann wird gezählt, in wieviele Elemente gesplittet wurde und nur die ausgegegeben, bei denen es weniger oder gleich 3 Splits (4 Elemente) waren. Ist man bereits in einem tiefen Verzeichnisbaum muss der Parameter entsprechend hoch angesetzt werden.
gci c:\powershelltest -recurse | where{ if( ($_.fullname.split("\")).count -le 4){write-host $_.fullname} } |
Mit der pChart (http://pchart.sourceforge.net) Bibliothek habe ich eine einfache Möglichkeit gefunden, die Temperaturen grafisch darzustellen. Hier ein erstes Beispiel, anhand einer Vorlage aus der pChart Bibliothek. War recht einfach abzuändern, hat mich nur wenige Minuten gekostet, die Anpassungen vorzunehmen.
Ausgehend von Mats Vanselows getTemperatur()
Funktion (http://www.mats-vanselow.de/2009/03/25/temperaturen-messen-mit-arduino und einem Beispiel aus der Ethernet Library habe ich einen kleinen Client geschrieben, der alle 10 Minuten die Temperatur aus einem LM35 Sensor ausliest und per HTTP-Request an ein PHP-Skript auf meiner Homepage schickt. Da der LM35 nicht genau kalibriert ist und wohl sowieso maximal auf ein halbes Grad genau ist, habe ich mittels zwei anderer Thermometer (die wiederum selbst voneinander abweichen) die ungefähre Abweichung des LM35 bestimmt und ziehe die 2° Celsius einfach ab.
Hier der entsprechende Processing-Code:
#include <Ethernet.h> bool connected = false; byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192, 168, 0, 99 }; // IP-Adresse des Webservers byte serverIP[] = {111,111,111,111}; Client client(serverIP,80); int inPin = 5; // input pin 1 float inValTotal; int i; int runs = 5; // Anzahl der Durchläufe int waittime = 20; // ms zwischen Durchläufen int delayVal = 1000; // Intervall für Serial Output float getTemperatur() { inValTotal = 0; for(i = 0;i<runs;i++){ inValTotal = inValTotal + analogRead(inPin); delay(waittime); } inValTotal = inValTotal / runs / 2; return(inValTotal-2); } void setup() { Ethernet.begin(mac, ip); Serial.begin(9600); Serial.println("setup done"); } void loop() { Serial.println("Entered loop"); if (!connected){ Serial.println("Not connected"); if (client.connect()){ connected = true; Serial.println("Connected to Server"); Serial.println("Sending request to server"); client.print("GET /storetemp.php?t="); client.print(getTemperatur()); client.println(" HTTP/1.1"); client.println("Host: www.mydomain.com"); client.println("User-Agent: Arduino"); client.println("Accept: text/html"); client.println(); } else { Serial.println("Cannot connect to server"); } } else { delay(500); while (client.connected() && client.available()) { char c = client.read(); Serial.print(c); } Serial.println(); client.stop(); connected=false; } Serial.println("Done now"); delay(600000); } |
Hier der Code des PHP-Skripts, es schickt als Antwort Zeit und erhaltene Temperatur zurück zum Arduino und speichert die Temperatur mit Zeitstempel in einer Textdatei. Im nächsten Schritt werde ich wohl sicher eine MySQL-Datenbank hintersetzen, für den Moment reicht es aber völlig aus.
<?php header('Content-type: text/plain'); echo date("d.m.Y-H:i:s") . " Temperatur= " . $_GET['t']; $myFile = "testFile.txt"; $fh = fopen($myFile, 'a') or die("can't open file"); fwrite($fh, date("d.m.Y-H:i:s") . " Temperatur= " . $_GET['t']."\n"); fclose($fh); ?> </php> |
Und abschließend ein Auszug aus der Textdatei:
04.10.2009-09:22:29 Temperatur= 21.00 04.10.2009-09:22:37 Temperatur= 21.00 04.10.2009-09:22:44 Temperatur= 21.00 04.10.2009-09:22:52 Temperatur= 21.00 04.10.2009-09:23:00 Temperatur= 21.00 04.10.2009-09:23:07 Temperatur= 20.90 04.10.2009-09:23:15 Temperatur= 21.00 04.10.2009-09:23:33 Temperatur= 21.00