Une lampe intelligente pour les "riches" avec leurs mains "paresseuses", c'est "simple" et pratique



introduction


Il a fait un éclairage «moderne» dans la cuisine pour un évier, une cuisinière et une table de découpe sur la base d'une bande LED contrôlée par Arduino (que l'on appelle la lampe 1). Cette conception a fonctionné pendant 2 ans, jusqu'à ce que la partie puissance des "cerveaux" se soit détériorée. C'est une excellente occasion de réinventer la roue de la «poubelle improvisée» (lampe 2). Certes, cette fois, la «poubelle» sera chère et compatible avec la maison intelligente Z-wave. Ce qui suit est une histoire sur le remplacement d'arduino par ZUNo (un module compatible arduino pour créer un périphérique Z-wave) avec une sauvegarde maximale du code et une explication des changements nécessaires.

Que s'est-il passé avant que j'y apparaisse


Il était une fois, pour laver la vaisselle ou faire cuire des aliments, il fallait allumer la lampe au dessus de l'évier. C'était une lampe de table refaite.

Je n'aimais pas appuyer sur le petit interrupteur avec les mains mouillées car il commutait 220 volts sur la lampe à incandescence.



De plus, la lumière de la lampe tombait principalement sur l'évier, mais je voulais mieux éclairer la table de cuisson et la cuisinière.

Objectifs:

  • Rendre la lumière marche / arrêt dans la cuisine sans contact;
  • Éclairer uniformément l'évier, la table de cuisson et la cuisinière;
  • Économisez de l'énergie en remplaçant les ampoules à incandescence par des LED.

Il a assemblé la lampe 1. Elle se composait d'un boîtier en aluminium de 2 mètres avec un diffuseur pour ruban RVB et une unité de contrôle. Une boîte et un diffuseur ont été achetés prêts à l'emploi au magasin, il y avait une bande et l'unité de contrôle était depuis longtemps dans le coin et attendait dans les coulisses.

Le boîtier était industriel (étanche à la poussière, étanche). Comme la bande est de 12 volts, l'unité d'alimentation de 220 V à 12 V est située dans l'unité, la carte d'isolement galvanique pour contrôler la bande basée sur TLP250 (optocoupleur) a également contrôlé tout cet arduino dans un design compact.
J'ai obtenu l'isolement galvanique de l'ancien projet. Une fois, j'ai fait un rétro-éclairage pour un minibar dans ma table de nuit. Lorsque la porte a été ouverte, le pavé tactile a enregistré un changement de capacité et allumé une lumière scintillante doucement. Autrement dit, le conseil d'administration était bien adapté pour le projet actuel, il ne restait plus qu'à couper tout ce qui n'était pas nécessaire. Il y avait un convertisseur linéaire de 5 volts sur la carte, il était alimenté par ZUNo.

Il était prévu d'allumer la lampe avec un plateau à main pour le télémètre à ultrasons. Il l'a monté dans le couvercle, et toutes les autres pièces sont entrées dans la boîte. Le tout «de manière fiable» fixé avec un adhésif thermofusible. Au moment des tests, j'ai créé un bouton à proximité pour alimenter l'unité de commande à partir d'un interrupteur d'éclairage pour une installation externe.



Allumer les lumières est devenu plus pratique et plus sûr. Il était attaché à l'envers au bas de l'armoire de cuisine et il était plus difficile d'obtenir de l'eau des mains mouillées de l'intérieur.

Conclusions de l'unité de contrôle précédente


L'éclairage de la zone de travail de la cuisine est devenu plus uniforme et plus agréable, en raison du rendu des couleurs non naturel de ma bande LED, la couleur de certains produits a changé. Par exemple: les carottes semblaient beaucoup plus appétissantes en raison de leur couleur plus vive. Mais cela n'a pas beaucoup interféré, et j'espère que cela n'a pas fait beaucoup de mal.

Avec l'activation / la désactivation sans contact, tout s'est avéré pire. Ça a marché. Mais après 5 minutes à l'arrêt, des flashs ont commencé sur la bande LED. Je n'ai pas remodelé le circuit sur les optocoupleurs et tout laissé tel quel. Seulement pour allumer et éteindre a commencé à utiliser le nouveau commutateur. Tout le monde a aimé son emplacement et sa forme.
Plus de deux ans d'utilisation, les graisses et autres composés sécrétés lors de la cuisson se sont accumulés sur le corps et à l'intérieur. Cette plaque a pénétré partiellement dans le boîtier à travers les trous pour l'entrée des fils. Mais en raison de la surface brillante du corps, cette substance se condense en une masse gélatineuse. C'est agréable au toucher, inodore et ... (je ne l'ai pas goûté). J'ai pris quelques photos de l'endroit sous la forme d'un germe de dragon.





Sur les murs, cette substance se transforme en un terrible raid, qui n'est pas seulement blanchi.

Qu'est devenu


Après avoir fouillé dans des bacs, j'ai trouvé un module d'extension inachevé pour ZUNo. ZUNo est une carte de type Arduino pour concevoir votre propre appareil compatible avec la maison intelligente Z-Wave. Il est programmé à partir de l'environnement de l'arduino.

Spécifications du fabricant:
  • 28 kB Flash memory for your sketches
  • 2 kB RAM available
  • Z-Wave RF transmitter at 9.6/40/100 kbps
  • 26 GPIO (overlaps with special hardware controllers)
  • 4 ADC
  • 5 PWM
  • 2 UART
  • 1 USB (serial port)
  • 16 kB EEPROM
  • 1 SPI (master or slave)
  • 4 IR controllers, 1 IR learn capability
  • 1 TRIAC/ZEROX to control dimmer
  • 3 Interrupts
  • 1 Timer 4 MHz
  • I2C (software)
  • 1-Wire (software)
  • 8x6 Keypad Scanner (software)
  • 2 service LED, 1 service button
  • 1 user test LED


Le module d'extension fait de ZUNo une carte de débogage à part entière, qui, après le débogage du prototype, peut être utilisée comme un appareil complet.

Quelques informations du fabricant:
  • One 0-10 V analog output — control industrial dimmers
  • Up to four PWM or switch outputs (up to 5 A per channel) — control contactors, switches, halogen bulbs or LED strips
  • Up to eight digital 0/3 V inputs or outputs — connect various low voltage digital senors and actors
  • Up to four digital 0/3, 0/5 or 0/12 V digital or analog inputs — connect industrial 10 V sensors or any Arduino-compatible sensor
  • RS485 or UART — for industial meters
  • OneWire — for DS18B20 or other sensors


Pour mon projet, j'ai besoin de 3 transistors puissants pour passer de 12 volts à une bande LED et d'un convertisseur de 12 volts à 5 volts pour alimenter ZUNo. Le reste de la périphérie du module d'extension n'est ni soudé ni testé.



Dans cette partie du circuit, il n'y a pas assez de diode pour l'alimentation, pour la protection contre "l'inversion de polarité", et des résistances aux grilles des transistors à effet de champ de puissance devaient être connectées à la grille, et non devant la résistance de limitation. J'écrirai plus à ce sujet dans les conclusions.

Ce module d'extension est fourni dans un boîtier de Gainta. Mon unité de contrôle précédente était également dans le cas de cette société, mais d'une taille différente. Malheureusement, les fixations sur le module ne correspondaient pas à l'ancien boîtier, et je ne voulais pas en percer un nouveau, j'ai quitté l'ancien boîtier. Le panneau a été "planté" sur un adhésif thermofusible.



Un peu sur la programmation Arduino et ZUNo


Les appareils Z-wave doivent avoir un certain nombre de classes. Les cours décrivent les fonctions des appareils et les interfaces d'interaction. Par exemple, ma lampe contrôle une bande LED composée de trois couleurs (rouge, vert, bleu). Ces fonctions sont exécutées par la classe Switch multi-niveaux. Si nous l'ajoutons à l'esquisse, nous pouvons modifier à distance la luminosité de l'une des couleurs. Pour contrôler trois couleurs, vous devez créer trois instances de cette classe. Je n'en parlerai pas plus en détail et en détail. Parce que la manipulation de classe de routine est cachée pour les utilisateurs de ZUNo par la notion de «canal». Par exemple, j'ai besoin de trois classes de Switch multi-niveaux, donc dans le code devrait apparaître 3 canaux de Switch multi-niveaux et plusieurs fonctions de rappel pour le contrôle radio. Comment faire ça? Vous devez également ajouter la classe de base Switch,pour allumer et éteindre la lampe sur simple pression d'un bouton (à partir de l'interface du contrôleur réseau), et ne pas configurer 3 canaux à chaque fois.

Vous devez vous rendre sur le site Web des développeurs, où sont présentés des exemples de z-uno.z-wave.me/Reference/ZUNO_SWITCH_MULTILEVEL . Chaque classe prise en charge par ZUNo a une description et un exemple. Ensuite, copiez et collez les fonctions proposées dans votre croquis. Maintenant, dans l'esquisse, il y a trois canaux de commutation à plusieurs niveaux et 6 fonctions de rappel pour répondre aux commandes de la radio. Je ne suis pas très sophistiqué dans les classes Z-Wave, donc mon précédent périphérique de bande LED fonctionnait avec cet ensemble de classes.

Les chaînes ont été déclarées comme ceci:

Cap de spoiler
ZUNO_SETUP_CHANNELS(
      ZUNO_SWITCH_MULTILEVEL(getRed, setRed),
      ZUNO_SWITCH_MULTILEVEL(getGreen, setGreen),
      ZUNO_SWITCH_MULTILEVEL(getBlue, setBlue),
      ZUNO_SWITCH_BINARY(switch_getter, switch_setter)
);


Cela a conduit à la génération des widgets suivants dans le contrôleur après l'ajout au réseau:



Pour ajuster la couleur, il était nécessaire d'ouvrir et de configurer chaque couleur dans le menu du contrôleur séparément. Ce n'est pas pratique et lent. Cependant, j'ai eu de la chance. Il s'est avéré que je ne suis pas seul. Ils ont pensé à nous et ont créé la chaîne z-uno.z-wave.me/Reference/ZUNO_SWITCH_COLOR . Maintenant, il n'y a qu'un canal et deux fonctions de rappel dans l'esquisse. Dans le menu du contrôleur, le réglage des couleurs est effectué séparément pour chaque couleur, ainsi que simultanément, en sélectionnant dans la palette.

ZUNO_SETUP_CHANNELS(ZUNO_SWITCH_COLOR(SWITCH_COLOR_FLAGS_RED|SWITCH_COLOR_FLAGS_GREEN|SWITCH_COLOR_FLAGS_BLUE, getterFunction, setterFunction));

Et dans le menu du contrôleur, cela ressemble à ceci:



La fonction suivante répond aux demandes par radio. Une demande de lecture de l'état de l'un des canaux de couleur peut survenir.

BYTE getterFunction(BYTE component) {
  switch(component)
  {
    case SWITCH_COLOR_COMPONENT_RED:
      return pwmR;
      break;
    case SWITCH_COLOR_COMPONENT_GREEN:
      return pwmG;
      break;
    case SWITCH_COLOR_COMPONENT_BLUE:
      return pwmB;
      break;
  }
  return 3;
}

Et c'est une fonction pour définir les couleurs à partir de l'interface du contrôleur.

void setterFunction(BYTE component, BYTE newValue) 
{
  switch(component)
  {
    case SWITCH_COLOR_COMPONENT_RED:
      pwmR = newValue;
      break;
    case SWITCH_COLOR_COMPONENT_GREEN:
      pwmG = newValue;
      break;
    case SWITCH_COLOR_COMPONENT_BLUE:
      pwmB = newValue;
      break;
  }
  radio_action = 1;
}

C'est tout le code que vous devez ajouter pour transformer une esquisse Arduino en une esquisse pour ZUNo.

Conclusion


Après l'assemblage et l'installation, toutes les tâches déclarées ont été achevées. Cependant, l'habitude d'allumer la lumière avec l'interrupteur est restée (cela s'est avéré très pratique). L'option d'inclusion sans contact fonctionne également. Parmi les lacunes, je tiens à noter le scintillement de la lampe LED pendant une seconde après avoir alimenté l'unité de contrôle. Cela est dû à la longue initialisation des périphériques ZUNo. À ce stade, les jambes sont imprévisibles. Je pense que la résistance de pull-up sur la grille du transistor corrigera la situation si vous la mettez après la résistance de limitation. Si le code d'initialisation ajuste les jambes à la sortie et modifie délibérément les niveaux logiques, vous pouvez expérimenter avec le filtre RC, qui ne passera pas de courtes impulsions. Je ne l'ai pas encore fait, et peut-être que je ne le ferai jamais!

résultats


ZUNo et son module d'extension simplifient grandement la «créativité technique à domicile». Cependant, je considère que ces produits sont très chers et si je travaillais ailleurs et que l'équipement Z-Wave ne traînait pas, je ferais tout sur ESP8266. Pendant le développement, j'ai appris une nouvelle «norme» pour marquer les fils de l'alimentation.



Maintenant non seulement la terre est marquée d'une bande noire, mais comme dans mon cas le fil "positif". Pour le module d'extension, cela s'est avéré important. Le convertisseur 5 volts LM2594 est tombé en panne (le prix en Chip and Dip est d'environ 200 roubles). J'espère que dans la prochaine version du module d'extension il y aura une diode de protection contre «l'inversion de polarité». Et je vais vérifier la polarité des fils d'alimentation. Un autre inconvénient est associé au corps. Le boîtier a l'air bien, mais je n'ai pas pu connecter les fils sans pince aux borniers. J'espère qu'il y aura une version avec d'autres borniers (pour connecter les fils par le haut ou en biais).

Je n'aime pas stocker de photos sur les services cloud et je fais souvent des sauvegardes. Par conséquent, la plupart des photographies associées au processus de conception et à la lampe 1 sont irrémédiablement corrompues.



C'est tout ce qui reste du processus d'assemblage et de débogage.

Et cela ressemble au rétroéclairage mis en service, si vous vous penchez un peu. Si vous vous redressez, la boîte et le commutateur ne sont pas visibles.



Esquisse pour ZUNo. J'attache, seulement pour confirmer que tout est élémentaire
#include "EEPROM.h"
#include "EEPR.h"

int readPin = 9;
int triggerPin = 10;
byte controlState = 0;
word lastValue;
#define REDPIN   PWM1     // pin connection R 
#define GREENPIN PWM2     // pin connection G
#define BLUEPIN  PWM3     // pin connection B

ZUNO_SETUP_CHANNELS(ZUNO_SWITCH_COLOR(SWITCH_COLOR_FLAGS_RED|SWITCH_COLOR_FLAGS_GREEN|SWITCH_COLOR_FLAGS_BLUE, getterFunction, setterFunction));

#define ON 1
#define OFF 0
uint8_t switch_=OFF;

uint8_t pwmR=0;
uint8_t pwmG=0;
uint8_t pwmB=0;
uint8_t b_pwmR=0;
uint8_t b_pwmG=0;
uint8_t b_pwmB=0;

enum
{
  DEF_R = 255,
  DEF_G = 255,
  DEF_B = 255
};
uint8_t radio_action = 0;

void setup() 
{ 
  init_EEPROM();
  Serial.begin();
  pinMode(readPin, INPUT);
  pinMode(triggerPin, OUTPUT);
  digitalWrite(triggerPin, LOW);
  pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);
  analogWrite(REDPIN, pwmR & 0xff);
  analogWrite(GREENPIN, pwmG & 0xff);
  analogWrite(BLUEPIN, pwmB & 0xff);
  
} 
int act=1;
int actf = 0;
int cnt=57; 

void loop()
{
  int tmp;
  // trigger measurement
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(10);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  // read pulse width
  tmp = pulseIn(readPin, HIGH, 100000);
  lastValue = tmp / 58;
  Serial.print(" cm= ");
  Serial.println(lastValue);
  if (lastValue < 30)
  {
    cnt++;
  }
  else
  {
    cnt--;
  }
  if (cnt > 55)
  { 
    act=1;
  }
  if (cnt > 60)
    cnt= 60;
  if (cnt < 50)
  {
    act=0;
    actf=0;
  }
  if (cnt < 45 )
    cnt = 45;
  
  if ((act == 1) && (actf == 0))
  {  
    actf = 1;
    if (switch_ == OFF)
    {
      switch_=ON;
      b_pwmG = pwmG;
      b_pwmB = pwmB;
      b_pwmR = pwmR;
    }
    else
    {
      switch_=OFF;
      b_pwmR=0;
      b_pwmG=0;
      b_pwmB=0;
    }
    analogWrite(REDPIN, b_pwmR & 0xff);
    analogWrite(GREENPIN, b_pwmG & 0xff);
    analogWrite(BLUEPIN, b_pwmB & 0xff); 
  } 
  
  Serial.print("cnt = ");    
  Serial.print(cnt);  
  Serial.print(" || ");    
  Serial.print(pwmR);  
  Serial.print(" ");      
  Serial.print(pwmG);  
  Serial.print(" ");
  Serial.print(pwmB);  
  Serial.print(" ");
  Serial.println("");
 // delay(10);

 if(radio_action)
 {
    radio_action = 0;
    eepr_save_col();
    analogWrite(REDPIN, pwmR & 0xff);
    analogWrite(GREENPIN, pwmG & 0xff);
    analogWrite(BLUEPIN, pwmB & 0xff);
 }
}

BYTE getterFunction(BYTE component) {
  switch(component)
  {
    case SWITCH_COLOR_COMPONENT_RED:
      return pwmR;
      break;
    case SWITCH_COLOR_COMPONENT_GREEN:
      return pwmG;
      break;
    case SWITCH_COLOR_COMPONENT_BLUE:
      return pwmB;
      break;
  }
  return 3;
}

void setterFunction(BYTE component, BYTE newValue) 
{
  switch(component)
  {
    case SWITCH_COLOR_COMPONENT_RED:
      pwmR = newValue;
      break;
    case SWITCH_COLOR_COMPONENT_GREEN:
      pwmG = newValue;
      break;
    case SWITCH_COLOR_COMPONENT_BLUE:
      pwmB = newValue;
      break;
  }
  radio_action = 1;
}


All Articles