Mini touch switch nga adunay glass panel sa nRF52832

Sa karon nga artikulo gusto nakong ipaambit kanimo ang usa ka bag-ong proyekto. Niining higayona kini usa ka touch switch nga adunay usa ka glass panel. Ang himan mao ang compact, pagsukod 42x42mm (standard bildo panel adunay mga dimensyon 80x80mm). Ang kasaysayan niini nga device nagsugod sa dugay na nga panahon, mga usa ka tuig na ang milabay.

Mini touch switch nga adunay glass panel sa nRF52832

Ang una nga mga kapilian naa sa atmega328 microcontroller, apan sa katapusan ang tanan natapos sa nRF52832 microcontroller.

Mini touch switch nga adunay glass panel sa nRF52832

Ang bahin sa paghikap sa aparato nagdagan sa TTP223 chips. Ang duha ka mga sensor gisilbihan sa usa ka interrupt. Gipadagan sa usa ka CR2477 nga baterya, pinaagi sa usa ka boost converter sa TPS610981 chip | Datasheet.

Mini touch switch nga adunay glass panel sa nRF52832
Mini touch switch nga adunay glass panel sa nRF52832

Ang aparato nagpatuman sa usa ka power-off circuit gamit ang field-effect transistors. Pagkahuman sa pagpindot sa buton, ang microcontroller mismo nagpugong sa pagkontrol sa kuryente ug dayon ang buton mahimong magamit alang sa mga mode sa serbisyo (sa akong kaso, kini ang pagpares sa ubang mga aparato, gipalong ang gahum ug gi-reset ang mga setting sa pabrika).

Adunay 2 rgb LEDs alang sa pagpaila sa mga estado ug mga mode sa serbisyo. Gidugang usab ang usa ka piezo emitter aron ma-simulate ang usa ka pag-klik kung gihikap ang mga buton sa paghikap ug timailhan sa tunog sa mga mode sa serbisyo. Ang mga LED ug piezo emitter mahimong i-on ug i-off sa pagkabuotan sa tiggamit. Gihimo kini pinaagi sa smart home controller pinaagi sa pagpadala sa mga command ngadto sa mga teknikal nga sensor; mahimo usab nga usbon sa user ang mga agwat sa pagpadala sa battery charge ug signal level pinaagi usab sa smart home controller. Sa akong kaso kini MAJORDOMO.

Ang konsumo sa transmit mode mao ang 7mA (250kbit, 10ms), ang konsumo sa pagkatulog mao ang 40Β΅A, ang konsumo sa off state mas ubos sa 1Β΅A (=konsumo sa boost converter sa β€œidle” mode). Rx, tx, swd connector alang sa programming gihatag. Usa ka gamay nga 2x3p connector nga adunay pitch nga 1.27 gigamit. Ang usa ka espesyal nga adapter gihimo alang sa pagprograma.

Mini touch switch nga adunay glass panel sa nRF52832

Sama sa kanunay, ang operasyon sa aparato gibase sa protocol AkongSensors. Kini nga touch switch giplano nga gamiton sa roller blind control system. Apan sa kinatibuk-an, ang aplikasyon limitado lamang sa imong imahinasyon. Pananglitan, ang akong anak nga lalaki (7 ka tuig ang panuigon) nakahimo na og 3 ka mga order alang sa mga bersyon sa switch: sa pagpasiga ug pagpalong sa suga sa usa ka kasilyas nga adunay bathtub (kini ibutang sa ubos gikan sa salog), aron sa pagpasiga sa suga sa usa ka taas ug ngitngit nga koridor kung nagbiyahe sa usa ka kasilyas nga adunay bathtub, ug usa pa ingon sa kilid sa higdaanan, aron dali nga mapasiga ang suga sa imong kwarto aron ang mga monsters modagan.

Mini touch switch nga adunay glass panel sa nRF52832
Mini touch switch nga adunay glass panel sa nRF52832
Mini touch switch nga adunay glass panel sa nRF52832

Ang kaso tradisyonal nga giimprinta sa usa ka tig-imprenta sa SLA, ang aparato gamay ra, ang kaso nahimo nga gamay, ang paggamit niini nga teknolohiya sa pag-imprenta gipakamatarung.

Tan-awa ang giimprinta nga modeloMini touch switch nga adunay glass panel sa nRF52832
Mini touch switch nga adunay glass panel sa nRF52832
Mini touch switch nga adunay glass panel sa nRF52832

Ang mga magnet gipapilit sa kaso ug ang tabon sa kompartamento sa baterya.

Mga video nga adunay mga pagsulay niini nga device:



Para sa mga gusto mubalik:

Test program code para sa switch sa roller blind control system para sa 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);
}

Mga file sa kaso sa stl - google drive

Gerber PCB files - google drive

Alang sa mga pangutana bahin sa kini nga pag-uswag, bahin sa mga kalisud sa imong mga pag-uswag sa Arduinos ug Mysensors kanunay nga motabang sa among telegram chat - https://t.me/mysensors_rus.

Source: www.habr.com

Idugang sa usa ka comment