Alle Beiträge von Tobias Guggenberger

SDS011 – Feinstaubsensor

Mit dem Modul SDS011 kann der Feinstaub in der Luft per Particulate Matter (PM) „gezählt“ werden. Es werden Partikelgrößen in den Bereichen PM 2.5 und PM 10 registriert.

Die Kommunikation mit dem Arduino geht per Serieller Verbindung. Der Sensor kann per HEX Befehl gesteuert oder Schlafen gelegt werden. Dies ist auch bei Einsatz als „Messsonde“ auch sinnvoll da die Lebensdauer der Laserdiode auf 8000 h geschätzt wird. Mehr Infos gibt es Datenblatt am Ende des Beitrages.

Ein einfacher Arduino Sketch zum auslesen der Daten sollte als Basis für weitere Entwicklungen ausreichend sein. Hierfür bietet sich die Library von Paweł Kołodziejczyk an die hier zu finden ist.



Nachfolgend eine Ausgabe im Arduino Seriellen Monitor.

 
#include "SdsDustSensor.h"
 
int rxPin = 6;
int txPin = 7;
SdsDustSensor sds(rxPin, txPin);
 
void setup() {
  Serial.begin(9600);
  sds.begin();
 
  Serial.println(sds.queryFirmwareVersion().toString()); // prints firmware version
  Serial.println(sds.setActiveReportingMode().toString()); // ensures sensor is in 'active' reporting mode
  Serial.println(sds.setCustomWorkingPeriod(10).toString()); // sensor sends data every 3 minutes
}
 
void loop() {
  PmResult pm = sds.readPm();
  if (pm.isOk()) {
    Serial.print("PM2.5 = ");
    Serial.print(pm.pm25);
    Serial.print(", PM10 = ");
    Serial.println(pm.pm10);
 
    // if you want to just print the measured values, you can use toString() method as well
    Serial.println(pm.toString());
  } else {
    // notice that loop delay is set to 5s (sensor sends data every 3 minutes) and some reads are not available
    Serial.print("Could not read values from sensor, reason: ");
    Serial.println(pm.statusToString());
  }
 
  delay(5000);
}

Nachfolgend noch das Datenblatt von Nova Fitness Co., Ltd..

DHT22 / AM2302-Luftfeuchte und Temperatursensor

Dieser Sensor dient zum Messen der Luftfeuchtigkeit und der Temperatur. Durch seinen günstigen Preis bietet sich der AM2302 fuer diese Aufgabe an. Da er sowohl mit 3,3V oder 5V betrieben werden kann eignet er sich zum Betrieb an einem Raspberry oder Arduino.

Durch seine OneWire Technologie reicht ein PIN am Board um Luftfeuchtigkeit und Temperatur zu ermitteln. Die Abfrage der Messwerte erfolgt somit seriell als Bitreihenfolge.

Technische Daten:

  • Betriebsspannung: DC 3.3-5.5V
  • Luftfeuchtigkeitsmessbereich : 0 bis 100% relative Luftfeuchte
  • Feuchtemessgenauigkeit: ±2% RH
  • Temperaturbereich: -40 bis +80 C
  • Temperaturmessgenauigkeit ±0.5
  • OneWire Ausgang an Pin 2

  • Maße: 28mm x 12mm x 10mm

Beispielprogramm fuer einen Arduino Uno

    // Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
 
#include "DHT.h"
 
#define DHTPIN 7     // what digital pin we're connected to
 
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
 
// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
 
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
  Serial.begin(57600);
  Serial.println("DHTxx test!");
 
  dht.begin();
}
 
void loop() {
  // Wait a few seconds between measurements.
  delay(2000);
 
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);
 
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
 
  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
 
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
}

Quelle ladyada, public domain

Mehr infos unter Github.

Arduino Relaiskarte per MQTT Befehl steuern

Die Hausautomatisierung benötigt sehr viele Aktoren. In diesem Bereich gibt es sehr viele Produkte der großen Hersteller. Leider auch entsprechend teuer. Hier möchte ich ein Projekt vorstellen das über einen Arduino (WeMos D1) eine Relaiskarte ansteuert. zur Steuerung verwende ich das MQTT Protokoll. Natürlich alles per WiFi. Es wird nur noch die Versorgungsspannung und der Laststromkreis benötig.

5 Minuten Probeaufbau

Gesteuert wird nun das Relais A mit folgendem Befehl:

Ebenso einfach geht das Aus schalten des Relais

Relais B reagiert folglich auf

Das Relais ist nun im kompletten Heimnetzwerk erreichbar.

Code Snipes

WeMos D1 per WiFI Daten in mySQL schreiben

Mit dem nachfolgendem Sketch ist der WeMos D1 in der Lage Messdaten in eine mySQL Datenbank zu senden.

Das eigentliche schreiben der Daten erfolgt mit dem Aufrufen einer PHP Datei in Form eines GET Befehls.

<?php
/*
 
Daten per GET in eine mySQL Datenbank schrieben
 
by Tobias Guggenberger
guggenberber.me
 
*/
 
// POD Verbindung zur Datenbank
$datenbank_name 		= "NAME_DATENBANK";
$datenbank_username 	= "USER";
$datenbank_passwort		= "PASS";
 
// Datenbankverbindung aufbauen
$pdo = new PDO('mysql:host=localhost;dbname='.$datenbank_name, $datenbank_username, $datenbank_passwort);
 
// Neuen Datensatz schreiben
$neuer_datensatz = array();
$neuer_datensatz['WERT1'] = time();
$neuer_datensatz['WERT2'] = $_GET['temperatur'];
$neuer_datensatz['WERT3'] = $_GET['sensor'];
$statement = $pdo->prepare("INSERT INTO TABELLE (wert1, wert2, wert3) VALUES (:wert1, :wert2, :wert3)");
$statement->execute($neuer_datensatz);
?>

Der passende Sketch sieht so aus:

 
#include <ESP8266WiFi.h>
const char* ssid     = "SSID";      // SSID
const char* password = "PASS";      // Password
const char* host = "SERVER_DB";  // IP ServeP
const int   port = 80;            // Port
const int   watchdog = 5000;        // Schreibefruenz
unsigned long previousMillis = millis(); 
 
void setup() {
  Serial.begin(115200);
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
 
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
 
void loop() {
  delay(5000);  
    unsigned long currentMillis = millis();
 
  if ( currentMillis - previousMillis > watchdog ) {
    previousMillis = currentMillis;
    WiFiClient client;
 
    if (!client.connect(host, port)) {
      Serial.println("connection failed");
      return;
    }
 
    String url = "/arduino/FILE_zum-SCHREIBEN.php?wert1=wer1&usw";
    url += String(millis());
    url += "&ip=";
    url += WiFi.localIP().toString();
 
    // Envoi la requete au serveur - This will send the request to the server
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
    unsigned long timeout = millis();
    while (client.available() == 0) {
      if (millis() - timeout > 5000) {
        Serial.println(">>> Client Timeout !");
        client.stop();
        return;
      }
    }
      while(client.available()){
      String line = client.readStringUntil('\r');
      Serial.print(line);
    }
  }
}

Projektdatein zum Download

MYSQL Datenbankverbindung aufbauen PDO

Inhaltsverzeichnis

Die aktuell beste Möglichkeit sich mit SQL Datenbank zu verbinden sind PHP Data Objects (POD).

Mit einer Datenbank verbinden

Bevor man mit einer Datenbank arbeiten kann, muss man erst eine Verbindung zu dieser aufbauen. Die geschieht mir der Klasse PDO.

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
?>
  • host: Hostname der Datenbank (meistens localhost)
  • dbname: Der Datenbankname
  • username: Benutzername in der Datenbank
  • password: Passwort in der Datenbank


Wemos D1 ESP8266 Board als Webserver

Mit dem nachfolgendem Sketch betreiben Sie den Wemos DA ESP8266 im WiFi als Webserver.

In dem Sketch wird eine feste IP vergeben. Ich finde das immer angenehmer wie dynamische Vergabe.

    #include <ESP8266WiFi.h>
 
const char* ssid = "DEINE_SSID";
const char* password = "DEIN_PASSWORT";
 
int ledPin = D5;
WiFiServer server(80);
 
void setup() {
  Serial.begin(19200);
  delay(10);
 
 
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
 
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
WiFi.begin(ssid, password);
 
  IPAddress ip(192, 168, 187, 52); // Feste IP vergeben
  IPAddress gateway(192, 168, 1, 1);
  IPAddress subnet(255, 255, 0, 0);
  IPAddress dns(192, 168, 1, 1);
  WiFi.config(ip, dns, gateway, subnet);
 
 
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");
 
  // Print the IP address
  Serial.print("Use this URL : ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
 
}
 
void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 
  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();
 
  // Match the request
 
  int value = LOW;
  if (request.indexOf("/LED=ON") != -1) {
    digitalWrite(ledPin, HIGH);
    value = HIGH;
  } 
  if (request.indexOf("/LED=OFF") != -1){
    digitalWrite(ledPin, LOW);
    value = LOW;
  }
 
 
 
  // Return the response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
 
  client.print("Led pin is now: ");
 
  if(value == HIGH) {
    client.print("On");  
  } else {
    client.print("Off");
  }
  client.println("<br><br>");
  client.println("Click <a href=\"/LED=ON\">here</a> turn the LED on pin 5 ON<br>");
  client.println("Click <a href=\"/LED=OFF\">here</a> turn the LED on pin 5 OFF<br>");
  client.println("</html>");
 
  delay(1);
  Serial.println("Client disconnected");
  Serial.println("");
 
}