NRF52832'de cam panelli mini dokunmatik anahtar

Bugünkü yazımda sizlerle yeni bir projeyi paylaşmak istiyorum. Bu sefer cam panelli bir dokunmatik anahtar. Cihaz kompakttır, 42x42 mm ölçülerindedir (standart cam panellerin boyutları 80x80 mm'dir). Bu cihazın tarihi çok uzun zaman önce, yaklaşık bir yıl önce başladı.

NRF52832'de cam panelli mini dokunmatik anahtar

İlk seçenekler atmega328 mikrodenetleyicideydi, ancak sonunda hepsi nRF52832 mikrodenetleyiciyle sona erdi.

NRF52832'de cam panelli mini dokunmatik anahtar

Cihazın dokunmatik kısmı TTP223 yongaları üzerinde çalışıyor. Her iki sensöre de tek bir kesme ile hizmet verilir. CR2477 pille, TPS610981 yongasındaki takviye dönüştürücü aracılığıyla çalıştırılır | veri Sayfası.

NRF52832'de cam panelli mini dokunmatik anahtar
NRF52832'de cam panelli mini dokunmatik anahtar

Cihaz, alan etkili transistörleri kullanarak bir kapatma devresi uygular. Düğmeye bastıktan sonra, mikro denetleyicinin kendisi güç kontrolünü keser ve ardından düğme servis modları için kullanılabilir (benim durumumda bu, diğer cihazlarla eşleştirme, gücü kapatma ve fabrika ayarlarına sıfırlamadır).

Durumları ve servis modlarını göstermek için 2 RGB LED vardır. Dokunmatik düğmelere dokunulduğunda tıklamayı ve servis modlarının sesli gösterimini simüle etmek için bir piezo yayıcı da eklenmiştir. LED'ler ve piezo emitör kullanıcının takdirine bağlı olarak açılıp kapatılabilir. Bu, akıllı ev kumandası aracılığıyla teknik sensörlere komutlar gönderilerek gerçekleştirilir; kullanıcı ayrıca akıllı ev kumandası aracılığıyla pil şarjı ve sinyal seviyesi gönderme aralıklarını da değiştirebilir. benim durumumda BÜYÜKŞEHİR.

İletim modundaki tüketim 7mA'dir (250kbit, 10ms), uykudaki tüketim 40μA, kapalı durumdaki tüketim 1μA'dan azdır (=boşta modundaki takviye dönüştürücünün tüketimi). Programlama için Rx, tx, swd konnektörü sağlanmıştır. 2 aralıklı minyatür 3x1.27p konektör kullanılır. Programlama için özel bir adaptör yapılmıştır.

NRF52832'de cam panelli mini dokunmatik anahtar

Her zaman olduğu gibi cihazın çalışması protokole dayanmaktadır. Sensörlerim. Bu dokunmatik anahtarın stor perde kontrol sisteminde kullanılması planlanmaktadır. Ancak genel olarak uygulama yalnızca sizin hayal gücünüzle sınırlıdır. Örneğin, oğlum (7 yaşında) zaten anahtar versiyonları için 3 sipariş verdi: küvetli bir tuvaletteki ışığı açıp kapatmak (yerden alçakta monte edilecek), bir banyoda ışığı açmak Küvetli bir tuvalete giderken uzun ve karanlık bir koridor ve canavarların kaçması için odanızdaki ışığı hızla açmak için başucu olarak başka bir koridor.

NRF52832'de cam panelli mini dokunmatik anahtar
NRF52832'de cam panelli mini dokunmatik anahtar
NRF52832'de cam panelli mini dokunmatik anahtar

Kasa geleneksel olarak bir SLA yazıcıya basıldı, cihaz minyatür, kasanın küçük olduğu ortaya çıktı, bu baskı teknolojisinin kullanımı haklı.

Basılı modeli görüntüleNRF52832'de cam panelli mini dokunmatik anahtar
NRF52832'de cam panelli mini dokunmatik anahtar
NRF52832'de cam panelli mini dokunmatik anahtar

Mıknatıslar kasaya ve pil bölmesi kapağına yapıştırılmıştır.

Bu cihazın testlerini içeren videolar:



Tekrarlamak isteyenler için:

Arduino IDE için panjur kontrol sistemindeki bir anahtarın program kodunu test edin

Arduino Kablolama

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'deki vaka dosyaları - Google sürücü

Gerber PCB dosyaları - Google sürücü

Bu gelişmeyle ilgili sorularınız için, Arduinos ve Mysensors'taki geliştirmelerinizdeki zorluklarla ilgili sorularınız için telgraf sohbetimizde her zaman kurtarmaya geleceksiniz - https://t.me/mysensors_rus.

Kaynak: habr.com

Yorum ekle