Калиди хурди сенсорӣ бо панели шишагӣ дар nRF52832

Дар мақолаи имрӯза ман мехоҳам бо шумо як лоиҳаи навро мубодила кунам. Ин дафъа он коммутатори сенсорӣ бо панели шишагӣ мебошад. Дастгоҳ паймон буда, андозааш 42х42мм (панелҳои шишагии стандартӣ андозаи 80x80мм доранд). Таърихи ин дастгоҳ хеле пеш, тақрибан як сол пеш оғоз шудааст.

Калиди хурди сенсорӣ бо панели шишагӣ дар nRF52832

Вариантҳои аввал дар микроконтроллери atmega328 буданд, аммо дар ниҳоят ҳамааш бо микроконтроллери nRF52832 анҷом ёфт.

Калиди хурди сенсорӣ бо панели шишагӣ дар nRF52832

Қисми ламси дастгоҳ дар микросхемаҳои TTP223 кор мекунад. Ҳарду сенсорҳо бо як танаффус хидмат мекунанд. Бо батареяи CR2477, тавассути табдилдиҳандаи пурқувват дар чипи TPS610981 | рӯйхат.

Калиди хурди сенсорӣ бо панели шишагӣ дар nRF52832
Калиди хурди сенсорӣ бо панели шишагӣ дар nRF52832

Дастгоҳ бо истифода аз транзисторҳои саҳроӣ схемаи хомӯш кардани барқро амалӣ мекунад. Пас аз пахш кардани тугма, худи микроконтроллер назорати қувваи барқро бозмедорад ва он гоҳ тугмаро барои режимҳои хидматрасонӣ истифода бурдан мумкин аст (дар ҳолати ман, ин пайвастшавӣ бо дастгоҳҳои дигар, хомӯш кардани барқ ​​ва аз нав барқарор кардани танзимоти заводӣ мебошад).

2 LEDs rgb барои нишон додани ҳолат ва режимҳои хидмат мавҷуданд. Инчунин барои тақлид кардани клик ҳангоми ламс кардани тугмаҳои ламсӣ ва нишондиҳандаи садои режимҳои хидматрасонӣ як эмиттери пьезо илова карда шудааст. LEDҳо ва эмиттери пьезо метавонанд бо ихтиёри корбар фурӯзон ва хомӯш карда шаванд. Ин тавассути контролери хонагии интеллектуалӣ тавассути фиристодани фармонҳо ба сенсорҳои техникӣ анҷом дода мешавад; корбар инчунин метавонад фосилаҳои ирсоли заряди батарея ва сатҳи сигналро тавассути контролери хонагии интеллектуалӣ тағир диҳад. Дар ҳолати ман он аст МАЖОРДОМО.

Истеъмол дар реҷаи интиқол 7 мА (250 кбит, 10 мс), истеъмол дар хоб 40 мкА, масраф дар ҳолати хомӯш камтар аз 1 мкА аст (= истеъмоли конвертери пурқувват дар ҳолати "бекор"). Пайвасткунаки Rx, tx, swd барои барномасозӣ пешбинӣ шудааст. Пайвасткунаки миниётураи 2x3p бо қабати 1.27 истифода мешавад. Барои барномасозӣ адаптери махсус сохта шудааст.

Калиди хурди сенсорӣ бо панели шишагӣ дар nRF52832

Чун ҳамеша, кори дастгоҳ дар асоси протокол аст MySensors. Ин коммутатори сенсорӣ ба нақша гирифта шудааст, ки дар системаи идоракунии ғилдиракҳо истифода шавад. Аммо дар маҷмӯъ, барнома танҳо бо тасаввуроти шумо маҳдуд аст. Масалан, писари ман (7 сола) аллакай барои версияҳои коммутаторӣ 3 фармоиш додааст: фурӯзон ва хомӯш кардани чароғ дар ҳоҷатхона бо ванна (он аз фарш паст ҷойгир карда мешавад), даргиронидани чароғ. долони дароз ва торик ҳангоми сафар ба ҳоҷатхона бо ванна ва дигаре ҳамчун назди кат, барои зуд фурӯзон кардани чароғ дар ҳуҷраи худ, то ҳаюлоҳо гурезанд.

Калиди хурди сенсорӣ бо панели шишагӣ дар nRF52832
Калиди хурди сенсорӣ бо панели шишагӣ дар nRF52832
Калиди хурди сенсорӣ бо панели шишагӣ дар nRF52832

Парвандаи анъанавӣ дар принтери SLA чоп карда шуд, дастгоҳ миниатюрӣ аст, парванда хурд аст, истифодаи ин технологияи чопӣ асоснок аст.

Намоиши модели чопшудаКалиди хурди сенсорӣ бо панели шишагӣ дар 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 - Google Drive

Файлҳои PCB Gerber - Google Drive

Барои саволҳо дар бораи ин рушд, дар бораи мушкилот дар таҳаввулоти шумо дар Arduinos ва Mysensors ҳамеша дар сӯҳбати телеграммаи мо ба кӯмак меоянд - https://t.me/mysensors_rus.

Манбаъ: will.com

Илова Эзоҳ