Interrupteur d'éclairage wifi intelligent



Bonjour, cher lecteur.

Un peu de paroles au début. L'idée d'un interrupteur d'éclairage «intelligent» n'est pas nouvelle du tout et, probablement, c'est la première chose qui vient à l'esprit pour ceux qui ont commencé à se familiariser avec la plate-forme Arduino et les éléments IoT. Et je ne fais pas exception à cela. Après avoir expérimenté des éléments de circuit, des moteurs et des LED, je veux faire quelque chose de plus appliqué, qui est demandé dans la vie quotidienne et, surtout, sera pratique à utiliser et ne restera pas victime de l'expérience pour le confort.

Dans cet article, je vais vous dire comment j'ai fait un interrupteur qui fonctionnera comme un interrupteur normal (c'est-à-dire qui est généralement monté sur un mur) et en même temps lui permettre d'être contrôlé via WiFi (ou via Internet, comme cela se fait dans ce cas).

Nous allons donc dresser une liste de ce qui sera nécessaire pour mettre en œuvre le plan. Je dois dire tout de suite que j'avais l'intention de ne pas faire de folies sur les composants et j'ai choisi des composants en fonction des commentaires sur les forums et du rapport qualité-prix. Par conséquent, certains composants peuvent sembler inappropriés ici pour les amateurs électriques expérimentés, mais ne jugez pas strictement, car Je suis nouveau dans l'électromécanique et j'apprécierais grandement les commentaires de professionnels plus expérimentés.
Non.NomLa descriptionPrix
1HLK-PM01Adaptateur 220VAC à 5VDC4,02 €
2SSR-40DARelais à semi-conducteurs pour le contrôle du courant du circuit3,35 €
3AMS1117-3.3Suppresseur de tension 5V à 3V1,29 €
4ESP8266-01Microcontrôleur avec WiFi2,35 €
Total:11,01 €

J'avais également besoin: d'un serveur avec lequel le commutateur sera contrôlé via Internet, Arduino Uno, avec lequel j'ai programmé ESP, un routeur et des consommables comme des fils, des terminaux, etc., tout cela peut varier selon les goûts et n'affectera pas au résultat final.

Les prix sont tirés d'Ebay, où je les ai achetés.

Et voici à quoi ressemblent les éléments du tableau:



Vous pouvez maintenant dessiner un schéma de connexion:



Comme vous l'avez probablement remarqué, le schéma est très simple. Tout est assemblé facilement, rapidement et sans soudure. Une sorte de prototype fonctionnel, qui n'a pas besoin d'être dérangé longtemps. Tout est connecté par des fils et des bornes. Le seul point négatif est que le relais ne rentre pas dans la prise de l'interrupteur. Oui, au départ, j'avais prévu de tout enfoncer dans le mur derrière l'interrupteur pour qu'il soit esthétique. Mais à mon regret, il n'y avait pas assez d'espace dans la prise et le relais ne montait tout simplement pas vers le haut ou vers le bas:



Par conséquent, j'ai temporairement retiré le relais de la prise jusqu'à ce que je trouve un coffret électrique approprié avec une prise pour cacher le fer à l'intérieur. Mais il n'y a rien de plus permanent que temporaire, n'est-ce pas? Par conséquent, tout cela ressemble maintenant à ceci: du



ruban isolant sauvera des chocs électriques ... j'espère.

Parlons maintenant de la partie logicielle.

Et avant de procéder à l'analyse du code et des détails, je vais donner un schéma général de la mise en œuvre du contrôle des lampes.



J'espère qu'un jour je réécrirai tout et que la connexion sera basée sur un protocole plus rapide que HTTP, mais pour commencer, ce sera le cas. À distance, l'ampoule change son état en environ 1-1,5 secondes, et à partir du commutateur instantanément, comme il sied à un commutateur décent.

Programmation ESP8266-01


La façon la plus simple de le faire est d'utiliser Arduino. Vous pouvez télécharger les bibliothèques nécessaires pour l'IDE Arduino depuis GitHub . Il y a toutes les instructions d'installation et de configuration.

Ensuite, nous devons connecter l'ESP à l'ordinateur, pour cela, nous avons besoin d'un adaptateur USB vers série (tel que FTDi , CH340 , FT232RL ) ou de toute plate-forme Arduino (j'avais Arduino Uno) avec des sorties RX et TX.

Il est à noter que l'ESP8266-01 est alimenté en 3,3 Volts, ce qui signifie qu'en aucun cas ne le connectez à l'Arduino, qui (souvent) est alimenté en 5 Volts, sinon tout ira en enfer directement. Vous pouvez utiliser le réducteur de tension, comme indiqué dans le tableau ci-dessus.

Le schéma de connexion est simple: nous connectons TX ,Adaptateur RX et GND ESP vers RX, TX et GND / Arduino respectivement. Après cela, en fait, la connexion est prête à l'emploi. Le microcontrôleur peut être programmé à l'aide de l'IDE Arduino.

Quelques nuances lors de l'utilisation d'Arduino Uno:
  • Uno a une sortie pour 3,3 V, mais ce n'était pas suffisant. Lorsque vous y connectez un ESP, tout semble fonctionner, les indicateurs sont allumés, mais la communication avec le port COM est perdue. J'ai donc utilisé une alimentation 3,3 V différente pour ESP.
  • De plus, UNO n'a eu aucun problème de communication avec ESP, étant donné que UNO était alimenté par 5V et ESP à partir de 3V.

Après plusieurs expériences avec ESP8266-01, il s'est avéré que les ESP sont sensibles aux tensions connectées à GPIO0 et GPIO2. Au moment du lancement, ils ne doivent en aucun cas être mis à la terre si vous comptez le démarrer en mode normal. Plus de détails sur le démarrage du microcontrôleur ici . Je ne le savais pas et j'ai dû changer légèrement le circuit, car dans la version ESP-01, seules ces 2 broches sont présentes et les deux sont utilisées dans mon circuit.

Et voici le programme pour ESP lui-même:

Afficher le code
#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;
  }
}


Quelques commentaires sur le code:
  • Il est très important de déclarer la broche GPIO0 comme pinMode (bouton, INPUT_PULLUP ), car Dans le circuit, nous n'utilisons pas de résistance pour ce bouton. Et ESP a son propre "cousu" à ces fins.
  • .

WEB


Ici, vous pouvez donner libre cours à votre imagination et utiliser tous les moyens disponibles pour créer un service qui traitera les demandes envoyées par le commutateur et enverra des demandes d'activation / désactivation.

J'ai utilisé Yii à cet effet . J'ai choisi ce framework pour plusieurs raisons, j'avais besoin d'une autorisation (puisque le portail est disponible sur Internet) et d'une gestion des rôles (pour de futures expériences), et j'aime ça. Et maintenant, mon portail de gestion ressemble à ceci:



Pour contrôler l'ampoule dans la zone d'accès au réseau, le serveur lui-même sur l'ESP serait suffisant. Mais vous voulez vraiment avoir des journaux, de la logique et d'autres appareils à l'avenir, il est donc préférable d'utiliser toujours un serveur distinct pour la gestion.

Tout cela concerne le portail, je pense que cela n'a aucun sens d'en écrire plus, mais si vous avez des questions, je répondrai avec plaisir dans les commentaires.

Au lieu d'une conclusion


Merci si vous avez lu l'article jusqu'au bout et que vous y avez peut-être trouvé quelque chose d'utile. Je me ferai un plaisir de vous conseiller et critiquer. En général, il me semble toujours que le goulot d'étranglement dans le circuit est l'adaptateur 5V et je serai heureux si vous partagez votre expérience dans la résolution de tels problèmes. Quant à l'ESP8266-01, il n'a jusqu'à présent soulevé aucune plainte de ma part, à l'exception de l'utilisation spéciale des broches GPIO. Il fonctionne de manière stable depuis la deuxième semaine. Succès dans les projets.

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


All Articles