nRF52832 پر گلاس پینل کے ساتھ منی ٹچ سوئچ

آج کے مضمون میں میں آپ کے ساتھ ایک نیا پروجیکٹ شیئر کرنا چاہتا ہوں۔ اس بار یہ شیشے کے پینل کے ساتھ ٹچ سوئچ ہے۔ ڈیوائس کمپیکٹ ہے، جس کی پیمائش 42x42mm ہے (معیاری شیشے کے پینلز کے طول و عرض 80x80mm ہیں)۔ اس ڈیوائس کی تاریخ کا آغاز ایک طویل عرصہ پہلے یعنی تقریباً ایک سال پہلے ہوا۔

nRF52832 پر گلاس پینل کے ساتھ منی ٹچ سوئچ

پہلے اختیارات atmega328 مائیکرو کنٹرولر پر تھے، لیکن آخر میں یہ سب nRF52832 مائیکرو کنٹرولر کے ساتھ ختم ہوا۔

nRF52832 پر گلاس پینل کے ساتھ منی ٹچ سوئچ

ڈیوائس کا ٹچ حصہ TTP223 چپس پر چلتا ہے۔ دونوں سینسر ایک وقفے کے ذریعہ پیش کیے جاتے ہیں۔ TPS2477 چپ پر بوسٹ کنورٹر کے ذریعے CR610981 بیٹری سے تقویت یافتہ | ڈیٹا شیٹ.

nRF52832 پر گلاس پینل کے ساتھ منی ٹچ سوئچ
nRF52832 پر گلاس پینل کے ساتھ منی ٹچ سوئچ

ڈیوائس فیلڈ ایفیکٹ ٹرانزسٹرز کا استعمال کرتے ہوئے پاور آف سرکٹ کو لاگو کرتی ہے۔ بٹن دبانے کے بعد، مائیکروکنٹرولر خود پاور کنٹرول کو روکتا ہے اور پھر بٹن کو سروس موڈز کے لیے استعمال کیا جا سکتا ہے (میرے معاملے میں، یہ دوسرے ڈیوائسز کے ساتھ جوڑا بنانا، پاور آف کرنا اور فیکٹری سیٹنگز پر ری سیٹ کرنا ہے)۔

ریاستوں اور سروس کے طریقوں کی نشاندہی کرنے کے لیے 2 rgb LEDs ہیں۔ ٹچ بٹنوں کو چھونے اور سروس موڈز کی آواز کے اشارے پر کلک کرنے کے لیے ایک پیزو ایمیٹر بھی شامل کیا گیا ہے۔ ایل ای ڈی اور پیزو ایمیٹر کو صارف کی صوابدید پر آن اور آف کیا جا سکتا ہے۔ یہ سمارٹ ہوم کنٹرولر کے ذریعے تکنیکی سینسرز کو کمانڈ بھیج کر کیا جاتا ہے؛ صارف سمارٹ ہوم کنٹرولر کے ذریعے بیٹری چارج اور سگنل لیول بھیجنے کے وقفوں کو بھی تبدیل کر سکتا ہے۔ میرے معاملے میں یہ ہے۔ میجرڈومو.

ٹرانسمٹ موڈ میں کھپت 7mA (250kbit, 10ms) ہے، نیند میں کھپت 40µA ہے، آف اسٹیٹ میں کھپت 1µA سے کم ہے (="بے کار" موڈ میں بوسٹ کنورٹر کی کھپت)۔ پروگرامنگ کے لیے Rx، tx، swd کنیکٹر فراہم کیا گیا ہے۔ 2 کی پچ کے ساتھ ایک چھوٹا 3x1.27p کنیکٹر استعمال کیا جاتا ہے۔ پروگرامنگ کے لیے ایک خاص اڈاپٹر بنایا گیا ہے۔

nRF52832 پر گلاس پینل کے ساتھ منی ٹچ سوئچ

ہمیشہ کی طرح، ڈیوائس کا آپریشن پروٹوکول پر مبنی ہے۔ مائی سینسرز. اس ٹچ سوئچ کو رولر بلائنڈ کنٹرول سسٹم میں استعمال کرنے کا منصوبہ ہے۔ لیکن عام طور پر، درخواست صرف آپ کی تخیل کی طرف سے محدود ہے. مثال کے طور پر، میرا بیٹا (7 سال کا) پہلے ہی سوئچ ورژن کے لیے 3 آرڈر کر چکا ہے: باتھ ٹب والے ٹوائلٹ میں لائٹ آن اور آف کرنے کے لیے (اسے فرش سے نیچے رکھا جائے گا)، لمبا اور تاریک کوریڈور جب باتھ ٹب کے ساتھ بیت الخلا میں جاتے ہو، اور دوسرا پلنگ کے طور پر، آپ کے کمرے کی روشنی کو جلدی سے آن کرنے کے لیے تاکہ راکشس بھاگ جائیں۔

nRF52832 پر گلاس پینل کے ساتھ منی ٹچ سوئچ
nRF52832 پر گلاس پینل کے ساتھ منی ٹچ سوئچ
nRF52832 پر گلاس پینل کے ساتھ منی ٹچ سوئچ

کیس روایتی طور پر ایس ایل اے پرنٹر پر پرنٹ کیا گیا تھا، ڈیوائس چھوٹا ہے، کیس چھوٹا نکلا، اس پرنٹنگ ٹیکنالوجی کا استعمال جائز ہے۔

پرنٹ شدہ ماڈل دیکھیںnRF52832 پر گلاس پینل کے ساتھ منی ٹچ سوئچ
nRF52832 پر گلاس پینل کے ساتھ منی ٹچ سوئچ
nRF52832 پر گلاس پینل کے ساتھ منی ٹچ سوئچ

میگنےٹ کیس اور بیٹری کے کمپارٹمنٹ کور میں چپکائے جاتے ہیں۔

اس ڈیوائس کے ٹیسٹ کے ساتھ ویڈیوز:



ان لوگوں کے لیے جو دہرانا چاہتے ہیں:

Arduino IDE کے لیے رولر بلائنڈ کنٹرول سسٹم میں سوئچ کے لیے پروگرام کوڈ کی جانچ کریں۔

Arduino وائرنگ

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 میں کیس فائلیں - گوگل ڈرائیو

Gerber PCB فائلیں - گوگل ڈرائیو

اس ترقی کے بارے میں سوالات کے لیے، Arduinos اور Mysensors پر آپ کی پیشرفت میں مشکلات کے بارے میں ہماری ٹیلی گرام چیٹ میں ہمیشہ مدد کی جائے گی۔ https://t.me/mysensors_rus.

ماخذ: www.habr.com

نیا تبصرہ شامل کریں