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

Поздрав свим читаоцима рубрике „Уради сам или уради сам“ на Хабру! Данашњи чланак ће бити о додирном прекидачу на ТТП223 чипу | лист са подацима. Прекидач ради на микроконтролеру нРФ52832 | лист са подацима, коришћен је модул ИЈ-17103 са штампаном антеном и конектором за екстерну МХФ4 антену. Прекидач на додир ради на ЦР2430 или ЦР2450 батеријама. Потрошња у режиму преноса није већа од 8 мА, у режиму мировања не већа од 6 µА.
Бежични прекидач на додир са додатним флуоресцентним позадинским осветљењем

Као и сви претходни пројекти, и овај је Ардуино пројекат, програм је написан у Ардуино ИДЕ. Софтверска имплементација уређаја је заснована на Мисенсорс протоколу | ГитХуб библиотеке, нРФ5 плоча подржава ГитХуб у Мајсензорима. Форум заједнице на енглеском језику - http://forum.mysensors.org, форум заједнице на руском језику - http://mysensors.ru/forum/
(За оне који желе да уче - Записи, Серијски протокол, АПИ за, Протокол, Парсер | за оне који желе да помогну (доприноси) у изради пројекта - Записи)

Табла са прекидачем на додир је развијена у програму Деептраце, узимајући у обзир накнадну производњу користећи методу Ласер Иронинг Тецхнологи (ЛУТ). Плоча је развијена у димензијама 60к60мм (стандардна стаклена плоча има димензије 80к80мм). Коло је одштампано на страницама часописа Антенна и пренето Босцх пеглом са поставком „Лен“ (максимална снага) на двострану фолијску плочу од фибергласа 1.5 мм, 35 ​​µм (у недостатку друге).
Бежични прекидач на додир са додатним флуоресцентним позадинским осветљењем

Нагризање је обављено раствором гвожђе хлорида, претходно припремљеним у пропорцијама од 1.5 кашичице на 250 мл топле воде. Процес је трајао 15 минута.
Бушење рупа за међуслојне отворе и за причвршћивање држача батерије изведено је мини-бушилицом ДРЕМЕЛ 3000 монтираном на постоље за бушилицу ДРЕМЕЛ 220. Рупе за међуслојне спојеве избушене су бушилицом од 0,4 мм, рупе за држач батерије бургијом од 1,1 мм . Обрезивање по ивицама плоче је обављено истом мини бушилицом са ДРЕМЕЛ 540 наставком (круг сечења д=32.0мм). Резидба је обављена на респиратору.
Калајсовање јеткане плоче је обављено помоћу легуре Росе у воденом раствору (1 кашичица кристализоване лимунске киселине на 300 мл воде).

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

Плоча је опрана средством за чишћење аеросола ФЛУКС ОФФ.
Бежични прекидач на додир са додатним флуоресцентним позадинским осветљењем

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

Дизајн тела уређаја изведен је у тродимензионалном компјутерском уређивачу дизајна. Димензије кућишта 78,5 мм Кс 78,5 мм Кс 12 мм.
Бежични прекидач на додир са додатним флуоресцентним позадинским осветљењем

Завршени модел кућишта и поклопца одељка за батерије је сачуван у СТЛ формату, затим је било потребно ове моделе припремити за штампање на СЛА штампачу (додавање носача, оријентација). У овој фази се појавио мали проблем, јер је површина за штампање СЛА штампача за домаћинство мала. Модел кућишта уређаја у најоптималнијем положају у односу на време штампе није се уклапао у димензије површине за штампање. Постављање модела на 45 степени такође је дало разочаравајући резултат, тежина ослонца је била једнака тежини модела каросерије. Одлучено је да се модел одштампа вертикално, правећи ослонац на једној од предњих страна, унапред сложивши се са чињеницом накнадне обраде. Штампање тела је трајало 5 сати са поставком слоја од 50 микрона. Затим је обрада обављена веома финим брусним папиром (нећу писати број јер не знам :)). Штампање поклопца батерије трајало је 40 минута.
Бежични прекидач на додир са додатним флуоресцентним позадинским осветљењем

Стаклене плоче са Алиекпресс-а се продају са већ залепљеним пластичним оквиром, није било проблема са уклањањем оквира. Уклонио сам стаклену плочу након што сам је загрејао обичним феном за косу.
Бежични прекидач на додир са додатним флуоресцентним позадинским осветљењем

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

Дифузор за ЛЕД позадинско осветљење је направљен од двостране траке са акрилним лепком 3М 9088-200. За флуоресцентно осветљење било је неколико материјала за избор, кинеска лепљива трака и лепљиви папир исечен на траке домаће компаније Луминофор. Избор је направљен у корист домаћег произвођача, по мом осећању, сијао је јаче и дуже. Квадрат папира са флуоресцентним пигментом залепљен је на врху двостраном траком 3М 9088-200.

Стакло је залепљено на тело прекидача помоћу двостране траке са 3М ВХБ 4910 акрилним лепком.
Бежични прекидач на додир са додатним флуоресцентним позадинским осветљењем

Поклопац је причвршћен вијком М 1,4 Кс 5 мм.

Цена уређаја износила је 890 рубаља.

Следио је програмски део. Било је неких проблема. Испоставило се да ТТП223 сензорски чипови раде одлично са стабилизованим напајањем од 3.3 В и не баш добро када се напајају директно из добро испражњене батерије. Приликом покретања уређаја са напајањем од око 2.5в, плус након додатног „испадања“ при изради презентације Мисенсорс, микроколо ТТП223 (одмах након калибрације) изазвало је прекид МК пошто је био са активним окидачем.

Промењено је коло за напајање микрокола (управљање напајањем ТТП223 са гпио МК), додатно уземљење, а замењени су отпорници већег отпора на ргб лед линијама (који се покрећу на другој страни капацитивне сензорске плоче). Такође је додато софтверу: активација напајања за капацитивно микроколо након покретања оквира Мисенсорс и израде презентације. Кашњење за аутоматску калибрацију ТТП223 чипа када се примени напајање је удвостручено. Све ове промене су у потпуности елиминисале овај проблем.

Пре него што погледате програмски код, препоручујем вам да се упознате са основном структуром скица у Мисенсорс-у.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()
{

}

Тестни код програма прекидача на додир:тест_сенс.ино
/**
ТЕСТОВЫЙ СКЕТЧ СЕНСОРНОГО ВЫКЛЮЧАТЕЛЯ С ПРЕРЫВАНИЯМИ НА 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();
}

МиБоардНРФ5.цпп
#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

МиБоардНРФ5.х
#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

Прекидач има дугме за додир и дугме за такт на задњој страни уређаја. Ово тактично дугме ће се користити за сервисне режиме, режим бежичног повезивања и ресетовање уређаја. Дугме има функцију против одбијања гвожђа. Линија капацитивног сензора и линија тактног дугмета су повезане преко Шоткијевих диода и спојене на аналогни пин п0.05, а такође и од капацитивног сензора и тактног дугмета воде до МК пинова п0.25 и п0.27 .0.05 за очитавање стања након активирања прекида на пину п0.05. На пину пXNUMX активира се прекид преко компаратора (НРФ_ЛПЦОМП) преко ЕВЕНТС_УП. Добио сам инспирацију да решим проблем овде и овде.

Прекидач је додат у мрежу Мисенсорс, којом управља контролер паметне куће Мајордомо (сајт проекта)

ПХП код за додавање прекидача методи статусУпдате

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

Резултат погледајте у видеу

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

Касније је направљена опција са појачаним конвертором, али то није везано за рад капацитивног микрокола ТТП223, већ је жеља за добрим и уједначеним осветљењем при притискању тастера током читавог трајања батерије.

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

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

Пројецт Гитхуб - гитхуб.цом/смартбокцханнел/ЕФЕКТА_ВИРЕЛЕСС_ТОУЦХ_СВИТЦХ

руског говорног подручја сајт заједнице Мисенсорс

Телеграм цхат Мисенсорс — брзо решење проблема са Мисенсорима, савети, трикови, инсталирање плоча, рад са атмега 328, стм32, нРФ5 микроконтролерима у Ардуино ИДЕ — @мисенсорс_рус

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

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

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

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

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

Извор: ввв.хабр.цом

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