nRF52832 da shisha panelli mini sensorli kalit

Bugungi maqolamda sizlar bilan yangi loyihani baham ko'rmoqchiman. Bu safar shisha panelli sensorli kalit. Qurilma ixcham, o'lchami 42x42 mm (standart shisha panellarning o'lchamlari 80x80 mm). Ushbu qurilmaning tarixi uzoq vaqt oldin, taxminan bir yil oldin boshlangan.

nRF52832 da shisha panelli mini sensorli kalit

Birinchi variantlar atmega328 mikrokontrollerida edi, ammo oxir-oqibat hammasi nRF52832 mikrokontrolleri bilan yakunlandi.

nRF52832 da shisha panelli mini sensorli kalit

Qurilmaning sensorli qismi TTP223 chiplarida ishlaydi. Ikkala sensor ham bitta uzilish bilan xizmat qiladi. TPS2477 chipidagi kuchaytiruvchi konvertor orqali CR610981 batareyasi bilan ishlaydi | tafsilotli ro'yxat.

nRF52832 da shisha panelli mini sensorli kalit
nRF52832 da shisha panelli mini sensorli kalit

Qurilma dala effektli tranzistorlar yordamida quvvatni o'chirish sxemasini amalga oshiradi. Tugmani bosgandan so'ng, mikrokontrollerning o'zi quvvatni boshqarishni to'xtatadi va keyin tugma xizmat ko'rsatish rejimlari uchun ishlatilishi mumkin (mening holatimda bu boshqa qurilmalar bilan bog'lanish, quvvatni o'chirish va zavod sozlamalarini tiklash).

Holatlar va xizmat ko'rsatish rejimlarini ko'rsatish uchun 2 rgb LED mavjud. Sensorli tugmalarni bosish va xizmat ko'rsatish rejimlarining ovozli ko'rsatkichlarini taqlid qilish uchun piezo emitent ham qo'shildi. LED va piezo emitterni foydalanuvchining xohishiga ko'ra yoqish va o'chirish mumkin. Bu aqlli uy boshqaruvchisi orqali texnik sensorlarga buyruqlar yuborish orqali amalga oshiriladi; foydalanuvchi shuningdek, aqlli uy boshqaruvchisi orqali batareya zaryadini va signal darajasini yuborish intervallarini o'zgartirishi mumkin. Mening holimda shunday MORDOMO.

Uzatish rejimidagi iste'mol 7mA (250kbit, 10ms), uyqudagi iste'mol 40Β΅A, o'chirilgan holatda iste'mol 1Β΅A dan kam (=bo'sh rejimda kuchaytiruvchi konvertorning iste'moli). Dasturlash uchun Rx, tx, swd ulagichi taqdim etilgan. 2 pitchli miniatyura 3x1.27p ulagichi ishlatiladi. Dasturlash uchun maxsus adapter ishlab chiqariladi.

nRF52832 da shisha panelli mini sensorli kalit

Har doimgidek, qurilmaning ishlashi protokolga asoslanadi MySensors. Ushbu sensorli kalit rolikli panjurni boshqarish tizimida qo'llanilishi rejalashtirilgan. Ammo umuman olganda, dastur faqat sizning tasavvuringiz bilan cheklangan. Masalan, mening o'g'lim (7 yosh) allaqachon kommutator versiyalariga 3 ta buyurtma bergan: vannali hojatxonadagi chiroqni yoqish va o'chirish (u poldan pastroqda o'rnatiladi), chiroqni yoqish va o'chirish. Vannali hojatxonaga, boshqasi esa karavot yoniga borganingizda uzun va qorong'i yo'lak, yirtqich hayvonlar qochib ketishi uchun xonangizdagi yorug'likni tezda yoqish uchun.

nRF52832 da shisha panelli mini sensorli kalit
nRF52832 da shisha panelli mini sensorli kalit
nRF52832 da shisha panelli mini sensorli kalit

Koson an'anaviy ravishda SLA printerida chop etilgan, qurilma miniatyura, korpus kichik bo'lib chiqdi, ushbu bosib chiqarish texnologiyasidan foydalanish oqlanadi.

Chop etilgan modelni ko'rishnRF52832 da shisha panelli mini sensorli kalit
nRF52832 da shisha panelli mini sensorli kalit
nRF52832 da shisha panelli mini sensorli kalit

Magnitlar korpusga va batareya bo'limi qopqog'iga yopishtirilgan.

Ushbu qurilma sinovlari bilan videolar:



Takrorlashni istaganlar uchun:

Arduino IDE uchun rolikli panjurni boshqarish tizimidagi kalit uchun dastur kodini sinab ko'ring

Arduino simlari

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-dagi ish fayllari - google drive

Gerber PCB fayllari - google drive

Ushbu rivojlanish, Arduinos va Mysensors-dagi ishlanmalaringizdagi qiyinchiliklar haqida savollar uchun bizning telegram chatimizda har doim yordamga keladi - https://t.me/mysensors_rus.

Manba: www.habr.com

a Izoh qo'shish