Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Χαιρετισμούς σε όλους τους αναγνώστες της ενότητας «DIY or Do It Yourself» στο Habr! Το σημερινό άρθρο θα αφορά τον διακόπτη αφής στο τσιπ TTP223 | φύλλο δεδομένων. Ο διακόπτης λειτουργεί στον μικροελεγκτή nRF52832 | φύλλο δεδομένων, χρησιμοποιήθηκε μονάδα YJ-17103 με τυπωμένη κεραία και βύσμα για εξωτερική κεραία MHF4. Ο διακόπτης αφής λειτουργεί με μπαταρίες CR2430 ή CR2450. Η κατανάλωση στη λειτουργία μετάδοσης δεν είναι μεγαλύτερη από 8 mA, σε κατάσταση αναστολής λειτουργίας όχι μεγαλύτερη από 6 μA.
Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Όπως όλα τα προηγούμενα έργα, έτσι και αυτό είναι έργο Arduino, το πρόγραμμα είναι γραμμένο στο Arduino IDE. Η εφαρμογή λογισμικού της συσκευής βασίζεται στο πρωτόκολλο Mysensors | Βιβλιοθήκες GitHub, Υποστήριξη πλακέτας nRF5 GitHub στο Mysensors. αγγλόφωνο κοινοτικό φόρουμ - http://forum.mysensors.org, Ρωσόφωνο κοινοτικό φόρουμ - http://mysensors.ru/forum/
(Για όσους θέλουν να σπουδάσουν - Εγγραφές, Σειριακό πρωτόκολλο, API, Πρωτόκολλο, αναλυτής | για όσους θέλουν να βοηθήσουν (συνεισφορές) στην ανάπτυξη του έργου - Εγγραφές)

Η πλακέτα διακόπτη αφής αναπτύχθηκε στο πρόγραμμα Deeptrace, λαμβάνοντας υπόψη την επακόλουθη κατασκευή χρησιμοποιώντας τη μέθοδο Laser Ironing Technology (LUT). Η πλακέτα αναπτύχθηκε σε διαστάσεις 60x60mm (ένα τυπικό γυάλινο πάνελ έχει διαστάσεις 80x80mm). Το κύκλωμα τυπώθηκε στις σελίδες του περιοδικού Antenna και μεταφέρθηκε με ένα σίδερο Bosch με τη ρύθμιση "Len" (μέγιστη ισχύς) σε μια πλακέτα από υαλοβάμβακα διπλής όψης 1.5 mm, 35 μm (ελλείψει άλλης).
Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Η χάραξη διεξήχθη με ένα διάλυμα χλωριούχου σιδήρου, που παρασκευάστηκε προηγουμένως σε αναλογίες 1.5 κουταλάκι του γλυκού ανά 250 ml ζεστού νερού. Η διαδικασία κράτησε 15 λεπτά.
Η διάνοιξη οπών για τις ενδιάμεσες βάσεις και για τη στερέωση της θήκης της μπαταρίας έγινε με ένα μίνι τρυπάνι DREMEL 3000 τοποθετημένο σε βάση τρυπανιού DREMEL 220. Οι οπές για τις οπές ενδιάμεσης στρώσης τρυπήθηκαν με ένα τρυπάνι 0,4 mm, τρύπες για τη βάση μπαταρίας με ένα τρυπάνι 1,1 mm . Το τρίψιμο κατά μήκος των περιθωρίων της σανίδας έγινε με το ίδιο μίνι τρυπάνι με εξάρτημα DREMEL 540 (Κύκλος κοπής d=32.0mm). Το κλάδεμα έγινε σε αναπνευστήρα.
Η επικασσιτέρωση της χαραγμένης σανίδας έγινε χρησιμοποιώντας κράμα τριαντάφυλλου σε υδατικό διάλυμα (1 κουταλάκι του γλυκού κρυσταλλωμένο κιτρικό οξύ ανά 300 ml νερού).

Η διαδικασία συγκόλλησης διήρκεσε περίπου μία ώρα, τον περισσότερο χρόνο ξοδεύτηκε για τη συγκόλληση σύρματος (επικασσιτερωμένο, διαμέτρου 0.4 mm) στις οπές για τις αγωγές ενδιάμεσων στρωμάτων.

Η πλακέτα πλύθηκε με καθαριστικό αεροζόλ FLUX OFF.
Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Ο σχεδιασμός του σώματος της συσκευής πραγματοποιήθηκε σε τρισδιάστατο πρόγραμμα επεξεργασίας σχεδίασης με τη βοήθεια υπολογιστή. Διαστάσεις θήκης 78,5mm X 78,5mm X 12mm.
Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Το ολοκληρωμένο μοντέλο της θήκης και του καλύμματος της θήκης της μπαταρίας αποθηκεύτηκε σε μορφή STL, τότε ήταν απαραίτητο να προετοιμαστούν αυτά τα μοντέλα για εκτύπωση σε εκτυπωτή SLA (προσθήκη στηρίξεων, προσανατολισμός). Σε αυτό το στάδιο, προέκυψε ένα μικρό πρόβλημα, καθώς η περιοχή εκτύπωσης των οικιακών εκτυπωτών SLA είναι μικρή. Το μοντέλο της θήκης της συσκευής στην πιο βέλτιστη θέση σε σχέση με τον χρόνο εκτύπωσης δεν ταίριαζε στις διαστάσεις της περιοχής εκτύπωσης. Κατά την τοποθέτηση του μοντέλου στις 45 μοίρες, έδωσε επίσης ένα απογοητευτικό αποτέλεσμα· το βάρος του στηρίγματος ήταν ίσο με το βάρος του μοντέλου αμαξώματος. Αποφασίστηκε να εκτυπωθεί το μοντέλο κάθετα, κάνοντας στήριγμα σε μία από τις μπροστινές πλευρές, έχοντας συμφωνήσει εκ των προτέρων με το γεγονός της μετα-επεξεργασίας. Η εκτύπωση του σώματος χρειάστηκε 5 ώρες με ρύθμιση στρώματος 50 microns. Στη συνέχεια, η επεξεργασία πραγματοποιήθηκε με πολύ λεπτόκοκκο γυαλόχαρτο (δεν θα γράψω τον αριθμό γιατί δεν ξέρω :)). Το κάλυμμα της μπαταρίας χρειάστηκε 40 λεπτά για να εκτυπωθεί.
Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Τα γυάλινα πάνελ από την Aliexpress πωλούνται με πλαστικό πλαίσιο που έχει ήδη κολληθεί, δεν υπήρχαν προβλήματα με την αφαίρεση του πλαισίου. Αφαίρεσα το γυάλινο πάνελ αφού το προθέρμανση με κανονικό στεγνωτήρα μαλλιών.
Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Ο διαχύτης για τον οπίσθιο φωτισμό LED κατασκευάστηκε από ταινία διπλής όψης με ακρυλική κόλλα 3M 9088-200. Για τον φωτισμό φθορισμού υπήρχαν πολλά υλικά για να διαλέξετε, κινέζικη κολλητική ταινία και αυτοκόλλητο χαρτί κομμένο σε ταινίες από την εγχώρια εταιρεία Luminofor. Η επιλογή έγινε υπέρ ενός εγχώριου κατασκευαστή· σύμφωνα με τα συναισθήματά μου, έλαμπε πιο φωτεινά και μακρύτερα. Ένα τετράγωνο χαρτί με φθορίζουσα χρωστική κολλήθηκε από πάνω με ταινία διπλής όψης 3M 9088-200.

Το γυαλί κολλήθηκε στο σώμα του διακόπτη χρησιμοποιώντας ταινία διπλής όψης με ακρυλική κόλλα 3M VHB 4910.
Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Το κάλυμμα στερεώθηκε με βίδα M 1,4 X 5 mm.

Το κόστος της συσκευής ήταν 890 ρούβλια.

Ακολούθησε το μέρος του προγράμματος. Υπήρχαν κάποια προβλήματα. Αποδεικνύεται ότι τα τσιπ αισθητήρων TTP223 λειτουργούν εξαιρετικά με σταθεροποιημένο τροφοδοτικό 3.3 V και όχι πολύ καλά όταν τροφοδοτούνται απευθείας από μια καλά αποφορτισμένη μπαταρία. Κατά την εκκίνηση της συσκευής με τροφοδοτικό περίπου 2.5v, συν μετά από μια πρόσθετη «απόσυρση» κατά την επεξεργασία της παρουσίασης του Mysensors, το μικροκύκλωμα TTP223 (αμέσως μετά τη βαθμονόμηση) προκάλεσε διακοπή του MK αφού ήταν με ενεργή σκανδάλη.

Το κύκλωμα τροφοδοσίας στο μικροκύκλωμα άλλαξε (διαχείριση ισχύος TTP223 με gpio MK), τροφοδοτήθηκε πρόσθετη γείωση και αντιστάσεις με υψηλότερη αντίσταση αντικαταστάθηκαν στις γραμμές led rgb (που λειτουργούν στην άλλη πλευρά της πλακέτας χωρητικού αισθητήρα). Προστέθηκε επίσης στο λογισμικό: ενεργοποίηση ισχύος για το χωρητικό μικροκύκλωμα μετά την εκκίνηση του πλαισίου Mysensors και την επεξεργασία της παρουσίασης. Η καθυστέρηση για την αυτόματη βαθμονόμηση του τσιπ TTP223 κατά την παροχή ρεύματος έχει διπλασιαστεί. Όλες αυτές οι αλλαγές εξαλείφουν πλήρως αυτό το πρόβλημα.

Πριν δείτε τον κώδικα του προγράμματος, σας συνιστώ να εξοικειωθείτε με τη βασική δομή των σκίτσων στο 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()
{

}

Κωδικός δοκιμής προγράμματος διακόπτη αφής: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

Ο διακόπτης διαθέτει κουμπί αφής και κουμπί τακτ στο πίσω μέρος της συσκευής. Αυτό το κουμπί τακτ θα χρησιμοποιηθεί για λειτουργίες σέρβις, λειτουργία σύνδεσης μέσω αέρα και επαναφορά συσκευής. Το κουμπί έχει σιδερένιο χαρακτηριστικό anti-bounce. Η γραμμή του χωρητικού αισθητήρα και η γραμμή του κουμπιού τακτ συνδέονται μέσω διόδων Schottky και συνδέονται με την αναλογική ακίδα p0.05, και επίσης από τον χωρητικό αισθητήρα και το κουμπί τακτ υπάρχουν γραμμές στις ακίδες MK p0.25 και p0.27 .0.05 για την ανάγνωση καταστάσεων μετά την ενεργοποίηση της διακοπής στον ακροδέκτη p0.05. XNUMX. Στην καρφίτσα pXNUMX, ενεργοποιείται μια διακοπή μέσω του συγκριτή (NRF_LPCOMP) μέσω EVENTS_UP. Έλαβα έμπνευση για να λύσω το πρόβλημα εδώ и εδώ.

Ο διακόπτης προστέθηκε στο δίκτυο Mysensors, το οποίο διαχειρίζεται ο ελεγκτής έξυπνου σπιτιού Majordomo (ιστοσελίδα έργου)

Κώδικας PHP για την προσθήκη διακόπτη στη μέθοδο 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');
} 
}

Δείτε το αποτέλεσμα στο βίντεο

Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Αργότερα, έγινε μια επιλογή με μετατροπέα ενίσχυσης, αλλά αυτό δεν σχετίζεται με τη λειτουργία του χωρητικού μικροκυκλώματος TTP223· υπάρχει περισσότερη επιθυμία για καλό και ομοιόμορφο φωτισμό όταν πατάτε τα πλήκτρα καθ 'όλη τη διάρκεια ζωής της μπαταρίας.

ματιάΑσύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Έργο Github - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

Ρωσόφωνο ιστότοπος της κοινότητας Mysensors

Συνομιλία Telegram Mysensors — γρήγορη λύση σε προβλήματα με Mysensors, συμβουλές, κόλπα, εγκατάσταση πλακών, εργασία με μικροελεγκτές atmega 328, stm32, nRF5 στο Arduino IDE — @mysensors_rus

Λίγες εικόνεςΑσύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Ασύρματος διακόπτης αφής με πρόσθετο οπίσθιο φωτισμό φθορισμού

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο