المس مفتاح صغير بلوحة زجاجية على nRF52832

في مقال اليوم أريد أن أشارككم مشروع جديد. هذه المرة هو التبديل اللمس مع لوحة زجاجية. الجهاز مدمج ، أبعاد 42 × 42 مم (لوحة زجاجية قياسية لها أبعاد 80 × 80 مم). بدأ تاريخ هذا الجهاز منذ فترة طويلة ، منذ حوالي عام.



كانت الخيارات الأولى على متحكم atmega328 ، ولكن في النهاية انتهى الأمر كله مع متحكم nRF52832.



يعمل الجزء الذي يعمل باللمس من الجهاز على شرائح TTP223. يتم خدمة كل من أجهزة الاستشعار عن طريق مقاطعة واحدة. مدعوم من بطارية CR2477 ، عبر محول دفعة على TPS610981 | Datashit .




يقوم الجهاز بتنفيذ دائرة انقطاع التيار الكهربائي عن الترانزستورات ذات التأثير الميداني. بعد الضغط على الزر ، يقوم المتحكم نفسه باعتراض إدارة الطاقة ومن ثم يمكن استخدام الزر في أوضاع الخدمة (في حالتي ، يتم إقرانه مع الأجهزة الأخرى ، وإيقاف تشغيل الطاقة وإعادة ضبط إعدادات المصنع (إعادة ضبط المصنع)).


هناك 2 rgb LEDs للإشارة إلى الأوضاع وأساليب الخدمة. تمت إضافة باعث بيزو لمحاكاة نقرة عند لمس أزرار اللمس ومؤشر الصوت من أوضاع الخدمة. يمكن تشغيل وإيقاف تشغيل مصابيح LED وإصدار بيزو بناءً على طلب المستخدم. يتم ذلك من خلال وحدة التحكم في المنزل الذكي ، من خلال إرسال أوامر إلى أجهزة الاستشعار التقنية ، يمكن أيضًا تغيير فترات المستخدم لإرسال شحن البطارية ومستوى الإشارة من خلال وحدة تحكم المنزل الذكي. في حالتي ، هو MAJORDOMO .


الاستهلاك في وضع النقل هو 7 مللي أمبير (250 كيلو بت في الثانية ، 10 مللي ثانية) ، واستهلاك النوم 40 ميكروليتر ، والاستهلاك خارج الخط أقل من 1 ميكرولتر (= استهلاك محول التعزيز في وضع الخمول). الناتج آر إكس ، تكساس ، المكونات swd للبرمجة. يتم استخدام موصل مصغرة 2x3p في الزيادات من 1.27. تم إجراء محول خاص للبرمجة.



كالمعتاد ، يعتمد الجهاز على بروتوكول MySensors . تم تخطيط مفتاح اللمس هذا في نظام التحكم للستائر الدوارة. ولكن بشكل عام ، يقتصر التطبيق فقط من خيالك. على سبيل المثال ، قام الآن بالفعل ابن (7 سنوات) بإصدار 3 أوامر لإصدار التبديل: لتشغيل وإيقاف تشغيل الضوء في المرحاض مع حوض استحمام (سيتم تركيبه على ارتفاع غير مرتفع من الأرضية) ، لتشغيل الضوء في ممر طويل ومظلم عند السفر إلى المرحاض مع حوض الاستحمام وواحد آخر بجانب السرير ، لتشغيل الضوء بسرعة في غرفتك بحيث تنتشر الوحوش.





تمت طباعة العلبة بشكل تقليدي على طابعة SLA ، الجهاز صغير الحجم ، والحالة صغيرة ، واستخدام تقنية الطباعة له ما يبرره.


عرض النموذج المطبوع



يتم لصقها المغناطيس في السكن وغطاء البطارية.


Vidosiki مع اختبارات هذا الجهاز:





للراغبين في التكرار:


كود برنامج اختبار قاطع الدائرة لنظام التحكم في الرول العمياء لـ 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_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() { //delay(1000); pinMode(31, OUTPUT); digitalWrite(31, HIGH); delay(3000); pinMode(3, INPUT); pinMode(25, OUTPUT); pinMode(26, OUTPUT); pinMode(27, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(28, OUTPUT); // bizzer pinMode(2, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(29, INPUT); digitalWrite(28, LOW); // off bizzer digitalWrite(27, HIGH); digitalWrite(26, HIGH); digitalWrite(25, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); } void before() { //digitalWrite(31, HIGH); NRF_POWER->DCDCEN = 1; //NRF_UART0->ENABLE = 0; analogReadResolution(12); disableNfc(); turnOffAdc(); //wait(2000); 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("Power on|off Node", "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; send(upMsg.set(switch_a)); //wait(200); digitalWrite(6, LOW); wait(10); playSound1(); wait(20); playSound2(); wait(50); } else { switch_a = 0; send(upMsg.set(switch_a)); //wait(200); digitalWrite(6, HIGH); wait(10); playSound2(); wait(20); playSound1(); wait(50); } //sleep_not_pasible = 1; //digitalWrite(25, HIGH); //wait(100); } 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; send(downMsg.set(switch_b)); //wait(200); digitalWrite(25, LOW); wait(10); playSound1(); wait(20); playSound2(); wait(50); } else { switch_b = 0; send(downMsg.set(switch_b)); //wait(200); digitalWrite(25, HIGH); wait(10); playSound2(); wait(20); playSound1(); wait(50); } //sleep_not_pasible = 1; //digitalWrite(6, HIGH); //wait(100); } if (digitalRead(9) == LOW && sens_flag1 == 1) { sens_flag1 = 0; //digitalWrite(6, HIGH); //playSound2(); //wait(50); } if (digitalRead(10) == LOW && sens_flag2 == 1) { sens_flag2 = 0; //digitalWrite(25, HIGH); //playSound2(); //wait(50); } 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) { //   myTone j = 500000 / j; //    j       k += millis(); //          while (k > millis()) { //  ,      digitalWrite(28, HIGH); delayMicroseconds(j); //    i   «1»   j digitalWrite(28, LOW ); delayMicroseconds(j); //    i   «0»   j } } void playSound0() { //wait(500); myTone(1300, 50); //     0,1    2048  wait(20); //  0,1  myTone(1300, 50); wait(50); } void playSound() { //wait(500); myTone(700, 30); //     0,1    2048  wait(10); //  0,1  myTone(700, 30); wait(10); myTone(700, 30); wait(50); //  0,1  //myTone(500, 30); //wait(500); } void playSound1() { //wait(500); myTone(200, 10); //     0,1    2048  wait(10); //  0,1  myTone(400, 5); wait(30); //  0,1  //myTone(500, 30); //wait(500); } void playSound2() { //wait(500); myTone(400, 10); //     0,1    2048  wait(10); //  0,1  myTone(200, 5); wait(30); //  0,1  //myTone(500, 30); //wait(500); } void readBatLev() { //NRF5_ESB_startListening(); wait(200); 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); wait(200); 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); } 

ملفات القضية في المحكمة الخاصة بلبنان


ملفات جربر لوحات الدارات الكهربائية


لطرح الأسئلة حول هذا التطور ، حول الصعوبات في تطويرك ، سيأتي Arduino و Mysensors دائمًا إلى الإنقاذ في دردشة البرقية الخاصة بنا.

Source: https://habr.com/ru/post/ar453868/


All Articles