Ukutshintshela okuncinci kunye nepaneli yeglasi kwi-nRF52832

Kwinqaku lanamhlanje ndifuna ukwabelana nawe ngeprojekthi entsha. Ngeli xesha kukutshintsha kokuchukumisa kunye nepaneli yeglasi. Isixhobo sihlangene, silinganisa i-42x42mm (iipaneli zeglasi eziqhelekileyo zinemilinganiselo ye-80x80mm). Imbali yesi sixhobo yaqala kudala, malunga nonyaka odlulileyo.

Ukutshintshela okuncinci kunye nepaneli yeglasi kwi-nRF52832

Iinketho zokuqala zazikwi-atmega328 microcontroller, kodwa ekugqibeleni yonke yaphela nge-nRF52832 microcontroller.

Ukutshintshela okuncinci kunye nepaneli yeglasi kwi-nRF52832

Inxalenye yokuchukumisa yesixhobo isebenza kwiitshiphusi zeTTP223. Zombini abenzi boluvo banikezelwa sisiphazamiso esinye. Ixhaswe ngebhetri ye-CR2477, ngokusebenzisa i-boost converter kwi-chip ye-TPS610981 | ishiti yedatha.

Ukutshintshela okuncinci kunye nepaneli yeglasi kwi-nRF52832
Ukutshintshela okuncinci kunye nepaneli yeglasi kwi-nRF52832

Isixhobo sisebenzisa isiphaluka sokucima umbane sisebenzisa i-transistors ye-field-effect. Emva kokucofa iqhosha, i-microcontroller ngokwayo ibamba ulawulo lwamandla kwaye emva koko iqhosha lingasetyenziselwa iindlela zenkonzo (kwimeko yam, oku kukudibanisa nezinye izixhobo, ukucima amandla kunye nokusetha kwakhona kwizicwangciso zefektri).

Kukho ii-LED ze-2 rgb zokubonisa amazwe kunye neendlela zenkonzo. I-piezo emitter iye yongezwa ukulinganisa ukucofa xa uchukumisa amaqhosha kunye nesandi esibonakalisa iindlela zenkonzo. Ii-LED kunye ne-piezo emitter zinokuvulwa kwaye zicinywe ngokubona komsebenzisi. Oku kwenziwa ngesilawuli sekhaya esikrelekrele ngokuthumela imiyalelo kwizivavanyi zobugcisa; umsebenzisi unokutshintsha amaxesha okuthumela intlawulo yebhetri kunye nenqanaba lomqondiso kwakhona ngesilawuli sekhaya esilumkileyo. Kwimeko yam kunjalo MAJORDOMO.

Ukusetyenziswa kwimo yokuhambisa yi-7mA (250kbit, 10ms), ukusetyenziswa ebuthongweni yi-40Β΅A, ukusetyenziswa kwimeko engaphandle kungaphantsi kwe-1Β΅A (=ukusetyenziswa kwe-boost converter kwimo "engasebenziyo"). I-Rx, tx, i-swd isinxibelelanisi sodweliso sinikezelwe. Isixhobo esincinci se-2x3p esine-pitch ye-1.27 sisetyenziswa. Iadaptha ekhethekileyo yenziwe ukulungiselela inkqubo.

Ukutshintshela okuncinci kunye nepaneli yeglasi kwi-nRF52832

Njengesiqhelo, ukusebenza kwesixhobo kusekwe kwiprotocol MySensors. Olu tshintsho lokuchukumisa lucetywa ukuba lusetyenziswe kwinkqubo yokulawula i-roller blind. Kodwa ngokubanzi, isicelo sinqunyelwe kuphela yingcamango yakho. Umzekelo, unyana wam (iminyaka eyi-7 ubudala) sele enze ii-odolo ezi-3 zeenguqulelo zokutshintsha: ukukhanyisa kunye nokucima ukukhanya kwindlu yangasese enebhafu (iya kunyuswa phantsi ukusuka phantsi), ukukhanyisa ukukhanya Ipaseji ende nemnyama xa usiya kwindlu yangasese enebhafu, nenye njengesecaleni kwebhedi, ukukhanyisa ngokukhawuleza kwigumbi lakho ukuze izilo zibaleke.

Ukutshintshela okuncinci kunye nepaneli yeglasi kwi-nRF52832
Ukutshintshela okuncinci kunye nepaneli yeglasi kwi-nRF52832
Ukutshintshela okuncinci kunye nepaneli yeglasi kwi-nRF52832

Ityala lalishicilelwe ngokwesiko kumshicileli we-SLA, isixhobo sincinci, imeko yajika yaba yincinci, ukusetyenziswa kobu buchwephesha bokushicilela kufanelekile.

Jonga imodeli eprintiweyoUkutshintshela okuncinci kunye nepaneli yeglasi kwi-nRF52832
Ukutshintshela okuncinci kunye nepaneli yeglasi kwi-nRF52832
Ukutshintshela okuncinci kunye nepaneli yeglasi kwi-nRF52832

Iimagnethi zincanyathiselwe kwicasi kunye nesigqubuthelo sendawo yebhetri.

Iividiyo ezinovavanyo lwesi sixhobo:



Kwabo bafuna ukuphinda:

Ikhowudi yeprogram yovavanyo yokutshintsha kwi-roller blind control system ye-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);
}

Iifayile zetyala kwi-stl - google drive

Iifayile zeGerber PCB - google drive

Ngemibuzo malunga nolu phuhliso, malunga nobunzima kuphuhliso lwakho kwi-Arduinos kunye neMysensors iya kuhlala isiza kwingxoxo yethu yetelegram - https://t.me/mysensors_rus.

umthombo: www.habr.com

Yongeza izimvo