Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Salam kanggo kabeh sing maca bagean "DIY utawa Do It Yourself" ing Habr! Artikel dina iki bakal babagan switch tutul ing chip TTP223 | lembar data. Ngalih makaryakke ing nRF52832 mikrokontroler | lembar data, modul YJ-17103 karo antena dicithak lan konektor kanggo antena MHF4 external digunakake. Ngalih tutul beroperasi ing baterei CR2430 utawa CR2450. Konsumsi ing mode transmisi ora luwih saka 8 mA, ing mode turu ora luwih saka 6 μA.
Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Kaya kabeh proyek sadurunge, iki uga minangka proyek Arduino, program kasebut ditulis ing Arduino IDE. Implementasi piranti lunak piranti kasebut adhedhasar protokol Mysensors | Pustaka GitHub, nRF5 papan ndhukung GitHub ing Mysensors. Forum komunitas basa Inggris - http://forum.mysensors.org, forum komunitas basa Rusia - http://mysensors.ru/forum/
(Kanggo sing pengin sinau - Dokumentasi, Protokol Serial, API, Protokol, Parser | kanggo sing pengin mbantu (panganggo) ing pangembangan proyek - Dokumentasi)

Papan switch tutul dikembangake ing program Deeptrace, njupuk manufaktur sakteruse nggunakake metode Laser Ironing Technology (LUT). Papan kasebut dikembangake kanthi ukuran 60x60mm (panel kaca standar duwe dimensi 80x80mm). Sirkuit kasebut dicithak ing kaca majalah Antena lan ditransfer nganggo wesi Bosch kanthi setelan "Len" (daya maksimal) menyang papan fiberglass foil pindho sisi 1.5mm, 35μm (ora ana liyane).
Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Etching ditindakake kanthi solusi ferric chloride, sing sadurunge disiapake kanthi proporsi 1.5 sendok teh saben 250 ml banyu anget. Proses njupuk 15 menit.
Pengeboran bolongan kanggo interlayer vias lan kanggo fastening wadhah baterei wis dileksanakake karo DREMEL 3000 mini-bor dipasang ing DREMEL 220 bor ngadeg. . Trimming ing sadawane wates Papan rampung karo mini-bor padha karo DREMEL 0,4 lampiran (Cutting bunder d = 1,1mm). Pruning ditindakake ing respirator.
Tinning saka Papan etched wis rampung nggunakake Rose alloy ing solusi banyu (1 sendok teh asam sitrat crystallized saben 300 ml banyu).

Proses soldering njupuk bab jam, paling wektu ngginakaken soldering kabel (tinned, 0.4 mm ing diameteripun) ing bolongan kanggo interlayer vias.

Papan kasebut dikumbah nganggo pembersih aerosol FLUX OFF.
Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Desain awak piranti ditindakake ing editor desain dibantu komputer telung dimensi. Ukuran casing 78,5mm x 78,5mm x 12mm.
Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Model lengkap kasus lan tutup kompartemen baterei disimpen ing format STL, banjur perlu nyiyapake model kasebut kanggo dicithak ing printer SLA (nambah dhukungan, orientasi). Ing tahap iki, ana masalah cilik, amarga area cetak printer SLA rumah tangga cilik. Model kasus piranti ing posisi paling optimal relatif kanggo wektu printing ora pas karo dimensi saka wilayah printing. Nalika nyelehake model ing 45 derajat, uga menehi asil sing nguciwani, bobot dhukungan padha karo bobot model awak. Diputusake kanggo nyithak model kanthi vertikal, nggawe dhukungan ing salah sawijining sisih ngarep, sing wis disepakati sadurunge karo kasunyatan post-processing. Nyetak awak butuh 5 jam kanthi setelan lapisan 50 mikron. Sabanjure, pangolahan ditindakake nggunakake sandpaper sing apik banget (aku ora bakal nulis nomer amarga aku ora ngerti :)). Tutup baterei butuh 40 menit kanggo dicithak.
Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Panel kaca saka Aliexpress didol kanthi pigura plastik sing wis dipasang, ora ana masalah nalika mbusak pigura kasebut. Aku mbusak panel kaca sawise preheating karo pengering rambut biasa.
Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Diffuser kanggo lampu latar LED digawe saka tape sisi pindho kanthi adhesive akrilik 3M 9088-200. Kanggo lampu neon ana sawetara bahan sing bisa dipilih, tape adesif Cina lan kertas adesif dipotong dadi kaset saka perusahaan domestik Luminofor. Pilihan digawe kanggo pabrikan domestik; miturut perasaanku, dheweke luwih cerah lan luwih suwe. A kothak kertas karo pigmen neon iki glued ing ndhuwur karo 3M 9088-200 tape pindho sisi.

Kaca kasebut ditempelake ing awak saklar kanthi nggunakake tape sisi ganda kanthi perekat akrilik 3M VHB 4910.
Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Tutup kasebut dipasang kanthi sekrup M 1,4 X 5 mm.

Biaya piranti kasebut 890 rubel.

Sabanjure teka bagean program. Ana sawetara masalah. Pranyata Kripik sensor TTP223 bisa digunakake kanthi sumber daya 3.3V sing stabil lan ora apik nalika didhukung langsung saka baterei sing wis kosong. Nalika miwiti piranti karo sumber daya watara 2.5v, plus sawise tambahan "drawdown" nalika nggarap presentation Mysensors, TTP223 microcircuit (sanalika sawise kalibrasi) nyebabake gangguan saka MK amarga iku karo pemicu aktif.

Sirkuit catu daya menyang microcircuit diganti (manajemen daya TTP223 karo gpio MK), lemah tambahan diwenehake, lan resistor kanthi resistensi sing luwih dhuwur diganti ing garis sing dipimpin rgb (sing mlaku ing sisih liya papan sensor kapasitif). Iki uga ditambahake menyang piranti lunak: aktivasi daya kanggo microcircuit kapasitif sawise miwiti kerangka Mysensors lan nggarap presentasi. Wektu tundha kanggo kalibrasi otomatis chip TTP223 nalika daya ditrapake wis tikel kaping pindho. Kabeh owah-owahan iki rampung ngilangi masalah iki.

Sadurunge ndeleng kode program, aku menehi saran supaya sampeyan ngerti struktur dhasar sketsa ing 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()
{

}

Kode tes program switch tutul: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

Ngalih nduweni tombol tutul lan tombol tact ing mburi piranti. Tombol kawicaksanan iki bakal digunakake kanggo mode layanan, mode naleni over-the-air, lan ngreset piranti. Tombol kasebut nduweni fitur anti-mumbul wesi. Garis sensor kapasitif lan garis tombol jam disambungake liwat dioda Schottky lan disambungake menyang pin analog p0.05, lan uga saka sensor kapasitif lan tombol jam ana garis menyang pin MK p0.25 lan p0.27. .0.05 kanggo maca negara sawise ngaktifake interupsi ing pin p0.05. XNUMX. Ing pin pXNUMX, interupsi liwat komparator (NRF_LPCOMP) liwat EVENTS_UP diaktifake. Aku nampa inspirasi kanggo ngatasi masalah kene и kene.

Saklar kasebut ditambahake menyang jaringan Mysensors, sing dikelola dening pengontrol omah cerdas Majordomo (situs web proyek)

Kode PHP kanggo nambah saklar menyang metode 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');
} 
}

Deleng asil ing video

Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Mengko, pilihan digawe karo konverter ngedongkrak, nanging iki ora ana hubungane karo operasi TTP223 capacitive microcircuit, ana kepinginan liyane kanggo katerangan apik lan seragam nalika menet tombol ing kabeh urip baterei.

NdelengNgalih tutul nirkabel kanthi lampu latar neon tambahan

Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Proyek Github - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

basa Rusia situs komunitas Mysensors

Telegram chatting Mysensors - solusi cepet kanggo masalah karo Mysensors, tips, trik, nginstal papan, nggarap mikrokontroler atmega 328, stm32, nRF5 ing Arduino IDE - @mysensors_rus

Sawetara gambarNgalih tutul nirkabel kanthi lampu latar neon tambahan

Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Ngalih tutul nirkabel kanthi lampu latar neon tambahan

Source: www.habr.com

Add a comment