Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Вітаю ўсіх чытачоў раздзела "DIY або Зрабі сам" на Habr! Сённяшні артыкул будзе аб сэнсарным выключальніку на мікрасхеме TTP223 тэхнічны ліст. Выключальнік працуе на мікракантролеры nRF52832 | тэхнічны ліст, выкарыстаны модуль YJ-17103 з друкаванай антэнай і раздымам для знешняй антэны MHF4. Сэнсарны выключальнік працуе ад батарэек CR2430 ці CR2450. Спажыванне ў рэжыме перадачы складае не больш за 8мА, у рэжыме сну не больш за 6мкА.
Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Як і ўсе папярэднія праекты гэты таксама з'яўляецца Arduino праектам, праграма напісана ў Arduino IDE. У аснове праграмнай рэалізацыі прылады выкарыстаны пратакол Mysensors GitHub бібліятэкі, GitHub падтрымкі поплаткаў nRF5 у Mysensors. Англамоўны форум супольнасці http://forum.mysensors.org, рускамоўны форум суполкі http://mysensors.ru/forum/
(Для жадаючых вывучыць - Дакументацыя, Паслядоўны пратакол, API, пратакол, Парсер | для жадаючых аказаць садзейнічанне (ўзносы) у развіцці праекта - Дакументацыя)

Поплатак сэнсарнага выключальніка распрацоўвалася ў праграме Диптрейс, з улікам наступнага выраба па метадзе Лазернай Праснай Тэхналогіі (ЛУТ). Поплатак распрацоўвалася ў памерах 60х60мм (стандартная шкляная панэль мае памеры 80х80мм). Схема была раздрукавана на старонках часопіса Антэна і перанесена прасам Bosсh з наладай «Лён» (максімальная магутнасць) на двухбаковую фальгаваную шклотэксталітавую плату 1.5мм, 35мкм (за адсутнасцю іншай).
Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Тручэнне выраблялася растворам хлоркавага жалеза, папярэдне прыгатаваным у прапорцыях 1.5ч. лыжкі на 250мл цёплай вады. Працэс заняў 15 хвілін.
Свідраванне адтулін пад міжслаёвыя пераходы і пад мацаванне батарэйнага трымальніка выконвалася міні-дрэлем DREMEL 3000 усталяванай на стойцы для свідравання DREMEL 220. Адтуліны пад міжслаёвыя пераходы былі прасвідраваны свердзелам 0,4мм, адтуліны пад трымальнік батарэек1,1. Абразанне па межах платы была выканана той жа міні-дрыллёй з асадкай DREMEL 540 (Кола отрезной d=32.0мм). Абразанне праводзілася ў рэспіратары.
Луджэнне вытручанай платы было выканана з дапамогай сплаву Розе, у водным растворы (1 ч. лыжка крышталізаванай цытрынавай кіслаты на 300мл вады).

Працэс паяння заняў каля гадзіны, асноўная частка часу была выдаткавана на прапайку дроту (луджаная, дыяметрам 0.4мм) у адтулінах для міжслаёвых пераходаў.

Адмывалася плата аэразольным ачышчальнікам FLUX OFF.
Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Распрацоўка корпуса прылады была выканана ў трохмерным рэдактары аўтаматызаванага праектавання. Памеры корпуса 78,5mm X 78,5mm X 12mm.
Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Скончаная мадэль корпуса і вечкі батарэйнага адсека была захавана ў фармаце STL, далей неабходна было выканаць падрыхтоўку гэтых мадэляў для друку на SLA друкарцы (даданне падтрымак, арыентацыя). На гэтым этапе ўзнікла невялікая праблема, бо вобласць друку ў бытавых SLA друкарак невялікая. Мадэль корпуса прылады ў самай аптымальнай адносна часу друку становішчы не мясцілася ў памеры вобласці друку. Пры размяшчэнні мадэлі пад 45 градусаў гэтак жа дало несуцяшальны вынік, вага падтрымкі атрымліваўся роўнай вазе мадэлі корпуса. Было прынята рашэнне друкаваць мадэль вертыкальна, зрабіўшы падтрымку на адным з вонкавых бакоў, які загадзя пагадзіўся з фактам пост апрацоўкі. Друк корпуса заняла 5 гадзін з настройкай пласта ў 50 мікрон. Далей была выканана апрацоўка з дапамогай вельмі дробназярністай наждачнай паперы(нумар не напішу, бо не ведаю:)). Вечка батарэйнага адсека друкавалася 40 хвілін.
Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Шкляныя панэлі з Аліэкспрэс прадаюцца з ужо прылепленай пластмасавай рамкай, праблем са здыманнем рамкі не ўзнікла. Здымаў папярэдне разагрэў шкляную панэль звычайным фенам.
Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Рассейвальнік для led падсвятлення быў зроблены з двухбаковага скотчу c акрылавым адгезівам 3M 9088-200. Для флуарэсцэнтнага падсвятлення на выбар было некалькі матэрыялаў, кітайская клеючая стужка і клеючая папера нарэзаная ў стужкі айчыннай кампаніі Люмінафор. Выбар быў зроблены на карысць айчыннага вытворцы, па маіх адчуваннях свяціла ярчэй і даўжэй. Квадрат з паперы з флуарэсцэнтным пігментам быў налеплены зверху на двухбаковы скотч 3M 9088-200.

Прыклейванне шкла да корпуса выключальніка было выканана з дапамогай двухбаковага скотчу з акрылавым адгезівам 3M VHB 4910.
Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Вечка фіксавалася шрубай M 1,4 Х 5мм.

Сабекошт прылады склала 890 руб.

Далей мелася быць праграмная частка. Без праблем не абышлося. Апыняецца сэнсарныя мікрасхемы TTP223 выдатна працуюць пры стабілізаваным сілкаванні в.3.3в і не вельмі выдатна пры сілкаванні напроста ад добра разраджанай батарэйкі. Пры старце прылады з харчаваннем у раёне 2.5v, плюс пасля дадатковай "прасадкі" пры адпрацоўцы прэзентацыі Mysensors мікрасхема TTP223 (адразу пасля каліброўкі) выклікала перапыненне МК так як знаходзілася з актыўным трыгерам.

Была зменена схема падачы харчавання на мікрасхему (кіраваннем харчаваннем TTP223 c gpio МК), падведзена дадатковая зямля, на лініях rgb led (якія праходзяць па другім баку платы ёмістнага сэнсара) былі заменены рэзістары з больш высокім супрацівам. Гэтак жа ў ПА было дададзена: актывацыя харчавання для ёмістнай мікрасхемы пасля старту фрэймворка Mysensors і адпрацоўцы прэзентацыі. Павялічана ўдвая затрымка для аўтакаліброўкі мікрасхемы TTP223 пры падачы на ​​яе харчавання. Усе гэтыя змены цалкам ухілілі дадзеную праблему.

Перад праглядам кода праграмы рэкамендую пазнаёміцца ​​з базавай структурай скетчаў у 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()
{

}

Тэставы код праграмы сэнсарнага выключальніка: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

Выключальнік мае сэнсарную кнопку і тактавую кнопку на адваротным баку прылады. Дадзеная тактавая кнопка будзе выкарыстоўвацца для сэрвісных рэжымаў, рэжым прывязкі па паветры, абнуленне прылады. На кнопцы рэалізаваны жалезны анты бразгот. Лінія ёмістнага сэнсара і лінія тактавай кнопкі праз дыёды Шоткі злучаныя і падлучаныя да аналагавага піну p0.05, гэтак жа з ёмістнага сэнсара і тактавай кнопкі ідуць лініі на піны МК р0.25 і p0.27 для счытвання станаў пасля актывацыі перапынення на пін. 0.05. На піне p0.05 актываванае перапыненне праз кампаратар (NRF_LPCOMP) па EVENTS_UP. Натхненне для рашэння задачы атрымліваў тут и тут.

Выключальнік быў дададзены ў сетку Mysensors, якая кіруецца кантралёрам разумнага дома Мажордомо (сайт праекта)

PHP код для даданне ў метад 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');
} 
}

Вынік глядзіце на відэа

Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Пазней быў зроблены варыянт з які падвышае пераўтваральнікам, але гэта не злучана з працай ёмістнай мікрасхемы TTP223, тут больш жаданні ў добрым і раўнамерным падсвятленні пры адпрацоўцы націскаў на ўсім тэрміне працы ад батарэйкі.

ПаглядзецьБесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Github праекта - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

Рускамоўны сайт супольнасці Mysensors

Тэлеграм чат Mysensors - хуткае рашэнне праблем з Mysensors, рады, падказкі, усталёўка поплаткаў, праца з мікракантролерамі atmega 328, stm32, nRF5 у асяроддзі Arduino IDE - @mysensors_rus

Трохі фотакБесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Бесправадны сэнсарны выключальнік з дадатковай флуарэсцэнтнай падсветкай.

Крыніца: habr.com

Дадаць каментар