Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Xin chào tất cả độc giả của phần “DIY hoặc Do It Yourself” trên Habr! Bài viết hôm nay sẽ nói về công tắc cảm ứng trên chip TTP223 | bảng dữliệu. Switch hoạt động trên vi điều khiển nRF52832 | bảng dữliệu, mô-đun YJ-17103 có ăng-ten được in và đầu nối cho ăng-ten MHF4 bên ngoài đã được sử dụng. Công tắc cảm ứng hoạt động bằng pin CR2430 hoặc CR2450. Mức tiêu thụ ở chế độ truyền không quá 8 mA, ở chế độ ngủ không quá 6 µA.
Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Giống như tất cả các dự án trước, dự án này cũng là một dự án Arduino, chương trình được viết bằng Arduino IDE. Việc triển khai phần mềm của thiết bị dựa trên giao thức Mysensors | Thư viện GitHub, hỗ trợ bo mạch nRF5 GitHub trong Mysensors. diễn đàn cộng đồng tiếng anh - http://forum.mysensors.org, diễn đàn cộng đồng tiếng Nga - http://mysensors.ru/forum/
(Dành cho những ai muốn học - Tài liệu, Giao thức nối tiếp, API, Nghị định thư, Trình phân tích cú pháp | dành cho những người muốn hỗ trợ (đóng góp) trong quá trình phát triển dự án - Tài liệu)

Bảng công tắc cảm ứng được phát triển trong chương trình Deeptrace, có tính đến quá trình sản xuất tiếp theo bằng phương pháp Công nghệ ủi bằng laze (LUT). Bảng được phát triển với kích thước 60x60mm (tấm kính tiêu chuẩn có kích thước 80x80mm). Mạch điện được in trên các trang của tạp chí Antenna và được chuyển bằng bàn ủi Bosch có cài đặt “Len” (công suất tối đa) lên một tấm ván sợi thủy tinh hai mặt 1.5mm, 35µm (trong trường hợp không có loại khác).
Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Quá trình khắc được thực hiện bằng dung dịch clorua sắt, đã chuẩn bị trước đó theo tỷ lệ 1.5 muỗng cà phê trên 250 ml nước ấm. Quá trình này mất 15 phút.
Các lỗ khoan cho các via xen kẽ và để gắn chặt giá đỡ pin được thực hiện bằng máy khoan mini DREMEL 3000 gắn trên đế khoan DREMEL 220. Các lỗ cho vias giữa các lớp được khoan bằng mũi khoan 0,4mm, lỗ cho giá đỡ pin bằng mũi khoan 1,1mm . Việc cắt dọc theo các viền của bảng được thực hiện bằng cùng một mũi khoan mini có gắn phụ kiện DREMEL 540 (Vòng tròn cắt d=32.0mm). Việc cắt tỉa được thực hiện trong mặt nạ phòng độc.
Việc đóng hộp tấm khắc được thực hiện bằng hợp kim Rose trong dung dịch nước (1 thìa cà phê axit citric kết tinh trên 300 ml nước).

Quá trình hàn mất khoảng một giờ, phần lớn thời gian được dùng để hàn dây (đóng hộp, đường kính 0.4 mm) vào các lỗ dành cho các vias xen kẽ.

Bảng được rửa bằng chất tẩy rửa khí dung FLUX OFF.
Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Thiết kế thân thiết bị được thực hiện trong trình chỉnh sửa thiết kế ba chiều có sự hỗ trợ của máy tính. Kích thước vỏ 78,5mm X 78,5mm X 12 mm.
Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Mẫu hoàn thiện của vỏ và nắp ngăn chứa pin được lưu ở định dạng STL, sau đó cần chuẩn bị các mẫu này để in trên máy in SLA (thêm giá đỡ, định hướng). Ở giai đoạn này, một vấn đề nhỏ đã nảy sinh vì diện tích in của máy in SLA gia đình nhỏ. Mẫu vỏ thiết bị ở vị trí tối ưu nhất so với thời gian in không vừa với kích thước của vùng in. Khi đặt mô hình ở góc 45 độ cũng cho kết quả đáng thất vọng, trọng lượng của giá đỡ bằng trọng lượng của thân mô hình. Người ta quyết định in mô hình theo chiều dọc, tạo ra sự hỗ trợ ở một trong các mặt trước, đã đồng ý trước với thực tế xử lý hậu kỳ. Việc in phần thân mất 5 giờ với cài đặt lớp 50 micron. Tiếp theo, quá trình xử lý được thực hiện bằng giấy nhám rất mịn (tôi sẽ không viết số vì tôi không biết :)). Nắp pin mất 40 phút để in.
Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Các tấm kính từ Aliexpress được bán với khung nhựa đã được dán sẵn, không có vấn đề gì khi tháo khung. Tôi tháo tấm kính ra sau khi làm nóng trước bằng máy sấy tóc thông thường.
Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Bộ khuếch tán cho đèn nền LED được làm bằng băng keo hai mặt với keo acrylic 3M 9088-200. Đối với đèn huỳnh quang, có một số vật liệu để lựa chọn, băng dính Trung Quốc và giấy dính được cắt thành băng từ công ty nội địa Luminofor. Sự lựa chọn có lợi cho một nhà sản xuất trong nước, theo cảm nhận của tôi, nó tỏa sáng hơn và lâu hơn. Một hình vuông giấy có bột màu huỳnh quang được dán lên trên bằng băng keo hai mặt 3M 9088-200.

Kính được dán vào thân công tắc bằng băng dính hai mặt bằng keo acrylic 3M VHB 4910.
Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Nắp được cố định bằng vít M 1,4 X 5 mm.

Giá của thiết bị là 890 rúp.

Tiếp theo là phần chương trình. Có một số vấn đề. Hóa ra chip cảm biến TTP223 hoạt động tốt với nguồn điện 3.3V ổn định và không hoạt động tốt lắm khi được cấp nguồn trực tiếp từ pin đã xả tốt. Khi khởi động thiết bị với nguồn điện khoảng 2.5v, cộng thêm sau một lần “rút điện” bổ sung khi thực hiện bản trình bày Mysensors, vi mạch TTP223 (ngay sau khi hiệu chỉnh) đã khiến MK bị gián đoạn do nó đang được kích hoạt.

Mạch cấp nguồn cho vi mạch đã được thay đổi (tTP223 quản lý nguồn với gpio MK), nối đất bổ sung và các điện trở có điện trở cao hơn được thay thế trên các dây dẫn rgb (chạy ở phía bên kia của bảng cảm biến điện dung). Nó cũng được thêm vào phần mềm: kích hoạt nguồn cho vi mạch điện dung sau khi khởi động khung Mysensors và xử lý bài thuyết trình. Độ trễ tự động hiệu chỉnh chip TTP223 khi cấp nguồn đã tăng gấp đôi. Tất cả những thay đổi này đã loại bỏ hoàn toàn vấn đề này.

Trước khi xem mã chương trình, tôi khuyên bạn nên tự làm quen với cấu trúc cơ bản của bản phác thảo trong 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()
{

}

Mã kiểm tra chương trình chuyển đổi cảm ứng: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

Công tắc có nút cảm ứng và nút bấm khéo léo ở mặt sau của thiết bị. Nút khéo léo này sẽ được sử dụng cho các chế độ dịch vụ, chế độ liên kết qua mạng và đặt lại thiết bị. Nút bấm có tính năng chống nảy bằng sắt. Đường của cảm biến điện dung và đường của nút chiến thuật được kết nối thông qua điốt Schottky và được kết nối với chân analog p0.05, đồng thời từ cảm biến điện dung và nút chiến thuật cũng có các đường đến các chân MK p0.25 và p0.27 .0.05 để đọc trạng thái sau khi kích hoạt ngắt trên chân p0.05. Trên chân pXNUMX, ngắt qua bộ so sánh (NRF_LPCOMP) qua EVENTS_UP được kích hoạt. Tôi đã nhận được cảm hứng để giải quyết vấn đề đây и đây.

Công tắc đã được thêm vào mạng Mysensors, được quản lý bởi bộ điều khiển nhà thông minh Majordomo (địa điểm dự án)

Mã PHP để thêm một nút chuyển vào phương thức 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');
} 
}

Xem kết quả trong video

Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Sau đó, một tùy chọn đã được thực hiện với bộ chuyển đổi tăng cường, nhưng điều này không liên quan đến hoạt động của vi mạch điện dung TTP223, người ta mong muốn có được ánh sáng tốt và đồng đều hơn khi nhấn các phím trong suốt thời lượng pin.

XemCông tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Dự án Github - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

Nói tiếng Nga trang web cộng đồng cảm biến của tôi

Trò chuyện Telegram Mysensors — giải pháp nhanh chóng cho các vấn đề với Mysensors, mẹo, thủ thuật, cài đặt bảng mạch, làm việc với bộ vi điều khiển atmega 328, stm32, nRF5 trong Arduino IDE — @mysensors_rus

Vài hình ảnhCông tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Công tắc cảm ứng không dây có thêm đèn nền huỳnh quang

Nguồn: www.habr.com

Thêm một lời nhận xét