Archive for the ‘Arduino’ Category.

Luftfeuchtigkeits-Ampel mit dem Arduino

Vor ein paar Tagen habe ich ein kleines Projekt mit dem Arduino abgeschlossen. Eine LED sollte — ähnlich wie eine Ampel — über die aktuelle Luftfeuchtigkeit Auskunft geben. Dazu habe ich einen DHT 22 Sensor und eine 5mm Full-RGB LED an einen USB-Boarduino angeschlossen.

Hier der Code, eine Fritzing-Zeichnung werde ich noch nachliefern.

//
// Basis: dht22_test.ino by Rob Tillaart
#include <dht.h>
dht DHT;
#define DHT22_PIN 2
 
void setup()
{
  Serial.begin(9600);
  pinMode(5, OUTPUT); // Blau
  pinMode(4, OUTPUT); // ROT
  pinMode(3, OUTPUT); // GRÜN
 
  digitalWrite(4, HIGH);
  delay(1000);
  digitalWrite(3, HIGH);
  delay(1000);
  digitalWrite(5, HIGH);
  delay(1000);
 
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
}
 
void loop()
{
  int chk = DHT.read22(DHT22_PIN);
  float humidity = DHT.humidity;
  float temp = DHT.temperature;
 
  Serial.print("Humidity (%): ");
  Serial.println(humidity);
  Serial.print("Temperature (C): ");
  Serial.println(temp);
 
  if (humidity > 60) // ROT, wenn die L. zu hoch ist.
  {
    digitalWrite(4, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(5, LOW);
  }
 
  if (humidity < 40) // BLAU, wenn L. zu niedrig ist.
  {
    digitalWrite(5, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
  }
 
  if ((humidity >= 40) && (humidity <= 60) ) // Zwischen 40 und 60 zeige GRÜN
  {
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
  }
  delay(5000);
}

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website

Temperatur und Luftfeuchtigkeit messen mit dem Arduino Teil III – Auswertung

Nachdem jetzt die Daten erfolgreich in der Datenbank gespeichert werden können, wird es Zeit, die Daten zu visualisieren.

Dazu nutze ich pChart, eine für nicht-kommerzielle Zwecke freie PHP Bibliothek. Die Verbindung zur Datenbank war schnell erstellt, das folgende Beispiel ist nur eine Anpassung des Codes von http://wiki.pchart.net/doc.mysql.integration.html

Hinweis: Der Code ist noch nicht aufgeräumt, dies folgt in den nächsten Tagen.

<?php   
	/* pChart library inclusions */
	include("../pChart/class/pData.class.php");
	include("../pChart/class/pDraw.class.php");
	include("../pChart/class/pImage.class.php");
 
	/* Create and populate the pData object */
	$MyData = new pData();  
 
	/* Connect to the MySQL database */
	$db = mysql_connect("<server>", "<user>", "<password>");
	mysql_select_db("uwezie_db7",$db);
	/* Build the query that will returns the data to graph */
	$Requete = "SELECT temperature, humidity, timestamp FROM ( SELECT @row := @row +1 AS rownum, temperature, humidity, timestamp FROM ( SELECT @row :=0) r, data ) ranked WHERE rownum % 5 = 1 and timestamp >= now() - INTERVAL 24 hour";
	$Result  = mysql_query($Requete,$db);
$timestamp=""; $temperature=""; $humidity="";
 
if($Result == FALSE) {
    die(mysql_error()); // TODO: better error handling
}
 
while($row = mysql_fetch_array($Result))
 {
  /* Get the data from the query result */
  $timestamp   = $row["timestamp"];
  $temperature = $row["temperature"];
  $humidity    = $row["humidity"];
 
  /* Save the data in the pData array */
  //$myData->addPoints($timestamp,"Timestamp");
  $MyData->addPoints($temperature,"Temperature");
  //$myData->addPoints($humidity,"Humidity");
 }
 
 /* Create the pChart object */
 $myPicture = new pImage(1600,800,$MyData);
 /* Turn of Antialiasing */
 $myPicture->Antialias = FALSE;
 /* Add a border to the picture */
// $myPicture->drawRectangle(0,0,1599,799,array("R"=>0,"G"=>0,"B"=>0));
 /* Write the chart title */ 
 $myPicture->setFontProperties(array("FontName"=>"../pChart/fonts/Forgotte.ttf","FontSize"=>11));
 $myPicture->drawText(150,35,"Temperature",array("FontSize"=>30,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
 /* Set the default font */
 $myPicture->setFontProperties(array("FontName"=>"../pChart/fonts/pf_arma_five.ttf","FontSize"=>8));
 /* Define the chart area */
 $myPicture->setGraphArea(60,40,1500,700);
 /* Draw the scale */
 $labelskip =  30; // 1000/24; // values = 1000, hours = 24
$AxisBoundaries = array(0=>array("Min"=>15,"Max"=>25));
$scaleSettings  = array("GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>FALSE,"CycleBackground"=>FALSE,"Mode"=>SCALE_MODE_MANUAL, "ManualScale"=>$AxisBoundaries,"LabelSkip"=>$labelskip);
 
$serieSettings = array("R"=>229,"G"=>11,"B"=>11,"Alpha"=>100);
$MyData->setPalette("Temperature",$serieSettings);
 
 
 $myPicture->drawScale($scaleSettings);
 /* Turn on Antialiasing */
 $myPicture->Antialias = TRUE;
 /* Draw the line chart */
 $myPicture->drawLineChart();
 /* Write the chart legend */
 $myPicture->drawLegend(540,20,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
 /* Render the picture (choose the best way) */
 $myPicture->autoOutput("drawobjects2.png");
?>
 
<img src="drawobjects2.png"/>

index5.php

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website

Temperatur und Luftfeuchtigkeit messen mit dem Arduino Teil I 1/2

Den ursprünglichen Sketch aus dem Artikel vom 24.12. habe ich so abgeändert, dass jetzt in der ersten Zeile die aktuelle Temperatur und Luftfeuchtigkeit gezeigt wird und in der zweiten Zeile die Min/Max Werte für die gemessene Temperatur.

// Beispielcode, um Temperatur/Luftfeuchtigkeit
// eines DHT22 auf einem Sparkfun SerialLCD auszugeben
 
#include "DHT.h"
#include <SoftwareSerial.h>
 
#define DHTPIN 2     // Pin für den DHT22
SoftwareSerial mySerial(4,3); // SoftwareSerial für das LCD
 
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);
 
float maxtemp = 0.0;
float mintemp = 100.0;
 
 
void setup() {
  mySerial.begin(9600); // starte LCD Verbindung
  Serial.begin(9600); // starte zus. serielle Verbindung
  delay(500); // wait for display to boot up
 
  mySerial.write(254); // setze Cursor in die erste Zeile
  mySerial.write(128);
 
  mySerial.write("                "); // clear LCD
  mySerial.write("                ");
  delay(500);
  mySerial.write("  DHT22 Sensor");
 
  dht.begin();
}
 
char tempstring[10], humstring[10];
 
void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  delay(5000); // lese alle 5 Sekunden ein
 
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    mySerial.write(254); // move cursor to beginning of first line
    mySerial.write(128);
    mySerial.println("DHT22 nicht gefunden");
  } else {
    mySerial.write(254); // move cursor to beginning of first line
    mySerial.write(128);
    mySerial.write("                "); // clear display
    mySerial.write("                ");
    mySerial.write(254); // move cursor to beginning of first line
    mySerial.write(128); 
    mySerial.print(t);
    mySerial.print(" *C ");      
    mySerial.print(h);
    mySerial.print("%");
    mySerial.write(254); // move cursor to beginning of 2nd line
    mySerial.write(192);
    if (t<mintemp){mintemp = t;};
    if (t>maxtemp){maxtemp = t;};
    mySerial.print(mintemp);
    mySerial.print(" ");
    mySerial.print(maxtemp);
    Serial.println(t);
 
  }
}

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website

Temperatur und Luftfeuchtigkeit messen mit dem Arduino Teil II – Speicherung der Messdaten

Nachdem das Messen und Anzeigen der DHT22 Daten recht einfach war, geht es in diesem Posting um die Speicherung der Daten. Ich habe es technisch so gelöst, dass der Arduino über das Ethernet-Shield eine URL aufruft und per Parameter die entsprechenden Variablen übergibt.

Hier der passende Arduino-Code. Der Ethernet Shield holt sich per DHCP eine IP-Adresse vom Server und ruft eine URL auf. Hinter der URL liegt ein PHP Skript, das die Daten mit SensorID und Zeitstempel in eine MySQL Datenbank schreibt. Ich nutze den Zeitstempel des Servers, dadurch spare ich es mir, eine RTC in die Schaltung einzubauen.

#include <Ethernet.h>
#include <SPI.h>
#include "DHT.h"
 
bool connected = false;
 
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x22, 0x81};
byte serverIP[] = {123,123,123,123}; // Server IP address
 
EthernetClient client;
 
#define SENSORID 1
#define DHTPIN  5     // input pin 5
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);
 
 
void setup()
{
  Ethernet.begin(mac); // no IP => DHCP
  Serial.begin(9600);
  Serial.println("setup done");
  dht.begin();
}
 
void loop()
{
  Serial.println("Entered loop");
if (!connected){ 
   Serial.println("Not connected");
  if (client.connect(serverIP,80)){
      connected = true;
      Serial.println("Connected to Server");
      Serial.println("Sending request to server");
      client.print("GET /somedir/someurl.php?s=");
      client.print(SENSORID);      
      client.print("&t=");
      client.print(dht.readTemperature());
      client.print("&h=");
      client.print(dht.readHumidity());
      client.println("HTTP/1.1");
      client.println("Host: www.uweziegenhagen.de");
      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(60000);
}

Hier noch das entsprechende PHP-Skript:

<?php
header('Content-type: text/plain');
echo "Sensor:" . $_GET['s'] . "Temperature= " . $_GET['t'] . " Humidity= " . $_GET['h'];
 
$link = mysql_connect("<server>", "<user>", "password") or die("Keine Verbindung möglich: " . mysql_error());
mysql_select_db("<database>") or die("Auswahl der Datenbank fehlgeschlagen");
$query = "INSERT INTO data values(" $_GET['s'] . "," . $_GET['t'] . "," . $_GET['h'] . ",NOW())";
$result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error());
 
mysql_close($link);
?>

Datenbank-Setup:

CREATE TABLE IF NOT EXISTS `data` (
  `sensor` tinyint(1) NOT NULL,
  `temperature` float NOT NULL,
  `humidity` float NOT NULL,
  `timestamp` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

IMG_8334

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website

Temperatur und Luftfeuchtigkeit messen mit dem Arduino I

Vor ein paar Tagen habe ich mir zwei DHT22 Sensoren bei Watterott bestellt, die sowohl Temperatur als auch Luftfeuchtigkeit mit ausreichender Genauigkeit messen können.

Im ersten Sketch lese ich die Daten aus und gebe sie seriell sowohl auf einem angeschlossenen Sparkfun LCD als auch über die serielle Schnittstelle aus. Zum Auslesen des Sensors gibt es von Adafruit eine Bibliothek, die folgende Seite zeigt auch die Beschaltung: http://learn.adafruit.com/dht/connecting-to-a-dhtxx-sensor

IMG_8173

// Beispielcode, um Temperatur/Luftfeuchtigkeit
// eines DHT22 auf einem Sparkfun SerialLCD auszugeben
 
#include "DHT.h"
#include <SoftwareSerial.h>
 
#define DHTPIN 2     // Pin für den DHT22
SoftwareSerial mySerial(4,3); // SoftwareSerial für das LCD
 
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
  mySerial.begin(9600); // starte LCD Verbindung
  Serial.begin(9600); // starte zus. serielle Verbindung
  delay(500); // wait for display to boot up
 
  mySerial.write(254); // setze Cursor in die erste Zeile
  mySerial.write(128);
 
  mySerial.write("                "); // clear LCD
  mySerial.write("                ");
  delay(500);
  mySerial.write("  DHT22 Sensor");
 
  dht.begin();
}
 
char tempstring[10], humstring[10];
 
void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  delay(5000); // lese alle 5 Sekunden ein
 
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    mySerial.write(254); // move cursor to beginning of first line
    mySerial.write(128);
    mySerial.println("DHT22 nicht gefunden");
  } else {
    mySerial.write(254); // move cursor to beginning of first line
    mySerial.write(128);
    mySerial.write("                "); // clear display
    mySerial.write("                ");
    mySerial.write(254); // move cursor to beginning of first line
    mySerial.write(128); 
    mySerial.print("Luftf: ");  
    mySerial.print(h);
    mySerial.print(" %");      
    Serial.println(h);
    mySerial.write(254); // move cursor to beginning of 2nd line
    mySerial.write(192);
    mySerial.print("Temp: ");  
    mySerial.print(t);
    mySerial.print(" *C");   
    Serial.println(t);
  }
}

Im nächsten Schritt werde ich die Daten per WLAN oder Ethernet in eine Datenbank schreiben.

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website

Folien für den Arduino-Vortrag, FrOSCon 2013

Hier die Folien für meinen 2013er Arduino-Vortrag auf der FrOSCon.

Arduino Vortrag (PDF)

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website

Buchkritik „Arduino Praxiseinstieg“ von Thomas Brühlmann (2. Auflage)

Vor ein paar Wochen hat mir der mitp Verlag freundlicherweise ein Rezensionsexemplar für die 2. Auflage von Thomas Brühlmanns Buch „Arduino Praxiseinstieg“ zukommen lassen. Nach dem Weihnachtsstress der vergangenen Wochen möchte ich es jetzt gern vorstellen. Gegenüber der 1. Auflage hat sich einiges getan, auf fast 530 Seiten (fast 200 mehr als bei der Erstauflage) stellt der Autor Version 1.0 der Arduino-Umgebung vor. Erfreulich ist, dass trotz des beträchtlichen Seitenzuwachses der Preis nur auf 29,95 Euro gestiegen ist.

Ein Hinweis nebenbei: Version 1.0 heißt im OpenSource-Umfeld nicht, dass es die erste Version ist, die nix taugt. OpenSource Software ist dafür bekannt, Versionsnummern nur sehr zögerlich zu inkrementieren. BibTeX von Leslie Lamport und Oren Patashnik wird seit 1985 entwickelt und ist immer noch nicht in Version 1.0 angekommen…

Zurück zum Thema: Nach der Einleitung und Vorstellung von Software und den verschiedenen Arduino-Boards stellt der Autor im dritten Kapitel die grundlegenden Elektronik-Bauteile wie Widerstand, LED, etc. vor. Hardcore-Elektroniker können dies sicher überspringen, für Fachfremde wie mich ist das aber sicher sinnvoll.

Kapitel 4 behandelt die verschiedenen Ein- und Ausgänge des Arduinos und zeigt, wie man Werte ein- und auslesen kann. Thomas Brühlmann geht dabei auch auf die serielle Schnittstelle und I2C ein (Das erinnert mich dran, mal meine MAX232 Chips ausprobieren zu wollen). Um Sensoren (Licht, Temperatur), Aktoren (Relais, Servos, Motoren) und Anzeigen (LEDs, LC-Displays, etc.) geht es in Kapitel 5. Kapitel 6 zeigt, wie man die gesammelten Daten im EEPROM des Arduinos speichern oder auf eine SD-Karte schreiben kann. Dieses Kapitel geht auch auf Processing, die „Künstler-Programmiersprache“ ein. Dieser Teil ist insbesondere deshalb spannend, weil ich schon seit Monaten mal Processing-Programme mit dem Arduino ansprechen will. Da muss ich mal einen genaueren Blick raufwerfen.

Kapitel 7 stellt einige der vielen Soft- und Hardware-Erweiterungen vor, darunter TinyGPS, Ethernet Lib, LCD, MIDI auf der Software-Seite, Ethernet-, Motorshield und viele andere auf der Hardware-Seite.

Das achte Kapitel zeigt einige Praxisbeispiele wie die Verwendung des Arduino als Webserver (hab ich auch schon gemacht), das Twittern per Arduino und verschiedene andere Web-getriebene Themen. Sehr spannend auf den ersten Blick!

In den restlichen Kapiteln geht es dann um DIY-Boards (DYI = Do-It-Yourself also selbsterstellte Controller-Platinen), die Suche nach Fehlern und nützliche Tools für die Arbeit mit Elektronik (Lötkolben, Oszilloskop, Multimeter); außerdem enthält das Buch noch eine knapp 30-seitige Codereferenz sowie technische Listen der Boards sowie Bezugsquellen.

Fazit: Schönes Buch, das mich reizt, mal wieder die Arduino-Kiste unter dem Tisch hervorzuholen. Für das Jahr 2013 habe ich mir vorgenommen, wieder mehr mit dem Arduino zu machen (IKEA LED Streifen ansteuern, Kameraauslöser bauen, usw.), dabei wird mir das Buch sicher helfen.

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website

Folien vom Arduino Vortrag auf der Froscon 2012

Hier die Folien vom Arduino Vortrag Arduino-Slides.

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website

Arduino hackt Hotel-Türen

Heute meldet Golem, dass ein Arduino beim Aufdecken von Sicherheitslücken in Hotels eine wesentliche Rolle gespielt hat: http://www.golem.de/news/cody-brocious-mozilla-softwareentwickler-hackt-hoteltueren-mit-arduino-1207-93427.html

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website

Folien vom Arduino-Workshop auf der Froscon

Hier die Folien vom Arduino-Workshop auf der Froscon.

Arduino-Slides

Uwe

Uwe Ziegenhagen has been working with LaTeX for more than a decade. Besides TeX/LaTeX he likes to work with Python, Rasberry/Arduino and his digital camera.

More Posts - Website