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


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




Купив его в интернет магазине (за вполне себе небольшие деньги в районе 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() {
}

Продолжение — Смарт розетка REDMOND

Комментарии (4)


  1. augorelov
    06.05.2019 20:22

    Автор, оформите статью:
    1. Добавить подсветку исходного кода;
    2. Схему можно на Хабр, а то прыгать по ссылкам не совсем удобно и разрешение схемы увеличить не мешало.


    1. Berkseo Автор
      07.05.2019 12:01

      с подсветкой беда, похоже нет поддержки виринга, добавление атрибута C++ не помогло, спец атрибута нет, с хабрсторажем разобрался


  1. SlimShaggy
    07.05.2019 19:43

    Из статьи непонятно, каков был изначальный функционал цоколя, и насколько то, что стало, отличается от того, что было.


    1. Berkseo Автор
      07.05.2019 20:25

      Помимо того что что было BLE радио а стало RF24 ANT радио и прибавления возможности интеграции в УД, почеловечески а не через «аппку» РЕДМОНД и только с девайсами РЕДМОНД пожалуй всё.

      PS… а вот еще что, мне там писк из бизера не нравился, как от пожарки, монотонный, я сделал как мне нужно c тональностью. Понятно куда клоню? Вы сами решаете как оно будет работать)))))… А как работало можно посмотреть на ютубе, обзоров море…