GrĂŒĂe an alle Leser des DIY- oder Do-it-yourself-Bereichs auf Habr! Der heutige Artikel befasst sich mit dem Touch-Schalter auf dem TTP223-Chip |
Datenblatt . Der Schalter arbeitet mit dem Mikrocontroller nRF52832 |
Datenblatt , YJ-17103-Modul mit einer gedruckten Antenne und einem Anschluss fĂŒr eine externe Antenne MHF4 wurde verwendet. Der BerĂŒhrungsschalter wird mit CR2430- oder CR2450-Batterien betrieben. Der Verbrauch im Ăbertragungsmodus betrĂ€gt nicht mehr als 8 mA, im Schlafmodus nicht mehr als 6 mA.

Wie alle vorherigen Projekte ist auch dieses ein Arduino-Projekt, das Programm ist in der Arduino-IDE geschrieben. Die Software-Implementierung des GerÀts basiert auf dem Mysensors-Protokoll |
GitHub-Bibliotheken ,
GitHub-UnterstĂŒtzung fĂŒr nRF5-Boards in Mysensors. Englischsprachiges Community-Forum -
http://forum.mysensors.org , russischsprachiges Community-Forum -
http://mysensors.ru/forum/(FĂŒr diejenigen, die studieren möchten -
Dokumentation ,
serielles Protokoll ,
API ,
Protokoll ,
Parser | fĂŒr diejenigen, die bei der Entwicklung des Projekts helfen möchten -
Dokumentation )
Die Touch-Schalttafel wurde im Diptrace-Programm unter BerĂŒcksichtigung der spĂ€teren Herstellung nach der Methode der Laser-Eisen-Technologie (LUT) entwickelt. Die Platte wurde in den GröĂen 60 x 60 mm entwickelt (die Standardglasscheibe hat Abmessungen von 80 x 80 mm). Die Schaltung wurde auf die Seiten der Zeitschrift Antenna gedruckt und von einem Bosch-BĂŒgeleisen mit der Einstellung âLenâ (maximale Leistung) auf eine doppelseitige folienbeschichtete Glasfaserplatte 1,5 mm, 35 ÎŒm (mangels einer anderen) ĂŒbertragen.

Das Ătzen wurde mit einer Lösung von Eisenchlorid durchgefĂŒhrt, die zuvor in Anteilen von 1,5 Teilen eines Löffels pro 250 ml warmem Wasser hergestellt worden war. Der Vorgang dauerte 15 Minuten.
Die Löcher fĂŒr die ZwischenschichtĂŒbergĂ€nge und fĂŒr die Montage des Batteriehalters wurden mit einem DREMEL 3000-Minibohrer gebohrt, der auf einem DREMEL 220-BohrstĂ€nder montiert war. Die Löcher fĂŒr die ZwischenschichtĂŒbergĂ€nge wurden mit einem 0,4-mm-Bohrer gebohrt, die Löcher fĂŒr den Batteriehalter mit einem 1,1-mm-Bohrer. Das Trimmen entlang der PlattenrĂ€nder wurde mit demselben Minibohrer mit einer DREMEL 540-DĂŒse (Schneidrad d = 32,0 mm) durchgefĂŒhrt. Das Zuschneiden wurde in einem BeatmungsgerĂ€t durchgefĂŒhrt.
Das Verzinnen der geĂ€tzten Platte wurde unter Verwendung einer Rosenlegierung in einer wĂ€ssrigen Lösung (1 Teelöffel kristallisierte ZitronensĂ€ure in 300 ml Wasser) durchgefĂŒhrt.
Der Lötvorgang dauerte ungefĂ€hr eine Stunde. Die meiste Zeit wurde fĂŒr das Löten des Drahtes (verzinnt, 0,4 mm Durchmesser) in die Löcher fĂŒr ZwischenschichtĂŒbergĂ€nge aufgewendet.
Die Platte wurde mit dem Aerosolreiniger FLUX OFF gewaschen.


Die Entwicklung des GerĂ€tegehĂ€uses erfolgte in einem dreidimensionalen computergestĂŒtzten Designeditor. GehĂ€useabmessungen 78,5 mm x 78,5 mm x 12 mm.

Das fertige Modell des GehĂ€uses und die Batterieabdeckung wurden 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Ă€tekörpers in der im VerhĂ€ltnis zur Druckzeit optimalsten Position passte nicht in die GröĂe des Druckbereichs. Wenn das Modell bei 45 Grad platziert wurde, ergab sich auch ein enttĂ€uschendes Ergebnis: Das StĂŒtzgewicht entsprach dem Gewicht des GehĂ€usemodells. Es wurde beschlossen, das Modell vertikal zu drucken, wobei eine der Vorderseite unterstĂŒtzt wurde, wobei zuvor die Tatsache der Nachbearbeitung vereinbart wurde. Es dauerte 5 Stunden, um das GehĂ€use mit einer Schichteinstellung von 50 Mikron abzudichten. Als nĂ€chstes wurde die Verarbeitung mit sehr feinkörnigem Sandpapier durchgefĂŒhrt (ich schreibe die Nummer nicht, weil ich es nicht weiĂ :)). Die Batterieabdeckung wurde 40 Minuten lang gedruckt.

Die Glasscheiben mit Aliexpress werden mit einem bereits geklebten Kunststoffrahmen verkauft, es gab keine Probleme beim Entfernen des Rahmens. Ich nahm die Glasscheibe mit einem normalen Haartrockner vor.


Der Diffusor fĂŒr die LED-Hintergrundbeleuchtung bestand aus doppelseitigem Klebeband mit 3M 9088-200 Acrylkleber. FĂŒr die Leuchtstofflampe standen verschiedene Materialien zur Auswahl: chinesisches Klebeband und Klebepapier, die in BĂ€nder der inlĂ€ndischen Firma Luminophore geschnitten wurden. Die Wahl wurde zugunsten eines einheimischen Herstellers getroffen, meiner Meinung nach leuchtete sie heller und lĂ€nger. Ein Quadrat aus Papier mit fluoreszierendem Pigment wurde auf doppelseitiges Klebeband 3M 9088-200 geklebt.
Das Glas wurde mit doppelseitigem Klebeband mit 3M VHB 4910 Acrylkleber auf das GehÀuse des Leistungsschalters geklebt.

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 kam der Software-Teil. Kein Problem. Es stellt sich heraus, dass die Mikroschaltungen des TTP223-Sensors mit einer stabilisierten Leistung von 3,3 V perfekt funktionieren und nicht sehr gut sind, wenn sie direkt von einer gut entladenen Batterie gespeist werden. Zu Beginn des GerÀts mit einer Leistung im Bereich von 2,5 V und nach einem zusÀtzlichen "Drawdown" bei der Ausarbeitung der Mysensors-PrÀsentation verursachte der TTP223-Chip (unmittelbar nach der Kalibrierung) eine Unterbrechung des MK, da er sich im aktiven Trigger befand.
Die Schaltung zur Stromversorgung des Chips (Energieverwaltung TTP223 mit gpio MK) wurde geĂ€ndert, zusĂ€tzliche Masse wurde zugefĂŒhrt, auf den RGB-LED-Leitungen (die auf der anderen Seite der kapazitiven Sensorplatine verlaufen) wurden WiderstĂ€nde mit einem höheren Widerstand ersetzt. Es wurde auch zur Software hinzugefĂŒgt: Leistungsaktivierung fĂŒr einen kapazitiven Mikrokreis nach dem Starten des Mysensors-Frameworks und dem Ausarbeiten der PrĂ€sentation. Die Verzögerung fĂŒr die automatische Kalibrierung des TTP223-Chips wird verdoppelt, wenn Strom an ihn angelegt wird. All diese Ănderungen haben dieses Problem vollstĂ€ndig behoben.
Bevor Sie den Programmcode anzeigen, empfehlen wir 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 Touch-Switch-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 Uhr-Taste auf der RĂŒckseite des GerĂ€ts. Diese Uhrentaste wird fĂŒr Servicemodi, Luftschnappmodus und Nullstellen des GerĂ€ts verwendet. Der Knopf implementiert ein eisernes Anti-Bounce. Die kapazitive Sensorleitung und die Taktknopfleitung durch die Schottky-Dioden sind mit dem analogen Pin p0.05 verbunden und verbunden, die Leitungen zu den MK-Pins p0.25 und p0.27 gehen zum kapazitiven Sensor und zum Taktknopf, um ZustĂ€nde nach Aktivierung des Interrupts am Pin p0 zu lesen. 05. An Pin p0.05 wird ein Interrupt ĂŒber den Komparator (NRF_LPCOMP) von EVENTS_UP aktiviert. Ich habe mich inspirieren lassen, das Problem
hier und
hier zu lösen.
Der Switch wurde dem Mysensors-Netzwerk hinzugefĂŒgt, das vom Controller des Smart Home, Magordomo (
Projektstandort ), verwaltet wird.
PHP-Code zum HinzufĂŒgen zur StatusUpdate-Switch-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 sich das Ergebnis im Video an

SpĂ€ter wurde eine Option mit einem AufwĂ€rtswandler getroffen, die jedoch nicht mit dem Betrieb des kapazitiven TTP223-Chips zusammenhĂ€ngt. Es besteht ein gröĂerer Wunsch nach einer guten und gleichmĂ€Ăigen Beleuchtung, wenn Abgriffe fĂŒr die gesamte Batterielebensdauer erarbeitet werden.
Github-Projekt -
github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCHRussischsprachige
Community-Site Mysensors
Telegramm-Chat Mysensors - schnelle Lösung fĂŒr Probleme mit Mysensors, Tipps, Tricks, Installation von Boards, Arbeiten mit atmega 328-, stm32- und nRF5-Mikrocontrollern in einer Arduino IDE -
@mysensors_rus