Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Salutations à tous les lecteurs de la section « DIY ou Do It Yourself » sur Habr ! L'article d'aujourd'hui portera sur le commutateur tactile de la puce TTP223 | Fiche technique. Le commutateur fonctionne sur le microcontrôleur nRF52832 | Fiche technique, un module YJ-17103 avec une antenne imprimée et un connecteur pour une antenne externe MHF4 a été utilisé. L'interrupteur tactile fonctionne avec des piles CR2430 ou CR2450. La consommation en mode transmission ne dépasse pas 8 mA, en mode veille pas plus de 6 µA.
Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Comme tous les projets précédents, celui-ci est également un projet Arduino, le programme est écrit dans l'IDE Arduino. La mise en œuvre logicielle de l'appareil est basée sur le protocole Mysensors | Bibliothèques GitHub, Prise en charge de la carte nRF5 GitHub dans Mes capteurs. Forum communautaire anglophone - http://forum.mysensors.org, forum communautaire russophone - http://mysensors.ru/forum/
(Pour ceux qui veulent étudier - Documentation, Protocole série, API, Protocole, Analyseur | pour ceux qui souhaitent aider (contributions) dans le développement du projet - Documentation)

La carte de commutation tactile a été développée dans le cadre du programme Deeptrace, en tenant compte de la fabrication ultérieure à l'aide de la méthode Laser Ironing Technology (LUT). Le panneau a été développé dans des dimensions de 60x60 mm (un panneau de verre standard a des dimensions de 80x80 mm). Le circuit a été imprimé sur les pages du magazine Antenne et transféré avec un fer à repasser Bosch avec le réglage « Len » (puissance maximale) sur une plaque de fibre de verre double face 1.5 mm, 35 µm (en l'absence d'une autre).
Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

La gravure a été réalisée avec une solution de chlorure ferrique, préalablement préparée à raison de 1.5 cuillères à café pour 250 ml d'eau tiède. Le processus a duré 15 minutes.
Le perçage des trous pour les vias intercalaires et pour la fixation du support de batterie a été réalisé avec une mini-perceuse DREMEL 3000 montée sur un support de perceuse DREMEL 220. Les trous pour les vias intercalaires ont été percés avec une perceuse de 0,4 mm, les trous pour le support de batterie avec une perceuse de 1,1 mm. . Le détourage le long des bords de la planche a été réalisé avec la même mini-perceuse avec un accessoire DREMEL 540 (Cercle de coupe d=32.0 mm). La taille a été réalisée sous respirateur.
L'étamage du panneau gravé a été réalisé en utilisant un alliage Rose dans une solution aqueuse (1 cuillère à café d'acide citrique cristallisé pour 300 ml d'eau).

Le processus de soudure a duré environ une heure, la majeure partie du temps étant consacrée à souder du fil (étamé, de 0.4 mm de diamètre) dans les trous pour les vias intercalaires.

La planche a été lavée avec le nettoyant en aérosol FLUX OFF.
Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

La conception du corps du dispositif a été réalisée dans un éditeur de conception tridimensionnelle assistée par ordinateur. Dimensions du boîtier 78,5 mm X 78,5 mm X 12 mm.
Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Le modèle terminé du boîtier et du couvercle du compartiment à piles a été sauvegardé au format STL, il a ensuite fallu préparer ces modèles pour l'impression sur une imprimante SLA (ajout de supports, orientation). A ce stade, un petit problème s'est posé, car la zone d'impression des imprimantes SLA domestiques est petite. Le modèle du boîtier de l'appareil dans la position la plus optimale par rapport au temps d'impression ne correspondait pas aux dimensions de la zone d'impression. En plaçant le modèle à 45 degrés, cela donnait également un résultat décevant : le poids du support était égal au poids du corps du modèle. Il a été décidé d'imprimer le modèle verticalement, en réalisant un support sur l'une des faces avant, après avoir convenu au préalable du post-traitement. L'impression du corps a pris 5 heures avec une couche de 50 microns. Ensuite, le traitement a été effectué avec du papier de verre à grain très fin (je n'écrirai pas le numéro car je ne sais pas :)). L'impression du couvercle de la batterie a pris 40 minutes.
Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Les panneaux de verre d'Aliexpress sont vendus avec un cadre en plastique déjà collé ; il n'y a eu aucun problème pour retirer le cadre. J'ai retiré le panneau de verre après l'avoir préchauffé avec un sèche-cheveux ordinaire.
Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Le diffuseur pour le rétroéclairage LED était constitué de ruban adhésif double face avec de la colle acrylique 3M 9088-200. Pour l'éclairage fluorescent, il y avait plusieurs matériaux parmi lesquels choisir, du ruban adhésif chinois et du papier adhésif découpé en rubans de la société nationale Luminofor. Le choix s'est porté sur un fabricant national, selon mon ressenti, il brillait plus fort et plus longtemps. Un carré de papier avec un pigment fluorescent a été collé dessus avec du ruban adhésif double face 3M 9088-200.

Le verre a été collé au corps de l'interrupteur à l'aide de ruban adhésif double face avec de l'adhésif acrylique 3M VHB 4910.
Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Le couvercle a été fixé avec une vis M 1,4 X 5 mm.

Le coût de l'appareil était de 890 roubles.

Vint ensuite la partie programme. Il y a eu quelques problèmes. Il s'avère que les puces de capteur TTP223 fonctionnent très bien avec une alimentation stabilisée de 3.3 V et pas très bien lorsqu'elles sont alimentées directement à partir d'une batterie bien déchargée. Lors du démarrage de l'appareil avec une alimentation d'environ 2.5 V, plus après un « retrait » supplémentaire lors de l'élaboration de la présentation Mysensors, le microcircuit TTP223 (immédiatement après calibrage) a provoqué une interruption du MK puisqu'il était avec un déclencheur actif.

Le circuit d'alimentation du microcircuit a été modifié (gestion de l'alimentation TTP223 avec gpio MK), une masse supplémentaire a été fournie et des résistances avec une résistance plus élevée ont été remplacées sur les lignes LED RVB (qui passent de l'autre côté de la carte du capteur capacitif). Il a également été ajouté au logiciel : activation de l'alimentation du microcircuit capacitif après démarrage du framework Mysensors et élaboration de la présentation. Le délai de calibrage automatique de la puce TTP223 lors de la mise sous tension a été doublé. Tous ces changements ont complètement éliminé ce problème.

Avant de visualiser le code du programme, je vous recommande de vous familiariser avec la structure de base des croquis dans Mysensors.void before()
{
// Дополнительная функция, если сравнивать со стандартной структурой Ардуино скетчей, то before() это подобие setup(), отработка происходит до инициализации транспортного уровня Mysensors, рекомендуется например для инициализации устройств SPI
}

void setup()
{

}

void presentation()
{
//Тут происходит презентация ноды и ее сенсоров на контролере через маршрутизатор
sendSketchInfo("Name of my sensor node", "1.0"); // презентация названия ноды, версии ПО
present(CHILD_ID, S_WHATEVER, "Description"); // презентация сенсоров ноды, описания сенсоров
}

void loop()
{

}

Code de test du programme de commutation tactile :test_sens.ino
/**
ТЕСТОВЫЙ СКЕТЧ СЕНСОРНОГО ВЫКЛЮЧАТЕЛЯ С ПРЕРЫВАНИЯМИ НА NRF_LPCOMP
*/
bool button_flag;
bool sens_flag;
bool send_flag;
bool detection;
bool nosleep;
byte timer;
unsigned long SLEEP_TIME = 21600000; //6 hours
unsigned long oldmillis;
unsigned long newmillis;
unsigned long interrupt_time;
unsigned long SLEEP_TIME_W;
uint16_t currentBatteryPercent;
uint16_t batteryVoltage = 0;
uint16_t battery_vcc_min = 2400;
uint16_t battery_vcc_max = 3000;

#define MY_RADIO_NRF5_ESB
//#define MY_PASSIVE_NODE
#define MY_NODE_ID 30
#define MY_PARENT_NODE_ID 0
#define MY_PARENT_NODE_IS_STATIC
#define MY_TRANSPORT_UPLINK_CHECK_DISABLED
#define IRT_PIN 3 //(PORT0, gpio 5)
#include <MySensors.h>
// see https://www.mysensors.org/download/serial_api_20
#define SENS_CHILD_ID 0
#define CHILD_ID_VOLT 254
MyMessage sensMsg(SENS_CHILD_ID, V_VAR1);
//MyMessage voltMsg(CHILD_ID_VOLT, V_VOLTAGE);

void preHwInit() {
sleep(2000);
pinMode(RED_LED, OUTPUT);
digitalWrite(RED_LED, HIGH);
pinMode(GREEN_LED, OUTPUT);
digitalWrite(GREEN_LED, HIGH);
pinMode(BLUE_LED, OUTPUT);
digitalWrite(BLUE_LED, HIGH);
pinMode(MODE_PIN, INPUT);
pinMode(SENS_PIN, INPUT);
}

void before()
{
NRF_POWER->DCDCEN = 1;
NRF_UART0->ENABLE = 0;
sleep(1000);
digitalWrite(BLUE_LED, LOW);
sleep(150);
digitalWrite(BLUE_LED, HIGH);
}

void presentation() {
sendSketchInfo("EFEKTA Sens 1CH Sensor", "1.1");
present(SENS_CHILD_ID, S_CUSTOM, "SWITCH STATUS");
//present(CHILD_ID_VOLT, S_MULTIMETER, "Battery");
}

void setup() {
digitalWrite(BLUE_LED, LOW);
sleep(100);
digitalWrite(BLUE_LED, HIGH);
sleep(200);
digitalWrite(BLUE_LED, LOW);
sleep(100);
digitalWrite(BLUE_LED, HIGH);
lpComp();
detection = false;
SLEEP_TIME_W = SLEEP_TIME;
pinMode(31, OUTPUT);
digitalWrite(31, HIGH);
/*
while (timer < 10) {
timer++;
digitalWrite(GREEN_LED, LOW);
wait(5);
digitalWrite(GREEN_LED, HIGH);
wait(500);
}
timer = 0;
*/
sleep(7000);
while (timer < 3) {
timer++;
digitalWrite(GREEN_LED, LOW);
sleep(15);
digitalWrite(GREEN_LED, HIGH);
sleep(85);
}
timer = 0;
sleep(1000);
}

void loop() {

if (detection) {
if (digitalRead(MODE_PIN) == 1 && button_flag == 0 && digitalRead(SENS_PIN) == 0) {
//back side button detection
button_flag = 1;
nosleep = 1;
}
if (digitalRead(MODE_PIN) == 1 && button_flag == 1 && digitalRead(SENS_PIN) == 0) {
digitalWrite(RED_LED, LOW);
wait(10);
digitalWrite(RED_LED, HIGH);
wait(50);
}
if (digitalRead(MODE_PIN) == 0 && button_flag == 1 && digitalRead(SENS_PIN) == 0) {
nosleep = 0;
button_flag = 0;
digitalWrite(RED_LED, HIGH);
lpComp_reset();
}

if (digitalRead(SENS_PIN) == 1 && sens_flag == 0 && digitalRead(MODE_PIN) == 0) {
//sens detection
sens_flag = 1;
nosleep = 1;
newmillis = millis();
interrupt_time = newmillis - oldmillis;
SLEEP_TIME_W = SLEEP_TIME_W - interrupt_time;
if (send(sensMsg.set(detection))) {
send_flag = 1;
}
}
if (digitalRead(SENS_PIN) == 1 && sens_flag == 1 && digitalRead(MODE_PIN) == 0) {
if (send_flag == 1) {
while (timer < 10) {
timer++;
digitalWrite(GREEN_LED, LOW);
wait(20);
digitalWrite(GREEN_LED, HIGH);
wait(30);
}
timer = 0;
} else {
while (timer < 10) {
timer++;
digitalWrite(RED_LED, LOW);
wait(20);
digitalWrite(RED_LED, HIGH);
wait(30);
}
timer = 0;
}
}
if (digitalRead(SENS_PIN) == 0 && sens_flag == 1 && digitalRead(MODE_PIN) == 0) {
sens_flag = 0;
nosleep = 0;
send_flag = 0;
digitalWrite(GREEN_LED, HIGH);
sleep(500);
lpComp_reset();
}
if (SLEEP_TIME_W < 60000) {
SLEEP_TIME_W = SLEEP_TIME;
sendBatteryStatus();
}
}
else {
//if (detection == -1) {
SLEEP_TIME_W = SLEEP_TIME;
sendBatteryStatus();
}
if (nosleep == 0) {
oldmillis = millis();
sleep(SLEEP_TIME_W);
}
}

void sendBatteryStatus() {
wait(20);
batteryVoltage = hwCPUVoltage();
wait(2);

if (batteryVoltage > battery_vcc_max) {
currentBatteryPercent = 100;
}
else if (batteryVoltage < battery_vcc_min) {
currentBatteryPercent = 0;
} else {
currentBatteryPercent = (100 * (batteryVoltage - battery_vcc_min)) / (battery_vcc_max - battery_vcc_min);
}

sendBatteryLevel(currentBatteryPercent, 1);
wait(2000, C_INTERNAL, I_BATTERY_LEVEL);
//send(powerMsg.set(batteryVoltage), 1);
//wait(2000, 1, V_VAR1);
}

void lpComp() {
NRF_LPCOMP->PSEL = IRT_PIN;
NRF_LPCOMP->ANADETECT = 1;
NRF_LPCOMP->INTENSET = B0100;
NRF_LPCOMP->ENABLE = 1;
NRF_LPCOMP->TASKS_START = 1;
NVIC_SetPriority(LPCOMP_IRQn, 15);
NVIC_ClearPendingIRQ(LPCOMP_IRQn);
NVIC_EnableIRQ(LPCOMP_IRQn);
}

void s_lpComp() {
if ((NRF_LPCOMP->ENABLE) && (NRF_LPCOMP->EVENTS_READY)) {
NRF_LPCOMP->INTENCLR = B0100;
}
}

void r_lpComp() {
NRF_LPCOMP->INTENSET = B0100;
}

#if __CORTEX_M == 0x04
#define NRF5_RESET_EVENT(event)
event = 0;
(void)event
#else
#define NRF5_RESET_EVENT(event) event = 0
#endif

extern "C" {
void LPCOMP_IRQHandler(void) {
detection = true;
NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_UP);
NRF_LPCOMP->EVENTS_UP = 0;
MY_HW_RTC->CC[0] = (MY_HW_RTC->COUNTER + 2);
}
}

void lpComp_reset () {
s_lpComp();
detection = false;
NRF_LPCOMP->EVENTS_UP = 0;
r_lpComp();
}

MonBoardNRF5.cpp
#ifdef MYBOARDNRF5
#include <variant.h>

/*
* Pins descriptions. Attributes are ignored by arduino-nrf5 variant.
* Definition taken from Arduino Primo Core with ordered ports
*/
const PinDescription g_APinDescription[]=
{
{ NOT_A_PORT, 0, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // LFCLK
{ NOT_A_PORT, 1, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // LFCLK
{ PORT0, 2, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A0, PWM4, NOT_ON_TIMER},
{ PORT0, 3, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A1, PWM5, NOT_ON_TIMER},
{ PORT0, 4, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A2, PWM6, NOT_ON_TIMER},
{ PORT0, 5, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A3, PWM7, NOT_ON_TIMER},
{ PORT0, 6, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT3
{ PORT0, 7, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT4
{ PORT0, 8, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM10, NOT_ON_TIMER}, //USER_LED
{ PORT0, 9, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // NFC1
{ PORT0, 10, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // NFC2
{ PORT0, 11, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TX
{ PORT0, 12, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // RX
{ PORT0, 13, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SDA
{ PORT0, 14, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SCL
{ PORT0, 15, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SDA1
{ PORT0, 16, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SCL1
{ PORT0, 17, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TP4
{ PORT0, 18, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TP5
{ PORT0, 19, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT2
{ PORT0, 20, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT1
{ PORT0, 21, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT1
{ PORT0, 22, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM9, NOT_ON_TIMER},
{ PORT0, 23, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM8, NOT_ON_TIMER},
{ PORT0, 24, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT
{ PORT0, 25, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM11, NOT_ON_TIMER}, //RED_LED
{ PORT0, 26, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM11, NOT_ON_TIMER}, //GREEN_LED
{ PORT0, 27, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM11, NOT_ON_TIMER}, //BLUE_LED
{ PORT0, 28, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A4, PWM3, NOT_ON_TIMER},
{ PORT0, 29, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A5, PWM2, NOT_ON_TIMER},
{ PORT0, 30, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A6, PWM1, NOT_ON_TIMER},
{ PORT0, 31, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A7, PWM0, NOT_ON_TIMER}
};

// Don't remove this line
#include <compat_pin_mapping.h>

#endif

MonBoardNRF5.h
#ifndef _MYBOARDNRF5_H_
#define _MYBOARDNRF5_H_

#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus

// Number of pins defined in PinDescription array
#define PINS_COUNT (32u)
#define NUM_DIGITAL_PINS (32u)
#define NUM_ANALOG_INPUTS (8u)
#define NUM_ANALOG_OUTPUTS (8u)

/*
* LEDs
*
* This is optional
*
* With My Sensors, you can use
* hwPinMode() instead of pinMode()
* hwPinMode() allows to use advanced modes like OUTPUT_H0H1 to drive LEDs.
* https://github.com/mysensors/MySensors/blob/development/drivers/NRF5/nrf5_wiring_constants.h
*
*/
#define PIN_LED1 (16)
#define PIN_LED2 (15)
#define PIN_LED3 (17)
#define RED_LED (PIN_LED1)
#define GREEN_LED (PIN_LED2)
#define BLUE_LED (PIN_LED3)
#define INTERRUPT_PIN (5)
#define MODE_PIN (25)
#define SENS_PIN (27)

/*
* Analog ports
*
* If you change g_APinDescription, replace PIN_AIN0 with
* port numbers mapped by the g_APinDescription Array.
* You can add PIN_AIN0 to the g_APinDescription Array if
* you want provide analog ports MCU independed, you can add
* PIN_AIN0..PIN_AIN7 to your custom g_APinDescription Array
* defined in MyBoardNRF5.cpp
*/
static const uint8_t A0 = ADC_A0;
static const uint8_t A1 = ADC_A1;
static const uint8_t A2 = ADC_A2;
static const uint8_t A3 = ADC_A3;
static const uint8_t A4 = ADC_A4;
static const uint8_t A5 = ADC_A5;
static const uint8_t A6 = ADC_A6;
static const uint8_t A7 = ADC_A7;

/*
* Serial interfaces
*
* RX and TX are required.
* If you have no serial port, use unused pins
* CTS and RTS are optional.
*/
#define PIN_SERIAL_RX (11)
#define PIN_SERIAL_TX (12)

#ifdef __cplusplus
}
#endif

#endif

Le commutateur dispose d'un bouton tactile et d'un bouton tactile à l'arrière de l'appareil. Ce bouton tactile sera utilisé pour les modes de service, le mode de liaison en direct et la réinitialisation de l'appareil. Le bouton est doté d'une fonction anti-rebond du fer. La ligne du capteur capacitif et la ligne du bouton tactile sont connectées via des diodes Schottky et connectées à la broche analogique p0.05, et également à partir du capteur capacitif et du bouton tactile, il y a des lignes vers les broches MK p0.25 et p0.27 .0.05 pour la lecture des états après activation de l'interruption sur la broche p0.05. Sur la broche pXNUMX, une interruption via le comparateur (NRF_LPCOMP) via EVENTS_UP est activée. J'ai reçu l'inspiration pour résoudre le problème ici и ici.

Le commutateur a été ajouté au réseau Mysensors, géré par le contrôleur de maison intelligente Majordomo (site du projet)

Code PHP pour ajouter un commutateur à la méthode statusUpdate

if (getGlobal("MysensorsButton01.status")==1) {
if (getGlobal('MysensorsRelay04.status') == 0) {
setGlobal('MysensorsRelay04.status', '1');
} else if (getGlobal('MysensorsRelay04.status') == 1) {
setGlobal('MysensorsRelay04.status', '0');
} 
}

Voir le résultat en vidéo

Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Plus tard, une option a été réalisée avec un convertisseur boost, mais cela n'a rien à voir avec le fonctionnement du microcircuit capacitif TTP223 : il y a davantage de désir d'un éclairage bon et uniforme lorsque l'on appuie sur les touches pendant toute la durée de vie de la batterie.

regarderInterrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Projet GitHub - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

russophone site communautaire Mes capteurs

Chat télégramme Mysensors — solution rapide aux problèmes avec Mysensors, trucs, astuces, installation de cartes, utilisation des microcontrôleurs atmega 328, stm32, nRF5 dans l'IDE Arduino — @mysensors_rus

Quelques photosInterrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Interrupteur tactile sans fil avec rétroéclairage fluorescent supplémentaire

Source: habr.com

Ajouter un commentaire