اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

Habr تي “DIY or Do It Yourself” سيڪشن جي سڀني پڙهندڙن کي سلام! اڄ جو مضمون ٿيندو 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, پروٽوڪول, پرسر | انهن لاءِ جيڪي مدد ڪرڻ چاهين ٿا (contributions) منصوبي جي ترقي ۾ - دستاويزي)

ٽچ سوئچ بورڊ ڊيپ ٽريڪ پروگرام ۾ ترقي ڪئي وئي، ليزر آئرننگ ٽيڪنالاجي (LUT) طريقي سان استعمال ڪندي ايندڙ پيداوار کي مدنظر رکندي. بورڊ 60x60mm جي طول و عرض ۾ ترقي ڪئي وئي (هڪ معياري شيشي پينل 80x80mm جي طول و عرض آهي). سرڪٽ انٽينا ميگزين جي صفحن تي ڇپيل هو ۽ بوش آئرن سان "لين" سيٽنگ (وڌ کان وڌ پاور) سان ٻه طرفي ورق فائبر گلاس بورڊ 1.5mm، 35µm (ٻي جي غير موجودگي ۾) تي منتقل ڪيو ويو.
اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

خارش فيرڪ ڪلورائڊ جي حل سان ڪئي وئي، اڳ ۾ تيار ڪيل 1.5 چمچ في 250 ملي گرم پاڻي جي تناسب ۾. عمل 15 منٽ ورتو.
انٽرليئر ويز لاءِ سوراخ ڪرڻ ۽ بيٽري هولڊر کي تيز ڪرڻ لاءِ DREMEL 3000 ڊرل اسٽينڊ تي لڳل DREMEL 220 مني ڊرل سان ڪيو ويو. انٽرليئر ويز لاءِ سوراخ 0,4mm ڊرل سان، بيٽري هولڊر لاءِ سوراخ 1,1mm سان ڊرل ڪيا ويا. . بورڊ جي سرحدن کي تراشڻ هڪ ئي ميني ڊرل سان DREMEL 540 منسلڪ سان ڪيو ويو (ڪٽڻ وارو دائرو ڊي = 32.0mm). پرننگ هڪ respirator ۾ ڪيو ويو.
ايچ ٿيل بورڊ جي ٽيننگ گلاب مصر جي پاڻيءَ جي حل ۾ ڪئي وئي (1 چمچو ڪرسٽلائز سائٽرڪ ايسڊ في 300 مليل پاڻي).

سولڊرنگ جي عمل ۾ اٽڪل هڪ ڪلاڪ لڳندو هو، گهڻو وقت سولڊرنگ تار (ٽينڊ ٿيل، قطر ۾ 0.4 ملي ميٽر) انٽرليئر وياس لاءِ سوراخن ۾ خرچ ڪيو ويندو هو.

بورڊ کي FLUX OFF ايروسول ڪلينر سان ڌوئي ويو.
اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

ڊيوائس باڊي جي ڊيزائن کي ٽي-dimensional ڪمپيوٽر جي مدد سان ڊزائين ايڊيٽر ۾ ڪيو ويو. ڪيس جي ماپ 78,5mm X 78,5mm X 12mm.
اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

ڪيس جو مڪمل ماڊل ۽ بيٽري ڪمپارٽمينٽ کا احاطو STL فارميٽ ۾ محفوظ ڪيو ويو، پوءِ ضروري ھو ته انھن ماڊلز کي SLA پرنٽر تي ڇپائڻ لاءِ تيار ڪيو وڃي (سپورٽ، اورينٽيشن شامل ڪرڻ). هن مرحلي تي، هڪ ننڍڙو مسئلو پيدا ٿيو، ڇاڪاڻ ته گهريلو SLA پرنٽر جي پرنٽ جي ايراضي ننڍڙو آهي. پرنٽنگ وقت جي لحاظ کان سڀ کان وڌيڪ مناسب پوزيشن ۾ ڊوائيس ڪيس جو ماڊل ڇپائي واري علائقي جي طول و عرض ۾ مناسب نه هو. جڏهن ماڊل کي 45 درجا تي رکي، اهو پڻ مايوس ڪندڙ نتيجو ڏنو؛ سپورٽ جو وزن جسم جي ماڊل جي وزن جي برابر هو. اهو فيصلو ڪيو ويو ته ماڊل کي عمودي طور پرنٽ ڪرڻ، هڪ سامهون واري پاسي تي هڪ سپورٽ ٺاهي، پوسٽ پروسيسنگ جي حقيقت سان اڳ ۾ اتفاق ڪيو وڃي. جسم کي ڇپائڻ ۾ 5 ڪلاڪ لڳا 50 مائڪرن جي پرت سيٽنگ سان. اڳيون، پروسيسنگ تمام نفيس ٿيل سينڊ پيپر استعمال ڪندي ڪيو ويو (مان نمبر نه لکندس ڇو ته مون کي خبر ناهي :)). بيٽري جو ڍڪ ڇپجڻ ۾ 40 منٽ ورتو.
اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

Aliexpress کان شيشي پينل اڳ ۾ ئي ٺهيل پلاسٽڪ فريم سان وڪرو ڪيا ويا آهن؛ فريم کي هٽائڻ سان ڪو مسئلو ناهي. مون شيشي جي پينل کي باقاعده هيئر ڊرير سان گرم ڪرڻ کان پوءِ هٽائي ڇڏيو.
اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

LED backlight لاءِ ڊفيوزر ڊبل رخا ٽيپ مان ٺاھيو ويو آھي ايڪريڪ چپڪندڙ 3M 9088-200 سان. فلورسنٽ لائٽنگ لاءِ اتي ڪيترائي مواد هئا جن مان چونڊڻ لاءِ، چيني چپپڻ وارو ٽيپ ۽ چپپڻ وارو پيپر گهريلو ڪمپني Luminofor کان ٽيپ ۾ ڪٽيو ويو. چونڊ هڪ گهريلو ڪاريگر جي حق ۾ ڪيو ويو آهي؛ منهنجي جذبات موجب، ان کي روشن ۽ ڊگهو ٿي ويو. فلورسنٽ پگمينٽ سان ڪاغذ جو چورس مٿي تي 3M 9088-200 ڊبل رخا ٽيپ سان چپ ڪيو ويو هو.

شيشي کي 3M VHB 4910 acrylic Adhesive سان ڊبل رخا ٽيپ استعمال ڪندي سوئچ باڊي تي چمڪيو ويو.
اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

ڍڪ هڪ اسڪرو M 1,4 X 5 ملي ميٽر سان طئي ڪيو ويو.

هن ڊوائيس جي قيمت 890 روبل هئي.

اڳتي پروگرام جو حصو آيو. ڪجهه مسئلا هئا. اهو ظاهر ٿئي ٿو ته TTP223 سينسر چپس هڪ مستحڪم 3.3V پاور سپلائي سان تمام سٺو ڪم ڪن ٿا ۽ تمام سٺو ناهي جڏهن سڌو سنئون ڊسچارج ٿيل بيٽري مان هلايو وڃي. جڏهن ڊوائيس کي 2.5v جي چوڌاري پاور سپلائي سان شروع ڪيو وڃي، اضافي "ڊراوون" کان پوء جڏهن Mysensors جي پيشڪش کي ڪم ڪري رهيو آهي، TTP223 microcircuit (فوري طور تي حساب ڪرڻ کان پوء) MK جي مداخلت جو سبب بڻيو ڇاڪاڻ ته اهو هڪ فعال ٽرگر سان هو.

مائڪرو سرڪٽ کي پاور سپلائي سرڪٽ تبديل ڪيو ويو (پاور مئنيجمينٽ TTP223 gpio MK سان)، اضافي گرائونڊ فراهم ڪيو ويو، ۽ اعلي مزاحمت سان مزاحمت ڪندڙ 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

سوئچ ۾ هڪ ٽچ بٽڻ ۽ ڊوائيس جي پوئتي تي هڪ ٽيڪٽ بٽڻ آهي. هي ٽيڪٽ بٽڻ استعمال ڪيو ويندو سروس موڊس، اوور دي ايئر بائنڊنگ موڊ، ۽ ڊيوائس ري سيٽ. بٽڻ کي لوھ مخالف بائونس خصوصيت آھي. Capacitive sensor جي لڪير ۽ tact بٽڻ جي لڪير Schottky diodes ذريعي ڳنڍيل آهن ۽ اينالاگ پن p0.05 سان ڳنڍيل آهن، ۽ capacitive sensor ۽ tact بٽڻ مان پڻ MK پنن p0.25 ۽ p0.27 ڏانهن لائينون آهن. پن p0.05. 0.05 تي مداخلت کي چالو ڪرڻ کان پوء رياستن پڙهڻ لاء .XNUMX. پن pXNUMX تي، EVENTS_UP ذريعي موازنہ ڪندڙ (NRF_LPCOMP) ذريعي هڪ مداخلت چالو آهي. مون کي مسئلو حل ڪرڻ لاء وحي ملي هتي и هتي.

سوئچ کي Mysensors نيٽ ورڪ ۾ شامل ڪيو ويو، منظم ڪيو ويو سمارٽ هوم ڪنٽرولر Majordomo (منصوبو)

PHP ڪوڊ اسٽيٽس اپ ڊيٽ طريقي ۾ سوئچ شامل ڪرڻ لاءِ

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 capacitive microcircuit جي آپريشن سان لاڳاپيل ناهي؛ سڄي بيٽري جي زندگي ۾ چابيون کي دٻائڻ دوران سٺي ۽ يونيفارم روشني لاء وڌيڪ خواهش آهي.

ڏسواضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

پروجيڪٽ Github - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

روسي ڳالهائيندڙ ڪميونٽي سائيٽ ميسينسر

ٽيليگرام چيٽ Mysensors - Mysensors سان مسئلن جو تڪڙو حل، ٽوٽڪا، ترڪيبون، بورڊ انسٽال ڪرڻ، atmega 328، stm32، nRF5 microcontrollers سان Arduino IDE ۾ ڪم ڪرڻ. @mysensors_rus

ڪجھ تصويروناضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

اضافي فلورسنٽ بيڪ لائٽ سان وائرليس ٽچ سوئچ

جو ذريعو: www.habr.com

تبصرو شامل ڪريو