Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Поздрав до сите читатели на делот „Направи сам или сам“ на Хабр! Денешната статија ќе биде за прекинувачот на допир на чипот TTP223 | податоци. Прекинувачот работи на микроконтролерот nRF52832 | податоци, користен е модул YJ-17103 со печатена антена и конектор за надворешна MHF4 антена. Прекинувачот на допир работи на батерии CR2430 или CR2450. Потрошувачката во режим на пренос не е поголема од 8 mA, во режим на мирување не повеќе од 6 µA.
Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Како и сите претходни проекти, и овој е проект Arduino, програмата е напишана во Arduino IDE. Софтверската имплементација на уредот се базира на протоколот Mysensors | Библиотеки на GitHub, Поддршка на табла nRF5 за GitHub во Mysensors. Форум на заедницата на англиски јазик - http://forum.mysensors.org, форум на заедницата на руски јазик - http://mysensors.ru/forum/
(За оние кои сакаат да учат - документација, Сериски протокол, API, Протокол, Парсер | за оние кои сакаат да помогнат (придонеси) во развојот на проектот - документација)

Таблата со прекинувач на допир е развиена во програмата Deeptrace, земајќи го предвид последователното производство со методот на технологија за ласерско пеглање (LUT). Плочката е развиена во димензии од 60x60mm (стандарден стаклен панел има димензии од 80x80mm). Колото беше испечатено на страниците на списанието Antenna и пренесено со пегла на Bosch со поставката „Len“ (максимална моќност) на двострана фолија од фиберглас плочка 1.5mm, 35µm (во отсуство на друга).
Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Офорсирањето се вршеше со раствор од железен хлорид, претходно подготвен во пропорции од 1.5 лажички на 250 ml топла вода. Процесот траеше 15 минути.
Дупчењето на отворите за меѓуслојни виси и за прицврстување на држачот за батерии беше изведено со мини дупчалка DREMEL 3000 поставена на држач за дупчалка DREMEL 220 Дупки за меѓуслојни виси беа дупчат со дупчалка од 0,4 мм, дупки за држачот за батерии со дупчалка од 1,1 мм. . Со истата мини дупчалка со додаток DREMEL 540 (Круг за сечење d=32.0mm) се изврши кроење по границите на таблата. Закројувањето се вршеше во респиратор.
Каласирањето на гравираната плоча беше направено со употреба на легура на Роза во воден раствор (1 лажичка кристализирана лимонска киселина на 300 ml вода).

Процесот на лемење траеше околу еден час, поголемиот дел од времето беше потрошено за лемење на жица (конзервирана, со дијаметар од 0.4 мм) во отворите за меѓуслојни виси.

Плочката беше измиена со аеросолен чистач FLUX OFF.
Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Дизајнот на телото на уредот беше изведен во тридимензионален уредувач за дизајн со помош на компјутер. Димензии на куќиштето 78,5mm X 78,5mm X 12mm.
Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Завршениот модел на куќиштето и капакот на преградата за батерии беше зачуван во STL формат, тогаш беше неопходно да се подготват овие модели за печатење на SLA печатач (додавање потпори, ориентација). Во оваа фаза, се појави мал проблем, бидејќи површината за печатење на SLA печатачите во домаќинството е мала. Моделот на куќиштето на уредот во најоптимална положба во однос на времето на печатење не се вклопуваше во димензиите на областа за печатење. При поставувањето на моделот на 45 степени, тој исто така даде разочарувачки резултат, тежината на потпирачот беше еднаква на тежината на моделот на телото. Беше одлучено да се испечати моделот вертикално, правејќи потпора на една од предните страни, откако претходно се согласивме со фактот за пост-обработка. Печатењето на телото траеше 5 часа со поставување на слој од 50 микрони. Следно, обработката беше извршена со користење на многу ситно-грануларен шкурка (нема да го напишам бројот затоа што не знам :)). На капакот на батеријата му беа потребни 40 минути за печатење.
Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Стаклените панели од Aliexpress се продаваат со веќе залепена пластична рамка, немаше проблеми со отстранување на рамката. Ја отстранив стаклената плоча откако претходно ја загреав со обичен фен.
Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Дифузорот за LED позадинското осветлување е направен од двострана лента со акрилно лепило 3M 9088-200. За флуоресцентно осветлување имаше неколку материјали за избор, кинеска селотејп и леплива хартија исечена на ленти од домашната компанија Луминофор. Изборот беше направен во корист на домашниот производител според моите чувства, блескаше посветло и подолго. Одозгора беше залепен квадрат хартија со флуоресцентен пигмент со двострана лента 3M 9088-200.

Стаклото беше залепено на телото на прекинувачот со помош на двострана лента со акрилно лепило 3M VHB 4910.
Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Капакот е фиксиран со завртка М 1,4 X 5 mm.

Цената на уредот беше 890 рубли.

Следуваше програмскиот дел. Имаше некои проблеми. Излегува дека чиповите со сензор TTP223 работат одлично со стабилизирано напојување од 3.3 V и не многу добро кога се напојуваат директно од добро испразнета батерија. При стартување на уредот со напојување околу 2.5v, плус по дополнително „повлекување“ при изработката на презентацијата на Mysensors, микроколото TTP223 (веднаш по калибрацијата) предизвика прекин на МК бидејќи беше со активен активирач.

Променет е колото за напојување на микроспојот (управување со електрична енергија TTP223 со gpio MK), се испорачува дополнително заземјување, а на 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, а исто така од капацитивниот сензор и копчето за часовник има линии до пиновите MK p0.25 и p0.27 .0.05 за читање состојби по активирање на прекинот на пинот p0.05. На пинот pXNUMX, се активира прекин преку компараторот (NRF_LPCOMP) преку EVENTS_UP. Добив инспирација да го решам проблемот тука и тука.

Прекинувачот беше додаден во мрежата Mysensors, управувана од контролорот за паметни домови Majordomo (сајт проекта)

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, совети, трикови, инсталирање табли, работа со микроконтролери atmega 328, stm32, nRF5 во Arduino IDE — @mysensors_rus

Некои фотографииБезжичен прекинувач на допир со дополнително флуоресцентно осветлување

Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Безжичен прекинувач на допир со дополнително флуоресцентно осветлување

Извор: www.habr.com

Додадете коментар