Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Pozdrawiamy wszystkich czytelników działu „Zrób to sam” na Habr! Dzisiejszy artykuł będzie dotyczył przełącznika dotykowego w układzie TTP223 | arkusz danych. Przełącznik działa na mikrokontrolerze nRF52832 | arkusz danychzastosowano moduł YJ-17103 z drukowaną anteną i złączem na zewnętrzną antenę MHF4. Przełącznik dotykowy działa na bateriach CR2430 lub CR2450. Pobór mocy w trybie nadawania nie przekracza 8 mA, w trybie uśpienia nie więcej niż 6 µA.
Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Podobnie jak wszystkie poprzednie projekty, i ten jest projektem Arduino, program napisany jest w Arduino IDE. Implementacja oprogramowania urządzenia opiera się na protokole Mysensors | Biblioteki GitHuba, Płyta nRF5 obsługuje GitHub w Mysensorach. Forum społeczności anglojęzycznej - http://forum.mysensors.org, rosyjskojęzyczne forum społecznościowe - http://mysensors.ru/forum/
(Dla tych, którzy chcą się uczyć - Dokumentacja, Protokół szeregowy, API, Protokół, parser | dla tych, którzy chcą pomóc (składki) w rozwoju projektu - Dokumentacja)

Tablica przełączników dotykowych została opracowana w programie Deeptrace z uwzględnieniem późniejszej produkcji metodą Laser Ironing Technology (LUT). Tablica została opracowana w wymiarach 60x60mm (standardowy panel szklany ma wymiary 80x80mm). Układ został wydrukowany na łamach magazynu Antenna i przeniesiony za pomocą żelazka Bosch z ustawieniem „Len” (moc maksymalna) na dwustronną folię z włókna szklanego o grubości 1.5 mm, 35 µm (w przypadku braku innej).
Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Trawienie przeprowadzono roztworem chlorku żelaza, przygotowanym wcześniej w proporcji 1.5 łyżeczki na 250 ml ciepłej wody. Proces trwał 15 minut.
Otwory pod przelotki międzywarstwowe i do mocowania uchwytu akumulatora wykonano miniwiertarką DREMEL 3000 zamontowaną na stojaku wiertniczym DREMEL 220. Otwory pod przelotki międzywarstwowe wykonano wiertłem 0,4mm, otwory pod uchwyt akumulatora wiertłem 1,1mm . Przycinanie wzdłuż krawędzi deski wykonano tą samą miniwiertarką z przystawką DREMEL 540 (okrąg cięcia d=32.0mm). Cięcie odbywało się w respiratorze.
Cynowanie trawionej płyty przeprowadzono stopem różu w roztworze wodnym (1 łyżeczka krystalizowanego kwasu cytrynowego na 300 ml wody).

Proces lutowania trwał około godziny, większość czasu zajęła lutowanie drutu (ocynowanego o średnicy 0.4 mm) w otwory na przelotki międzywarstwowe.

Deskę umyliśmy środkiem czyszczącym w aerozolu FLUX OFF.
Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Projekt korpusu urządzenia wykonano w trójwymiarowym edytorze komputerowym. Wymiary koperty 78,5 mm x 78,5 mm x 12 mm.
Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Gotowy model obudowy i pokrywy komory baterii zapisano w formacie STL, następnie konieczne było przygotowanie tych modeli do druku na drukarce SLA (dodanie podpórek, orientacja). Na tym etapie pojawił się mały problem, ponieważ obszar wydruku domowych drukarek SLA jest niewielki. Model obudowy urządzenia w najbardziej optymalnej pozycji pod względem czasu druku nie zmieścił się w wymiarach obszaru zadruku. Przy ustawieniu modelu pod kątem 45 stopni również dało to rozczarowujący wynik – ciężar podpory był równy ciężarowi modelu korpusu. Zdecydowano się wydrukować model w pionie, tworząc podporę na jednej z przednich stron, po wcześniejszym uzgodnieniu faktu post-processingu. Drukowanie korpusu trwało 5 godzin przy ustawieniu warstwy 50 mikronów. Następnie przeprowadzono obróbkę przy użyciu bardzo drobnoziarnistego papieru ściernego (liczby nie napiszę, bo nie wiem :)). Drukowanie pokrywy baterii trwało 40 minut.
Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Szklane panele z Aliexpress sprzedawane są z już przyklejoną plastikową ramką, nie było żadnych problemów z demontażem ramki. Zdjąłem szklany panel po podgrzaniu go zwykłą suszarką do włosów.
Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Dyfuzor do podświetlenia LED został wykonany z taśmy dwustronnej z klejem akrylowym 3M 9088-200. Do oświetlenia świetlówkowego do wyboru było kilka materiałów, chińska taśma klejąca i papier samoprzylepny pocięty na taśmy krajowej firmy Luminofor. Wybór padł na rodzimego producenta, według moich odczuć świecił jaśniej i dłużej. Kwadrat papieru z pigmentem fluorescencyjnym został przyklejony na wierzch taśmą dwustronną 3M 9088-200.

Szybę przyklejono do korpusu wyłącznika za pomocą taśmy dwustronnej z klejem akrylowym 3M VHB 4910.
Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Pokrywę przykręcono śrubą M 1,4 X 5 mm.

Koszt urządzenia wyniósł 890 rubli.

Następnie przyszła część programowa. Wystąpiły pewne problemy. Okazuje się, że chipy czujnika TTP223 świetnie radzą sobie ze stabilizowanym zasilaniem 3.3 V, a niezbyt dobrze przy zasilaniu bezpośrednio z dobrze rozładowanego akumulatora. Podczas uruchamiania urządzenia z zasilaniem około 2.5 V, a także po dodatkowym „wyczerpaniu” podczas opracowywania prezentacji Mysensors, mikroukład TTP223 (zaraz po kalibracji) spowodował przerwanie MK, ponieważ był on z aktywnym wyzwalaczem.

Zmieniono obwód zasilania mikroukładu (zarządzanie energią TTP223 z gpio MK), doprowadzono dodatkowe uziemienie oraz wymieniono rezystory o większej rezystancji na liniach diod rgb (które biegną po drugiej stronie płytki czujnika pojemnościowego). Do oprogramowania dodano także: aktywację zasilania mikroukładu pojemnościowego po uruchomieniu frameworka Mysensors i opracowaniu prezentacji. Opóźnienie automatycznej kalibracji układu TTP223 po włączeniu zasilania zostało podwojone. Wszystkie te zmiany całkowicie wyeliminowały ten problem.

Przed zapoznaniem się z kodem programu polecam zapoznać się z podstawową strukturą szkiców w 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()
{

}

Kod testowy programu przełącznika dotykowego: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();
}

Moja tablicaNRF5.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

Moja tablicaNRF5.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

Przełącznik posiada przycisk dotykowy oraz przycisk taktowy z tyłu urządzenia. Ten przycisk taktu będzie używany w trybach serwisowych, trybie wiązania bezprzewodowego i resetowaniu urządzenia. Przycisk posiada funkcję zapobiegającą odbijaniu się żelazka. Linia czujnika pojemnościowego i linia przycisku zegara są połączone diodami Schottky'ego i podłączone do pinu analogowego p0.05, a także z czujnika pojemnościowego i przycisku zegara wychodzą linie do pinów MK p0.25 i p0.27 .0.05 do odczytu stanów po włączeniu przerwania na pinie p0.05. Na pinie pXNUMX aktywowane jest przerwanie przez komparator (NRF_LPCOMP) poprzez EVENTS_UP. Otrzymałem inspirację do rozwiązania problemu tutaj и tutaj.

Przełącznik został dodany do sieci Mysensors, zarządzanej przez kontroler inteligentnego domu Majordomo (Strona projektu)

Kod PHP umożliwiający dodanie przełącznika do metody 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');
} 
}

Zobacz wynik na filmie

Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Później wprowadzono opcję z konwerterem podwyższającym, ale nie jest to związane z działaniem mikroukładu pojemnościowego TTP223, bardziej pożądane jest dobre i równomierne oświetlenie podczas naciskania klawiszy przez cały czas pracy baterii.

ZobaczyćBezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Projekt Github - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

rosyjskojęzyczny witryna społecznościowa Moje czujniki

Czat telegramowy Mysensors — szybkie rozwiązanie problemów z Mysensorami, porady, triki, montaż płytek, praca z mikrokontrolerami atmega 328, stm32, nRF5 w Arduino IDE — @mysensors_rus

Kilka zdjęćBezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Bezprzewodowy włącznik dotykowy z dodatkowym podświetleniem fluorescencyjnym

Źródło: www.habr.com

Dodaj komentarz