Mini skārienekrāna slēdzis ar stikla paneli uz nRF52832

Šodienas rakstā es vēlos dalīties ar jums jaunu projektu. Šoreiz tas ir skārienslēdzis ar stikla paneli. Ierīce ir kompakta, tās izmēri ir 42x42mm (standarta stikla paneļu izmēri ir 80x80mm). Šīs ierīces vēsture sākās jau sen, apmēram pirms gada.

Mini skārienekrāna slēdzis ar stikla paneli uz nRF52832

Pirmās iespējas bija uz mikrokontrolleri atmega328, bet beigās viss beidzās ar mikrokontrolleri nRF52832.

Mini skārienekrāna slēdzis ar stikla paneli uz nRF52832

Ierīces skārienjutīgā daļa darbojas ar TTP223 mikroshēmām. Abi sensori tiek apkalpoti ar vienu pārtraukumu. Darbojas ar CR2477 akumulatoru, izmantojot TPS610981 mikroshēmas pastiprināšanas pārveidotāju | datu lapas.

Mini skārienekrāna slēdzis ar stikla paneli uz nRF52832
Mini skārienekrāna slēdzis ar stikla paneli uz nRF52832

Ierīce īsteno izslēgšanas ķēdi, izmantojot lauka efekta tranzistorus. Pēc pogas nospiešanas mikrokontrolleris pats pārtver jaudas vadību un pēc tam pogu var izmantot servisa režīmiem (manā gadījumā tā ir savienošana pārī ar citām ierīcēm, strāvas izslēgšana un rūpnīcas iestatījumu atiestatīšana).

Ir 2 rgb gaismas diodes stāvokļu un apkalpošanas režīmu indikācijai. Ir pievienots arī pjezo izstarotājs, lai simulētu klikšķi, pieskaroties skārienpogām, un apkalpošanas režīmu skaņas norādes. Gaismas diodes un pjezo emitētāju var ieslēgt un izslēgt pēc lietotāja ieskatiem. Tas tiek darīts caur viedās mājas kontrolieri, nosūtot komandas tehniskajiem sensoriem, kā arī lietotājs var mainīt akumulatora uzlādes un signāla līmeņa nosūtīšanas intervālus arī caur viedās mājas kontrolieri. Manā gadījumā tā ir MAJORDOMO.

Patēriņš pārraides režīmā ir 7mA (250kbit, 10ms), patēriņš miega režīmā ir 40µA, patēriņš izslēgtā stāvoklī ir mazāks par 1µA (=pastiprināšanas pārveidotāja patēriņš “dīkstāves” režīmā). Tiek nodrošināts Rx, tx, swd savienotājs programmēšanai. Tiek izmantots miniatūrs 2x3p savienotājs ar soli 1.27. Programmēšanai tiek izgatavots īpašs adapteris.

Mini skārienekrāna slēdzis ar stikla paneli uz nRF52832

Kā vienmēr, ierīces darbība ir balstīta uz protokolu ManiSensori. Šo skārienslēdzi plānots izmantot rullo žalūziju vadības sistēmā. Bet kopumā pielietojumu ierobežo tikai jūsu iztēle. Piemēram, mans dēls (7 gadi) jau ir veicis 3 pasūtījumus slēdžu versijām: ieslēgt un izslēgt gaismu tualetē ar vannu (tā tiks uzstādīta zemu no grīdas), ieslēgt gaismu garš un tumšs koridors, dodoties uz tualeti ar vannu, un vēl viens kā gulta, lai ātri ieslēgtu gaismu savā istabā, lai briesmoņi bēgtu.

Mini skārienekrāna slēdzis ar stikla paneli uz nRF52832
Mini skārienekrāna slēdzis ar stikla paneli uz nRF52832
Mini skārienekrāna slēdzis ar stikla paneli uz nRF52832

Korpuss tradicionāli tika drukāts uz SLA printera, ierīce ir miniatūra, korpuss izrādījās mazs, šīs drukas tehnoloģijas izmantošana ir pamatota.

Skatīt drukāto modeliMini skārienekrāna slēdzis ar stikla paneli uz nRF52832
Mini skārienekrāna slēdzis ar stikla paneli uz nRF52832
Mini skārienekrāna slēdzis ar stikla paneli uz nRF52832

Korpusā un akumulatora nodalījuma vāciņā ir ielīmēti magnēti.

Video ar šīs ierīces testiem:



Tiem, kas vēlas atkārtot:

Testa programmas kods slēdžam Arduino IDE rullo žalūziju vadības sistēmā

Arduino elektroinstalācija

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);
}

Lietas faili stl - google disks

Gerber PCB faili - google disks

Ja jums ir jautājumi par šo attīstību, par grūtībām, kas saistītas ar jūsu Arduinos un Mysensors izstrādi, tas vienmēr palīdzēs mūsu telegrammas tērzēšanā - https://t.me/mysensors_rus.

Avots: www.habr.com

Pievieno komentāru