Pull to refresh

Cмарт розетка REDMOND SkyPort 100S

Reading time4 min
Views6.2K

Это продолжение моей первой статьи на смарт цоколь Redmond. В этой статье речь пойдет о другом девайсе компании Redmond — Cмарт розетка REDMOND SkyPort 100S. Данное устройство тоже базируется на чипе nRF51822 и как говорится тут сам бог велел попробовать. Итак, была куплена данная розетка. Корпус разбирается так же легко как и цоколь, доступ к порту программирования еще удобнее. Но забегая вперед скажу что все немного сложнее, чем мне показалось сначала. Схему данной розетки не стал прозванивать, т.к. уже существует куча обзоров по модернизации и модификации данных розеток.



В одном из обзоров нашел схему, этим и ограничился. Из схемы понятно что задействованы так же как и в смарт цоколе всего 4 пина на модуле nRF51822. На устройстве присутствует тактовая кнопка подключенная к пину p0.00, два светодиода, красный подключен к пину p0.01, зеленый подключен к пину p0.02. Электромагнитное реле на 10A подключено к пину p0.03. Итак запускаем Arduino IDE и начинаем накидывать экземпл:


#define BUTTON_PIN 0
#define RED_LED_PIN 1
#define GREEN_LED_PIN 2
#define RELAY_PIN 3

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

//#define MY_DEBUG
#define MY_DISABLED_SERIAL
#define MY_RADIO_NRF5_ESB
//#define MY_NRF5_ESB_PA_LEVEL (NRF5_PA_LOW)
#define MY_NRF5_ESB_PA_LEVEL (NRF5_PA_MAX)
//#define MY_PASSIVE_NODE
#define MY_NODE_ID 201
#define MY_PARENT_NODE_ID 0
#define MY_PARENT_NODE_IS_STATIC
#define MY_TRANSPORT_UPLINK_CHECK_DISABLED

#define RELAY_ID 1

#include <MySensors.h>

MyMessage lMsg(RELAY_ID, V_STATUS);

void preHwInit() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(RED_LED_PIN, OUTPUT);
  pinMode(GREEN_LED_PIN, OUTPUT);
  pinMode(RELAY_PIN, OUTPUT);
}

void before()
{
  digitalWrite(RED_LED_PIN, HIGH);
}

void presentation()
{
  sendSketchInfo("REDMOND R nRF51", "1.0");
  wait(300);
  present(RELAY_ID, S_BINARY, "RELAY SWITCH");
  wait(300);
}

void setup()
{
  digitalWrite(RED_LED_PIN, LOW);
  wait(300);
  digitalWrite(GREEN_LED_PIN, HIGH);
  wait(200);
  digitalWrite(GREEN_LED_PIN, LOW);
  wait(200);
  digitalWrite(GREEN_LED_PIN, HIGH);
  wait(200);
  digitalWrite(GREEN_LED_PIN, LOW);
  wait(200);
  digitalWrite(GREEN_LED_PIN, HIGH);
  wait(200);
  digitalWrite(GREEN_LED_PIN, LOW);
  wait(500);
  send(lMsg.set(iswitch));
  wait(500);
}

void loop()
{
  if (digitalRead(BUTTON_PIN) == LOW && flag_button == 0) {
    flag_button = 1;
    previousMillis = millis();
    wait(20);
  }

  if (digitalRead(BUTTON_PIN) == LOW && flag_button == 1) {
    //что нибудь потом добавить, может быть
  }
  if (digitalRead(BUTTON_PIN) == HIGH && flag_button == 1) {

    if ((millis() - previousMillis > 0) && (millis() - previousMillis <= 3000)) {
      if (iswitch == 0) {
        digitalWrite(GREEN_LED_PIN, HIGH);
        wait(10);
      } else if (iswitch == 1) {
        digitalWrite(GREEN_LED_PIN, LOW);
        wait(10);
      }
      flag_button = 0;
      iswitch = !iswitch;
      digitalWrite(RELAY_PIN, iswitch);
      wait(1500);
      send(lMsg.set(iswitch));
    }
    if (millis() - previousMillis > 3000)
    {
      flag_button = 0;
    }
  }
}

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 {
          wait(50);
          if (iswitch == 0) {
            digitalWrite(GREEN_LED_PIN, HIGH);
          }else
          if (iswitch == 1) {
            digitalWrite(GREEN_LED_PIN, LOW);
          }
          iswitch = !iswitch;
          wait(10);
          digitalWrite(RELAY_PIN, iswitch);
          wait(1500);
          send(lMsg.set(iswitch));
        }
      }
      if (mGetCommand(message) == 2) {
      }
    }
  }
}

Как видите код небольшой и достаточно простой, спасибо за это сообществу Mysensors.


Как с кодом было закончено, подключил программатор к устройству и перепрошил. Подключение программатора к розетке делается очень просто, в моем случае я взял два обычных выводных резистора, откусил кусачками проволоку, из проволоки сделал крючки, согнув ее, вставил эти крючки в провода программатора и "подцепился" к розетке, на видео видно как я это делаю.Пришло время тестировать то что получилось. Вставил смарт розетку в розетку :), открыл Мажордомо, все нормально, розетка уже присутствовала в сети Майсенсорс. Отправляю первую команду на включение и… ребут :)… неожиданный поворот. Первое что пришло в голову, просадка по питанию во время включения реле. Сел переделал программу, убрал включение светодиода при включении реле, что бы снизить потребление. И это сработало, розетка перестала перезагружаться при выключении реле.… Но не надолго :). И так стало понятно что модулю не хватает питания. Схема бестрансформаторного блока питания рассчитана так, что бы хватало только на работу в режиме BLE. В Mysensors же используется другой режим радиомодуля 2.4 Ггц (совместимость с RF24 — ANT). Итак имеем дефицит примерно 10мА. Обсудив проблемку в нашем чате Mysensors остановился на решении добавить балластный конденсатор, так как это очень простая манипуляция, то что нужно для повторения. Вот что получилось:


image


image


Собрав снова розетку, немного взволнованно приступил к тестам. Отработка теперь шла превосходно. Переписал логику работы программы обратно, добавил еще #define MY_NRF5_ESB_PA_LEVEL (NRF5_PA_MAX), то есть "врубил" радио на полную мощность(да с Mysensors это очень просто).… Работает. Без ошибок. Без перезагрузок. Это победа :)


image



А есть же еще у этого производителя другие устройства на nRF51822 — датчик дыма, датчик движения, датчик газа, тепловые конвертеры, вентиляторы, увлажнители, очистители, чайники… ;)


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

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+15
Comments11

Articles