په nRF52832 کې د شیشې پینل سره مینی ټچ سویچ

په نننۍ مقاله کې زه غواړم تاسو سره یوه نوې پروژه شریک کړم. دا ځل دا د شیشې پینل سره د ټچ سویچ دی. وسیله کمپیکٹ ده، د 42x42mm اندازه کوي (د معیاري شیشې تختې 80x80mm ابعاد لري). د دې وسیلې تاریخ ډیر وخت دمخه پیل شوی ، شاوخوا یو کال دمخه.

په nRF52832 کې د شیشې پینل سره مینی ټچ سویچ

لومړی اختیارونه په atmega328 مایکرو کنټرولر کې وو، مګر په پای کې دا ټول د nRF52832 مایکرو کنټرولر سره پای ته ورسیدل.

په nRF52832 کې د شیشې پینل سره مینی ټچ سویچ

د وسیلې ټچ برخه په TTP223 چپس چلیږي. دواړه سینسرونه د یو مداخلې لخوا خدمت کیږي. د CR2477 بیټرۍ لخوا ځواکمن شوی، په TPS610981 چپ کې د بوسټ کنورټر له لارې | ډیټاشیټ.

په nRF52832 کې د شیشې پینل سره مینی ټچ سویچ
په nRF52832 کې د شیشې پینل سره مینی ټچ سویچ

وسیله د ساحوي اغیزې ټرانزیسټرونو په کارولو سره د بریښنا بند سرکټ پلي کوي. د تڼۍ فشارولو وروسته، مایکرو کنټرولر پخپله د بریښنا کنټرول مداخله کوي او بیا تڼۍ د خدماتو حالتونو لپاره کارول کیدی شي (زما په قضیه کې، دا د نورو وسیلو سره جوړه کول، بریښنا بندول او د فابریکې ترتیباتو ته بیا تنظیم کول).

د ریاستونو او خدماتو حالتونو ښودلو لپاره د 2 rgb LEDs شتون لري. د پیزو ایمیټر هم اضافه شوی ترڅو د کلیک سمولو لپاره کله چې د ټچ بټونو لمس کول او د خدماتو حالتونو غږ نښې. LEDs او د پیزو ایمیټر د کارونکي په اختیار کې فعال او بند کیدی شي. دا د سمارټ کور کنټرولر له لارې تخنیکي سینسرونو ته د قوماندې لیږلو له لارې ترسره کیږي؛ کارونکي کولی شي د بیټرۍ چارج او سیګنال کچه لیږلو لپاره وقفې هم د سمارټ کور کنټرولر له لارې بدل کړي. زما په قضیه کې دا دی ماجوردومو.

د لیږد حالت کې مصرف 7mA (250kbit، 10ms) دی، په خوب کې مصرف 40µA دی، په بند حالت کې مصرف له 1µA څخه کم دی (= په "بې کاره" حالت کې د بوسټ کنورټر مصرف). د پروګرام کولو لپاره Rx، tx، swd نښلونکی چمتو شوی. یو کوچنی 2x3p نښلونکی د 1.27 پیچ سره کارول کیږي. د پروګرام کولو لپاره یو ځانګړی اډاپټر جوړ شوی.

په nRF52832 کې د شیشې پینل سره مینی ټچ سویچ

د تل په څیر، د وسیلې عملیات د پروتوکول پراساس دي MySensors. دا ټچ سویچ پلان شوی چې د رولر ړندو کنټرول سیسټم کې وکارول شي. مګر په عموم کې، غوښتنلیک یوازې ستاسو د تصور لخوا محدود دی. د مثال په توګه ، زما زوی (7 کلن) دمخه د سویچ نسخو لپاره 3 امرونه کړي دي: د تشناب سره په تشناب کې ر lightا فعاله او بنده کړئ (دا به له پوړ څخه ښکته ایښودل شي) اوږده او تیاره دهلیز کله چې د تشناب سره تشناب ته سفر کوئ ، او بل یې د بستر په توګه ، ستاسو په خونه کې ژر تر ژره رڼا واچوئ ترڅو شیطانان وتښتي.

په nRF52832 کې د شیشې پینل سره مینی ټچ سویچ
په nRF52832 کې د شیشې پینل سره مینی ټچ سویچ
په nRF52832 کې د شیشې پینل سره مینی ټچ سویچ

قضیه په دودیز ډول په SLA پرنټر کې چاپ شوې ، وسیله کوچنۍ ده ، قضیه کوچنۍ وه ، د دې چاپ کولو ټیکنالوژۍ کارول جواز لري.

چاپ شوی ماډل وګورئپه nRF52832 کې د شیشې پینل سره مینی ټچ سویچ
په nRF52832 کې د شیشې پینل سره مینی ټچ سویچ
په nRF52832 کې د شیشې پینل سره مینی ټچ سویچ

مقناطیس په قضیه او د بیټرۍ کمپارټ پوښ کې چپک شوي.

د دې وسیلې ازموینې سره ویډیوګانې:



د هغو کسانو لپاره چې غواړي تکرار کړي:

د Arduino IDE لپاره د رولر ړانده کنټرول سیسټم کې د سویچ لپاره د ازموینې برنامې کوډ

د Arduino Wiring

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 فایلونه - ګوګل ډرایو

د دې پرمختګ په اړه پوښتنو لپاره، په Arduinos او Mysensors کې ستاسو په پرمختګونو کې د ستونزو په اړه به تل زموږ د ټیلیګرام چیٹ کې ژغورنې ته راشي - https://t.me/mysensors_rus.

سرچینه: www.habr.com

Add a comment