Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

Saluton al ĉiuj legantoj de la sekcio "DIY aŭ Faru Vi mem" pri Habr! La hodiaŭa artikolo temas pri la tuŝŝaltilo sur la blato TTP223 | datumpaĝo. La ŝaltilo funkcias sur la mikroregilo nRF52832 | datumpaĝo, YJ-17103-modulo kun presita anteno kaj konektilo por ekstera MHF4-anteno estis uzita. La tuŝŝaltilo funkcias per CR2430 aŭ CR2450-kuirilaroj. Konsumo en elsenda reĝimo estas ne pli ol 8 mA, en dormreĝimo ne pli ol 6 µA.
Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

Kiel ĉiuj antaŭaj projektoj, ĉi tiu ankaŭ estas Arduino-projekto, la programo estas skribita en la Arduino IDE. La programaro efektivigo de la aparato baziĝas sur la Mysensors protokolo | GitHub-bibliotekoj, nRF5-tabulo subtenas GitHub en Mysensors. Anglalingva komunuma forumo - http://forum.mysensors.org, ruslingva komunuma forumo - http://mysensors.ru/forum/
(Por tiuj, kiuj volas studi - Dokumentado, Seria Protokolo, API, Protokolo, Analizilo | por tiuj, kiuj volas helpi (kontribuoj) en la evoluo de la projekto - Dokumentado)

La tuŝŝaltila tabulo estis evoluigita en la programo Deeptrace, konsiderante postan fabrikadon per la metodo de Laser Ironing Technology (LUT). La tabulo estis evoluigita en dimensioj de 60x60mm (norma vitropanelo havas dimensiojn de 80x80mm). La cirkvito estis presita sur la paĝoj de Antenna revuo kaj transdonita per Bosch-fero kun la "Len" agordo (maksimuma potenco) sur duoble-flanka folia vitrofibrotabulo 1.5mm, 35µm (en la foresto de alia).
Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

Akvaforto estis farita per solvo de fera klorido, antaŭe preparita en proporcioj de 1.5 kuleretoj por 250 ml da varma akvo. La procezo daŭris 15 minutojn.
Borado de truoj por intertavolaj vojoj kaj por fiksado de la bateria tenilo estis farita per mini-borilo DREMEL 3000 muntita sur borilo DREMEL 220. Truoj por intertavolaj vojoj estis boritaj per borilo de 0,4 mm, truoj por la bateriotenilo per borilo de 1,1 mm. . Tondado laŭ la randoj de la tabulo estis farita per la sama mini-borilo kun DREMEL 540 aldonaĵo (Tranĉa cirklo d=32.0mm). La pritondado estis farita en spiralo.
Stanado de la gravurita tabulo estis farita per Roza alojo en akva solvaĵo (1 kulereto da kristaligita citrata acido por 300 ml da akvo).

La lutprocezo daŭris ĉirkaŭ unu horon, plej de la tempo estis elspezita lutdrato (stanita, 0.4 mm en diametro) en la truoj por intertavolaj vojoj.

La tabulo estis lavita per aerosolpurigilo FLUX OFF.
Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

La dezajno de la aparato-korpo estis efektivigita en tridimensia komputil-helpata dezajnoredaktilo. Kazaj dimensioj 78,5mm X 78,5mm X 12mm.
Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

La finita modelo de la kazo kaj kuirila kupea kovrilo estis konservita en formato STL, tiam necesis prepari ĉi tiujn modelojn por presado sur SLA-presilo (aldonante subtenojn, orientiĝon). En ĉi tiu etapo, malgranda problemo aperis, ĉar la presa areo de hejmaj SLA-printiloj estas malgranda. La modelo de la aparato en la plej optimuma pozicio rilate al presa tempo ne kongruis kun la dimensioj de la presa areo. Metante la modelon je 45 gradoj, ĝi ankaŭ donis seniluziigan rezulton; la pezo de la subteno estis egala al la pezo de la korpomodelo. Oni decidis presi la modelon vertikale, farante subtenon sur unu el la antaŭaj flankoj, anticipe konsentinte kun la fakto de post-traktado. Presi la korpon daŭris 5 horojn kun tavola agordo de 50 mikronoj. Poste, prilaborado estis farita per tre fajngrajna sablo (mi ne skribos la numeron ĉar mi ne scias :)). La baterio kovrilo daŭris 40 minutojn por presi.
Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

Vitraj paneloj de Aliexpress estas venditaj kun plasta kadro jam gluita; ne estis problemoj kun forigo de la kadro. Mi forigis la vitran panelon post varmigado de ĝi per regula harsekigilo.
Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

La difuzilo por la LED-kontraŭlumo estis farita el duflanka bendo kun akrila gluaĵo 3M 9088-200. Por fluoreska lumigado estis pluraj materialoj por elekti, ĉina glubendo kaj glupapero tranĉita en glubendojn de la enlanda firmao Luminofor. La elekto estis farita favore al hejma fabrikisto; laŭ miaj sentoj, ĝi brilis pli hele kaj pli longe. Kvadrato el papero kun fluoreska pigmento estis gluita supre kun 3M 9088-200 duobla bendo.

La vitro estis gluita al la ŝaltilkorpo uzante duflankan glubendon kun 3M VHB 4910 akrila gluo.
Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

La kovrilo estis fiksita per ŝraŭbo M 1,4 X 5 mm.

La kosto de la aparato estis 890 rubloj.

Poste venis la programparto. Estis kelkaj problemoj. Rezultas, ke TTP223-sensilo-fritoj funkcias bonege kun stabiligita 3.3V-elektroprovizo kaj ne tre bone kiam funkciigite rekte de bone malŝarĝita baterio. Ekfunkciigante la aparaton kun nutrado ĉirkaŭ 2.5v, kaj post plia "malaltiĝo" dum ellaborado de la Mysensors-prezento, la mikrocirkvito TTP223 (tuj post kalibrado) kaŭzis interrompon de la MK ĉar ĝi estis kun aktiva ellasilo.

La elektroprovizocirkvito al la mikrocirkvito estis ŝanĝita (potenca administrado TTP223 kun gpio MK), kroma grundo estis liverita, kaj rezistiloj kun pli alta rezisto estis anstataŭigitaj sur la rgb gviditaj linioj (kiuj kuras sur la alia flanko de la kapacita sensiltabulo). Ĝi ankaŭ estis aldonita al la programaro: aktivigo de potenco por la kapacita mikrocirkvito post komenci la Mysensors-kadron kaj ellabori la prezenton. La prokrasto por aŭtomata kalibrado de la peceto TTP223 kiam potenco estas aplikata estis duobligita. Ĉiuj ĉi tiuj ŝanĝoj tute forigis ĉi tiun problemon.

Antaŭ ol vidi la programkodon, mi rekomendas, ke vi konatiĝu kun la baza strukturo de skizoj en 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()
{

}

Testkodo de la programo de tuŝoŝaltilo: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

Mia TabuloNRF5.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

La ŝaltilo havas tuŝbutonon kaj takto-butonon sur la dorso de la aparato. Ĉi tiu taktobutono estos uzata por servaj reĝimoj, trans-aera liga reĝimo kaj aparato rekomencigita. La butono havas feran kontraŭ-resalto-trajton. La linio de la kapacita sensilo kaj la linio de la takto-butono estas konektitaj per Schottky-diodoj kaj konektitaj al la analoga pinglo p0.05, kaj ankaŭ de la kapacita sensilo kaj la takto-butono estas linioj al la MK-stiftoj p0.25 kaj p0.27. .0.05 por legado de statoj post aktivigo de la interrompo sur pinglo p0.05. Sur pinglo pXNUMX, interrompo per la komparilo (NRF_LPCOMP) per EVENTS_UP estas aktivigita. Mi ricevis inspiron por solvi la problemon tie и tie.

La ŝaltilo estis aldonita al la reto Mysensors, administrita de la inteligenta hejma regilo Majordomo (projektejo)

PHP-kodo por aldoni ŝaltilon al la metodo 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');
} 
}

Vidu la rezulton en la video

Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

Poste, opcio estis farita per akcela konvertilo, sed ĉi tio ne rilatas al la funkciado de la kapacita mikrocirkvito TTP223; estas pli da deziro al bona kaj unuforma lumigado kiam oni premas la klavojn dum la tuta bateria vivo.

VidoSendrata tuŝŝaltilo kun plia fluoreska fonlumo

Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

Projekto Github - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

ruslingva komunuma retejo Misensiloj

Telegram-babilejo Mysensors - rapida solvo al problemoj kun Mysensors, konsiletoj, lertaĵoj, instalado de tabuloj, laborado kun mikroregiloj atmega 328, stm32, nRF5 en la Arduino IDE - @mysensors_rus

Kelkaj fotojSendrata tuŝŝaltilo kun plia fluoreska fonlumo

Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

Sendrata tuŝŝaltilo kun plia fluoreska fonlumo

fonto: www.habr.com

Aldoni komenton