Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Grüße an alle Leser der Rubrik „DIY or Do It Yourself“ auf Habr! Im heutigen Artikel geht es um den Touch-Schalter auf dem TTP223-Chip | Datenblatt. Der Schalter arbeitet auf dem nRF52832-Mikrocontroller | DatenblattZum Einsatz kam ein YJ-17103-Modul mit gedruckter Antenne und einem Anschluss für eine externe MHF4-Antenne. Der Touch-Schalter wird mit CR2430- oder CR2450-Batterien betrieben. Der Verbrauch beträgt im Sendemodus maximal 8 mA, im Ruhemodus maximal 6 µA.
Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Wie alle vorherigen Projekte ist auch dieses ein Arduino-Projekt, das Programm ist in der Arduino IDE geschrieben. Die Softwareimplementierung des Geräts basiert auf dem Mysensors-Protokoll | GitHub-Bibliotheken, nRF5-Board unterstützt GitHub in Mysensors. Englischsprachiges Community-Forum - http://forum.mysensors.org, Russischsprachiges Community-Forum - http://mysensors.ru/forum/
(Für diejenigen, die studieren wollen – Dokumentation, Serielles Protokoll, API, Protokoll, Parser | für diejenigen, die helfen möchten (Beiträge) bei der Entwicklung des Projekts - Dokumentation)

Die Touch-Switch-Platine wurde im Deeptrace-Programm unter Berücksichtigung der anschließenden Fertigung im Laser Ironing Technology (LUT)-Verfahren entwickelt. Die Platine wurde in den Maßen 60x60mm entwickelt (eine Standard-Glasscheibe hat die Maße 80x80mm). Die Schaltung wurde auf den Seiten des Antenna-Magazins abgedruckt und mit einem Bosch-Eisen mit der Einstellung „Len“ (maximale Leistung) auf eine doppelseitige Glasfaserfolienplatte 1.5 mm, 35 µm (sofern keine andere vorhanden war) übertragen.
Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Das Ätzen wurde mit einer Eisenchloridlösung durchgeführt, die zuvor in einem Verhältnis von 1.5 Teelöffeln pro 250 ml warmem Wasser zubereitet wurde. Der Vorgang dauerte 15 Minuten.
Das Bohren von Löchern für Zwischenschicht-Durchkontaktierungen und zur Befestigung des Batteriehalters erfolgte mit einem DREMEL 3000-Minibohrer, der auf einem DREMEL 220-Bohrständer montiert war. Löcher für Zwischenschicht-Durchkontaktierungen wurden mit einem 0,4-mm-Bohrer gebohrt, Löcher für den Batteriehalter mit einem 1,1-mm-Bohrer . Das Beschneiden entlang der Plattenränder erfolgte mit derselben Minibohrmaschine mit einem DREMEL 540-Aufsatz (Schneidkreis d=32.0 mm). Der Schnitt wurde in einem Beatmungsgerät durchgeführt.
Die Verzinnung der geätzten Platte erfolgte mit Rose-Legierung in einer wässrigen Lösung (1 Teelöffel kristallisierte Zitronensäure pro 300 ml Wasser).

Der Lötvorgang dauerte etwa eine Stunde, die meiste Zeit wurde mit dem Löten von Draht (verzinnt, 0.4 mm Durchmesser) in den Löchern für die Zwischenschicht-Durchkontaktierungen verbracht.

Die Platine wurde mit FLUX OFF Aerosolreiniger gewaschen.
Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Die Gestaltung des Gerätekörpers erfolgte in einem dreidimensionalen computergestützten Designeditor. Gehäuseabmessungen 78,5 mm x 78,5 mm x 12 mm.
Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Das fertige Modell des Gehäuses und des Batteriefachdeckels wurde im STL-Format gespeichert. Anschließend mussten diese Modelle für den Druck auf einem SLA-Drucker vorbereitet werden (Hinzufügen von Stützen, Ausrichtung). Zu diesem Zeitpunkt trat ein kleines Problem auf, da der Druckbereich von Haushalts-SLA-Druckern klein ist. Das Modell des Gerätegehäuses in der hinsichtlich der Druckzeit optimalen Position passte nicht in die Abmessungen des Druckbereichs. Bei der Platzierung des Modells im 45-Grad-Winkel ergab sich ebenfalls ein enttäuschendes Ergebnis; das Gewicht der Stütze entsprach dem Gewicht des Körpermodells. Es wurde beschlossen, das Modell vertikal zu drucken und auf einer der Vorderseiten eine Stütze anzubringen, nachdem man sich im Voraus mit der Nachbearbeitung einverstanden erklärt hatte. Das Drucken des Körpers dauerte 5 Stunden mit einer Schichteinstellung von 50 Mikrometern. Als nächstes erfolgte die Bearbeitung mit sehr feinkörnigem Schleifpapier (die Nummer schreibe ich nicht, weil ich es nicht weiß :)). Der Druck der Batterieabdeckung dauerte 40 Minuten.
Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Glasscheiben von Aliexpress werden mit bereits aufgeklebtem Kunststoffrahmen verkauft, beim Entfernen des Rahmens gab es keine Probleme. Ich habe die Glasscheibe entfernt, nachdem ich sie mit einem normalen Haartrockner vorgewärmt hatte.
Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Der Diffusor für die LED-Hintergrundbeleuchtung wurde aus doppelseitigem Klebeband mit Acrylkleber 3M 9088-200 hergestellt. Für die Leuchtstoffbeleuchtung standen mehrere Materialien zur Auswahl, chinesisches Klebeband und in Streifen geschnittenes Klebepapier der heimischen Firma Luminofor. Die Wahl fiel auf einen heimischen Hersteller, der nach meinem Empfinden heller und länger strahlte. Ein Quadrat Papier mit fluoreszierendem Pigment wurde mit doppelseitigem Klebeband 3M 9088-200 aufgeklebt.

Das Glas wurde mit doppelseitigem Klebeband und 3M VHB 4910 Acrylkleber auf das Schaltergehäuse geklebt.
Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Die Abdeckung wurde mit einer Schraube M 1,4 x 5 mm befestigt.

Die Kosten für das Gerät betrugen 890 Rubel.

Als nächstes folgte der Programmteil. Es gab einige Probleme. Es stellt sich heraus, dass TTP223-Sensorchips mit einer stabilisierten 3.3-V-Stromversorgung gut funktionieren, aber nicht sehr gut, wenn sie direkt von einer gut entladenen Batterie gespeist werden. Beim Starten des Geräts mit einer Stromversorgung von etwa 2.5 V und nach einem zusätzlichen „Drawdown“ beim Ausarbeiten der Mysensors-Präsentation verursachte die TTP223-Mikroschaltung (unmittelbar nach der Kalibrierung) eine Unterbrechung des MK, da dieser über einen aktiven Trigger verfügte.

Der Stromversorgungskreis der Mikroschaltung wurde geändert (Energieverwaltung TTP223 mit GPIO MK), zusätzliche Masse wurde bereitgestellt und Widerstände mit höherem Widerstand wurden auf den RGB-LED-Leitungen (die auf der anderen Seite der kapazitiven Sensorplatine verlaufen) ersetzt. Außerdem wurde der Software Folgendes hinzugefügt: Aktivierung der Stromversorgung für die kapazitive Mikroschaltung nach dem Start des Mysensors-Frameworks und der Ausarbeitung der Präsentation. Die Verzögerung für die automatische Kalibrierung des TTP223-Chips beim Anlegen der Stromversorgung wurde verdoppelt. Durch all diese Änderungen wurde dieses Problem vollständig beseitigt.

Bevor Sie sich den Programmcode ansehen, empfehle ich Ihnen, sich mit der Grundstruktur von Skizzen in Mysensors vertraut zu machen.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()
{

}

Testcode für das Touch-Schalter-Programm: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

Der Schalter verfügt über eine Touch-Taste und eine Takttaste auf der Rückseite des Geräts. Diese Takttaste wird für Servicemodi, den Over-the-Air-Bindungsmodus und das Zurücksetzen des Geräts verwendet. Der Knopf verfügt über eine Eisen-Anti-Bounce-Funktion. Die Leitung des kapazitiven Sensors und die Leitung des Uhrknopfes sind über Schottky-Dioden verbunden und mit dem analogen Pin p0.05 verbunden, und auch vom kapazitiven Sensor und dem Uhrknopf gibt es Leitungen zu den MK-Pins p0.25 und p0.27 .0.05 zum Lesen von Zuständen nach Aktivierung des Interrupts an Pin p0.05. XNUMX. Am Pin pXNUMX wird ein Interrupt über den Komparator (NRF_LPCOMP) über EVENTS_UP aktiviert. Ich erhielt Inspiration, das Problem zu lösen hier и hier.

Der Schalter wurde dem Mysensors-Netzwerk hinzugefügt und vom Smart-Home-Controller Majordomo verwaltet (Projektseite)

PHP-Code zum Hinzufügen eines Schalters zur statusUpdate-Methode

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

Sehen Sie das Ergebnis im Video

Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Später wurde eine Option mit einem Aufwärtswandler eingeführt, die jedoch nichts mit dem Betrieb der kapazitiven Mikroschaltung TTP223 zu tun hat; es besteht eher der Wunsch nach einer guten und gleichmäßigen Ausleuchtung beim Drücken der Tasten über die gesamte Batterielebensdauer.

SehenKabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Projekt Github - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

Russisch sprechend Community-Seite Meine Sensoren

Telegram-Chat Mysensors — schnelle Lösung von Problemen mit Mysensors, Tipps, Tricks, Installation von Platinen, Arbeiten mit atmega 328, stm32, nRF5 Mikrocontrollern in der Arduino IDE — @mysensors_rus

Manche FotosKabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Kabelloser Touch-Schalter mit zusätzlicher fluoreszierender Hintergrundbeleuchtung

Source: habr.com

Kommentar hinzufügen