Hallo zusammen, ich denke, ich hab das Ding im Kasten
Nach wie vor gilt natürlich, wenn ihr Verbesserungen am Code habt, sagt gerne Bescheid
Erstmal zur Beschreibung:
Ich habe mit einem Arduino Pro Mini 3,3V, einem ESP8266 WiFi-Modul und einem Taster ein netzwerkfähiges Modul gebaut, mit dem man z.B. Lampen etc. schalten können soll.
Dafür fehlt nur noch ein kleines Relais anstelle der im Skript beschriebenen LEDs und man kann mehrere Lampen an einem Modul fernsteuern.
Ferner wird noch ein Gleichrichter und ein Spannungswandler auf 3,3 Volt dazukommen, damit man quasi den vorhandenen Schalter aus der Dose nehmen kann, das Modul dazwischen hängen kann, und mit einem Taster wieder alles schön dicht machen kann.
Da das ganze im 2,4 ghz Netz läuft, ist die Abdeckung um einiges Besser als mit den ganzen Funkmodulen, die hier meistens verwendet werden, wie sich das mit der EMV verhält kann ich erst nach ein paar Testwochen sagen, hoffe aber dass das soweit kein Problem darstellt.
Hier das Fritzing von meinem Aufbau:
Und hier mein Sketch:
Dazu ist noch zu sagen, ich habe meinem ESP eine andere Firmware gegönnt, um die BaudRate auf 19200 senken zu können, damit ich nicht immer umstecken muss, wenn ich was neues ausprobiere, so konnte ich ihn einfach auf Softserial einstecken.
#include <SoftwareSerial.h>
#define SSID "Accesspoint"
#define PASS "SuperPassword"
SoftwareSerial dbgSerial(10, 11); // RX, TX
int Schalter1 = 0;
int Schalter2 = 0;
String content = "";
int contindex = -1;
const int buttonPin = 4;
const int ledPin = 13;
const int led2 = 2;
int buttonState = 0;
void setup()
{
pinMode(led2, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
// Open serial communications and wait for port to open:
Serial.begin(19200);
Serial.setTimeout(5000);
dbgSerial.begin(19200); //can't be faster than 19200 for softserial
Serial.println("ESP8266 Demo");
//connect to the wifi
boolean connected=false;
for(int i=0;i<5;i++)
{
if(connectWiFi())
{
connected = true;
break;
}
}
if (!connected)
{
while(1);
}
delay(5000);
//print the ip addr
dbgSerial.println("AT+CIFSR");
Serial.write("ip address:");
while (dbgSerial.available())
Serial.write(dbgSerial.read());
//set the ESP as ListenServer, no difference between UDP and TCP, UDP is just faster
dbgSerial.println("AT+CIPMUX=1");
if(dbgSerial.find((char*)"OK"))
{
dbgSerial.println("AT+CIPSERVER=1,7878");
if(dbgSerial.find((char*)"OK"))
{
dbgSerial.println("AT+CIPMUX=0");
}
}
}
void loop()
{
buttonState = digitalRead(buttonPin); //Tasterabfrage für manuellen Betrieb
if (buttonState == HIGH)
{
delay(500);
schalter2();
}
if(dbgSerial.available()>0) //Abfrage der seriellen Daten und Speichern in Variable um zu schauen welcher
// Schalter aktiviert werden soll!
{
content = dbgSerial.readStringUntil('\n');
if((contindex = content.indexOf("Schalter2"))>0)
{
schalter2();
}
else if((contindex =content.indexOf("Schalter1"))>0)
{
schalter1();
}
}
}
void schalter1()
{
switch (Schalter1) //Wechselschaltung, es wird immer der gleiche Befehl gesendet, egal ob an oder aus
{
case 0:
Schalter1 = 1;
digitalWrite(led2, HIGH);
break;
case 1:
Schalter1 = 0;
digitalWrite(led2, LOW);
break;
}
}
void schalter2()
{
switch (Schalter2)
{
case 0:
Schalter2 = 1;
digitalWrite(ledPin, HIGH);
break;
case 1:
Schalter2 = 0;
digitalWrite(ledPin, LOW);
break;
}
}
boolean connectWiFi()
{
String cmd="AT+CWJAP=\"";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";
dbgSerial.println(cmd);
delay(5000);
if(dbgSerial.find((char*)"OK"))
{
dbgSerial.println("OK, Connected to WiFi.");
return true;
}
else
{
dbgSerial.println("Can not connect to the WiFi.");
return false;
}
}
Alles anzeigen
So ich hoffe ihr könnt damit was anfangen, ansonsten einfach fragen! Wünsche euch viel Spaß beim Testen
Gruß,
Rabbit
Schalten lässt sich das ganze dann über die Konsole: