Mini touch switch misy tontonana fitaratra amin'ny nRF52832

Amin'ity lahatsoratra anio ity dia te hizara aminareo tetikasa vaovao aho. Amin'ity indray mitoraka ity dia switch fikasihana misy tontonana fitaratra. Ny fitaovana dia matevina, mirefy 42x42mm (ny takelaka fitaratra mahazatra dia manana refy 80x80mm). Efa ela no nanomboka ny tantaran'ity fitaovana ity, tokony ho herintaona lasa izay.

Mini touch switch misy tontonana fitaratra amin'ny nRF52832

Ny safidy voalohany dia tao amin'ny microcontroller atmega328, fa tamin'ny farany dia nifarana tamin'ny microcontroller nRF52832.

Mini touch switch misy tontonana fitaratra amin'ny nRF52832

Ny ampahany mikasika ny fitaovana dia mandeha amin'ny chip TTP223. Ireo sensor roa ireo dia karakarain'ny interrupt iray. Powered by CR2477 battery, via boost converter on the TPS610981 chip | Takela-daza.

Mini touch switch misy tontonana fitaratra amin'ny nRF52832
Mini touch switch misy tontonana fitaratra amin'ny nRF52832

Ny fitaovana dia mametra ny fampandehanana herinaratra amin'ny alΓ lan'ny transistor effet-field. Aorian'ny fanindriana ny bokotra dia ny microcontroller mihitsy no manakana ny fanaraha-maso ny herinaratra ary avy eo ny bokotra dia azo ampiasaina amin'ny maody serivisy (raha ny ahy, ity dia miaraka amin'ny fitaovana hafa, mamono ny herinaratra ary mamerina amin'ny toeran'ny orinasa).

Misy LED 2 rgb ho famantarana ny fanjakana sy ny fomba serivisy. Nampiana piezo emitter ihany koa mba haka sary an-tsarimihetsika rehefa mikitika bokotra fikasihana sy famantarana feo amin'ny fomba serivisy. Ny LED sy piezo emitter dia azo alefa sy vonoina araka ny fahaizan'ny mpampiasa. Izany dia atao amin'ny alΓ lan'ny fanaraha-maso an-trano marani-tsaina amin'ny alΓ lan'ny fandefasana baiko amin'ny sensor ara-teknika; ny mpampiasa dia afaka manova ny elanelan'ny fandefasana ny bateria sy ny haavon'ny famantarana ihany koa amin'ny alΓ lan'ny fanaraha-maso an-trano. Raha ny amiko dia izany MAJORDOMO.

Ny fanjifana amin'ny fomba fampitana dia 7mA (250kbit, 10ms), ny fanjifana amin'ny torimaso dia 40ΞΌA, ny fanjifana amin'ny toe-javatra tsy mety dia latsaky ny 1ΞΌA (=fanjifana ny mpanova boost amin'ny fomba "tsy miasa"). Rx, tx, swd connector ho an'ny fandaharana dia omena. Ny connecteur miniature 2x3p misy pitch 1.27 no ampiasaina. Misy adaptatera manokana natao ho an'ny fandaharana.

Mini touch switch misy tontonana fitaratra amin'ny nRF52832

Toy ny mahazatra, ny fiasan'ny fitaovana dia mifototra amin'ny protocol MySensors. Ity switch mikasika ity dia nokasaina hampiasaina amin'ny rafitra fanaraha-maso jamba-roller. Saingy amin'ny ankapobeny, ny fampiharana dia voafetra amin'ny eritreritrao ihany. Ohatra, ny zanako lahy (7 taona) dia efa nanao baiko 3 ho an'ny dikan-teny mifamadika: mandrehitra sy mamono ny jiro ao amin'ny trano fidiovana misy koveta fandroana (ambony ambany amin'ny tany izy io), mandrehitra ny jiro amin'ny a lalantsara lava sy maizina rehefa mandeha mankany amin'ny trano fidiovana misy koveta fandroana, ary ny iray hafa ho eo anilan'ny fandriana, mba hamonjena haingana ny jiro ao amin'ny efitranonao mba handositra ireo biby goavam-be.

Mini touch switch misy tontonana fitaratra amin'ny nRF52832
Mini touch switch misy tontonana fitaratra amin'ny nRF52832
Mini touch switch misy tontonana fitaratra amin'ny nRF52832

Ny raharaha dia natao pirinty tamin'ny mpanonta SLA nentim-paharazana, ny fitaovana dia kely, ny raharaha dia nivadika ho kely, ny fampiasana ity teknolojia fanontana ity dia ara-drariny.

Jereo ny modely vita pirintyMini touch switch misy tontonana fitaratra amin'ny nRF52832
Mini touch switch misy tontonana fitaratra amin'ny nRF52832
Mini touch switch misy tontonana fitaratra amin'ny nRF52832

Ny andriamby dia apetaka amin'ny fonony sy ny fonon'ny batterie.

Horonantsary misy andrana an'ity fitaovana ity:



Ho an'izay te hamerina:

Kaody programa fitsapana ho an'ny switch amin'ny rafitra fanaraha-maso jamba ho an'ny 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);
}

Takelaka data stl - google drive

Gerber PCB rakitra - google drive

Ho an'ny fanontaniana momba an'io fivoarana io, momba ny fahasarotana amin'ny fivoaranao amin'ny Arduinos sy Mysensors dia ho tonga hamonjy amin'ny chat telegrama - https://t.me/mysensors_rus.

Source: www.habr.com

Add a comment