nRF52832 шыны панелі бар шағын сенсорлық қосқыш

Бүгінгі мақалада мен сіздермен жаңа жобамен бөліскім келеді. Бұл жолы шыны панелі бар сенсорлық қосқыш. Құрылғы ықшам, өлшемі 42x42 мм (стандартты шыны панельдер 80x80 мм). Бұл құрылғының тарихы көп уақыт бұрын, шамамен бір жыл бұрын басталды.

nRF52832 шыны панелі бар шағын сенсорлық қосқыш

Алғашқы нұсқалар atmega328 микроконтроллеріне негізделген, бірақ соңында барлығы nRF52832 микроконтроллерімен аяқталды.

nRF52832 шыны панелі бар шағын сенсорлық қосқыш

Құрылғының сенсор бөлігі TTP223 микрочиптері арқылы жұмыс істейді. Екі сенсор да бір үзіліспен бөліседі. Қуат TPS610981 құрылғысындағы күшейткіш түрлендіргіш арқылы CR2477 батареясымен қамтамасыз етіледі | Деректер парағы.

nRF52832 шыны панелі бар шағын сенсорлық қосқыш
nRF52832 шыны панелі бар шағын сенсорлық қосқыш

Құрылғыда өрістік транзисторларды қолданатын қуатты өшіру тізбегі бар. Түймені басқаннан кейін микроконтроллер қуатты басқаруды автоматты түрде қабылдайды, содан кейін түймені қызмет көрсету режимдері үшін пайдалануға болады (менің жағдайда, бұл басқа құрылғылармен жұптастыруды, қуатты өшіруді және зауыттық параметрлерді қалпына келтіруді қамтиды).

Күй мен қызмет көрсету режимін көрсету үшін екі RGB жарық диоды бар. Сондай-ақ сенсорлық түймелерді басқан кезде шертуді имитациялау және қызмет көрсету режимдерінің дыбыстық индикациясын қамтамасыз ету үшін пьезо дыбыстық сигнал қосылды. Жарық диодты шамдар мен пьезо дыбыстық сигналды пайдаланушының қалауы бойынша қосуға және өшіруге болады. Бұл техникалық сенсорларға пәрмендерді жібере отырып, ақылды үй контроллері арқылы жасалады. Сондай-ақ пайдаланушы смарт үй контроллері арқылы аккумуляторды зарядтау аралықтарын және сигнал күшін өзгерте алады. Менің жағдайда, бұл МАЖОРДОМО.

Тасымалдау режиміндегі қуат тұтынуы 7 мА (250 кбит/с, 10 мс), ұйқы режиміндегі қуат тұтынуы 40 мкА, ал өшіру режиміндегі қуат тұтынуы 1 мкА-дан аз (= бос режимдегі күшейткіш түрлендіргішті тұтыну). Бағдарламалау үшін RX, TX және SWD қосқышы беріледі. 1.27 қадамы бар шағын 2x3p қосқышы қолданылады. Бағдарламалау үшін арнайы адаптер жасалған.

nRF52832 шыны панелі бар шағын сенсорлық қосқыш

Әдеттегідей, құрылғының жұмысы протоколға негізделген MySensorsБұл сенсорлық қосқыш роликті жалюзи басқару жүйесінде пайдалану үшін жоспарланған. Дегенмен, жалпы қолдану тек сіздің қиялыңызбен шектеледі. Мысалы, менің 7 жасар ұлым қосқыштың үш нұсқасына тапсырыс берді: біреуі ванна бөлмесіндегі жарықты қосу және өшіру (еденге төмен орнатылған), біреуі ваннаға бара жатқанда ұзын, қараңғы дәлізде жарықты қосу және екіншісі - құбыжықтар жүгіру үшін бөлмесіндегі жарықты тез қосу үшін төсек жанындағы қосқыш ретінде.

nRF52832 шыны панелі бар шағын сенсорлық қосқыш
nRF52832 шыны панелі бар шағын сенсорлық қосқыш
nRF52832 шыны панелі бар шағын сенсорлық қосқыш

Корпус дәстүрлі түрде SLA принтерінде басып шығарылды; құрылғы миниатюралық, корпусы кішкентай болып шықты және осы басып шығару технологиясын пайдалану негізделген.

Басып шығарылған үлгіні қараңызnRF52832 шыны панелі бар шағын сенсорлық қосқыш
nRF52832 шыны панелі бар шағын сенсорлық қосқыш
nRF52832 шыны панелі бар шағын сенсорлық қосқыш

Магниттер корпусқа және батарея бөлігінің қақпағына жабыстырылған.

Осы құрылғының сынақтары бар бейнелер:

Бейнені ойнату

Бейнені ойнату

Бейнені ойнату

Қайталауды қалайтындар үшін:

Arduino IDE үшін роликті жалюзи басқару жүйесінің қосқышына арналған сынақ бағдарлама кодын

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

stl ішіндегі корпус файлдары — Google Drive

Gerber PCB файлдары - Google Drive

Егер сізде осы жобаға қатысты сұрақтарыңыз болса немесе Arduino және Mysensors жобаларыңызға қатысты қандай да бір қиындықтар туындаса, біз сізге Telegram чатында көмектесуге қуаныштымыз. https://t.me/mysensors_rus.

Ақпарат көзі: www.habr.com

DDoS қорғауы бар сайттар үшін сенімді хостинг, VPS VDS серверлерін сатып алыңыз 🔥 DDoS қорғанысы, VPS VDS серверлері бар сенімді веб-сайт хостингін сатып алыңыз | ProHoster