سوئیچ مینی لمسی با پنل شیشه ای روی nRF52832

در مقاله امروز می خواهم یک پروژه جدید را با شما به اشتراک بگذارم. این بار سوئیچ لمسی با پنل شیشه ای است. این دستگاه جمع و جور است و ابعاد آن 42×42 میلی متر است (پنل های شیشه ای استاندارد دارای ابعاد 80×80 میلی متر هستند). تاریخچه این دستگاه از مدت ها قبل یعنی حدود یک سال پیش آغاز شد.

سوئیچ مینی لمسی با پنل شیشه ای روی nRF52832

اولین گزینه ها روی میکروکنترلر atmega328 بود، اما در نهایت همه چیز با میکروکنترلر nRF52832 تمام شد.

سوئیچ مینی لمسی با پنل شیشه ای روی nRF52832

قسمت لمسی دستگاه بر روی تراشه های TTP223 اجرا می شود. هر دو سنسور با یک وقفه سروکار دارند. تغذیه با باتری CR2477، از طریق مبدل تقویت کننده در تراشه TPS610981 | برگه داده.

سوئیچ مینی لمسی با پنل شیشه ای روی nRF52832
سوئیچ مینی لمسی با پنل شیشه ای روی nRF52832

این دستگاه یک مدار قطع برق را با استفاده از ترانزیستورهای اثر میدانی اجرا می کند. پس از فشار دادن دکمه، خود میکروکنترلر کنترل برق را قطع می کند و سپس دکمه را می توان برای حالت های سرویس استفاده کرد (در مورد من، جفت شدن با دستگاه های دیگر، خاموش کردن برق و بازنشانی به تنظیمات کارخانه است).

2 rgb LED برای نشان دادن وضعیت ها و حالت های خدمات وجود دارد. یک امیتر پیزو نیز برای شبیه سازی کلیک هنگام لمس دکمه های لمسی و نشان دادن صدا از حالت های سرویس اضافه شده است. LED ها و امیتر پیزو را می توان به صلاحدید کاربر روشن و خاموش کرد. این کار از طریق کنترلر خانه هوشمند با ارسال فرمان به سنسورهای فنی انجام می شود؛ همچنین کاربر می تواند فواصل ارسال شارژ باتری و میزان سیگنال را نیز از طریق کنترلر خانه هوشمند تغییر دهد. در مورد من اینطور است ماجوردومو.

مصرف در حالت انتقال 7 میلی آمپر (250 کیلو بیت، 10 میلی‌ثانیه)، مصرف در حالت خواب 40 میکروآمپر، مصرف در حالت خاموش کمتر از 1 µA است (=مصرف مبدل تقویت کننده در حالت بیکار). کانکتور Rx، tx، swd برای برنامه نویسی ارائه شده است. یک کانکتور مینیاتوری 2x3p با گام 1.27 استفاده شده است. یک آداپتور مخصوص برای برنامه نویسی ساخته شده است.

سوئیچ مینی لمسی با پنل شیشه ای روی nRF52832

مانند همیشه، عملکرد دستگاه بر اساس پروتکل است MySensors. این سوئیچ لمسی برای استفاده در سیستم کنترل کرکره غلتکی برنامه ریزی شده است. اما به طور کلی، برنامه فقط توسط تخیل شما محدود می شود. به عنوان مثال، پسر من (7 ساله) قبلاً 3 سفارش برای نسخه های سوئیچ داده است: روشن و خاموش کردن چراغ توالت با وان (از کف نصب می شود)، برای روشن کردن چراغ در یک حمام. راهروی طولانی و تاریک هنگام سفر به یک توالت با وان، و یکی دیگر به عنوان کنار تخت، برای روشن کردن سریع چراغ اتاق خود به طوری که هیولاها فرار کنند.

سوئیچ مینی لمسی با پنل شیشه ای روی nRF52832
سوئیچ مینی لمسی با پنل شیشه ای روی nRF52832
سوئیچ مینی لمسی با پنل شیشه ای روی nRF52832

کیس به طور سنتی بر روی یک چاپگر SLA چاپ می شد، دستگاه مینیاتوری است، کیس کوچک است، استفاده از این فناوری چاپ توجیه می شود.

مشاهده مدل چاپ شدهسوئیچ مینی لمسی با پنل شیشه ای روی nRF52832
سوئیچ مینی لمسی با پنل شیشه ای روی nRF52832
سوئیچ مینی لمسی با پنل شیشه ای روی nRF52832

آهنرباها به بدنه و درب محفظه باتری چسبانده شده اند.

ویدئوهایی با تست های این دستگاه:



برای کسانی که می خواهند تکرار کنند:

کد برنامه را برای یک سوئیچ در سیستم کنترل کرکره غلتکی برای Arduino IDE تست کنید

سیم کشی آردوینو

int8_t timer_status = 0;
boolean sens_flag1 = 0;
boolean sens_flag2 = 0;
boolean switch_a = 0;
boolean switch_b = 0;
uint16_t temp;
float vcc;
int battery;
int old_battery;
uint32_t oldmillis;
uint32_t newmillis;
uint32_t interrupt_time;
uint32_t SLEEP_TIME = 7000;
uint32_t SLEEP_TIME_W;
uint32_t SLEEP_TIME_W2;
int NrfRSSI;
uint16_t NrfRSSI2;
boolean wait_off;
//#define MY_DEBUG
#define MY_DISABLED_SERIAL
#define MY_RADIO_NRF5_ESB
#define MY_PASSIVE_NODE
#define MY_NODE_ID 120
#define MY_PARENT_NODE_ID 0
#define MY_PARENT_NODE_IS_STATIC
#define MY_TRANSPORT_UPLINK_CHECK_DISABLED
#define POWER_CHILD_ID 110
#define UP_POWER_SWITCH_ID 1
#define DOWN_POWER_SWITCH_ID 2
#define CHILD_ID_nRF52_RSSI_RX 3
#define BAT_COOF 0.0092957746478873
#define BAT_MIN 200
#define BAT_MAX 290
#include <MySensors.h>
MyMessage upMsg(UP_POWER_SWITCH_ID, V_STATUS);
MyMessage downMsg(DOWN_POWER_SWITCH_ID, V_STATUS);
MyMessage powerMsg(POWER_CHILD_ID, V_VAR1);
MyMessage msgRF52RssiReceiv(CHILD_ID_nRF52_RSSI_RX, V_VAR1);
void preHwInit() {
pinMode(31, OUTPUT); //power management pin
digitalWrite(31, HIGH);
delay(3000);
pinMode(3, INPUT); // on off mode button
pinMode(25, OUTPUT); // sens1 led
pinMode(26, OUTPUT); // sens1 led
pinMode(27, OUTPUT); // sens1 led
pinMode(6, OUTPUT); // sens21 led
pinMode(7, OUTPUT); // sens2 led
pinMode(8, OUTPUT); // sens2 led
pinMode(28, OUTPUT); // bizzer
pinMode(2, INPUT); // common interrupt for touch sensors
pinMode(9, INPUT); // touch sensors1
pinMode(10, INPUT); //touch sensors2
pinMode(29, INPUT); // battery
digitalWrite(28, LOW);
digitalWrite(27, HIGH);
digitalWrite(26, HIGH);
digitalWrite(25, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
void before()
{
NRF_POWER->DCDCEN = 1;
analogReadResolution(12);
disableNfc();
turnOffAdc();
digitalWrite(25, LOW);
digitalWrite(6, LOW);
wait(200);
digitalWrite(25, HIGH);
digitalWrite(6, HIGH);
wait(100);
playSound0();
wait(100);
digitalWrite(25, LOW);
digitalWrite(6, LOW);
wait(200);
digitalWrite(25, HIGH);
digitalWrite(6, HIGH);
wait(3000);
digitalWrite(27, LOW);
digitalWrite(8, LOW);
wait(200);
digitalWrite(27, HIGH);
digitalWrite(8, HIGH);
wait(400);
digitalWrite(6, LOW);
digitalWrite(25, LOW);
wait(200);
digitalWrite(6, HIGH);
digitalWrite(25, HIGH);
wait(400);
digitalWrite(26, LOW);
digitalWrite(7, LOW);
wait(200);
digitalWrite(26, HIGH);
digitalWrite(7, HIGH);
wait(1000);
digitalWrite(26, LOW);
digitalWrite(7, LOW);
}
void setup()
{
digitalWrite(26, HIGH);
digitalWrite(7, HIGH);
wait(50);
playSound();
wait(2000);
readBatLev();
wait(200);
SLEEP_TIME_W = SLEEP_TIME;
}
void presentation()
{
sendSketchInfo("EFEKTA ON|OFF NODE 2CH", "1.0");
wait(100);
present(POWER_CHILD_ID, S_CUSTOM, "BATTERY DATA");
wait(100);
present(UP_POWER_SWITCH_ID, S_BINARY, "UP SWITCH");
wait(100);
present(DOWN_POWER_SWITCH_ID, S_BINARY, "DOWN SWITCH");
}
void loop()
{
if (sens_flag1 == 0 && sens_flag2 == 0) {
if (switch_a == 0 && switch_b == 0) {
timer_status = sleep(digitalPinToInterrupt(2), RISING, digitalPinToInterrupt(3), RISING, 3600000, false);
wait_off = 1;
} else {
//oldmillis = millis();
timer_status = sleep(digitalPinToInterrupt(2), RISING, digitalPinToInterrupt(3), RISING, SLEEP_TIME_W, false);
wait_off = 0;
}
}
if (timer_status == 3) {
wait(100);
digitalWrite(27, LOW);
digitalWrite(8, LOW);
wait(2000);
digitalWrite(27, HIGH);
digitalWrite(8, HIGH);
wait(100);
digitalWrite(31, LOW);
}
if (timer_status == 2) {
if (digitalRead(9) == HIGH && sens_flag1 == 0 && switch_b == 0) {
sens_flag1 = 1;
if (switch_a == 0) {
oldmillis = millis();
SLEEP_TIME_W = SLEEP_TIME;
switch_a = 1;
digitalWrite(6, LOW);
wait(10);
playSound1();
wait(20);
playSound2();
wait(50);
send(upMsg.set(switch_a));
wait(200);
} else {
switch_a = 0;
digitalWrite(6, HIGH);
wait(10);
playSound2();
wait(20);
playSound1();
wait(50);
send(upMsg.set(switch_a));
wait(200);
}
}
if (digitalRead(10) == HIGH && sens_flag2 == 0 && switch_a == 0) {
sens_flag2 = 1;
if (switch_b == 0) {
oldmillis = millis();
SLEEP_TIME_W = SLEEP_TIME;
switch_b = 1;
digitalWrite(25, LOW);
wait(10);
playSound1();
wait(20);
playSound2();
wait(50);
send(downMsg.set(switch_b));
wait(200);
} else {
switch_b = 0;
digitalWrite(25, HIGH);
wait(10);
playSound2();
wait(20);
playSound1();
wait(50);
send(downMsg.set(switch_b));
wait(200);
}
}
if (digitalRead(9) == LOW && sens_flag1 == 1) {
sens_flag1 = 0;
}
if (digitalRead(10) == LOW && sens_flag2 == 1) {
sens_flag2 = 0;
}
if (switch_a == 1 || switch_b == 1) {
if (wait_off == 0) {
newmillis = millis();
wait(10);
SLEEP_TIME_W2 = SLEEP_TIME_W;
wait(10);
interrupt_time = newmillis - oldmillis;
wait(10);
SLEEP_TIME_W = SLEEP_TIME_W2 - interrupt_time;
wait(10);
Serial.print("WAS IN A SLEEP: ");
Serial.print(newmillis - oldmillis);
Serial.println(" MILLISECONDS");
if (SLEEP_TIME_W < 1000) {
if (switch_a == 1) {
switch_a = 0;
digitalWrite(6, HIGH);
wait(10);
playSound2();
wait(20);
playSound1();
wait(50);
send(upMsg.set(switch_a));
wait(200);
}
if (switch_b == 1) {
switch_b = 0;
digitalWrite(25, HIGH);
wait(10);
playSound2();
wait(20);
playSound1();
wait(50);
send(downMsg.set(switch_b));
wait(200);
}
SLEEP_TIME_W = SLEEP_TIME;
wait(50);
}
Serial.println(SLEEP_TIME);
Serial.println(SLEEP_TIME_W);
Serial.println(SLEEP_TIME_W2);
Serial.print("GO TO SLEEP FOR: ");
Serial.print(SLEEP_TIME_W);
Serial.println(" MILLISECONDS");
}
oldmillis = millis();
}
}
if (timer_status == -1) {
if (switch_a == 1 || switch_b == 1) {
if (switch_a == 1) {
switch_a = 0;
digitalWrite(6, HIGH);
wait(10);
playSound2();
wait(20);
playSound1();
wait(50);
send(upMsg.set(switch_a));
wait(200);
}
if (switch_b == 1) {
switch_b = 0;
digitalWrite(25, HIGH);
wait(10);
playSound2();
wait(20);
playSound1();
wait(50);
send(downMsg.set(switch_b));
wait(200);
}
} else {
readBatLev();
}
}
}
void disableNfc() {
NRF_NFCT->TASKS_DISABLE = 1;
NRF_NVMC->CONFIG = 1;
NRF_UICR->NFCPINS = 0;
NRF_NVMC->CONFIG = 0;
}
void turnOffAdc() {
if (NRF_SAADC->ENABLE) {
NRF_SAADC->TASKS_STOP = 1;
while (NRF_SAADC->EVENTS_STOPPED) {}
NRF_SAADC->ENABLE = 0;
while (NRF_SAADC->ENABLE) {}
}
}
void myTone(uint32_t j, uint32_t k) {
j = 500000 / j;
k += millis();
while (k > millis()) {
digitalWrite(28, HIGH); delayMicroseconds(j);
digitalWrite(28, LOW ); delayMicroseconds(j);
}
}
void playSound0() {
myTone(1300, 50);
wait(20);
myTone(1300, 50);
wait(50);
}
void playSound() {
myTone(700, 30); 
wait(10);
myTone(700, 30);
wait(10);
myTone(700, 30);
wait(50);
}
void playSound1() {
myTone(200, 10);
wait(10);
myTone(400, 5);
wait(30);
}
void playSound2() {
myTone(400, 10);
wait(10);
myTone(200, 5);
wait(30);
}
void readBatLev() {
temp = analogRead(29);
vcc = temp * 0.0033 * 100;
battery = map((int)vcc, BAT_MIN, BAT_MAX, 0, 100);
if (battery < 0) {
battery = 0;
}
if (battery > 100) {
battery = 100;
}
sendBatteryLevel(battery, 1);
wait(2000, C_INTERNAL, I_BATTERY_LEVEL);
send(powerMsg.set(temp));
wait(200);
NrfRSSI = transportGetReceivingRSSI();
NrfRSSI2 = map(NrfRSSI, -85, -40, 0, 100);
if (NrfRSSI2 < 0) {
NrfRSSI2 = 0;
}
if (NrfRSSI2 > 100) {
NrfRSSI2 = 100;
}
send(msgRF52RssiReceiv.set(NrfRSSI2));
wait(200);
}

پرونده های موردی در stl - درایو گوگل

فایل های PCB Gerber - درایو گوگل

برای سوالاتی در مورد این توسعه، در مورد مشکلات پیشرفت شما در Arduinos و Mysensors همیشه در چت تلگرام ما کمک می کند - https://t.me/mysensors_rus.

منبع: www.habr.com

اضافه کردن نظر