Mini Touch Switch mat Glas Panel op nRF52832

Am Artikel vun haut wëll ech en neie Projet mat Iech deelen. Dës Kéier ass et en Touchschalter mat engem Glaspanel. Den Apparat ass kompakt, moosst 42x42mm (Standard Glasplacke hunn Dimensiounen 80x80mm). D'Geschicht vun dësem Apparat huet viru laanger Zäit ugefaang, virun ongeféier engem Joer.

Mini Touch Switch mat Glas Panel op nRF52832

Déi éischt Optiounen waren um atmega328 Mikrokontroller, awer um Enn ass alles mam nRF52832 Mikrokontroller opgehalen.

Mini Touch Switch mat Glas Panel op nRF52832

Den Touch Deel vum Apparat leeft op TTP223 Chips. Béid Sensore ginn duerch eng Ënnerbriechung zerwéiert. Powered vun engem CR2477 Batterie, via engem Boost Converter op der TPS610981 Chip | Datenblat.

Mini Touch Switch mat Glas Panel op nRF52832
Mini Touch Switch mat Glas Panel op nRF52832

Den Apparat implementéiert e Power-Off Circuit mat Feldeffekttransistoren. Nodeems Dir de Knäppchen dréckt, hëlt de Mikrokontroller selwer d'Kraaftsteuerung an da kann de Knäppche fir Servicemodi benotzt ginn (a mengem Fall ass dëst mat aneren Apparater gekoppelt, d'Kraaft ausschalten an op d'Fabrécksastellungen zréckgesat).

Et ginn 2 rgb LEDs fir Staaten a Servicemodi unzeginn. E Piezo-Emitter gouf och bäigefüügt fir e Klick ze simuléieren wann Dir Touch Knäppercher beréiert an Tounindikatioun vu Servicemodi. D'LEDs an de Piezo-Emitter kënnen op an ausgeschalt ginn no der Diskretioun vum Benotzer. Dëst gëtt duerch de Smart Home Controller gemaach andeems Dir Kommandoen un technesch Sensoren schéckt; de Benotzer kann och d'Intervalle fir d'Batterieladung an d'Signalniveau änneren och duerch de Smart Home Controller änneren. A mengem Fall ass et MAJORDOMO.

De Verbrauch am Iwwerdroungsmodus ass 7mA (250kbit, 10ms), de Verbrauch am Schlof ass 40µA, de Verbrauch am Off-Staat ass manner wéi 1µA (=Verbrauch vum Boostkonverter am "Idle" Modus). Rx, TX, swd Connector fir Programméiere gëtt zur Verfügung gestallt. E Miniatur 2x3p Stecker mat engem Pitch vun 1.27 gëtt benotzt. E spezielle Adapter gëtt fir d'Programméierung gemaach.

Mini Touch Switch mat Glas Panel op nRF52832

Wéi ëmmer ass d'Operatioun vum Apparat op dem Protokoll baséiert MySensoren. Dësen Touchschalter ass geplangt fir am Roller Jalousie Kontrollsystem ze benotzen. Awer allgemeng ass d'Applikatioun nëmme vun Ärer Fantasi limitéiert. Zum Beispill, mäi Jong (7 Joer al) huet schonn 3 Bestellunge fir Schaltversioune gemaach: d'Luucht an enger Toilette mat enger Badewanne un an auszeschalten (et gëtt niddereg vum Buedem montéiert), d'Luucht an engem laangen an däischter Korridor wann Dir op eng Toilette mat enger Badewanne reest, an eng aner als Bett, fir séier d'Liicht an Ärem Zëmmer ze maachen, sou datt d'Monsteren fortlafen.

Mini Touch Switch mat Glas Panel op nRF52832
Mini Touch Switch mat Glas Panel op nRF52832
Mini Touch Switch mat Glas Panel op nRF52832

De Fall gouf traditionell op engem SLA Drécker gedréckt, den Apparat ass Miniatur, de Fall war kleng, d'Benotzung vun dëser Drocktechnologie ass gerechtfäerdegt.

View gedréckt ModellMini Touch Switch mat Glas Panel op nRF52832
Mini Touch Switch mat Glas Panel op nRF52832
Mini Touch Switch mat Glas Panel op nRF52832

Magnete ginn an de Fall an de Batteriefachdeckel gepecht.

Videoen mat Tester vun dësem Apparat:



Fir déi, déi widderhuelen wëllen:

Test Programm Code fir e schalt an engem Rouleau blann Kontroll System fir 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);
}

Falldateien an stl - google fueren

Gerber PCB Dateien - google fueren

Fir Froen iwwer dës Entwécklung, iwwer Schwieregkeeten an Ären Entwécklungen op Arduinos a Mysensors kommen ëmmer an eisem Telegram Chat zur Rettung - https://t.me/mysensors_rus.

Source: will.com

Setzt e Commentaire