Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Ողջույններ Habr-ի «DIY or Do It Yourself» բաժնի բոլոր ընթերցողներին: Այսօրվա հոդվածը վերաբերելու է TTP223 չիպի սենսորային անջատիչին | տվյալների թերթիկ. Անջատիչը աշխատում է nRF52832 միկրոկոնտրոլերի վրա | տվյալների թերթիկ, օգտագործվել է YJ-17103 մոդուլ՝ տպված ալեհավաքով և արտաքին MHF4 ալեհավաքի միակցիչով։ Սենսորային անջատիչը աշխատում է CR2430 կամ CR2450 մարտկոցներով: Հաղորդման ռեժիմում սպառումը 8 մԱ-ից ոչ ավելի է, քնի ռեժիմում՝ 6 մԱ-ից ոչ ավելի:
Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Ինչպես բոլոր նախորդ նախագծերը, այս մեկը նույնպես Arduino նախագիծ է, ծրագիրը գրված է Arduino IDE-ով։ Սարքի ծրագրային ներդրումը հիմնված է Mysensors արձանագրության | GitHub գրադարաններ, nRF5 տախտակի աջակցություն GitHub-ին Mysensors-ում։ Անգլալեզու համայնքային ֆորում - http://forum.mysensors.org, ռուսալեզու համայնքային ֆորում - http://mysensors.ru/forum/
(Նրանց համար, ովքեր ցանկանում են սովորել. Փաստաթղթերով հիմնավորում, Սերիական արձանագրություն, API, Արձանագրություն, Վերլուծիչ | նրանց համար, ովքեր ցանկանում են օգնել (ներդրումներ) նախագծի մշակման մեջ՝ Փաստաթղթերով հիմնավորում)

Սենսորային անջատիչ տախտակը մշակվել է Deeptrace ծրագրում՝ հաշվի առնելով հետագա արտադրությունը՝ օգտագործելով լազերային արդուկման տեխնոլոգիայի (LUT) մեթոդը: Տախտակը մշակվել է 60x60 մմ չափսերով (ստանդարտ ապակե վահանակն ունի 80x80 մմ չափսեր): Շղթան տպվել է Antenna ամսագրի էջերում և Bosch արդուկով փոխանցվել «Len» պարամետրով (առավելագույն հզորություն) երկկողմանի փայլաթիթեղի ապակեպլաստե տախտակի վրա 1.5 մմ, 35 մկմ (մյուսի բացակայության դեպքում):
Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Փորագրումն իրականացվել է երկաթի քլորիդի լուծույթով, որը նախկինում պատրաստվել է 1.5 թեյի գդալ 250 մլ տաք ջրի դիմաց: Գործընթացը տեւել է 15 րոպե։
Հորատման անցքեր միջշերտային միջանցքների և մարտկոցի ամրակի ամրացման համար կատարվել են DREMEL 3000 մինի-գայթակղիչով, որը տեղադրված է DREMEL 220 գայլիկոնի վրա, միջշերտային միջանցքների համար անցքեր են փորվել 0,4 մմ գայլիկով, մարտկոցի համար նախատեսված անցքեր՝ 1,1 մմ գայլիկով: . Տախտակի եզրագծերի երկայնքով կտրումը կատարվել է DREMEL 540 կցորդով նույն մինի փորվածքով (Կտրող շրջան d=32.0մմ): Էտումը կատարվել է ռեսպիրատորով։
Փորագրված տախտակի թիթեղավորումը կատարվել է վարդի խառնուրդի միջոցով ջրային լուծույթում (1 թեյի գդալ բյուրեղացված կիտրոնաթթու 300 մլ ջրի դիմաց):

Զոդման գործընթացը տևել է մոտ մեկ ժամ, ժամանակի մեծ մասը ծախսվել է միջշերտային միջանցքների անցքերում մետաղալարերի զոդման համար (թիթեղապատ, 0.4 մմ տրամագծով):

Տախտակը լվացվել է FLUX OFF աերոզոլային մաքրիչով:
Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Սարքի կորպուսի նախագծումն իրականացվել է համակարգչային նախագծման եռաչափ խմբագիրով: Գործի չափերը 78,5 մմ X 78,5 մմ X 12 մմ:
Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Գործի և մարտկոցի խցիկի կափարիչի ավարտված մոդելը պահպանվել է STL ձևաչափով, այնուհետև անհրաժեշտ է եղել պատրաստել այս մոդելները SLA տպիչի վրա տպագրության համար (հենակետեր ավելացնելու, կողմնորոշում): Այս փուլում փոքր խնդիր առաջացավ, քանի որ կենցաղային SLA տպիչների տպագրության տարածքը փոքր է: Սարքի պատյանի մոդելը տպագրության ժամանակի համեմատ ամենաօպտիմալ դիրքում չէր տեղավորվում տպագրական տարածքի չափսերի մեջ: Մոդելը 45 աստիճանի վրա դնելիս նույնպես հիասթափեցնող արդյունք տվեց՝ հենարանի քաշը հավասար էր մարմնի մոդելի քաշին։ Որոշվել է մոդելը տպել ուղղահայաց՝ առջեւի կողմերից մեկում հենարան անելով՝ նախապես համաձայնվելով հետմշակման փաստի հետ։ Մարմնի տպումը տևել է 5 ժամ՝ 50 միկրոն շերտով: Այնուհետև մշակումն իրականացվել է շատ նուրբ հղկաթուղթով (թիվը չեմ գրի, քանի որ չգիտեմ :)): Մարտկոցի կափարիչի տպումը տևել է 40 րոպե:
Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Aliexpress-ի ապակե վահանակները վաճառվում են արդեն սոսնձված պլաստիկ շրջանակով, շրջանակը հեռացնելու հետ կապված խնդիրներ չեն եղել: Ես հանեցի ապակե վահանակը սովորական վարսահարդարիչով նախապես տաքացնելուց հետո:
Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

LED հետին լույսի դիֆուզերը պատրաստված է երկկողմանի ժապավենից՝ ակրիլային սոսինձով 3M 9088-200: Լյումինեսցենտային լուսավորության համար կարող էին ընտրել մի քանի նյութեր՝ չինական կպչուն ժապավեն և ժապավենի մեջ կտրված կպչուն թուղթ տեղական Luminofor ընկերության կողմից: Ընտրությունը կատարվել է հայրենական արտադրողի օգտին, ըստ իմ զգացողությունների՝ այն ավելի պայծառ ու երկար էր փայլում։ Վերևում 3M 9088-200 երկկողմանի ժապավենով սոսնձվել է լյումինեսցենտային պիգմենտով քառակուսի թուղթ:

Ապակին սոսնձվել է անջատիչի մարմնին՝ օգտագործելով երկկողմանի ժապավեն՝ 3M VHB 4910 ակրիլային սոսինձով:
Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Կափարիչը ամրացվել է M 1,4 X 5 մմ պտուտակով:

Սարքի արժեքը կազմել է 890 ռուբլի։

Հաջորդիվ եկավ ծրագրային մասը։ Որոշ խնդիրներ կային։ Պարզվում է, որ TTP223 սենսորային չիպերը հիանալի աշխատում են կայունացված 3.3 Վ սնուցման հետ և ոչ այնքան լավ, երբ սնվում են անմիջապես լավ լիցքաթափված մարտկոցից: Սարքը մոտ 2.5 վ սնուցմամբ սնուցմամբ գործարկելիս, գումարած Mysensors-ի ներկայացումը մշակելիս լրացուցիչ «թուլացումից» հետո, TTP223 միկրոսխեման (չափորոշումից անմիջապես հետո) առաջացրել է MK-ի ընդհատում, քանի որ այն եղել է ակտիվ ձգանով:

Փոխվել է միկրոսխեմայի էլեկտրամատակարարման սխեման (էներգիայի կառավարում TTP223 gpio MK-ով), մատակարարվել է լրացուցիչ հող, և ավելի բարձր դիմադրությամբ ռեզիստորները փոխարինվել են rgb led գծերի վրա (որոնք աշխատում են կոնդենսիվ սենսորային տախտակի մյուս կողմում): Այն նաև ավելացվեց ծրագրային ապահովման մեջ. հզորության ակտիվացում կոնդենսիվ միկրոսխեմայի համար 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()
{

}

Touch switch ծրագրի փորձարկման կոդը.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

Անջատիչը սարքի հետևի մասում ունի հպման կոճակ և տակտային կոճակ: Այս նրբանկատ կոճակը կօգտագործվի սպասարկման ռեժիմների, օդային կապի ռեժիմի և սարքի վերակայման համար: Կոճակն ունի երկաթե հակացատկման հատկություն: Կապակցիվ սենսորի գիծը և ժամացույցի կոճակի գիծը միացված են 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 chat Mysensors — Mysensors-ի հետ կապված խնդիրների արագ լուծում, խորհուրդներ, հնարքներ, տախտակների տեղադրում, atmega 328, stm32, nRF5 միկրոկոնտրոլերների հետ աշխատել Arduino IDE-ում — @mysensors_rus

Որոշ լուսանկարներԱնլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Անլար հպման անջատիչ՝ լրացուցիչ լյումինեսցենտային լուսավորությամբ

Source: www.habr.com

Добавить комментарий