nRF52832-də şüşə panelli mini toxunma açarı

Bugünkü yazımda sizlərlə yeni bir layihəni bölüşmək istəyirəm. Bu dəfə şüşə panelli toxunma açarıdır. Cihaz yığcamdır, ölçüsü 42x42 mm (standart şüşə panellər 80x80 mm ölçülərə malikdir). Bu cihazın tarixi çox uzun müddət əvvəl, təxminən bir il əvvəl başladı.

nRF52832-də şüşə panelli mini toxunma açarı

İlk seçimlər atmega328 mikro nəzarətçisində idi, lakin sonda hamısı nRF52832 mikro nəzarətçi ilə başa çatdı.

nRF52832-də şüşə panelli mini toxunma açarı

Cihazın toxunma hissəsi TTP223 çipləri üzərində işləyir. Hər iki sensor bir fasilə ilə xidmət göstərir. TPS2477 çipindəki gücləndirici çevirici vasitəsilə CR610981 batareyası ilə təchiz edilmişdir | Məlumat vərəqi.

nRF52832-də şüşə panelli mini toxunma açarı
nRF52832-də şüşə panelli mini toxunma açarı

Cihaz sahə effektli tranzistorlardan istifadə edərək enerjinin söndürülməsi sxemini həyata keçirir. Düyməni basdıqdan sonra mikrokontroller özü güc nəzarətinə müdaxilə edir və sonra düyməni xidmət rejimləri üçün istifadə etmək olar (mənim vəziyyətimdə bu, digər cihazlarla cütləşmək, enerjini söndürmək və zavod parametrlərinə yenidən qurmaqdır).

Vəziyyətləri və xidmət rejimlərini göstərmək üçün 2 rgb LED var. Toxunma düymələrinə və xidmət rejimlərinin səs göstəricilərinə toxunduqda klikləri simulyasiya etmək üçün piezo emitent də əlavə edilib. LED və piezo emitter istifadəçinin istəyi ilə açıla və söndürülə bilər. Bu, texniki sensorlara əmrlər göndərməklə ağıllı ev nəzarətçisi vasitəsilə həyata keçirilir; istifadəçi həmçinin ağıllı ev nəzarətçisi vasitəsilə batareyanın doldurulması və siqnal səviyyəsinin göndərilməsi üçün intervalları da dəyişə bilər. Mənim vəziyyətimdə belədir MAJORDOMO.

Ötürmə rejimində istehlak 7mA (250kbit, 10ms), yuxuda istehlak 40µA, söndürülmüş vəziyyətdə istehlak 1µA-dan azdır (="boş" rejimdə gücləndirici çeviricinin istehlakı). Proqramlaşdırma üçün Rx, tx, swd konnektoru verilir. 2 addım olan miniatür 3x1.27p birləşdiricisi istifadə olunur. Proqramlaşdırma üçün xüsusi adapter hazırlanır.

nRF52832-də şüşə panelli mini toxunma açarı

Həmişə olduğu kimi, cihazın işləməsi protokola əsaslanır MySensors. Bu toxunma açarının roller pərdələrə nəzarət sistemində istifadə edilməsi planlaşdırılır. Ancaq ümumiyyətlə, tətbiq yalnız təsəvvürünüzlə məhdudlaşır. Məsələn, mənim oğlum (7 yaşında) keçid versiyaları üçün artıq 3 sifariş verdi: vanna ilə tualetdə işığı yandırmaq və söndürmək (o, yerdən aşağı quraşdırılacaq), işığı yandırmaq. Canavarlar qaçması üçün otağınızdakı işığı tez yandırmaq üçün vanna otağı olan tualetə, digəri isə çarpayıya gedərkən uzun və qaranlıq dəhliz.

nRF52832-də şüşə panelli mini toxunma açarı
nRF52832-də şüşə panelli mini toxunma açarı
nRF52832-də şüşə panelli mini toxunma açarı

Korpus ənənəvi olaraq SLA printerində çap edilib, cihaz miniatürdür, korpus kiçik olub, bu çap texnologiyasından istifadə özünü doğruldur.

Çap edilmiş modelə baxınnRF52832-də şüşə panelli mini toxunma açarı
nRF52832-də şüşə panelli mini toxunma açarı
nRF52832-də şüşə panelli mini toxunma açarı

Maqnitlər korpusa və batareya bölməsinin qapağına yapışdırılıb.

Bu cihazın sınaqları ilə videolar:



Təkrar etmək istəyənlər üçün:

Arduino IDE üçün diyircəkli pərdə idarəetmə sistemində keçid üçün proqram kodunu sınayın

Arduino naqilləri

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-də iş faylları - google drive

Gerber PCB faylları - google drive

Bu inkişafla, Arduinos və Mysensors-dakı inkişaflarınızdakı çətinliklərlə bağlı suallarınız üçün telegram çatımızda həmişə köməyə gələcək - https://t.me/mysensors_rus.

Mənbə: www.habr.com

Добавить комментарий