สวิตช์สัมผัสไร้สายพร้อมไฟเรืองแสงเพิ่มเติม

สวัสดีผู้อ่านทุกคนในส่วน "DIY หรือ Do It Yourself" บน Habr! บทความวันนี้จะเกี่ยวกับสวิตช์สัมผัสบนชิป TTP223 | แผ่นข้อมูล. สวิตช์ทำงานบนไมโครคอนโทรลเลอร์ nRF52832 | แผ่นข้อมูลมีการใช้โมดูล YJ-17103 พร้อมเสาอากาศแบบพิมพ์และขั้วต่อสำหรับเสาอากาศ MHF4 ภายนอก สวิตช์สัมผัสทำงานด้วยแบตเตอรี่ CR2430 หรือ CR2450 ปริมาณการใช้ในโหมดส่งสัญญาณไม่เกิน 8 mA ในโหมดสลีปไม่เกิน 6 µA
สวิตช์สัมผัสไร้สายพร้อมไฟเรืองแสงเพิ่มเติม

เช่นเดียวกับโปรเจ็กต์ก่อนหน้านี้ทั้งหมด อันนี้ก็เป็นโปรเจ็กต์ Arduino เช่นกัน โปรแกรมเขียนใน Arduino IDE การใช้งานซอฟต์แวร์ของอุปกรณ์จะขึ้นอยู่กับโปรโตคอล Mysensors | ไลบรารี GitHub, บอร์ด nRF5 รองรับ GitHub ในไมเซนเซอร์ ฟอรั่มชุมชนภาษาอังกฤษ - http://forum.mysensors.org, ฟอรั่มชุมชนภาษารัสเซีย - http://mysensors.ru/forum/
(สำหรับผู้ที่ต้องการเรียน - เอกสาร, โปรโตคอลอนุกรม, API, มาตรการ, พาร์เซอร์ | สำหรับผู้ที่ประสงค์จะช่วยเหลือ (ผลงาน) ในการพัฒนาโครงการ - เอกสาร)

แผงสวิตช์สัมผัสได้รับการพัฒนาในโปรแกรม Deeptrace โดยคำนึงถึงการผลิตในภายหลังโดยใช้วิธี Laser Ironing Technology (LUT) กระดานได้รับการพัฒนาในขนาด 60x60 มม. (แผงกระจกมาตรฐานมีขนาด 80x80 มม.) วงจรถูกพิมพ์บนหน้านิตยสาร Antenna และถ่ายโอนด้วยเตารีดของ Bosch ที่มีการตั้งค่า "Len" (กำลังสูงสุด) บนแผ่นฟอยล์ไฟเบอร์กลาสสองด้าน 1.5 มม., 35µm (ในกรณีที่ไม่มีแผ่นอื่น)
สวิตช์สัมผัสไร้สายพร้อมไฟเรืองแสงเพิ่มเติม

การแกะสลักดำเนินการด้วยสารละลายเฟอร์ริกคลอไรด์ซึ่งเตรียมไว้ก่อนหน้านี้ในสัดส่วน 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.3V ที่เสถียรและทำงานได้ไม่ดีนักเมื่อจ่ายไฟโดยตรงจากแบตเตอรี่ที่คายประจุออกมาดี เมื่อสตาร์ทอุปกรณ์ด้วยแหล่งจ่ายไฟประมาณ 2.5v บวกหลังจาก "ดรอดาวน์" เพิ่มเติมเมื่อทำงานกับการนำเสนอของ Mysensors ไมโครเซอร์กิต TTP223 (ทันทีหลังการสอบเทียบ) ทำให้เกิดการหยุดชะงักของ MK เนื่องจากมีทริกเกอร์ที่ใช้งานอยู่

วงจรจ่ายไฟไปยังไมโครวงจรเปลี่ยนไป (การจัดการพลังงาน TTP223 ด้วย gpio MK) มีการจ่ายกราวด์เพิ่มเติมและแทนที่ตัวต้านทานที่มีความต้านทานสูงกว่าบนเส้น LED RGB (ซึ่งทำงานที่อีกด้านหนึ่งของบอร์ดเซ็นเซอร์ capacitive) มันยังถูกเพิ่มเข้าไปในซอฟต์แวร์ด้วย: การเปิดใช้งานพลังงานสำหรับไมโครวงจรแบบคาปาซิทีฟหลังจากเริ่มเฟรมเวิร์ก Mysensors และดำเนินการนำเสนอ ความล่าช้าในการปรับเทียบอัตโนมัติของชิป TTP223 เมื่อมีการจ่ายไฟเพิ่มขึ้นเป็นสองเท่า การเปลี่ยนแปลงทั้งหมดนี้ช่วยขจัดปัญหานี้ได้อย่างสมบูรณ์

ก่อนที่จะดูโค้ดโปรแกรม ฉันขอแนะนำให้คุณทำความคุ้นเคยกับโครงสร้างพื้นฐานของภาพร่างใน Mysensorsvoid before()
{
// Дополнительная функция, если сравнивать со стандартной структурой Ардуино скетчей, то before() это подобие setup(), отработка происходит до инициализации транспортного уровня Mysensors, рекомендуется например для инициализации устройств SPI
}

การตั้งค่าเป็นโมฆะ ()
{

}

ปัจจุบันว่าง()
{
//ที่นี่โหนดและเซ็นเซอร์จะถูกนำเสนอให้กับตัวควบคุมผ่านเราเตอร์
sendSketchInfo("ชื่อโหนดเซ็นเซอร์ของฉัน", "1.0"); // การนำเสนอชื่อโหนด, เวอร์ชันซอฟต์แวร์
present(CHILD_ID, S_WHATEVER, "Description"); // การนำเสนอเซ็นเซอร์โหนด, คำอธิบายของเซ็นเซอร์
}

ห่วงเป็นโมฆะ ()
{

}

รหัสทดสอบโปรแกรมสวิตช์สัมผัส: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;

#กำหนดวิทยุของฉัน_NRF5_ESB
//#กำหนด MY_PASSIVE_NODE
#กำหนด MY_NODE_ID 30
#กำหนด MY_PARENT_NODE_ID 0
#กำหนด MY_PARENT_NODE_IS_STATIC
#กำหนด MY_TRANSPORT_UPLINK_CHECK_DISABLED
#define IRT_PIN 3 //(PORT0, gpio 5)
#รวม
// ดู https://www.mysensors.org/download/serial_api_20
#กำหนด SENS_CHILD_ID 0
#กำหนด CHILD_ID_VOLT 254
ข้อความของฉัน sensMsg(SENS_CHILD_ID, V_VAR1);
//ข้อความของฉัน voltMsg(CHILD_ID_VOLT, V_VOLTAGE);

เป็นโมฆะ preHwInit() {
นอนหลับ (2000);
pinMode(ไฟ LED สีแดง, เอาต์พุต);
digitalWrite(ไฟ LED สีแดง, สูง);
pinMode(ไฟ GREEN_LED, เอาต์พุต);
digitalWrite(ไฟ LED สีเขียว, สูง);
pinMode(BLUE_LED, OUTPUT);
digitalWrite(BLUE_LED, สูง);
pinMode(MODE_PIN, INPUT);
pinMode(SENS_PIN, อินพุต);
}

ว่างเปล่าก่อน()
{
NRF_POWER->DCDCEN = 1;
NRF_UART0->เปิดใช้งาน = 0;
นอนหลับ (1000);
digitalWrite(ไฟ LED สีน้ำเงิน, ต่ำ);
นอนหลับ (150);
digitalWrite(BLUE_LED, สูง);
}

ปัจจุบันเป็นโมฆะ() {
sendSketchInfo("เซ็นเซอร์ EFEKTA Sens 1CH", "1.1");
ปัจจุบัน (SENS_CHILD_ID, S_CUSTOM, "สถานะสวิตช์");
//present(CHILD_ID_VOLT, S_MULTIMETER, "แบตเตอรี่");
}

การตั้งค่าเป็นโมฆะ () {
digitalWrite(ไฟ LED สีน้ำเงิน, ต่ำ);
นอนหลับ (100);
digitalWrite(BLUE_LED, สูง);
นอนหลับ (200);
digitalWrite(ไฟ LED สีน้ำเงิน, ต่ำ);
นอนหลับ (100);
digitalWrite(BLUE_LED, สูง);
lpComp() ;
การตรวจจับ = เท็จ;
SLEEP_TIME_W = เวลานอนหลับ;
โหมดพิน (31, เอาต์พุต);
digitalWrite (31, สูง);
/*
while (ตัวจับเวลา < 10) {
ตัวจับเวลา++;
digitalWrite(ไฟ GREEN_LED, ต่ำ);
รอ (5);
digitalWrite(ไฟ LED สีเขียว, สูง);
รอ (500);
}
ตัวจับเวลา = 0;
*/
นอนหลับ (7000);
while (ตัวจับเวลา < 3) {
ตัวจับเวลา++;
digitalWrite(ไฟ GREEN_LED, ต่ำ);
นอนหลับ (15);
digitalWrite(ไฟ LED สีเขียว, สูง);
นอนหลับ (85);
}
ตัวจับเวลา = 0;
นอนหลับ (1000);
}

ห่วงเป็นโมฆะ () {

หาก (การตรวจจับ) {
หาก (digitalRead(MODE_PIN) == 1 และ button_flag == 0 และ digitalRead(SENS_PIN) == 0) {
//การตรวจจับปุ่มด้านหลัง
ปุ่ม_ธง = 1;
ง่วงนอน = 1;
}
หาก (digitalRead(MODE_PIN) == 1 และ button_flag == 1 และ digitalRead(SENS_PIN) == 0) {
digitalWrite(ไฟ LED สีแดง, ต่ำ);
รอ (10);
digitalWrite(ไฟ LED สีแดง, สูง);
รอ (50);
}
หาก (digitalRead(MODE_PIN) == 0 และ button_flag == 1 และ digitalRead(SENS_PIN) == 0) {
ง่วงนอน = 0;
ปุ่ม_ธง = 0;
digitalWrite(ไฟ LED สีแดง, สูง);
lpComp_รีเซ็ต()
}

หาก (digitalRead(SENS_PIN) == 1 และ sens_flag == 0 และ digitalRead(MODE_PIN) == 0) {
//การตรวจจับความรู้สึก
ธงสัมผัส = 1;
ง่วงนอน = 1;
newmillis = มิลลิส();
interrupt_time = newmillis - มิลลิสเก่า;
SLEEP_TIME_W = SLEEP_TIME_W - เวลาขัดจังหวะ;
หาก (send(sensMsg.set(detection))) {
ส่ง_ธง = 1;
}
}
หาก (digitalRead(SENS_PIN) == 1 และ sens_flag == 1 และ digitalRead(MODE_PIN) == 0) {
ถ้า (send_flag == 1) {
while (ตัวจับเวลา < 10) {
ตัวจับเวลา++;
digitalWrite(ไฟ GREEN_LED, ต่ำ);
รอ (20);
digitalWrite(ไฟ LED สีเขียว, สูง);
รอ (30);
}
ตัวจับเวลา = 0;
} else {
while (ตัวจับเวลา < 10) {
ตัวจับเวลา++;
digitalWrite(ไฟ LED สีแดง, ต่ำ);
รอ (20);
digitalWrite(ไฟ LED สีแดง, สูง);
รอ (30);
}
ตัวจับเวลา = 0;
}
}
หาก (digitalRead(SENS_PIN) == 0 และ sens_flag == 1 และ digitalRead(MODE_PIN) == 0) {
ธงสัมผัส = 0;
ง่วงนอน = 0;
ส่ง_ธง = 0;
digitalWrite(ไฟ LED สีเขียว, สูง);
นอนหลับ (500);
lpComp_รีเซ็ต()
}
ถ้า (SLEEP_TIME_W < 60000) {
SLEEP_TIME_W = เวลานอนหลับ;
ส่งสถานะแบตเตอรี่();
}
}
else {
//ถ้าการตรวจจับ == -1 {
SLEEP_TIME_W = เวลานอนหลับ;
ส่งสถานะแบตเตอรี่();
}
ถ้า (nosleep == 0) {
oldmillis = มิลลิส();
นอนหลับ(SLEEP_TIME_W);
}
}

โมฆะ sendBatteryStatus() {
รอ (20);
แรงดันแบตเตอรี่ = hwCPUVoltage();
รอ (2);

หาก (แรงดันแบตเตอรี่ > แบตเตอรี่ vcc_max) {
เปอร์เซ็นต์แบตเตอรี่ปัจจุบัน = 100;
}
มิฉะนั้นหาก (แรงดันแบตเตอรี่ < battery_vcc_min) {
เปอร์เซ็นต์แบตเตอรี่ปัจจุบัน = 0;
} else {
เปอร์เซ็นต์แบตเตอรี่ปัจจุบัน = (100 * (แรงดันแบตเตอรี่ - battery_vcc_min)) / (battery_vcc_max - battery_vcc_min);
}

ส่งระดับแบตเตอรี่(เปอร์เซ็นต์แบตเตอรี่ปัจจุบัน, 1);
รอ (2000, C_INTERNAL, I_BATTERY_LEVEL);
//ส่ง(powerMsg.set(แรงดันแบตเตอรี่), 1);
//รอ(2000, 1, V_VAR1);
}

เป็นโมฆะ lpComp() {
NRF_LPCOMP->PSEL = IRT_PIN;
NRF_LPCOMP->ANADETECT = 1;
NRF_LPCOMP->INTENSET = B0100;
NRF_LPCOMP->เปิดใช้งาน = 1;
NRF_LPCOMP->TASKS_START = 1;
NVIC_SetPriority (LPCOMP_IRQn, 15)
NVIC_ClearPendingIRQ(LPCOMP_IRQn) เคลียร์ IRQ ที่รอดำเนินการ
NVIC_EnableIRQ(LPCOMP_IRQn) เปิดใช้งาน IRQ
}

เป็นโมฆะ s_lpComp() {
หาก ((NRF_LPCOMP->ENABLE) และ (NRF_LPCOMP->EVENTS_READY)) {
NRF_LPCOMP->INTENCLR = B0100;
}
}

เป็นโมฆะ r_lpComp() {
NRF_LPCOMP->INTENSET = B0100;
}

#ถ้า __CORTEX_M == 0x04
#define NRF5_RESET_EVENT(เหตุการณ์)
เหตุการณ์ = 0;
(เหตุการณ์)เป็นโมฆะ
#อื่น
#define NRF5_RESET_EVENT(เหตุการณ์) เหตุการณ์ = 0
#เอนดิฟ

ภายนอก "C" {
LPCOMP_IRQHandler เป็นโมฆะ (void) {
การตรวจจับ = เป็นจริง;
NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_UP) เริ่มต้น
NRF_LPCOMP->EVENTS_UP = 0;
MY_HW_RTC->CC[0] = (MY_HW_RTC->COUNTER + 2);
}
}

เป็นโมฆะ lpComp_reset() {
s_lpComp() คำสั่ง
การตรวจจับ = เท็จ;
NRF_LPCOMP->EVENTS_UP = 0;
r_lpComp()
}

มายบอร์ดNRF5.cpp
#ifdef MYBOARDNRF5
#include <variant.h>

/*
*คำอธิบายพิน คุณลักษณะต่างๆ จะถูกละเว้นโดยตัวแปร Arduino-NRF5
* คำจำกัดความที่นำมาจาก Arduino Primo Core พร้อมพอร์ตที่เรียงลำดับ
*/
const PinDescription g_APinDescription[]=
{
{ NOT_A_PORT, 0, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มีช่อง ADC, NOT_ON_PWM, NOT_ON_TIMER}, // LFCLK
{ NOT_A_PORT, 1, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มีช่อง ADC, NOT_ON_PWM, NOT_ON_TIMER}, // LFCLK
พอร์ต 0, 2, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A0, PWM4, NOT_ON_TIMER},
พอร์ต 0, 3, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A1, PWM5, NOT_ON_TIMER},
พอร์ต 0, 4, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A2, PWM6, NOT_ON_TIMER},
พอร์ต 0, 5, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A3, PWM7, NOT_ON_TIMER},
{พอร์ต0, 6, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มีช่อง ADC, NOT_ON_PWM, NOT_ON_TIMER}, // INT3
{พอร์ต0, 7, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มีช่อง ADC, NOT_ON_PWM, NOT_ON_TIMER}, // INT4
พอร์ต 0, 8, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ไม่มีช่อง ADC, PWM10, NOT_ON_TIMER}, //USER_LED
{ พอร์ต 0, 9, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // NFC1
{ พอร์ต 0, 10, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // NFC2
{ พอร์ต 0, 11, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TX
{ พอร์ต 0, 12, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มี ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // RX
{ พอร์ต 0, 13, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มี ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SDA
{ พอร์ต 0, 14, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มี ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SCL
{ พอร์ต 0, 15, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มี ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SDA1
{ พอร์ต 0, 16, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มี ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // SCL1
{ พอร์ต 0, 17, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มี ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TP4
{ พอร์ต 0, 18, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มี ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // TP5
{พอร์ต0, 19, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มีช่อง ADC, NOT_ON_PWM, NOT_ON_TIMER}, // INT2
{พอร์ต0, 20, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มีช่อง ADC, NOT_ON_PWM, NOT_ON_TIMER}, // INT1
{พอร์ต0, 21, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มีช่อง ADC, NOT_ON_PWM, NOT_ON_TIMER}, // INT1
{ พอร์ต 0, 22, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ไม่มีช่อง ADC, PWM9, NOT_ON_TIMER},
{ พอร์ต 0, 23, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ไม่มีช่อง ADC, PWM8, NOT_ON_TIMER},
{ พอร์ต 0, 24, PIO_DIGITAL, PIN_ATTR_DIGITAL, ไม่มี ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER}, // INT
พอร์ต 0, 25, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ไม่มีช่อง ADC, PWM11, NOT_ON_TIMER}, // ไฟ LED สีแดง
{ พอร์ต 0, 26, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ไม่มีช่อง ADC, PWM11, NOT_ON_TIMER}, // ไฟ LED สีเขียว
พอร์ต 0, 27, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ไม่มีช่อง ADC, PWM11, NOT_ON_TIMER}, //BLUE_LED
พอร์ต 0, 28, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A4, PWM3, NOT_ON_TIMER},
พอร์ต 0, 29, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A5, PWM2, NOT_ON_TIMER},
พอร์ต 0, 30, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A6, PWM1, NOT_ON_TIMER},
พอร์ต 0, 31, PIO_DIGITAL, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), ADC_A7, PWM0, NOT_ON_TIMER
};

//อย่าลบบรรทัดนี้ออก
#รวม

#เอนดิฟ

มายบอร์ดNRF5.h
#ifndef _MYBOARDNRF5_H_
#define _MYBOARDNRF5_H_

#ifdef __cplusplus
ภายนอก "C"
{
#endif // __cplusplus

// จำนวนพินที่กำหนดไว้ในอาร์เรย์ PinDescription
#กำหนด PINS_COUNT (32u)
#กำหนด NUM_DIGITAL_PINS (32u)
#กำหนด NUM_ANALOG_INPUTS (8u)
#กำหนด NUM_ANALOG_OUTPUTS (8u)

/*
* ไฟ LED
*
* นี้เป็นทางเลือก
*
* ด้วย My Sensors คุณสามารถใช้
* hwPinMode() แทน pinMode()
* hwPinMode() ช่วยให้สามารถใช้โหมดขั้นสูง เช่น OUTPUT_H0H1 ในการขับเคลื่อน LED
* https://github.com/mysensors/MySensors/blob/development/drivers/NRF5/nrf5_wiring_constants.h
*
*/
#กำหนด PIN_LED1 (16)
#กำหนด PIN_LED2 (15)
#กำหนด PIN_LED3 (17)
#กำหนดไฟ LED สีแดง (PIN_LED1)
#กำหนดไฟ LED สีเขียว (PIN_LED2)
#กำหนดไฟ LED สีน้ำเงิน (PIN_LED3)
#กำหนด INTERRUPT_PIN (5)
#กำหนดโหมด_PIN (25)
#กำหนด SENS_PIN (27)

/*
* พอร์ตอะนาล็อก
*
* หากคุณเปลี่ยน g_APinDescription ให้แทนที่ PIN_AIN0 ด้วย
* หมายเลขพอร์ตที่แมปโดยอาร์เรย์ g_APinDescription
* คุณสามารถเพิ่ม PIN_AIN0 ลงในอาร์เรย์ g_APinDescription ได้หาก
* คุณต้องการให้พอร์ตอนาล็อก MCU อิสระ คุณสามารถเพิ่มได้
* PIN_AIN0..PIN_AIN7 ไปยังอาร์เรย์ g_APinDescription ที่กำหนดเองของคุณ
* กำหนดไว้ใน MyBoardNRF5.cpp
*/
คงที่ const uint8_t A0 = ADC_A0;
คงที่ const uint8_t A1 = ADC_A1;
คงที่ const uint8_t A2 = ADC_A2;
คงที่ const uint8_t A3 = ADC_A3;
คงที่ const uint8_t A4 = ADC_A4;
คงที่ const uint8_t A5 = ADC_A5;
คงที่ const uint8_t A6 = ADC_A6;
คงที่ const uint8_t A7 = ADC_A7;

/*
* อินเทอร์เฟซแบบอนุกรม
*
* จำเป็นต้องมี RX และ TX
* หากไม่มีพอร์ตซีเรียล ให้ใช้พินที่ไม่ได้ใช้
* CTS และ RTS เป็นทางเลือก
*/
#กำหนด PIN_SERIAL_RX (11)
#กำหนด PIN_SERIAL_TX (12)

#ifdef __cplusplus
}
#เอนดิฟ

#เอนดิฟ

สวิตช์มีปุ่มสัมผัสและปุ่มสัมผัสที่ด้านหลังของอุปกรณ์ ปุ่มชั้นเชิงนี้จะใช้สำหรับโหมดบริการ โหมดการเชื่อมโยงแบบ over-the-air และการรีเซ็ตอุปกรณ์ ปุ่มมีคุณสมบัติป้องกันการสะท้อนของเหล็ก เส้นของเซ็นเซอร์ capacitive และเส้นของปุ่มชั้นเชิงนั้นเชื่อมต่อผ่านไดโอด Schottky และเชื่อมต่อกับพินอะนาล็อก p0.05 และจากเซ็นเซอร์ capacitive และปุ่มชั้นเชิงจะมีเส้นไปยังหมุด 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');
} 
}

ดูผลลัพธ์ในวิดีโอ

เล่นวิดีโอ

สวิตช์สัมผัสไร้สายพร้อมไฟเรืองแสงเพิ่มเติม

ต่อมามีตัวเลือกถูกสร้างขึ้นด้วยบูสต์คอนเวอร์เตอร์ แต่สิ่งนี้ไม่เกี่ยวข้องกับการทำงานของวงจรไมโคร capacitive TTP223 มีความต้องการการส่องสว่างที่ดีและสม่ำเสมอมากขึ้นเมื่อกดปุ่มตลอดอายุการใช้งานแบตเตอรี่

ดูสวิตช์สัมผัสไร้สายพร้อมไฟเรืองแสงเพิ่มเติม

สวิตช์สัมผัสไร้สายพร้อมไฟเรืองแสงเพิ่มเติม

โครงการ Github - github.com/smartboxchannel/EFEKTA_WIRELESS_TOUCH_SWITCH

พูดภาษารัสเซีย เว็บไซต์ชุมชน ไมเซนเซอร์

โทรเลขแชท Mysensors — วิธีแก้ไขปัญหาอย่างรวดเร็วเกี่ยวกับ Mysensors เคล็ดลับ เคล็ดลับ การติดตั้งบอร์ด การทำงานกับไมโครคอนโทรลเลอร์ atmega 328, stm32, nRF5 ใน Arduino IDE — @mysensors_rus

ภาพถ่ายบางส่วนสวิตช์สัมผัสไร้สายพร้อมไฟเรืองแสงเพิ่มเติม

สวิตช์สัมผัสไร้สายพร้อมไฟเรืองแสงเพิ่มเติม

สวิตช์สัมผัสไร้สายพร้อมไฟเรืองแสงเพิ่มเติม

สวิตช์สัมผัสไร้สายพร้อมไฟเรืองแสงเพิ่มเติม

สวิตช์สัมผัสไร้สายพร้อมไฟเรืองแสงเพิ่มเติม

ที่มา: will.com

ซื้อโฮสติ้งที่เชื่อถือได้สำหรับไซต์ที่มีการป้องกัน DDoS เซิร์ฟเวอร์ VPS VDS 🔥 ซื้อบริการเว็บโฮสติ้งที่เชื่อถือได้ พร้อมระบบป้องกัน DDoS และเซิร์ฟเวอร์ VPS/VDS | ProHoster