Veilleuse programmée

image

Avec la naissance d'un enfant, la question s'est posée d'une lampe de nuit. Quelque part, ils ont lu que c'était nécessaire pour un sommeil tranquille. Rapidement utilisé pour dormir avec une faible lumière. Il est très pratique de se réveiller des cris et des hurlements au milieu de la nuit et de voir de quoi le bébé se plaint (si vous pouvez comprendre). De plus, dans une faible lumière, vous pouvez vous balancer, vous retourner et continuer à dormir.

Initialement, un échantillon d'essai de la lampe a été fabriqué à partir d'un morceau de bande LED jaune (12 volts), qui a été utilisé pendant 1,5 an.


image

En plus de la conception fragile, il a commencé à ennuyer chaque matin pour retirer le bloc d'alimentation de la lampe de la prise. Je me lève le matin, assez de lumière pénètre dans la pièce depuis la rue. Ainsi, la lampe est gaspillée plusieurs heures par jour. Encore une fois, en six mois, le contrôleur de bande RVB chinois a oublié le réglage actuel et il a fallu chercher un panneau de contrôle pour lui rappeler comment travailler. J'ai décidé de faire une nouvelle lampe avec arrêt automatique, avec réglage des couleurs en utilisant à la fois des potentiomètres et une radio.

Assemblé rapidement un prototype basé sur Arduino nano. Déboguez les fonctionnalités de base.

image

J'en ai profité pour essayer Fritzing. Je n'aimais pas ça, mais les images sont claires et "drôles". Apparemment, rien de nouveau n'a été inventé.

image

«Nano» a été remplacé par un module compatible arduino peu connu avec un émetteur-récepteur radio intégré (contrôleur 8 bits, performances et rembourrage comparables à «Nana»). Chez moi, j'ai déjà un appareil fonctionnant à une fréquence de 868 MHz, ce sera le second. Spécifications brèves du site Web du fabricant:

Brève caractéristiques
image


image

Je ne vois pas de gros problèmes à faire de même sur ESP8266 (il existe un collecteur de micrologiciel en ligne pratique pour les scripts sur LUA). Un peu plus compliqué sur Bluetooth (pour flasher le module HM-10 il faut un programmeur peu coûteux, un environnement de développement et une compréhension du protocole). Bien que vous puissiez utiliser le module Bluetooth avec l'arduino. Mais j'ai utilisé ZUNo, car il ment et m'attend depuis longtemps, et toute l'infrastructure est prête à connecter et gérer des appareils similaires en un seul réseau (je parle du contrôleur de réseau domestique intelligent).
Pour toutes les jambes utilisées sur Arduino, des analogues ont été trouvés dans le module.

image

Pour travailler avec le module de l'IDE Arduino, vous devez le configurer (la description des paramètres se trouve sur le site Web du fabricant). Aucun miracle ne s'est produit. En essayant de compiler, j'ai eu l'erreur "ne supporte pas" pour "l'instruction avec des colonnes vides ou sans corps!" J'ai utilisé la bibliothèque Adafruit_NeoPixel. Je suis monté dedans, j'ai vu combien de cycles il y avait et je l'ai fermé. Je devais revenir sur le site Web du fabricant et chercher des exemples de travail avec des LED (un exemple a été rapidement trouvé). Je ne suis donc pas le premier à rencontrer un problème similaire.

Pour que cette lampe soit contrôlée par radio dans le code Arduino, vous devez ajouter une macro et implémenter plusieurs fonctions:

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) ); 

Cette macro décrit un appareil Z-Wave avec trois commutateurs à plusieurs niveaux (contrôle RVB) et un commutateur simple (marche / arrêt simple).

J'ai la mise en œuvre la plus simple des fonctions (comme dans les exemples sur le site Web du fabricant). Vous pouvez le voir dans la liste ci-jointe.

Sélection de cas


J'avais déjà un cas. Scellé avec un couvercle transparent . Sous le couvercle, vous pouvez installer 25 LED. Les tests ont réussi. La lampe a une grande marge de luminosité pour ma chambre. Le couvercle de cet étui est transparent, j'ai donc décidé de diffuser un peu la lumière.

image

Croquis de perles colorées et de cubes en acrylique, remplis d'époxy transparent. La peinture des perles colorées s'est dissoute sous l'influence de la résine.

image

La chose la plus intéressante est que le capuchon du boîtier étanche a fui et presque toute la résine a fui. Je ne sais pas où j'ai réussi à toucher le couvercle, mais après séchage, la fissure est clairement visible.

image

La carte de circuit imprimé a été réalisée par la méthode photorésistive.

image

image

Après décapage et usinage

image

Le module avec le microcontrôleur a été remplacé par son prototype, qui se trouvait dans le placard (car ce n'est pas dommage, mais ZUNo doit être protégé). La première version de ZUNo, mais les dimensions sont plus grandes et pires que l'antenne, et vous ne pouvez pas déjà l'acheter. Les tests ont plus ou moins réussi. Le dernier segment a dû être ressoudé. Il a été soudé à l'origine du mauvais côté. Et ajustez le nombre de LED dans le firmware.

image

image

Voici ce qui s'est passé:

image

Commande radio


Fenêtre principale avec canaux de commande de lampe

image

Réglez la luminosité d'un canal de la bande LED

image

Réglage de l'arrêt matinal de la veilleuse

image

Conclusion


L'appareil fonctionne. Il est compact et soigné. Il est alimenté par la charge d'un téléphone mobile.
Des problèmes constatés:

  • lors de l'assemblage, a arraché une partie des pistes sur des résistances variables, donc en mode manuel, vous ne pouvez contrôler qu'un seul canal.
  • seulement 20 LED sur 25 fonctionnent normalement. J'en ai beaucoup, donc je vais probablement le laisser pour identifier les lacunes plus graves

Croquis de lumière de nuit
 #include "ZUNO_NeoPixel.h" #define MAX_PIXELS 20 // NB! Z-Uno can not control more than 25 WS2811 without harming RF communications #define PIXEL_SIZE 3 // Three colors per pixel #define BUFF_SIZE (MAX_PIXELS * PIXEL_SIZE) byte pixel_buff[BUFF_SIZE]; NeoPixel pixels(pixel_buff, BUFF_SIZE); #define B_PRESSED 1 #define BUTTON_PIN 1 // Digital IO pin connected to the button. This will be #define DEF_RED 30 #define DEF_GREEN 20 byte red = DEF_RED; byte green = DEF_GREEN; byte blue = 0; #define POWER_ON 1 #define POWER_OFF 0 byte light_power = POWER_ON; byte last_light_power = POWER_OFF; 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) ); void switch_setter(byte value) { Serial.println("switch"); Serial.print("value= "); Serial.println(value); if(value > 1) light_power = POWER_ON; else light_power = POWER_OFF; } byte switch_getter() { return light_power; } int getRed() { return red/2.56; } int getGreen() { return green/2.56; } int getBlue() { return blue/2.56; } void setRed(byte value) { red = value * 2,56; for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); Serial.print("set red = "); Serial.println(value); } void setGreen(byte value) { green = value * 2,56; for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); Serial.print("set red = "); Serial.println(value); } void setBlue(byte value) { blue = value * 2,56; for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); Serial.print("set red = "); Serial.println(value); } void set_LEDS() { for(uint8_t i = 0; i < MAX_PIXELS; i++) pixels.setPixelColor(i, pixels.Color(red, green, blue)); pixels.show(); } void read_resistors() { red = (analogRead(A0) >> 2) & 0xff; green = (analogRead(A1) >> 2) & 0xff; blue = (analogRead(A3) >> 2) & 0xff; Serial.print(red); Serial.print(" "); Serial.print(green); Serial.print(" "); Serial.print(blue); Serial.print(" "); Serial.println(); set_LEDS(); } #define DEBOUNCE_ACK 10 byte check_button() { static bool oldState = HIGH; byte debounce_cnt = 0; static byte ret = 0; if(digitalRead(BUTTON_PIN) == LOW) { if(ret != B_PRESSED) while(digitalRead(BUTTON_PIN) == LOW) { if(debounce_cnt == DEBOUNCE_ACK) { ret = B_PRESSED; break; } else debounce_cnt++; delay(10); } } else { debounce_cnt = 0; ret = 0; } return ret; } void setup() { Serial.begin(9600); pixels.begin(); pixels.clear(); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { if(check_button() == B_PRESSED) read_resistors(); if(last_light_power != light_power) { Serial.println("set power"); if(light_power == POWER_OFF) { Serial.println("power off"); red = 0; green = 0; blue = 0; } else { Serial.println("power on"); red = DEF_RED; green = DEF_GREEN; blue = 0; } set_LEDS(); last_light_power = light_power; } } 

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


All Articles