Alle Beiträge von Stefan

Beleuchtung über WLAN schalten mit ESP8266-01

Ziel ist es zwei Leuchten getrennt voneinander über WLAN zu schalten. Grundsätzlich ist es aber auch möglich andere Verbraucher zu schalten. Ich möchte jedoch schon jetzt darauf hinweisen, dass diese Schaltung nur mit „ohmschen Lasten“ funktioniert. Sollten „INDUKTIVE“ Lasten geschaltet werden, ist eine Snubber erforderlich. Ich habe mich für eine Solid State Relais entschieden mit der Bezeichnung PR36MF2 und habe diese über Reichelt bezogen. Somit entfällt das lästige knacken und Relais. Ein weiterer Vorteil ist die Schaltung im Nulldurchgang, welche im Relais bereits integriert ist. Das Relais schaltet mit den 3,3V Betriebsspannung, somit ist auch keine weitere Spannungsquelle erforderlich.  Der Hauptgrund lag jedoch in der Möglichkeit diese Schaltung direkt in der Schalterdose zu integrieren. Dafür war die kleine Abmessung natürlich optimal.

Über den Aufruf der IP-Adresse (192.168.178.240) kann somit von jedem Punkt im Haus das Licht ein und ausgeschaltet werden. Ich habe mich hierbei entschieden eine feste IP-Vergabe durchzuführen.

Den Prototypen habe ich auf Lochrasterplatine aufgebaut mit einer Abmessung 35mmx35mm. Ich habe diesen Prototypen nun seit einer Woche im Testbetrieb und konnte bislang keine Probleme feststellen.

Nun werde ich mir noch Gedanken über ein passenden Netzteil machen und ein Layout erstellen.
Achtung!! Ihr arbeitet mit Netzspannung!!!!

 

Programmcode für ARUDINO IDE mit ESP8266 Plugin

 

#include <ESP8266WiFi.h>

const char* ssid = „SSID_WLAN_Bezeichnung“;
const char* password = „WLAN-KEY“;
const IPAddress ipadd(192,168,178,240);
const IPAddress ipgat(192,168,178,1);
const IPAddress ipsub(255,255,255,0);

unsigned long ulReqcount;
unsigned long ulReconncount;
// Create an instance of the server on Port 80
WiFiServer server(80);

void setup()
{
// setup globals
ulReqcount=0;
ulReconncount=0;

// prepare GPIO2
pinMode(2, OUTPUT);
digitalWrite(2, 0);

// prepare GPIO0
pinMode(0, OUTPUT);
digitalWrite(0, 0);

// start serial
Serial.begin(9600);
delay(1);

// inital connect
WiFi.mode(WIFI_STA);
WiFiStart();
}

void WiFiStart()
{
ulReconncount++;

// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print(„Connecting to „);
Serial.println(ssid);

WiFi.config(ipadd, ipgat, ipsub);
WiFi.begin(ssid, password);

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.println(WiFi.localIP());
}

void loop()
{
// check if WLAN is connected
if (WiFi.status() != WL_CONNECTED)
{
WiFiStart();
}

// Check if a client has connected
WiFiClient client = server.available();
if (!client)
{
return;
}

// Wait until the client sends some data
unsigned long ultimeout = millis()+250;
while(!client.available() && (millis()<ultimeout) )
{
delay(1);
}
if(millis()>ultimeout)
{
Serial.println(„client connection time-out!“);
return;
}

// Read the first line of the request
String sRequest = client.readStringUntil(‚\r‘);
//Serial.println(sRequest);
client.flush();

// stop client, if request is empty
if(sRequest==““)
{
Serial.println(„empty request! – stopping client“);
client.stop();
return;
}

String sPath=““,sParam=““, sCmd=““;
String sGetstart=“GET „;
int iStart,iEndSpace,iEndQuest;
iStart = sRequest.indexOf(sGetstart);
if (iStart>=0)
{
iStart+=+sGetstart.length();
iEndSpace = sRequest.indexOf(“ „,iStart);
iEndQuest = sRequest.indexOf(„?“,iStart);

// are there parameters?
if(iEndSpace>0)
{
if(iEndQuest>0)
{
// there are parameters
sPath  = sRequest.substring(iStart,iEndQuest);
sParam = sRequest.substring(iEndQuest,iEndSpace);
}
else
{
// NO parameters
sPath  = sRequest.substring(iStart,iEndSpace);
}
}
}

///////////////////////////////////////////////////////////////////////////////
// output parameters to serial, you may connect e.g. an Arduino and react on it
///////////////////////////////////////////////////////////////////////////////
if(sParam.length()>0)
{
int iEqu=sParam.indexOf(„=“);
if(iEqu>=0)
{
sCmd = sParam.substring(iEqu+1,sParam.length());
Serial.println(sCmd);
}
}

///////////////////////////
// format the html response
///////////////////////////
String sResponse,sHeader;

////////////////////////////
// 404 for non-matching path
////////////////////////////
if(sPath!=“/“)
{
sResponse=“<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>“;

sHeader  = „HTTP/1.1 404 Not found\r\n“;
sHeader += „Content-Length: „;
sHeader += sResponse.length();
sHeader += „\r\n“;
sHeader += „Content-Type: text/html\r\n“;
sHeader += „Connection: close\r\n“;
sHeader += „\r\n“;
}
///////////////////////
// format the html page
///////////////////////
else
{
ulReqcount++;
sResponse  = „<html><head><title>Haussteuerung</title></head><body>“;
sResponse += „<font color=\“#000000\“><body bgcolor=\“#d0d0f0\“>“;
sResponse += „<meta name=\“viewport\“ content=\“width=device-width, initial-scale=1.0, user-scalable=yes\“>“;
sResponse += „<h1>Haussteuerung</h1>“;
sResponse += „<BR>“;
sResponse += „<BR>“;
sResponse += „<FONT SIZE=+1>“;
sResponse += „<p>Licht 1 <a href=\“?pin=FUNCTION1ON\“><button>einschalten</button></a>&nbsp;<a href=\“?pin=FUNCTION1OFF\“><button>ausschalten</button></a></p>“;
sResponse += „<p>Licht 2 <a href=\“?pin=FUNCTION2ON\“><button>einschalten</button></a>&nbsp;<a href=\“?pin=FUNCTION2OFF\“><button>ausschalten</button></a></p>“;

if (sCmd.length()>0)
{
// write received command to html page
sResponse += „Kommando:“ + sCmd + „<BR>“;

// switch GPIO
if(sCmd.indexOf(„FUNCTION1ON“)>=0)
{
digitalWrite(2, 1);
}
else if(sCmd.indexOf(„FUNCTION1OFF“)>=0)
{
digitalWrite(2, 0);
}
if(sCmd.indexOf(„FUNCTION2ON“)>=0)
{
digitalWrite(0, 1);
}
else if(sCmd.indexOf(„FUNCTION2OFF“)>=0)
{
digitalWrite(0, 0);
}
}

sResponse += „<FONT SIZE=-2>“;
sResponse += „<BR>“;
sResponse += „</body></html>“;

sHeader  = „HTTP/1.1 200 OK\r\n“;
sHeader += „Content-Length: „;
sHeader += sResponse.length();
sHeader += „\r\n“;
sHeader += „Content-Type: text/html\r\n“;

sHeader += „Connection: close\r\n“;
sHeader += „\r\n“;
}

// Send the response to the client
client.print(sHeader);
client.print(sResponse);

// and stop the client
client.stop();
}

 

Spannung Messen und auf I2C LCD ausgeben

Ziel dieses Projektes ist es eine Spannung auf dem Eingang „A0“ zu messen und auf einen LCD Display welches über einen I2C-Bus angesprochen wird auszugeben. Ich habe mir hierbei ein 4 zeiliges Display besorgt.

IMG_1228

Es reichen wir 4 Adern, die mit dem Arduino verbunden werden.

SCL=> A5

SDA=>A4

VCC=> 5V+

GND=> GND

IMG_1229

Die Schwierigkeit liegt im wesentlichen nun die Adresse des angeschlossenen Gerätes herauszufinden, ich habe hierzu einen I2C Scanner genutzt. Den I2C Scanner auf den Arduino übertragen, danach den seriellen Plotter starten und die angezeigte Adresse notieren. Ich habe bei meinem Display einen PCF8574A PortExpander. Da keine Lötbrücke auf dem Board geschlossen war, lautet bei mir die Adresse 0x3F, bei einem PCF8574 wäre es 0x27. Es ist also möglich mehrere Display’s zu betreiben. Sehr gute Erfahrungen habe ich mit der Library von „fmalpartida“ gemacht. Nun muss im Quellcode nur noch Eure I2C Adresse angepasst werden und es sollte funktionieren. Ich habe das Programm so geschrieben, dass alle 2 Sekunden die Spannung an Pin A0 abgefragt und auf dem Display ausgegeben werden. Der Analogeingang hat eine Auflösung von 10Bit, das heißt es gibt 1024 Zustände bei 5V

5V=>1024

2,5V=>512

0V=>0

Somit beträgt die Steigerung um 1Bit 5V/1024=0,004828125V

Um also die Spannung wieder auszugeben müssen wir den Wert den wir mit AnalogRead(PortPin) ausgelesen haben mit diesem Wert Multiplizieren. Da wir hier Kommastellen benötigen, müssen wir die Variable als Float definieren. Sollten wir sie als Integer definieren, würde der Arduino eine „Rundung“ vornehmen. Somit würden nur ganzzahlige Werte auf dem Display ausgegeben.


Quellcode I2C Scanner;

#include <Wire.h>
void setup()
{
Wire.begin();
  Serial.begin(9600);
Serial.println(„\nI2C Scanner“);
}
void loop()
{
byte error, address;
int nDevices;
  Serial.println(„Scanning…“);
  nDevices = 0;
for (address = 1; address < 127; address++ )
{
Wire.beginTransmission(address);
error = Wire.endTransmission();
    if (error == 0)
{
Serial.print(„I2C device found at address 0x“);
if (address < 16)
Serial.print(„0″);
Serial.print(address, HEX);
Serial.println(“  !“);
      nDevices++;
}
else if (error == 4)
{
Serial.print(„Unknow error at address 0x“);
if (address < 16)
Serial.print(„0“);
Serial.println(address, HEX);
}
}
if (nDevices == 0)
Serial.println(„No I2C devices found\n“);
else
Serial.println(„done\n“);
  delay(5000);           // wait 5 seconds for next scan
}

 


Quellcode für das Programm:

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR    0x3F // Hier die Hex-Adresse des Display eingeben
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7
int n = 1;
int lesewertA0 = 0;
int analogpin0 = 0;
float Spannung;
LiquidCrystal_I2C  lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
void setup()
{
lcd.begin (20,4);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);                       //Hintergrundbeleuchtung des Displays einschalten
lcd.home ();                   // go home
}
void loop()
{
lesewertA0= analogRead(analogpin0);
Spannung=(lesewertA0*0.0048828125);
lcd.setBacklight(HIGH);     // Backlight on
lcd.setCursor(0,0);
lcd.print(„A0=“);
lcd.print(Spannung);
lcd.print(„V“);
delay(2000);
lcd.clear();
}

Was kann der Arudino Nano ?

Der Arduino Nano ist ein kleiner programmierbarer Microcontroller. Ich möchte hier eine kleine Einführung die Möglichkeiten der Microcontrollerprogrammierung geben. Ich versuche möglichst ausführlich vorzugehen, damit ein Nachbau der Projekte auch für den unerfahrenen Elektroniker möglich ist.

Arduino-nano-pin-mapping

Grundsätzlich hat der Arduino Nano die wichtigsten Dinge an Board. Er verfügt über 8 Analogeingänge, sowie 14 Digitale Ein-Ausgänge davon sind 6 PWM fähig, welche je nach Anwendungsfall programmiert werden können. Eine Pin’s haben mehrfach Belegungen für Sonderfunktionen wie I2C, Pulsweitenmodulation. Pro Ausgang kann ein Strom von bis zu 40mA geschaltet werden, somit ist es direkt möglich LED’s anzusteuern. Die Betriebsspannung kann zwischen 7V und 12V betragen. Dabei ist jedoch darauf zu achten, dass die Ausgänge für TTL-Pegel verfügen (5V logisch 1, 0V logisch 0). Ich werde hierbei in den einzelnen Projekten näher darauf eingehen. Die Programmierung erfolgt über die auf dem Arduino befindliche USB Buchse. Zum Programmieren werde ich die Arduino (IDE) Entwicklungsumgebung nutzen. Diese ist kostenlos unter www.arduino.cc downloadbar.