Nesta revisão, falaremos sobre a base inteligente da marca REDMOND - SkySocket 202S. Um artigo sobre o circuito desse sistema chamou minha atenção, depois de ler, notei que o cérebro desse dispositivo é um chip da empresa Nordic Semiconductor 51 series (nRF51822).
Meu principal hobby no momento é construir uma casa inteligente. Estou construindo lentamente uma rede de rádio a partir de dispositivos usando o protocolo MySensors. Se brevemente sobre esse protocolo, talvez possamos dizer que esse é um protocolo muito simples e conveniente, com base no qual em uma hora no Ardunno IDE você pode montar alguns dispositivos a partir de módulos do arduino e iniciar sua primeira rede de sensores de rádio. Recentemente, desenvolvi dispositivos para minha rede MySensors nos módulos de rádio nRF51822 e nRF52832, e foi por isso que notei essa base.


Tendo comprado em uma loja on-line (por um pouco de dinheiro na região de 700 rublos) e analisado, vi que 4 contatos para programação são convenientemente exibidos no quadro. Sem pensar duas vezes, peguei meu programador e multímetro chinês ST-LINK e peguei a proverbial placa para esboçar o diagrama do dispositivo. No processo de elaboração do diagrama do dispositivo, ficou claro que apenas 4 pinos são usados no módulo, um botão no pino p0.27, um barramento no pino p0.26, um relé triac no pino p0.16 e um circuito detector de zero no pino p0.00. Por 20 minutos, esbocei o programa no IDE do Arduino (era muito simples e rápido escrever com o MySensors acima), conectei o programador ST-LINK e, e eis que, compilação, carregamento, o programador parou de piscar e ficou verde, o que significa que o firmware estava carregado. Abri imediatamente o navegador, abri o Majordomo, no módulo MySensors um novo dispositivo na rede já era exibido - REDMOND nRF51 1.0. Resta apenas criar objetos, criar botões, o que fiz imediatamente. Então, depois de uma hora e meia, eu já controlava a lâmpada nesta base, de acordo com o protocolo MySensors.

Bate-papo por telegrama da nossa comunidade de mysensors, onde todos contarão e ajudarão - https://t.me/mysensors_rus
Código Arduino (parece que a luz de fundo não é suportada):
#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() { }
Continuação - Tomada inteligente REDMOND