Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Troubleshooting
  3. Help me build a 6-light-sensor & 2 ch relay node.

Help me build a 6-light-sensor & 2 ch relay node.

Scheduled Pinned Locked Moved Troubleshooting
3 Posts 3 Posters 1.0k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    airmedic79
    wrote on last edited by
    #1

    Hi!
    I am trying to build a 6-light-sensor & 2 ch relay node to control my old dehumidifier. When I disassembled it, I found 2 switches (power & mode) and 6 leds which can be used to control and report status. Also it has 5v output.

    novita.jpg

    Below is the sketch I came up with. It is showing the light sensor values as below but can't see 2ch relay switches. Am I missing something?

    log.jpg


    // Enable debug prints
    #define MY_DEBUG
    // Enable and select radio type attached
    #define MY_RADIO_RF24
    //#define MY_RADIO_RFM69
    //#define MY_RS485
    #define MY_NODE_ID 7
    #define RELAY_PIN 3 // Arduino Digital I/O pin number for power relay (connected to D3)
    #define RELAY_PIN 4 // Arduino Digital I/O pin number for mode relay (connected to D4)
    #define NUMBER_OF_RELAYS 2 // Total number of attached relays (2 in this case)
    #define RELAY_ON 1 // GPIO value to write to turn on attached relay
    #define RELAY_OFF 0 // GPIO value to write to turn off attached relay

    #define CHILD_ID_LIGHT_1 0
    #define CHILD_ID_LIGHT_2 1
    #define CHILD_ID_LIGHT_3 2
    #define CHILD_ID_LIGHT_4 3
    #define CHILD_ID_LIGHT_5 4
    #define CHILD_ID_LIGHT_6 5

    #include <SPI.h>
    #include <MySensors.h>

    #define LIGHT_SENSOR_1_ANALOG_PIN A0
    #define LIGHT_SENSOR_2_ANALOG_PIN A1
    #define LIGHT_SENSOR_3_ANALOG_PIN A2
    #define LIGHT_SENSOR_4_ANALOG_PIN A3
    #define LIGHT_SENSOR_5_ANALOG_PIN A4
    #define LIGHT_SENSOR_6_ANALOG_PIN A5

    MyMessage msgLight1(CHILD_ID_LIGHT_1, V_LIGHT_LEVEL);
    MyMessage msgLight2(CHILD_ID_LIGHT_2, V_LIGHT_LEVEL);
    MyMessage msgLight3(CHILD_ID_LIGHT_3, V_LIGHT_LEVEL);
    MyMessage msgLight4(CHILD_ID_LIGHT_4, V_LIGHT_LEVEL);
    MyMessage msgLight5(CHILD_ID_LIGHT_5, V_LIGHT_LEVEL);
    MyMessage msgLight6(CHILD_ID_LIGHT_6, V_LIGHT_LEVEL);

    void before()
    {
    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
    // Then set relay pins in output mode
    pinMode(pin, OUTPUT);
    // Set relay to last known state (using eeprom storage)
    digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
    }
    }

    void presentation() {
    // Send the presentation to the controller
    sendSketchInfo("Dehumidifier Controller", "1.0");
    present(CHILD_ID_LIGHT_1, S_LIGHT_LEVEL);
    present(CHILD_ID_LIGHT_2, S_LIGHT_LEVEL);
    present(CHILD_ID_LIGHT_3, S_LIGHT_LEVEL);
    present(CHILD_ID_LIGHT_4, S_LIGHT_LEVEL);
    present(CHILD_ID_LIGHT_5, S_LIGHT_LEVEL);
    present(CHILD_ID_LIGHT_6, S_LIGHT_LEVEL);
    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
    // Register all sensors to gw (they will be created as child devices)
    present(sensor, S_BINARY);
    }
    }

    void setup() {
    // Setup code here if needed
    }

    void loop() {
    // Check light levels
    int lightLevel1 = analogRead(LIGHT_SENSOR_1_ANALOG_PIN);
    int lightLevel2 = analogRead(LIGHT_SENSOR_2_ANALOG_PIN);
    int lightLevel3 = analogRead(LIGHT_SENSOR_3_ANALOG_PIN);
    int lightLevel4 = analogRead(LIGHT_SENSOR_4_ANALOG_PIN);
    int lightLevel5 = analogRead(LIGHT_SENSOR_5_ANALOG_PIN);
    int lightLevel6 = analogRead(LIGHT_SENSOR_6_ANALOG_PIN);

    // Invert the light sensor values: Map the range 0 to 1023 to 100 to 0
    lightLevel1 = map(lightLevel1, 0, 1023, 100, 0);
    lightLevel2 = map(lightLevel2, 0, 1023, 100, 0);
    lightLevel3 = map(lightLevel3, 0, 1023, 100, 0);
    lightLevel4 = map(lightLevel4, 0, 1023, 100, 0);
    lightLevel5 = map(lightLevel5, 0, 1023, 100, 0);
    lightLevel6 = map(lightLevel6, 0, 1023, 100, 0);

    Serial.print("Light1: ");
    Serial.println(lightLevel1);
    Serial.print("Light2: ");
    Serial.println(lightLevel2);
    Serial.print("Light3: ");
    Serial.println(lightLevel3);
    Serial.print("Light4: ");
    Serial.println(lightLevel4);
    Serial.print("Light5: ");
    Serial.println(lightLevel5);
    Serial.print("Light6: ");
    Serial.println(lightLevel6);

    send(msgLight1.set(lightLevel1));
    send(msgLight2.set(lightLevel2));
    send(msgLight3.set(lightLevel3));
    send(msgLight4.set(lightLevel4));
    send(msgLight5.set(lightLevel5));
    send(msgLight6.set(lightLevel6));

    // Add any other code for the loop here
    delay(1000); // Adjust the delay as needed to control the update rate of the light sensor values
    }

    void receive(const MyMessage &message)
    {
    // We only expect one type of message from controller. But we better check anyway.
    if (message.getType()==V_STATUS) {
    // Change relay state
    digitalWrite(message.getSensor()-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF);
    // Store state in eeprom
    saveState(message.getSensor(), message.getBool());
    // Write some debug info
    Serial.print("Incoming change for sensor:");
    Serial.print(message.getSensor());
    Serial.print(", New status: ");
    Serial.println(message.getBool());
    }
    }

    H 1 Reply Last reply
    0
    • E Offline
      E Offline
      eiten
      wrote on last edited by
      #2

      Hi @airmedic79
      I see several problems in your code. Here, you redefine RELAY_PIN:

      #define RELAY_PIN 3 // Arduino Digital I/O pin number for power relay (connected to D3)
      #define RELAY_PIN 4 // Arduino Digital I/O pin number for mode relay (connected to D4)
      

      Its both times RELAY_PIN, the same name for the define, so you will end up with RELAY_PIN equals 4. This should yield a warning.

      You never present the binary sensors, because in this line:

      for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
      

      RELAY_PIN is 4, and NUMBER_OF_RELAYS is 2, so the for loop is never executed.
      Also, I think you got a problem with your sensor IDs, i think id 2 and 4 are doubled.

      Regards, Edi

      1 Reply Last reply
      0
      • A airmedic79

        Hi!
        I am trying to build a 6-light-sensor & 2 ch relay node to control my old dehumidifier. When I disassembled it, I found 2 switches (power & mode) and 6 leds which can be used to control and report status. Also it has 5v output.

        novita.jpg

        Below is the sketch I came up with. It is showing the light sensor values as below but can't see 2ch relay switches. Am I missing something?

        log.jpg


        // Enable debug prints
        #define MY_DEBUG
        // Enable and select radio type attached
        #define MY_RADIO_RF24
        //#define MY_RADIO_RFM69
        //#define MY_RS485
        #define MY_NODE_ID 7
        #define RELAY_PIN 3 // Arduino Digital I/O pin number for power relay (connected to D3)
        #define RELAY_PIN 4 // Arduino Digital I/O pin number for mode relay (connected to D4)
        #define NUMBER_OF_RELAYS 2 // Total number of attached relays (2 in this case)
        #define RELAY_ON 1 // GPIO value to write to turn on attached relay
        #define RELAY_OFF 0 // GPIO value to write to turn off attached relay

        #define CHILD_ID_LIGHT_1 0
        #define CHILD_ID_LIGHT_2 1
        #define CHILD_ID_LIGHT_3 2
        #define CHILD_ID_LIGHT_4 3
        #define CHILD_ID_LIGHT_5 4
        #define CHILD_ID_LIGHT_6 5

        #include <SPI.h>
        #include <MySensors.h>

        #define LIGHT_SENSOR_1_ANALOG_PIN A0
        #define LIGHT_SENSOR_2_ANALOG_PIN A1
        #define LIGHT_SENSOR_3_ANALOG_PIN A2
        #define LIGHT_SENSOR_4_ANALOG_PIN A3
        #define LIGHT_SENSOR_5_ANALOG_PIN A4
        #define LIGHT_SENSOR_6_ANALOG_PIN A5

        MyMessage msgLight1(CHILD_ID_LIGHT_1, V_LIGHT_LEVEL);
        MyMessage msgLight2(CHILD_ID_LIGHT_2, V_LIGHT_LEVEL);
        MyMessage msgLight3(CHILD_ID_LIGHT_3, V_LIGHT_LEVEL);
        MyMessage msgLight4(CHILD_ID_LIGHT_4, V_LIGHT_LEVEL);
        MyMessage msgLight5(CHILD_ID_LIGHT_5, V_LIGHT_LEVEL);
        MyMessage msgLight6(CHILD_ID_LIGHT_6, V_LIGHT_LEVEL);

        void before()
        {
        for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        // Then set relay pins in output mode
        pinMode(pin, OUTPUT);
        // Set relay to last known state (using eeprom storage)
        digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
        }
        }

        void presentation() {
        // Send the presentation to the controller
        sendSketchInfo("Dehumidifier Controller", "1.0");
        present(CHILD_ID_LIGHT_1, S_LIGHT_LEVEL);
        present(CHILD_ID_LIGHT_2, S_LIGHT_LEVEL);
        present(CHILD_ID_LIGHT_3, S_LIGHT_LEVEL);
        present(CHILD_ID_LIGHT_4, S_LIGHT_LEVEL);
        present(CHILD_ID_LIGHT_5, S_LIGHT_LEVEL);
        present(CHILD_ID_LIGHT_6, S_LIGHT_LEVEL);
        for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        // Register all sensors to gw (they will be created as child devices)
        present(sensor, S_BINARY);
        }
        }

        void setup() {
        // Setup code here if needed
        }

        void loop() {
        // Check light levels
        int lightLevel1 = analogRead(LIGHT_SENSOR_1_ANALOG_PIN);
        int lightLevel2 = analogRead(LIGHT_SENSOR_2_ANALOG_PIN);
        int lightLevel3 = analogRead(LIGHT_SENSOR_3_ANALOG_PIN);
        int lightLevel4 = analogRead(LIGHT_SENSOR_4_ANALOG_PIN);
        int lightLevel5 = analogRead(LIGHT_SENSOR_5_ANALOG_PIN);
        int lightLevel6 = analogRead(LIGHT_SENSOR_6_ANALOG_PIN);

        // Invert the light sensor values: Map the range 0 to 1023 to 100 to 0
        lightLevel1 = map(lightLevel1, 0, 1023, 100, 0);
        lightLevel2 = map(lightLevel2, 0, 1023, 100, 0);
        lightLevel3 = map(lightLevel3, 0, 1023, 100, 0);
        lightLevel4 = map(lightLevel4, 0, 1023, 100, 0);
        lightLevel5 = map(lightLevel5, 0, 1023, 100, 0);
        lightLevel6 = map(lightLevel6, 0, 1023, 100, 0);

        Serial.print("Light1: ");
        Serial.println(lightLevel1);
        Serial.print("Light2: ");
        Serial.println(lightLevel2);
        Serial.print("Light3: ");
        Serial.println(lightLevel3);
        Serial.print("Light4: ");
        Serial.println(lightLevel4);
        Serial.print("Light5: ");
        Serial.println(lightLevel5);
        Serial.print("Light6: ");
        Serial.println(lightLevel6);

        send(msgLight1.set(lightLevel1));
        send(msgLight2.set(lightLevel2));
        send(msgLight3.set(lightLevel3));
        send(msgLight4.set(lightLevel4));
        send(msgLight5.set(lightLevel5));
        send(msgLight6.set(lightLevel6));

        // Add any other code for the loop here
        delay(1000); // Adjust the delay as needed to control the update rate of the light sensor values
        }

        void receive(const MyMessage &message)
        {
        // We only expect one type of message from controller. But we better check anyway.
        if (message.getType()==V_STATUS) {
        // Change relay state
        digitalWrite(message.getSensor()-1+RELAY_PIN, message.getBool()?RELAY_ON:RELAY_OFF);
        // Store state in eeprom
        saveState(message.getSensor(), message.getBool());
        // Write some debug info
        Serial.print("Incoming change for sensor:");
        Serial.print(message.getSensor());
        Serial.print(", New status: ");
        Serial.println(message.getBool());
        }
        }

        H Offline
        H Offline
        Heizelmann
        wrote on last edited by Heizelmann
        #3

        Only if you send a correct message from the controller to the node
        the receive function is called. I don't see a receive in your log.

        I think in your case the receive-function is not called (or called with a wrong message type or node id). Put a

         serial.print("receive() is called with type "); serial.println(message.getType());
        

        on top of the receive function to see if the receive function is called and which type is handed over..

        1 Reply Last reply
        1

        Hello! It looks like you're interested in this conversation, but you don't have an account yet.

        Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

        With your input, this post could be even better 💗

        Register Login
        Reply
        • Reply as topic
        Log in to reply
        • Oldest to Newest
        • Newest to Oldest
        • Most Votes


        5

        Online

        12.0k

        Users

        11.2k

        Topics

        113.4k

        Posts


        Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
        • Login

        • Don't have an account? Register

        • Login or register to search.
        • First post
          Last post
        0
        • MySensors
        • OpenHardware.io
        • Categories
        • Recent
        • Tags
        • Popular