Beddel yar oo taabasho leh oo leh muraayad muraayad ah oo ku taal nRF52832

Maqaalka maanta waxaan rabaa in aan idinla wadaago mashruuc cusub. Markan waa taabasho taabasho leh oo leh muraayad muraayad ah. Qalabku waa mid cufan, oo cabbiraya 42x42mm ( muraayadaha caadiga ah waxay leeyihiin cabbir 80x80mm). Taariikhda qalabkani waxay bilaabatay wakhti dheer ka hor, qiyaastii hal sano ka hor.

Beddel yar oo taabasho leh oo leh muraayad muraayad ah oo ku taal nRF52832

Ikhtiyaarada ugu horeeya waxay ahaayeen atmega328 microcontroller, laakiin ugu dambeyntii waxay ku dhammaatay nRF52832 microcontroller.

Beddel yar oo taabasho leh oo leh muraayad muraayad ah oo ku taal nRF52832

Qaybta taabashada ee qalabku waxay ku socotaa chips TTP223. Labada dareeme waxa loo adeegaa hal kala goyn. Waxaa ku shaqeeya batari CR2477 ah, iyadoo loo sii marinayo beddelka kor u qaadista chip-ka TPS610981 | Xaashida xogta.

Beddel yar oo taabasho leh oo leh muraayad muraayad ah oo ku taal nRF52832
Beddel yar oo taabasho leh oo leh muraayad muraayad ah oo ku taal nRF52832

Qalabku wuxuu fuliyaa koronto-demis isagoo isticmaalaya transistor-ka saamaynta goobta. Ka dib markaad riixdo badhanka, microcontroller laftiisa ayaa xakameynaya xakamaynta korantada ka dibna badhanka waxaa loo isticmaali karaa hababka adeegga (xaaladdayda, tani waxay ku xiran tahay qalabka kale, daminta korontada iyo dib u dejinta goobaha warshadaha).

Waxaa jira 2 rgb LEDs oo muujinaya gobolada iyo hababka adeegga. Qalabka hawada sare ee loo yaqaan 'piezo emitter' ayaa sidoo kale lagu daray si uu u ekaado riix marka la taabanayo badhamada taabashada iyo muujinta dhawaaqa hababka adeegga. LED-yada iyo emitter-ka piezo waa la dami karaa oo la dami karaa go'aanka isticmaaluhu. Tan waxaa lagu sameeyaa iyada oo loo marayo kontaroolaha guriga ee caqliga leh iyadoo loo dirayo amarrada dareemayaasha farsamada; isticmaaluhu sidoo kale wuxuu bedeli karaa inta u dhaxaysa u dirida kharashka batteriga iyo heerka signalka sidoo kale iyada oo loo marayo kantaroolaha guriga smart. Xaaladeyda waa MAJORDOMO.

Isticmaalka habka gudbinta waa 7mA (250kbit, 10ms), isticmaalka hurdada waa 40Β΅A, isticmaalka gobolka ka baxsan wuxuu ka yar yahay 1Β΅A Rx, tx, xiriiriyaha swd ee barnaamijka ayaa la bixiyay. Xidhiidhiyaha 2x3p yar oo leh garoon 1.27 ah ayaa la isticmaalaa. Adapter gaar ah ayaa loo sameeyay barnaamijka.

Beddel yar oo taabasho leh oo leh muraayad muraayad ah oo ku taal nRF52832

Sida had iyo jeer, hawlgalka qalabku wuxuu ku salaysan yahay borotokoolka MySensors. Furaha taabashada taabashada waxaa loo qorsheeyay in lagu isticmaalo nidaamka xakamaynta indhoolaha rullaluistuyada. Laakiin guud ahaan, codsiga waxa xaddidaya oo kaliya male-awaalkaaga. Tusaale ahaan, wiilkayga (7 sano jir) wuxuu horey u sameeyay 3 dalab oo loogu talagalay noocyada beddelka: in la shido oo la damiyo iftiinka musqusha musqusha leh (waxa lagu dhejin doonaa meel hoose oo dabaq ah), si loo shido iftiinka Jidka dheer iyo mugdiga ah markaad u safraysid musqul leh musqul, iyo mid kale oo sariir ah, si dhakhso ah u shid iftiinka qolkaaga si ay daanyeerka u cararaan.

Beddel yar oo taabasho leh oo leh muraayad muraayad ah oo ku taal nRF52832
Beddel yar oo taabasho leh oo leh muraayad muraayad ah oo ku taal nRF52832
Beddel yar oo taabasho leh oo leh muraayad muraayad ah oo ku taal nRF52832

Kiisku wuxuu ahaa mid dhaqan ahaan lagu daabacay daabacaha SLA, qalabku wuu yar yahay, kiisku wuxuu noqday mid yar, adeegsiga tignoolajiyadan daabacaadda waa xaq.

Eeg qaabka daabacanBeddel yar oo taabasho leh oo leh muraayad muraayad ah oo ku taal nRF52832
Beddel yar oo taabasho leh oo leh muraayad muraayad ah oo ku taal nRF52832
Beddel yar oo taabasho leh oo leh muraayad muraayad ah oo ku taal nRF52832

Magnets ayaa ku dheggan kiiska iyo daboolka qaybta batteriga.

Fiidyowyo leh tijaabooyinka qalabkan:



Kuwa raba inay ku celiyaan:

Tijaabi koodka barnaamijka beddelka nidaamka xakamaynta indho la'aanta ee 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);
}

Faylasha kiiska ee stl - google drive

Gerber PCB faylasha - google drive

Su'aalaha ku saabsan horumarkan, ee ku saabsan dhibaatooyinka horumarkaaga ku saabsan Arduinos iyo Mysensors ayaa had iyo jeer u soo samatabbixin doona sheekeysiga telegram-keena - https://t.me/mysensors_rus.

Source: www.habr.com

Add a comment