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



  • 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());
    }
    }



  • 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



  • 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..


Log in to reply
 

Suggested Topics

36
Online

11.4k
Users

11.1k
Topics

112.6k
Posts