Tionndadh beag suathaidh le pannal glainne air nRF52832

Anns an artaigil an-diugh tha mi airson pròiseact ùr a roinn leat. An turas seo is e suidse suathaidh a th’ ann le pannal glainne. Tha an inneal teann, a’ tomhas 42x42mm (tha meudan pannalan glainne àbhaisteach 80x80mm). Thòisich eachdraidh an inneal seo o chionn fhada, timcheall air bliadhna air ais.

Tionndadh beag suathaidh le pannal glainne air nRF52832

Bha a’ chiad roghainnean air an atmega328 microcontroller, ach aig a’ cheann thall thàinig e gu crìch leis an microcontroller nRF52832.

Tionndadh beag suathaidh le pannal glainne air nRF52832

Bidh am pàirt suathaidh den inneal a’ ruith air sgoltagan TTP223. Tha an dà sensor air an toirt seachad le aon bhriseadh. Le cumhachd bataraidh CR2477, tro inneal-tionndaidh àrdachadh air a’ chip TPS610981 | Duilleag dàta.

Tionndadh beag suathaidh le pannal glainne air nRF52832
Tionndadh beag suathaidh le pannal glainne air nRF52832

Bidh an inneal a’ cur an gnìomh cuairt cumhachd dheth a’ cleachdadh transistors buaidh achaidh. Às deidh putadh air a ’phutan, bidh am microcontroller fhèin a’ toirt a-steach smachd cumhachd agus an uairsin faodar am putan a chleachdadh airson modhan seirbheis (anns a ’chùis agam, tha seo a’ dol còmhla ri innealan eile, a ’tionndadh a’ chumhachd agus ag ath-shuidheachadh gu suidheachadh factaraidh).

Tha 2 rgb LED ann airson stàitean agus modhan seirbheis a chomharrachadh. Chaidh emitter piezo a chuir ris cuideachd gus atharrais air cliog nuair a bhios tu a’ suathadh air putanan suathaidh agus deagh chomharradh air modhan seirbheis. Faodar na LEDs agus piezo emitter a thionndadh air agus dheth a rèir toil an neach-cleachdaidh. Tha seo air a dhèanamh tro rianadair dachaigh smart le bhith a’ cur òrdughan gu mothachairean teignigeach; faodaidh an neach-cleachdaidh cuideachd na h-amannan atharrachadh airson cosgais bataraidh agus ìre chomharran a chuir cuideachd tro rianadair an dachaigh spaideil. Anns a 'chùis agam tha e MÒR-MHÒR.

Is e caitheamh ann am modh tar-chuir 7mA (250kbit, 10ms), is e caitheamh ann an cadal 40µA, tha caitheamh anns an stàit dheth nas lugha na 1µA (= caitheamh an inneal-tionndaidh àrdachadh ann am modh “idle”). Tha ceangal Rx, tx, swd airson prògramadh air a thoirt seachad. Thathas a’ cleachdadh inneal-ceangail beag 2x3p le pitch de 1.27. Tha inneal-atharrachaidh sònraichte air a dhèanamh airson prògramadh.

Tionndadh beag suathaidh le pannal glainne air nRF52832

Mar as àbhaist, tha obrachadh an inneil stèidhichte air a’ phròtacal Mo Sensors. Thathas an dùil an suidse suathaidh seo a chleachdadh anns an t-siostam smachd rolair dall. Ach san fharsaingeachd, tha an tagradh air a chuingealachadh a-mhàin le do mhac-meanmna. Mar eisimpleir, tha mo mhac (7 bliadhna a dh'aois) air 3 òrdughan a dhèanamh mu thràth airson dreachan suidse: an solas a thionndadh air agus dheth ann an taigh-beag le bathtub (bidh e air a chuir sìos bhon ùrlar), gus an solas a chuir air. trannsa fada is dorcha nuair a bhios tu a’ siubhal gu taigh-beag le bathtub, agus fear eile ri taobh na leapa, airson an solas anns an t-seòmar agad a thionndadh gu sgiobalta gus am bi na h-uilebheistean a’ ruith air falbh.

Tionndadh beag suathaidh le pannal glainne air nRF52832
Tionndadh beag suathaidh le pannal glainne air nRF52832
Tionndadh beag suathaidh le pannal glainne air nRF52832

Chaidh a ’chùis a chlò-bhualadh gu traidiseanta air clò-bhualadair SLA, tha an inneal beag, thionndaidh a’ chùis a-mach gu bhith beag, tha cleachdadh an teicneòlais clò-bhualaidh seo air fhìreanachadh.

Seall am modail clò-bhuailteTionndadh beag suathaidh le pannal glainne air nRF52832
Tionndadh beag suathaidh le pannal glainne air nRF52832
Tionndadh beag suathaidh le pannal glainne air nRF52832

Tha magnets air an glaodhadh a-steach don chùis agus còmhdach roinn a ’bhataraidh.

Bhideothan le deuchainnean an inneal seo:



Dhaibhsan a tha airson ath-aithris:

Còd prògram deuchainn airson suidse ann an siostam smachd rolair dall airson Arduino IDE

Sreangadh Arduino

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);
}

Faidhlichean cùise ann an stl - draibh google

Faidhlichean Gerber PCB - draibh google

Airson ceistean mun leasachadh seo, bidh duilgheadasan anns na leasachaidhean agad air Arduinos agus Mysensors an-còmhnaidh a’ tighinn gu teasairginn nar còmhradh teileagram - https://t.me/mysensors_rus.

Source: www.habr.com

Cuir beachd ann