Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Salutări tuturor cititorilor secțiunii „DIY or Do It Yourself” de pe Habr! Articolul de astăzi va fi despre comutatorul tactil de pe cipul TTP223 | fișa cu date. Comutatorul funcționează pe microcontrolerul nRF52832 | fișa cu date, a fost folosit un modul YJ-17103 cu o antenă imprimată și un conector pentru o antenă MHF4 externă. Comutatorul tactil funcționează cu baterii CR2430 sau CR2450. Consumul în modul de transmisie nu este mai mare de 8 mA, în modul de repaus nu mai mult de 6 µA.
Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Ca toate proiectele anterioare, și acesta este un proiect Arduino, programul este scris în IDE-ul Arduino. Implementarea software a dispozitivului se bazează pe protocolul Mysensors | biblioteci GitHub, Placa nRF5 acceptă GitHub în Mysensors. forum comunității engleze - http://forum.mysensors.org, forum comunității în limba rusă - http://mysensors.ru/forum/
(Pentru cei care doresc să studieze - Documentație, Protocol serial, API, protocol, analizator | pentru cei care doresc să ajute (contribuţii) în dezvoltarea proiectului - Documentație)

Placa de comutare tactilă a fost dezvoltată în programul Deeptrace, ținând cont de fabricarea ulterioară folosind metoda Tehnologiei de călcat cu laser (LUT). Placa a fost dezvoltata in dimensiuni de 60x60mm (un panou standard de sticla are dimensiuni de 80x80mm). Circuitul a fost tipărit pe paginile revistei Antenna și transferat cu un fier de călcat Bosch cu setarea „Len” (putere maximă) pe o placă din fibră de sticlă din folie cu două fețe de 1.5 mm, 35 µm (în absența alteia).
Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Gravarea a fost efectuată cu o soluție de clorură ferică, preparată în prealabil în proporții de 1.5 lingurițe la 250 ml apă caldă. Procesul a durat 15 minute.
Găurile pentru căile interstrat și pentru fixarea suportului bateriei s-au efectuat cu un mini-burghiu DREMEL 3000 montat pe un suport de foraj DREMEL 220. Găurile pentru căile interstrat au fost găurite cu un burghiu de 0,4 mm, găuri pentru suportul bateriei cu un burghiu de 1,1 mm. . Tăierea de-a lungul marginilor plăcii s-a făcut cu același mini-burghiu cu atașament DREMEL 540 (Cercul de tăiere d=32.0mm). Tăierea s-a făcut într-un respirator.
Coatorirea plăcii gravate s-a făcut folosind aliaj Rose într-o soluție apoasă (1 linguriță de acid citric cristalizat la 300 ml apă).

Procesul de lipire a durat aproximativ o oră, cea mai mare parte a timpului s-a petrecut lipirea sârmei (coasitor, cu diametrul de 0.4 mm) în găurile pentru căile interstrat.

Placa a fost spălată cu agent de curățare cu aerosoli FLUX OFF.
Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Proiectarea corpului dispozitivului a fost realizată într-un editor tridimensional de proiectare asistată de computer. Dimensiuni carcasa 78,5mm X 78,5mm X 12mm.
Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Modelul completat al carcasei și al capacului compartimentului bateriei a fost salvat în format STL, apoi a fost necesară pregătirea acestor modele pentru imprimare pe o imprimantă SLA (adăugarea suporturilor, orientare). În această etapă, a apărut o mică problemă, deoarece zona de imprimare a imprimantelor SLA de uz casnic este mică. Modelul carcasei dispozitivului în cea mai optimă poziție în raport cu timpul de imprimare nu s-a încadrat în dimensiunile zonei de imprimare. La plasarea modelului la 45 de grade, a dat și un rezultat dezamăgitor; greutatea suportului a fost egală cu greutatea modelului de caroserie. S-a decis imprimarea modelului pe verticală, realizând un suport pe una dintre fețele din față, fiind de acord în prealabil cu faptul post-procesării. Imprimarea corpului a durat 5 ore cu o setare a stratului de 50 de microni. În continuare, prelucrarea a fost efectuată cu șmirghel cu granulație foarte fină (nu voi scrie numărul pentru că nu știu :)). Capacul bateriei a durat 40 de minute pentru a se imprima.
Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Panourile de sticlă de la Aliexpress sunt vândute cu un cadru de plastic deja lipit; nu au fost probleme la îndepărtarea cadrului. Am scos panoul de sticlă după ce l-am preîncălzit cu un uscător de păr obișnuit.
Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Difuzorul pentru iluminarea de fundal cu LED a fost realizat din bandă cu două fețe cu adeziv acrilic 3M 9088-200. Pentru iluminatul fluorescent au existat mai multe materiale din care să aleagă, bandă adezivă chinezească și hârtie adezivă tăiată în benzi de la compania autohtonă Luminofor. Alegerea a fost făcută în favoarea unui producător autohton; după sentimentele mele, a strălucit mai mult și mai mult. Un pătrat de hârtie cu pigment fluorescent a fost lipit deasupra cu bandă cu două fețe 3M 9088-200.

Sticla a fost lipită de corpul comutatorului folosind bandă dublă cu adeziv acrilic 3M VHB 4910.
Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Capacul a fost fixat cu un șurub M 1,4 X 5 mm.

Costul dispozitivului a fost de 890 de ruble.

Urmează partea de program. Au fost unele probleme. Se pare că cipurile senzorului TTP223 funcționează excelent cu o sursă de alimentare stabilizată de 3.3V și nu foarte bine atunci când sunt alimentate direct de la o baterie bine descărcată. La pornirea dispozitivului cu o sursă de alimentare în jur de 2.5v, plus după o „reducere” suplimentară la elaborarea prezentării Mysensors, microcircuitul TTP223 (imediat după calibrare) a provocat o întrerupere a MK, deoarece era cu un declanșator activ.

Circuitul de alimentare a microcircuitului a fost schimbat (gestionarea energiei TTP223 cu gpio MK), a fost furnizată masă suplimentară și au fost înlocuite rezistențe cu rezistență mai mare pe liniile led rgb (care rulează pe cealaltă parte a plăcii senzorului capacitiv). S-a adăugat și software-ului: activarea puterii pentru microcircuitul capacitiv după pornirea cadrului Mysensors și elaborarea prezentării. Întârzierea pentru autocalibrarea chipului TTP223 atunci când este aplicată puterea a fost dublată. Toate aceste modificări au eliminat complet această problemă.

Înainte de a vizualiza codul programului, vă recomand să vă familiarizați cu structura de bază a schițelor din 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()
{

}

Cod de testare a programului comutator tactil: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();
}

MyBoardNRF5.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

MyBoardNRF5.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

Comutatorul are un buton tactil și un buton tactil pe spatele dispozitivului. Acest buton tact va fi folosit pentru modurile de service, modul de legare prin aer și resetarea dispozitivului. Butonul are o funcție anti-saritură de fier. Linia senzorului capacitiv și linia butonului tact sunt conectate prin diode Schottky și conectate la pinul analogic p0.05, iar de la senzorul capacitiv și butonul tact există linii către pinii MK p0.25 și p0.27. .0.05 pentru citirea stărilor după activarea întreruperii pe pinul p0.05. Pe pinul pXNUMX, este activată o întrerupere prin comparator (NRF_LPCOMP) prin EVENTS_UP. Am primit inspirație pentru a rezolva problema aici и aici.

Comutatorul a fost adăugat la rețeaua Mysensors, gestionată de controlerul pentru casă inteligentă Majordomo (site-ul proiectului)

Cod PHP pentru adăugarea unui comutator la metoda 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');
} 
}

Vezi rezultatul în videoclip

Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Mai târziu, a fost făcută o opțiune cu un convertor de amplificare, dar aceasta nu este legată de funcționarea microcircuitului capacitiv TTP223; există mai multă dorință de iluminare bună și uniformă atunci când practicați apăsarea pe toată durata de viață a bateriei.

VedeaComutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Proiectul Github - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

vorbitor de limba rusă site-ul comunității Senzorii mei

Chat Telegram Mysensors — soluție rapidă la problemele cu Mysensors, sfaturi, trucuri, instalarea plăcilor, lucrul cu microcontrolere atmega 328, stm32, nRF5 în Arduino IDE — @mysensors_rus

Puține pozeComutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Comutator tactil fără fir cu lumină de fundal fluorescentă suplimentară

Sursa: www.habr.com

Adauga un comentariu