Смарт цоколь для лампы REDMOND — добавляем в умный дом

в 15:23, , рубрики: arduino, diy или сделай сам, MySensors, nrf51822

В этом обзоре речь пойдет об смарт цоколе бренда REDMOND — SkySocket 202S. Попалась как то мне на глаза статья об схемотехнике данного цоколя, почитав обратил внимание что мозгами данного девайса является чип от компании Nordic Semiconductor 51 серии (nRF51822).

Основным моим хобби на данный момент является посторение умного дома. Строю потихоньку радиосеть из устройств на протоколе MySensors. Если коротко о данном протоколе, то пожалуй можно сказать что это очень простой и удобный протокол на основе которого за один час в Ardunno IDE можно собрать пару устройств из ардуино модулей и запустить свою первую радиосеть датчиков. В последнее время делаю девайсы для своей сети MySensors на радиомодулях nRF51822 и nRF52832, поэтому и обратил внимание на этот цоколь.

Фото 1

Фото 2

Купив его в интернет магазине (за вполне себе небольшие деньги в районе 700 рублей) и разобрав увидел что на плате удобно выведены 4 контакта для програмирования. Недолго думая достал свой китайский программатор ST-LINK и мультметр и занялся прозвонкой платы что бы набросать схему устройства. В процессе составления схемы устройства стало ясно что используются всего 4 пина на модуле, кнопка на пине p0.27, биззер на пине p0.26, семисторное реле на пине p0.16 и схема детектора ноля на пине p0.00. За 20 минут набросал програмку в Arduino IDE ( писал выше с MySensors это очень просто и быстро), подключил програматор ST-LINK и о чудо компиляция, загрузка, програматор перестал помигивать и загорелся зеленым цветом, значит прошивка загрузилась. Сразу же открыл браузер, открыл Мажордомо, в модуле MySensors уже отображался новый девайс в сети — REDMOND nRF51 1.0. Осталось только создать объекты, сделать кнопки, что сразу же и сделал. И того через полтора часа уже управлял лампочкой в данном цоколе по протоколу MySensors.

Фото Схемы

Телеграмм чат нашего сообщества mysensors, где все раскажут и помогут — https://t.me/mysensors_rus

Код Ардуино:

#define BUTTON_PIN 27
#define BIZZER_PIN 26
#define ZERO_CROSS_PIN 0
#define RELAY_PIN 16

boolean iswitch = 1;
boolean flag_button = 0;
static uint32_t previousMillis;

//#define MY_DEBUG
#define MY_DISABLED_SERIAL
#define MY_RADIO_NRF5_ESB
//#define MY_PASSIVE_NODE
#define MY_NODE_ID 200
#define MY_PARENT_NODE_ID 0
#define MY_PARENT_NODE_IS_STATIC
//#define MY_TRANSPORT_UPLINK_CHECK_DISABLED
#define MY_REPEATER_FEATURE

#define RELAY_ID 1

#include <MySensors.h>

MyMessage lMsg(RELAY_ID, V_STATUS);

void preHwInit() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(BIZZER_PIN, OUTPUT);
  pinMode(ZERO_CROSS_PIN, INPUT);
  pinMode(RELAY_PIN, OUTPUT);
}

void before()
{
  //delay(2000);
  while (digitalRead(ZERO_CROSS_PIN) != 0) {
    //digitalWrite(RELAY_PIN, iswitch);
    //wait(200);
  }
  digitalWrite(RELAY_PIN, iswitch);
}

void presentation()
{
  sendSketchInfo("REDMOND nRF51", "1.0");
  wait(100);
  present(RELAY_ID, S_BINARY, "LIGHT SWITCH");
}

void setup()
{
  myTone(800, 50);
  delay(70);
  myTone(1500, 150);
  delay(30);
  wait(500);
  send(lMsg.set(iswitch));
  wait(100);
}


void loop()
{
  if (digitalRead(BUTTON_PIN) == LOW && flag_button == 0) {
    flag_button = 1;
    previousMillis = millis();
    wait(20);
    myTone(800, 50);
    delay(100);
    //myTone(1500, 200);
    //delay(30);
  }

  if (digitalRead(BUTTON_PIN) == LOW && flag_button == 1) {

  }
  if (digitalRead(BUTTON_PIN) == HIGH && flag_button == 1) {

    if ((millis() - previousMillis > 0) && (millis() - previousMillis <= 3000)) {
      flag_button = 0;
      myTone(800, 50);
      delay(70);
      myTone(1500, 150);
      delay(30);
      iswitch = !iswitch;
      while (digitalRead(ZERO_CROSS_PIN) != 0) {
        //iswitch = !iswitch;
      }
      digitalWrite(RELAY_PIN, iswitch);
      myTone(1500, 150);
      delay(30);
      wait(100);
      send(lMsg.set(iswitch));
      wait(300);
    }
    if (millis() - previousMillis > 3000)
    {
      flag_button = 0;
      wait(100);
    }
  }
}

void receive(const MyMessage & message) {
  if (message.type == V_STATUS) {
    if (message.sensor == RELAY_ID) {
      if (mGetCommand(message) == 1) {
        if (message.isAck()) {
          //AckG = 1;
        } else {
          //
          iswitch = !iswitch;
          while (digitalRead(ZERO_CROSS_PIN) != 0) {
            //iswitch = !iswitch;
          }
          digitalWrite(RELAY_PIN, iswitch);
          wait(200);
          myTone(800, 50);
          delay(70);
          myTone(1500, 150);
          delay(30);
          wait(100);
          send(lMsg.set(iswitch));
          wait(1000);
        }
      }
      if (mGetCommand(message) == 2) {

      }
    }
  }



  /*
    if (message.isAck()) {
    (message.sensor == LIGHT_SENS_ID) {

    }
    (message.sensor == TEMP_INT_ID) {

    }
    }
  */
}


void myTone(uint32_t j, uint32_t k) {
  j = 500000 / j;
  k += millis();
  while (k > millis()) {
    digitalWrite(BIZZER_PIN, HIGH); delayMicroseconds(j);
    digitalWrite(BIZZER_PIN, LOW ); delayMicroseconds(j);
  }
}

void playSound() {
}

Автор: Berkseo

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js