Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Hälsningar till alla läsare av avsnittet "Gör det själv eller gör det själv" på Habr! Dagens artikel kommer att handla om touch-omkopplaren på TTP223-chippet | datablad. Omkopplaren fungerar på nRF52832 mikrokontroller | datablad, användes en YJ-17103-modul med en tryckt antenn och en kontakt för en extern MHF4-antenn. Pekströmbrytaren fungerar på CR2430- eller CR2450-batterier. Förbrukningen i sändningsläge är inte mer än 8 mA, i viloläge inte mer än 6 µA.
Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Som alla tidigare projekt är även detta ett Arduino-projekt, programmet är skrivet i Arduino IDE. Programvaruimplementeringen av enheten är baserad på Mysensors-protokollet | GitHub-bibliotek, nRF5-kortstöd GitHub i Mysensors. Engelskspråkigt gemenskapsforum - http://forum.mysensors.org, ryskspråkigt gemenskapsforum - http://mysensors.ru/forum/
(För dig som vill studera - Документация, Seriellt protokoll, API, Protokoll, Parser | för de som vill hjälpa till (bidrag) i utvecklingen av projektet - Документация)

Touch-omkopplarkortet utvecklades i Deeptrace-programmet, med hänsyn tagen till efterföljande tillverkning med metoden Laser Ironing Technology (LUT). Skivan utvecklades i måtten 60x60 mm (en standardglaspanel har måtten 80x80 mm). Kretsen trycktes på sidorna av Antenna magazine och överfördes med ett Bosch-järn med "Len"-inställningen (maximal effekt) till en dubbelsidig folie av glasfiberskiva 1.5 mm, 35 µm (i avsaknad av en annan).
Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Etsningen utfördes med en lösning av järnklorid, tidigare framställd i proportionerna 1.5 teskedar per 250 ml varmt vatten. Processen tog 15 minuter.
Borrning av hål för mellanskiktsvias och för fastsättning av batterihållaren utfördes med en DREMEL 3000 miniborr monterad på ett DREMEL 220 borrstativ. . Trimning längs brädans kanter gjordes med samma miniborr med ett DREMEL 0,4-fäste (Skärcirkel d=1,1 mm). Beskärningen gjordes i respirator.
Förtenning av den etsade skivan gjordes med användning av Rose-legering i en vattenlösning (1 tesked kristalliserad citronsyra per 300 ml vatten).

Lödprocessen tog ungefär en timme, den mesta tiden gick åt till att löda tråd (förtennad, 0.4 mm i diameter) i hålen för mellanskiktsvias.

Skivan tvättades med FLUX OFF aerosolrengöringsmedel.
Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Designen av enhetens kropp utfördes i en tredimensionell datorstödd designredigerare. Boettmått 78,5 mm X 78,5 mm X 12 mm.
Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Den färdiga modellen av fodralet och batterifacket sparades i STL-format, sedan var det nödvändigt att förbereda dessa modeller för utskrift på en SLA-skrivare (lägga till stöd, orientering). I detta skede uppstod ett litet problem, eftersom utskriftsområdet för hushålls SLA-skrivare är litet. Modellen av enhetshöljet i det mest optimala läget i förhållande till trycktiden passade inte in i dimensionerna för utskriftsområdet. När man placerade modellen i 45 grader gav det också ett nedslående resultat, stödets vikt var lika med kroppsmodellens vikt. Det beslöts att skriva ut modellen vertikalt och göra ett stöd på en av framsidorna, efter att ha kommit överens i förväg om efterbearbetningen. Att skriva ut kroppen tog 5 timmar med en lagerinställning på 50 mikron. Därefter utfördes behandlingen med mycket finkornigt sandpapper (jag kommer inte att skriva numret eftersom jag inte vet :)). Batterilocket tog 40 minuter att skriva ut.
Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Glaspaneler från Aliexpress säljs med en plastram redan limmad; det var inga problem med att ta bort ramen. Jag tog bort glaspanelen efter att ha förvärmt den med en vanlig hårtork.
Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Diffusorn för LED-bakgrundsbelysningen var gjord av dubbelhäftande tejp med akryllim 3M 9088-200. För lysrörsbelysning fanns flera material att välja mellan, kinesisk tejp och självhäftande papper klippt till tejp från det inhemska företaget Luminofor. Valet gjordes till förmån för en inhemsk tillverkare; enligt mina känslor lyste den ljusare och längre. En fyrkant av papper med fluorescerande pigment limmades ovanpå med 3M 9088-200 dubbelsidig tejp.

Glaset limmades på brytarkroppen med dubbelhäftande tejp med 3M VHB 4910 akryllim.
Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Locket fästes med en skruv M 1,4 X 5 mm.

Kostnaden för enheten var 890 rubel.

Därefter kom programdelen. Det var några problem. Det visar sig att TTP223-sensorchips fungerar utmärkt med en stabiliserad 3.3V strömförsörjning och inte särskilt bra när den drivs direkt från ett väl urladdat batteri. Vid start av enheten med en strömförsörjning runt 2.5v, plus efter en extra "drawdown" när man tränade Mysensors-presentationen, orsakade TTP223-mikrokretsen (direkt efter kalibrering) ett avbrott i MK eftersom den var med en aktiv trigger.

Strömförsörjningskretsen till mikrokretsen ändrades (strömhantering TTP223 med gpio MK), ytterligare jord tillfördes och motstånd med högre resistans byttes ut på rgb led-ledningarna (som går på andra sidan av det kapacitiva sensorkortet). Det lades också till programvaran: aktivering av ström för den kapacitiva mikrokretsen efter att ha startat Mysensors ramverk och utarbetat presentationen. Fördröjningen för autokalibrering av TTP223-chippet när strömmen är påslagen har fördubblats. Alla dessa förändringar eliminerade helt detta problem.

Innan du tittar på programkoden rekommenderar jag att du bekantar dig med den grundläggande strukturen för skisser i 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()
{

}

Testkod för pekväxelprogram: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

Strömbrytaren har en pekknapp och en pekknapp på baksidan av enheten. Den här taktknappen kommer att användas för servicelägen, över-the-air-bindningsläge och enhetsåterställning. Knappen har en anti-studsfunktion i järn. Den kapacitiva sensorns linje och taktknappens linje är anslutna via Schottky-dioder och anslutna till det analoga stiftet p0.05, och även från den kapacitiva sensorn och taktknappen finns linjer till MK-stiften p0.25 och p0.27 .0.05 för avläsning av tillstånd efter aktivering av avbrottet på stift p0.05. XNUMX. På pin pXNUMX aktiveras ett avbrott via komparatorn (NRF_LPCOMP) via EVENTS_UP. Jag fick inspiration att lösa problemet här и här.

Switchen lades till Mysensors nätverk, som hanteras av smarta hemkontroller Majordomo (projektplats)

PHP-kod för att lägga till en switch till statusUpdate-metoden

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

Se resultatet i videon

Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Senare gjordes ett alternativ med en boost-omvandlare, men detta är inte relaterat till driften av den kapacitiva mikrokretsen TTP223, det finns mer önskemål om bra och enhetlig belysning när man trycker på tangenterna under hela batteritiden.

seTrådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Projekt Github - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

rysktalande gemenskapswebbplats Mina sensorer

Telegramchatt Mysensors — snabb lösning på problem med Mysensors, tips, tricks, installation av kort, arbeta med atmega 328, stm32, nRF5 mikrokontroller i Arduino IDE — @mysensors_rus

Lite bilderTrådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Trådlös touch-omkopplare med extra fluorescerande bakgrundsbelysning

Källa: will.com

Lägg en kommentar