Wireless touch switch na may karagdagang fluorescent backlight

Pagbati sa lahat ng mga mambabasa ng seksyong "DIY o Gawin Mo Ito" sa Habr! Ang artikulo ngayong araw ay tungkol sa touch switch sa TTP223 chip | sheet ng datos. Ang switch ay gumagana sa nRF52832 microcontroller | sheet ng datos, ginamit ang isang YJ-17103 module na may naka-print na antenna at isang connector para sa isang panlabas na MHF4 antenna. Ang touch switch ay gumagana sa CR2430 o CR2450 na baterya. Ang pagkonsumo sa transmit mode ay hindi hihigit sa 8 mA, sa sleep mode na hindi hihigit sa 6 µA.
Wireless touch switch na may karagdagang fluorescent backlight

Tulad ng lahat ng mga nakaraang proyekto, ang isang ito ay isa ring proyekto ng Arduino, ang programa ay nakasulat sa Arduino IDE. Ang pagpapatupad ng software ng device ay batay sa Mysensors protocol | Mga aklatan ng GitHub, Sinusuportahan ng nRF5 board ang GitHub sa Mysensors. forum ng komunidad sa wikang Ingles - http://forum.mysensors.org, Russian-language community forum - http://mysensors.ru/forum/
(Para sa mga gustong mag-aral - Records, Serial Protocol, API, Protocol, Parser | para sa mga gustong tumulong (mga kontribusyon) sa pagbuo ng proyekto - Records)

Ang touch switch board ay binuo sa Deeptrace program, na isinasaalang-alang ang kasunod na pagmamanupaktura gamit ang Laser Ironing Technology (LUT) na pamamaraan. Ang board ay binuo sa mga sukat na 60x60mm (isang karaniwang glass panel ay may mga sukat na 80x80mm). Ang circuit ay naka-print sa mga pahina ng Antenna magazine at inilipat gamit ang isang Bosch na bakal na may setting na "Len" (maximum power) sa isang double-sided foil fiberglass board na 1.5mm, 35µm (sa kawalan ng isa pa).
Wireless touch switch na may karagdagang fluorescent backlight

Ang pag-ukit ay isinasagawa gamit ang isang solusyon ng ferric chloride, na dati nang inihanda sa mga proporsyon ng 1.5 kutsarita bawat 250 ML ng maligamgam na tubig. Ang proseso ay tumagal ng 15 minuto.
Ang mga butas ng pagbabarena para sa mga interlayer vias at para sa pag-fasten ng lalagyan ng baterya ay isinagawa gamit ang isang DREMEL 3000 mini-drill na naka-mount sa isang DREMEL 220 drill stand. Ang mga butas para sa mga interlayer vias ay na-drill gamit ang isang 0,4mm drill, mga butas para sa lalagyan ng baterya na may isang 1,1mm drill . Ang pag-trim sa kahabaan ng mga hangganan ng board ay ginawa gamit ang parehong mini-drill na may DREMEL 540 attachment (Cutting circle d=32.0mm). Ang pruning ay ginawa sa isang respirator.
Ang tinning ng etched board ay ginawa gamit ang Rose alloy sa isang may tubig na solusyon (1 kutsarita ng crystallized citric acid bawat 300 ml ng tubig).

Ang proseso ng paghihinang ay tumagal ng halos isang oras, karamihan sa oras ay ginugol sa paghihinang wire (tinned, 0.4 mm ang lapad) sa mga butas para sa interlayer vias.

Ang board ay hinugasan ng FLUX OFF aerosol cleaner.
Wireless touch switch na may karagdagang fluorescent backlight

Wireless touch switch na may karagdagang fluorescent backlight

Ang disenyo ng katawan ng device ay isinagawa sa isang three-dimensional na computer-aided na editor ng disenyo. Mga sukat ng case 78,5mm X 78,5mm X 12mm.
Wireless touch switch na may karagdagang fluorescent backlight

Ang nakumpletong modelo ng case at takip ng kompartimento ng baterya ay na-save sa format na STL, pagkatapos ay kinakailangan upang ihanda ang mga modelong ito para sa pag-print sa isang SLA printer (pagdaragdag ng mga suporta, oryentasyon). Sa yugtong ito, lumitaw ang isang maliit na problema, dahil maliit ang lugar ng pag-print ng mga printer ng SLA sa bahay. Ang modelo ng case ng device sa pinakamainam na posisyon na nauugnay sa oras ng pag-print ay hindi umaangkop sa mga sukat ng lugar ng pag-print. Kapag inilagay ang modelo sa 45 degrees, nagbigay din ito ng isang nakakadismaya na resulta; ang bigat ng suporta ay katumbas ng bigat ng modelo ng katawan. Napagpasyahan na i-print ang modelo nang patayo, na gumagawa ng suporta sa isa sa mga front side, na sumang-ayon nang maaga sa katotohanan ng post-processing. Ang pag-print ng katawan ay tumagal ng 5 oras na may setting ng layer na 50 microns. Susunod, isinagawa ang pagproseso gamit ang napakapinong butil na papel de liha (hindi ko isusulat ang numero dahil hindi ko alam :)). Ang takip ng baterya ay tumagal ng 40 minuto upang mai-print.
Wireless touch switch na may karagdagang fluorescent backlight

Ang mga glass panel mula sa Aliexpress ay ibinebenta na may plastic frame na nakadikit na; walang mga problema sa pag-alis ng frame. Inalis ko ang glass panel matapos itong painitin gamit ang isang regular na hairdryer.
Wireless touch switch na may karagdagang fluorescent backlight

Wireless touch switch na may karagdagang fluorescent backlight

Ang diffuser para sa LED backlight ay gawa sa double-sided tape na may acrylic adhesive 3M 9088-200. Para sa fluorescent lighting mayroong ilang mga materyales na mapagpipilian, Chinese adhesive tape at adhesive paper na pinutol sa mga tape mula sa domestic company na Luminofor. Ang pagpili ay ginawa sa pabor ng isang domestic tagagawa; ayon sa aking mga damdamin, ito ay lumiwanag nang mas maliwanag at mas mahaba. Ang isang parisukat na papel na may fluorescent pigment ay nakadikit sa itaas na may 3M 9088-200 double-sided tape.

Ang salamin ay nakadikit sa switch body gamit ang double-sided tape na may 3M VHB 4910 acrylic adhesive.
Wireless touch switch na may karagdagang fluorescent backlight

Ang takip ay naayos na may isang tornilyo M 1,4 X 5 mm.

Ang halaga ng aparato ay 890 rubles.

Sumunod na dumating ang bahagi ng programa. Nagkaroon ng ilang mga problema. Lumalabas na ang TTP223 sensor chips ay gumagana nang mahusay sa isang nagpapatatag na 3.3V power supply at hindi masyadong mahusay kapag direktang pinapagana mula sa isang mahusay na na-discharge na baterya. Kapag sinimulan ang device gamit ang isang power supply sa paligid ng 2.5v, at pagkatapos ng karagdagang "drawdown" kapag ginagawa ang pagtatanghal ng Mysensors, ang TTP223 microcircuit (kaagad pagkatapos ng pagkakalibrate) ay nagdulot ng pagkaantala ng MK dahil ito ay may aktibong trigger.

Ang power supply circuit sa microcircuit ay binago (power management TTP223 na may gpio MK), karagdagang ground ang ibinigay, at ang mga resistor na may mas mataas na resistensya ay pinalitan sa rgb led lines (na tumatakbo sa kabilang panig ng capacitive sensor board). Idinagdag din ito sa software: activation ng power para sa capacitive microcircuit pagkatapos simulan ang Mysensors framework at isagawa ang presentation. Ang pagkaantala para sa auto-calibration ng TTP223 chip kapag inilapat ang kapangyarihan ay nadoble. Ang lahat ng mga pagbabagong ito ay ganap na inalis ang problemang ito.

Bago tingnan ang code ng programa, inirerekumenda ko na pamilyar ka sa pangunahing istraktura ng mga sketch sa 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()
{

}

Pindutin ang switch program test code: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

Ang switch ay may touch button at tact button sa likod ng device. Gagamitin ang tact button na ito para sa mga service mode, over-the-air binding mode, at pag-reset ng device. Ang pindutan ay may tampok na bakal na anti-bounce. Ang linya ng capacitive sensor at ang linya ng tact button ay konektado sa pamamagitan ng Schottky diodes at konektado sa analog pin p0.05, at mula din sa capacitive sensor at ang tact button ay may mga linya sa MK pins p0.25 at p0.27 .0.05 para sa pagbabasa ng mga estado pagkatapos i-activate ang interrupt sa pin p0.05. XNUMX. Sa pin pXNUMX, isang interrupt sa pamamagitan ng comparator (NRF_LPCOMP) sa pamamagitan ng EVENTS_UP ay isinaaktibo. Nakatanggap ako ng inspirasyon para malutas ang problema dito и dito.

Ang switch ay idinagdag sa Mysensors network, na pinamamahalaan ng smart home controller Majordomo (website ng proyekto)

PHP code para sa pagdaragdag ng switch sa statusUpdate method

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

Tingnan ang resulta sa video

Wireless touch switch na may karagdagang fluorescent backlight

Nang maglaon, ang isang pagpipilian ay ginawa gamit ang isang boost converter, ngunit hindi ito nauugnay sa pagpapatakbo ng TTP223 capacitive microcircuit; mayroong higit na pagnanais para sa mahusay at pare-parehong pag-iilaw kapag pinindot ang mga susi sa buong buhay ng baterya.

TingnanWireless touch switch na may karagdagang fluorescent backlight

Wireless touch switch na may karagdagang fluorescent backlight

Project Github - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

nagsasalita ng Ruso site ng komunidad Mysensors

Telegram chat Mysensors — mabilis na solusyon sa mga problema sa Mysensors, mga tip, trick, pag-install ng mga board, nagtatrabaho sa atmega 328, stm32, nRF5 microcontrollers sa Arduino IDE — @mysensors_rus

Ilang mga larawanWireless touch switch na may karagdagang fluorescent backlight

Wireless touch switch na may karagdagang fluorescent backlight

Wireless touch switch na may karagdagang fluorescent backlight

Wireless touch switch na may karagdagang fluorescent backlight

Wireless touch switch na may karagdagang fluorescent backlight

Pinagmulan: www.habr.com

Magdagdag ng komento