Guhestina mini touch bi panelê camê li ser nRF52832

Di gotara îro de ez dixwazim projeyek nû bi we re parve bikim. Vê carê ew bi panelek cam veguhezek pêçek e. Amûra kompakt e, bi pîvana 42x42mm (panelên cama standard xwedî pîvanên 80x80mm in). Dîroka vê cîhazê demek dirêj berê, bi qasî salek berê dest pê kir.

Guhestina mini touch bi panelê camê li ser nRF52832

Vebijarkên yekem li ser mîkrokontrolkerê atmega328 bûn, lê di dawiyê de ew hemî bi mîkrokontrolerê nRF52832 bi dawî bû.

Guhestina mini touch bi panelê camê li ser nRF52832

Parçeya destikê ya cîhazê li ser çîpên TTP223 dimeşe. Her du senzor ji hêla yek navberê ve têne xizmet kirin. Ji hêla pîlê CR2477 ve, bi navgînek veguhezkerek bihêz a li ser çîpê TPS610981 ve hatî hêzdar kirin | datasheet.

Guhestina mini touch bi panelê camê li ser nRF52832
Guhestina mini touch bi panelê camê li ser nRF52832

Amûr bi karanîna transîstorên bandora zeviyê pêvekek hêzê vedike. Piştî pêlkirina bişkojkê, mîkrokontroller bixwe kontrola hêzê digire û dûv re bişkoj dikare ji bo modên karûbarê were bikar anîn (di rewşa min de, ev bi cîhazên din re têkildar e, elektrîkê qut dike û vedigere mîhengên kargehê).

Ji bo nîşankirina rewşan û awayên karûbarê 2 rgb LED hene. Di heman demê de emiterek piezo jî hatiye zêdekirin da ku klîkek dema ku bişkojkên destikê û nîşana deng a modên karûbarê destnîşan dike simule bike. LEDs û emitera piezo dikarin li gorî biryara bikarhêner werin vemirandin û girtin. Ev bi navgîniya kontrolkera xaniyê biaqil bi şandina fermanan ji senzorên teknîkî re tê kirin; bikarhêner di heman demê de dikare navberên şandina barkirina batterê û asta sînyalê jî bi navgîniya kontrolkera xaniyê jîr biguhezîne. Di doza min de ew e MAJORDOMO.

Vexwarina di moda veguheztinê de 7mA (250kbit, 10ms) e, vexwarina di xewê de 40µA ye, vexwarin di rewşa neçalak de ji 1μA kêmtir e (=bikaranîna veguhezkarê zêdeker di moda "bêkar" de). Ji bo bernamekirinê girêdana Rx, tx, swd tê peyda kirin. Têkiliyek piçûk 2x3p bi pileya 1.27 tê bikar anîn. Ji bo bernamekirinê adapterek taybetî tê çêkirin.

Guhestina mini touch bi panelê camê li ser nRF52832

Mîna her gav, xebata amûrê li ser bingeha protokolê ye MySensors. Ev guhêrbar tê plansaz kirin ku di pergala kontrolkirina kor a roller de were bikar anîn. Lê bi gelemperî, serîlêdan tenê ji hêla xeyaliya we ve sînorkirî ye. Mînakî, kurê min (7 salî) jixwe 3 ferman ji bo guhertoyên guhêrbar çêkiriye: ronahiyê di tuwaletê de bi serşokê vekin û vemirînin (ew ê ji erdê nizm were çekirin), ronahiyê vekin. Korîdorek dirêj û tarî dema ku hûn diçin tuwaletek bi serşokê, û yekî din jî li kêleka nivînê, ji bo ku zû ronahiya odeya xwe vekin da ku cinawir birevin.

Guhestina mini touch bi panelê camê li ser nRF52832
Guhestina mini touch bi panelê camê li ser nRF52832
Guhestina mini touch bi panelê camê li ser nRF52832

Doz bi kevneşopî li ser çapkerek SLA hate çap kirin, amûrek mînyatur e, kavil piçûk bû, karanîna vê teknolojiya çapkirinê rastdar e.

Modela çapkirî bibîninGuhestina mini touch bi panelê camê li ser nRF52832
Guhestina mini touch bi panelê camê li ser nRF52832
Guhestina mini touch bi panelê camê li ser nRF52832

Magnet bi qalikê û qapaxa beşa pîlê têne zeliqandin.

Vîdyoyên bi ceribandinên vê cîhazê:



Ji bo kesên ku dixwazin dubare bikin:

Ji bo Arduino IDE koda bernameyê ceribandinê ji bo veguheztinek di pergalek kontrolê ya kor de

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

Pelên dozê li stl - google drive

Pelên Gerber PCB - google drive

Ji bo pirsên li ser vê pêşkeftinê, di derbarê dijwariyên di pêşkeftinên we de li ser Arduinos û Mysensors dê her gav di chat meya telegramê de werin rizgar kirin - https://t.me/mysensors_rus.

Source: www.habr.com

Add a comment