Dans cette revue, nous parlerons de la base intelligente de la marque REDMOND - SkySocket 202S. Un article sur les circuits de ce socle a attiré mon attention, après avoir lu que j'ai remarqué que le cerveau de cet appareil est une puce de la société Nordic Semiconductor 51 series (nRF51822).
Mon hobby principal en ce moment est de construire une maison intelligente. Je construis lentement un réseau radio à partir d'appareils utilisant le protocole MySensors. Si nous parlons brièvement de ce protocole, alors nous pouvons peut-être dire qu'il s'agit d'un protocole très simple et pratique basé sur lequel, en une heure dans l'IDE Ardunno, vous pouvez assembler quelques appareils à partir de modules Arduino et lancer votre premier réseau de capteurs radio. Récemment, j'ai fabriqué des appareils pour mon réseau MySensors sur les modules radio nRF51822 et nRF52832, c'est pourquoi j'ai remarqué cette base.


L'ayant acheté dans une boutique en ligne (pour un peu d'argent dans la région de 700 roubles) et l'ayant examiné, j'ai vu que 4 contacts pour la programmation sont affichés sur le tableau. Sans réfléchir à deux fois, j'ai sorti mon programmeur et multimètre chinois ST-LINK et pris la carte proverbiale pour esquisser le schéma de l'appareil. Au cours de l'élaboration du schéma de l'appareil, il est devenu clair que seules 4 broches sont utilisées sur le module, un bouton sur la broche p0.27, un bus sur la broche p0.26, un relais triac sur la broche p0.16 et un circuit de détection de zéro sur la broche p0.00. Pendant 20 minutes, j'ai esquissé le programme dans l'Arduino IDE (c'était très simple et rapide à écrire avec MySensors ci-dessus), j'ai connecté le programmeur ST-LINK et, voilà, compilation, chargement, le programmateur a cessé de clignoter et est devenu vert, ce qui signifie que le firmware a été chargé. Immédiatement, j'ai ouvert le navigateur, ouvert Majordomo, dans le module MySensors, un nouvel appareil sur le réseau était déjà affiché - REDMOND nRF51 1.0. Il ne reste plus qu'à créer des objets, faire des boutons, ce que j'ai fait immédiatement. Donc, après une heure et demie, j'ai déjà contrôlé l'ampoule de cette base selon le protocole MySensors.

Chat télégramme de notre communauté mysensors, où tout le monde dira et aidera - https://t.me/mysensors_rus
Code Arduino (il semble que le rétro-éclairage ne soit pas pris en charge):
#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() { }
Suite - Prise intelligente REDMOND