Mini ukipen etengailua kristalezko panelarekin nRF52832n

Gaurko artikuluan proiektu berri bat partekatu nahi dut zuekin. Oraingoan ukipen etengailua da kristalezko panel batekin. Gailua trinkoa da, 42x42mm neurtzen du (kristalezko panel estandarrak 80x80mm dimentsioak ditu). Gailu honen historia aspaldi hasi zen, duela urtebete inguru.

Mini ukipen etengailua kristalezko panelarekin nRF52832n

Lehen aukerak atmega328 mikrokontrolagailuan zeuden, baina azkenean nRF52832 mikrokontrolagailuarekin amaitu zen guztia.

Mini ukipen etengailua kristalezko panelarekin nRF52832n

Gailuaren ukipen-zatia TTP223 txipekin exekutatzen da. Bi sentsoreak etenaldi batez hornitzen dira. CR2477 bateria batek elikatzen du, TPS610981 txiparen boost bihurgailu baten bidez | fitxa teknikoa.

Mini ukipen etengailua kristalezko panelarekin nRF52832n
Mini ukipen etengailua kristalezko panelarekin nRF52832n

Gailuak itzaltzeko zirkuitu bat ezartzen du eremu-efektuko transistoreak erabiliz. Botoia sakatu ondoren, mikrokontrolagailuak berak potentzia kontrola atzematen du eta, ondoren, botoia zerbitzu moduetarako erabil daiteke (nire kasuan, hau beste gailu batzuekin parekatzea, itzaltzea eta fabrikako ezarpenetara berrezartzea da).

2 RGB LED daude egoerak eta zerbitzu moduak adierazteko. Piezo igorle bat ere gehitu da ukipen-botoiak ukitzean klik bat simulatzeko eta zerbitzu moduen soinu-adierazpena. LEDak eta piezo-igorlea piztu eta itzali daitezke erabiltzailearen erabakian. Hau etxeko kontrolagailu adimendunaren bidez egiten da sentsore teknikoei aginduak bidaliz; erabiltzaileak bateriaren karga eta seinale maila bidaltzeko tarteak ere alda ditzake etxeko kontrolagailu adimendunaren bidez. Nire kasuan hala da MAJORDOMO.

Igorpen moduan kontsumoa 7mA da (250kbit, 10ms), loaldian kontsumoa 40Β΅A da, itzalita egoeran kontsumoa 1Β΅A baino txikiagoa da (=boost bihurgailuaren kontsumoa β€œinaaktibo” moduan). Programaziorako Rx, tx, swd konektorea eskaintzen da. Miniaturazko 2x3p konektore bat erabiltzen da 1.27ko altuera duena. Programaziorako egokitzaile berezi bat egiten da.

Mini ukipen etengailua kristalezko panelarekin nRF52832n

Beti bezala, gailuaren funtzionamendua protokoloan oinarritzen da NireSentsoreak. Ukipen-etengailu hau pertsianen kontrol sisteman erabiltzeko aurreikusita dago. Baina, oro har, aplikazioa zure irudimenak soilik mugatzen du. Adibidez, nire semeak (7 urte) dagoeneko 3 eskaera egin ditu etengailuen bertsioetarako: bainuontzia duen komun batean argia piztea eta itzaltzea (lurretik baxua jarriko da), argia piztea. korridore luze eta iluna bainuontzia duen komun batera bidaiatzean, eta beste bat ohe-ohe gisa, zure gelako argia azkar pizteko, munstroek ihes egin dezaten.

Mini ukipen etengailua kristalezko panelarekin nRF52832n
Mini ukipen etengailua kristalezko panelarekin nRF52832n
Mini ukipen etengailua kristalezko panelarekin nRF52832n

Kasua tradizionalki SLA inprimagailu batean inprimatzen zen, gailua miniaturazkoa da, kasua txikia izan zen, inprimatzeko teknologia honen erabilera justifikatuta dago.

Ikusi inprimatutako ereduaMini ukipen etengailua kristalezko panelarekin nRF52832n
Mini ukipen etengailua kristalezko panelarekin nRF52832n
Mini ukipen etengailua kristalezko panelarekin nRF52832n

Imanak zorroan eta bateriaren konpartimenduko estalkian itsatsita daude.

Gailu honen probak dituzten bideoak:



Errepikatu nahi dutenentzat:

Probatu programaren kodea Arduino IDErako pertsianen kontrol-sistema bateko etengailu baterako

Arduino kableatua

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

Kasu fitxategiak stl-n - google drive

Gerber PCB fitxategiak - google drive

Garapen honi buruzko galderak egiteko, Arduinos eta Mysensors-en zure garapenen zailtasunei buruz beti erreskatatuko dira gure telegram txatean - https://t.me/mysensors_rus.

Iturria: www.habr.com

Gehitu iruzkin berria