Smart WiFi Lichtschalter



Guten Tag, lieber Leser.

Ein bisschen Text am Anfang. Die Idee eines „intelligenten“ Lichtschalters ist überhaupt nicht neu, und dies ist wahrscheinlich das erste, was denjenigen in den Sinn kommt, die mit der Arduino-Plattform und den IoT-Elementen vertraut wurden. Und ich bin keine Ausnahme. Nachdem ich mit Schaltungselementen, Motoren und LEDs experimentiert habe, möchte ich etwas mehr anwenden, das im Alltag gefragt ist und vor allem bequem zu bedienen ist und aus Komfortgründen nicht Opfer des Experiments bleibt.

In diesem Artikel werde ich Ihnen erzählen, wie ich einen Schalter gemacht habe, der wie ein normaler funktioniert (dh normalerweise an einer Wand montiert ist) und gleichzeitig die Steuerung über WLAN (oder über das Internet, wie in diesem Fall) ermöglicht.

Wir werden also eine Liste erstellen, was zur Umsetzung des Plans erforderlich ist. Ich muss sofort sagen, dass ich beabsichtigte, mich nicht stark mit Komponenten zu beschäftigen und Komponenten auszuwählen, basierend auf dem Feedback in den Foren und dem Preis-Leistungs-Verhältnis. Daher scheinen einige Komponenten hier für erfahrene elektrische Amateure ungeeignet zu sein, aber bitte beurteilen Sie nicht streng, weil Ich bin nur neu in der Elektromechanik und würde mich über Kommentare von erfahreneren Fachleuten sehr freuen.
Nein, nein.NameBeschreibungPreis
1HLK-PM01220VAC auf 5VDC Adapter4,02 €
2SSR-40DAHalbleiterrelais zur Stromkreisregelung3,35 €
3AMS1117-3.35V bis 3V Spannungsunterdrücker1,29 €
4ESP8266-01Mikrocontroller mit WiFi2,35 €
Gesamt:11,01 €

Ich brauchte auch: einen Server, mit dem der Switch über das Internet gesteuert wird, Arduino Uno, mit dem ich ESP programmiert habe, einen Router und Verbrauchsmaterialien wie Kabel, Terminals usw., all dies kann von Geschmack zu Geschmack variieren und hat keinen Einfluss bis zum Endergebnis.

Die Preise stammen von Ebay, wo ich sie gekauft habe.

Und so sehen die Elemente aus der Tabelle aus:



Jetzt können Sie ein Verbindungsdiagramm erstellen:



Wie Sie wahrscheinlich bemerkt haben, ist das Schema sehr einfach. Alles lässt sich einfach, schnell und ohne Löten zusammenbauen. Eine Art funktionierender Prototyp, der lange nicht gestört werden muss. Alles ist durch Drähte und Klemmen verbunden. Der einzige Nachteil ist, dass das Relais nicht in die Buchse des Schalters passt. Ja, ursprünglich wollte ich alles in die Wand hinter dem Schalter schieben, damit es ästhetisch ansprechend aussieht. Zu meinem Bedauern war jedoch nicht genügend Platz in der Steckdose und das Relais passte einfach weder in die Seite noch in die Seite:



Deshalb nahm ich das Relais vorübergehend aus der Steckdose, bis ich einen geeigneten Schaltkasten mit einer Steckdose fand, um das Bügeleisen darin zu verstecken. Aber es gibt nichts Bleibenderes als nur vorübergehend, nicht wahr? Daher sieht das alles jetzt so aus:



Isolierband schützt vor elektrischem Schlag ... Ich hoffe.

Lassen Sie uns nun über den Software-Teil sprechen.

Bevor ich mit der Analyse des Codes und der Details fortfahre, werde ich ein allgemeines Diagramm der Implementierung der Lampensteuerung geben.



Ich hoffe, dass ich eines Tages alles neu schreiben werde und die Verbindung auf einem schnelleren Protokoll als HTTP basiert, aber zunächst einmal wird es funktionieren. Aus der Ferne ändert die Glühbirne ihren Zustand in etwa 1 bis 1,5 Sekunden und sofort vom Schalter, wie es sich für einen anständigen Schalter gehört.

Programmierung ESP8266-01


Der einfachste Weg, dies zu tun, ist mit Arduino. Sie können die erforderlichen Bibliotheken für die Arduino IDE von GitHub herunterladen . Es gibt alle Installations- und Konfigurationsanweisungen.

Als nächstes müssen wir das ESP an den Computer anschließen. Dazu benötigen wir entweder einen USB-zu-Seriell-Adapter (wie FTDi , CH340 , FT232RL ) oder eine beliebige Arduino-Plattform (ich hatte Arduino Uno) mit RX- und TX-Ausgängen.

Es ist erwähnenswert, dass der ESP8266-01 mit 3,3 Volt betrieben wird, was bedeutet, dass er auf keinen Fall an den Arduino angeschlossen wird, der (oft) mit 5 Volt betrieben wird, da sonst alles direkt zur Hölle geht. Sie können den Spannungsreduzierer verwenden, der in der obigen Tabelle gezeigt ist.

Das Verbindungsschema ist einfach: Wir verbinden TX ,RX und GND ESP zu RX, TX und GND Adapter / Arduino. Danach ist die Verbindung tatsächlich betriebsbereit. Der Mikrocontroller kann mit der Arduino IDE programmiert werden.

Ein paar Nuancen bei der Verwendung von Arduino Uno:
  • Uno hat einen Ausgang für 3,3 V, aber es war nicht genug. Wenn Sie ein ESP daran anschließen, scheint alles zu funktionieren, die Anzeigen leuchten, aber die Kommunikation mit dem COM-Port geht verloren. Also habe ich ein anderes 3,3-V-Netzteil für ESP verwendet.
  • Darüber hinaus hatte UNO keine Probleme mit der Kommunikation mit ESP, da UNO mit 5 V und ESP mit 3 V betrieben wurde.

Nach mehreren Experimenten mit ESP8266-01 stellte sich heraus, dass ESPs empfindlich gegenüber an GPIO0 und GPIO2 angeschlossenen Spannungen sind. Zum Zeitpunkt des Starts sollten sie auf keinen Fall geerdet sein, wenn Sie beabsichtigen, sie im normalen Modus zu starten. Weitere Details zum Start des Mikrocontrollers hier . Ich wusste das nicht und musste die Schaltung leicht ändern, weil In der ESP-01-Version sind nur diese 2 Pins vorhanden und beide werden in meiner Schaltung verwendet.

Und hier ist das Programm für ESP selbst:

Code anzeigen
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPClient.h>
extern "C" { //         initVariant
  #include "user_interface.h"
}

const char* ssid = "WIFISSID"; //  WiFi
const char* password = "***************"; //  WiFi
const String self_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //     
const String serv_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //     
const String name = "IOT_lamp"; //  ,  
const String serverIP = "192.168.1.111"; //  IP WEB  
bool lamp_on =  false;
bool can_toggle = false;
int button_state;

ESP8266WebServer server(80); //  
HTTPClient http; //  

const int lamp = 2; //    GPIO2
const int button = 0; // ""   GPIO0

//    
void handleRoot() { 
  server.send(200, "text/plain", "Hello! I am " + name);
}

//    
void handleNotFound(){
  String message = "not found";
  server.send(404, "text/plain", message);
}

//   
void turnOnLamp(){
  digitalWrite(lamp, LOW);
  lamp_on = true;
}

//   
void turnOffLamp(){
  digitalWrite(lamp, HIGH);
  lamp_on = false;
}

//     ./.
void sendServer(bool state){
  http.begin("http://"+serverIP+"/iapi/setstate");
  String post = "token="+self_token+"&state="+(state?"on":"off"); //         
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  int httpCode = http.POST(post);
  http.end();  
}

//   
void toggleLamp(){
  if(lamp_on == true) {
    turnOffLamp();
    sendServer(false);
  } else {
    turnOnLamp();
    sendServer(true);
  }
}

//     
void handleOn(){
  String token = server.arg("token");
  if(serv_token != token) {
    String message = "access denied";
    server.send(401, "text/plain", message);
    return;
  }
  turnOnLamp();
  String message = "success";
  server.send(200, "text/plain", message);
}

//     
void handleOff(){
  String token = server.arg("token");
  if(serv_token != token) {
    String message = "access denied";
    server.send(401, "text/plain", message);
    return;
  }
  turnOffLamp();
  String message = "success";
  server.send(200, "text/plain", message);
}

//  MAC    IP
void initVariant() {
  uint8_t mac[6] = {0x00, 0xA3, 0xA0, 0x1C, 0x8C, 0x45};
  wifi_set_macaddr(STATION_IF, &mac[0]);
}

void setup(void){
  pinMode(lamp, OUTPUT);
  pinMode(button, INPUT_PULLUP); //   INPUT_PULLUP
  turnOffLamp();
  WiFi.hostname(name);
  WiFi.begin(ssid, password);

  //     WiFi
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  //    
  server.on("/", handleRoot);
  server.on("/on",  HTTP_POST, handleOn);
  server.on("/off", HTTP_POST, handleOff);
  server.onNotFound(handleNotFound);

  //  
  server.begin();
}

void loop(void){
  server.handleClient();

  //   
  button_state = digitalRead(button);
  if (button_state == HIGH && can_toggle) {
    toggleLamp();
    can_toggle = false;
    delay(500);
  } else if(button_state == LOW){
    can_toggle = true;
  }
}


Ein paar Kommentare zum Code:
  • Es ist sehr wichtig, den Pin GPIO0 als pinMode (button, INPUT_PULLUP ) zu deklarieren , weil In der Schaltung verwenden wir keinen Widerstand für diese Taste. Und ESP hat genau für diese Zwecke ein eigenes "eingenäht".
  • .

WEB


Hier können Sie Ihrer Fantasie freien Lauf lassen und mit allen verfügbaren Mitteln einen Dienst erstellen, der vom Switch gesendete Anforderungen verarbeitet und Anforderungen zum Ein- und Ausschalten sendet.

Ich habe Yii für diesen Zweck verwendet . Ich habe mich aus mehreren Gründen für dieses Framework entschieden. Ich benötigte eine Autorisierung (da das Portal im Internet verfügbar ist) und ein Rollenmanagement (für zukünftige Experimente) und es gefällt mir einfach. Und jetzt sieht mein Verwaltungsportal folgendermaßen aus:



Um die Glühbirne in der Netzwerkreichweite zu steuern, würde der Server selbst auf dem ESP ausreichen. Sie möchten jedoch in Zukunft wirklich Protokolle, Logik und andere Geräte haben. Daher ist es besser, weiterhin einen separaten Server für die Verwaltung zu verwenden.

Hier dreht sich alles um das Portal. Ich denke, es macht keinen Sinn, mehr darüber zu schreiben. Wenn Sie jedoch Fragen haben, werde ich diese gerne in den Kommentaren beantworten.

Anstelle einer Schlussfolgerung


Vielen Dank, wenn Sie den Artikel bis zum Ende gelesen und vielleicht etwas Nützliches darin gefunden haben. Ich werde gerne beraten und kritisieren. Im Allgemeinen scheint es mir immer noch, dass der Engpass in der Schaltung der 5-V-Adapter ist, und ich würde mich freuen, wenn Sie Ihre Erfahrungen bei der Lösung solcher Probleme teilen. Was den ESP8266-01 betrifft, so wurden bisher keine Beschwerden von mir vorgebracht, mit Ausnahme der besonderen Verwendung der GPIO-Pins. Es hat die zweite Woche stabil funktioniert. Erfolg in den Projekten.

Source: https://habr.com/ru/post/de393497/


All Articles