NodeMCU ESP8266 PIN Belegung

Es gib immer mal wieder die Situation mit einem Linux System E-Mails zu versenden. Das können zu hohe Temperaturen der Festplatte, störungen von Cronjob oder eine IP, die aufgrund von falschen Login versuchen auffällt. Natürlich ist dieser Service auch bei anderen Diensten wie FHEM interessant.
Man könnte sich eine E-Mail senden lassen wenn ein bestimmter Bewegungsmelder aktiv wird. Oder die Temperatur der Gefriertruhe steigt wegen einem defekt. Hier kann auch sSMTP einspringen und eine E-Mail versenden. Die Einsatzmöglichkeiten sind unglaublich vielfältig.
Und diese Möglichkeiten gibt es mit sSMTP mit relativ wenig Aufwand.
Wie immer, wer sein Linux liebt der updatet als erstes 🙂
apt-get update && apt-get upgrade -V
Nun kann man die beiden Pakete von sSMTP installieren
apt-get install ssmtp mailutils
Nun wird als erster Schritt die generelle Einrichtung von sSMTP vorgenommen
nano /etc/ssmtp/ssmtp.conf
Gebt in diesem File euer E-Mail Konto sowie die entsprechenden Ports eures E-Mail Anbieters an.
root=DEINE@EMAIL.DE
mailhub=DEIN-EMAIL.SERVER.DE:PORT(ist bei jedem Anbieter anders!)
hostname=localhost
UseTLS=Yes
UseSTARTTLS=Yes
AuthUser=DEIN-EMAIL-LOGIN-BENUTZER
AuthPass=DEIN-EMAIL-PASSWORT
FromLineOverride=yes
Wer mehr zu den einzelnen Eintragen wissen möchte kann sich gerne mal die man von sSMTP ansehen. Linux versteht man nur durch lesen :).
man ssmtp
Nun müssen wir Linux nur noch mitteilen welche Benutzer eigentlich sSMTP nutzen dürfen.
Dazu öffnen wir das Benutzer File des sSMTP
nano /etc/ssmtp/revaliases
In diesem File müssen alle Benutzer des jeweiligen Linux System eingetragen werden die gerne eine Email versenden möchten. Bitte achtet drauf auch hier die richtigen PORTs mit anzugeben.
root:DEINE@EMAIL-ADRESSE.DE:smtp.EMAIL-ADRESSE.de:587 (Je nach Anbeiter)
www-data:WWW-USER@SEINE-EMAIL.DE:smtp.IRGENDWAS.DE:PORT
Zum Schluss schicken wir nun mal eine Test E-Mail 😀
echo "Mail-Inhalt" | mail -s "Betreff" EMAIL@AN-DIE-GESENDET-WERDEN-SOLL.DE
So das waren die Grundlagen. Nun ist dein Linux System in der Lage E-Mails zu versenden. War ja eigentlich gar nicht so viel Aufwand!
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.
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.
Im Betrieb des esp8266 ist es oft störend und auch eine Sicherheitslücke wenn das WiFi Board im AP Modus arbeitet. Dies kann man durch einfügen der folgenden Codezeile abändern.
WiFi.softAPdisconnect(true);
Damit sollte das Melden als AccessPoint beendet sein.
Wer einen Arduino mit Ethernet Shield w5100 betreibt kann in die Situation kommen das bei DHCP durch den Router keine IP vergeben wird.
Ein Auslesen per seriellen Monitor gibt oft die Meldung IP 0.0.0.0 zurück.
Einer der häufigsten Fehler der mir unter die Finger kommt, sind Router oder Switch die nicht mir der Arduino MAC klar kommen.
Mehr hierzu gibt es wie üblich in der Wiki.
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.
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.
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); } } }
In Bearbeitung
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(""); }