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. Development
  3. Help on code for Mysensors 2.0

Help on code for Mysensors 2.0

Scheduled Pinned Locked Moved Development
11 Posts 5 Posters 3.4k 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.
  • S Offline
    S Offline
    stingone
    wrote on last edited by
    #1

    Hi everone.

    Couple of months i created a code for my dallas an ph sensor. however i reinstalled my pc and installed the mysensors 2.0 resulting in a error with No forward link or gateway feature activated.

    /*
      Original code created by DFRobot for their probes, 
      adapted by haze5@icloud.com Mysensors for the project.
    */
    
    
    #include <SPI.h>
    #include <MySensors.h>
    #include <DallasTemperature.h>
    #include <OneWire.h>
    #include "Vcc.h"        // https://github.com/Yveaux/Arduino_Vcc
    
    static const float VccMin = 0.0;        // Minimum expected Vcc level, in Volts. (0.6V for 1 AA Alkaline)
    static const float VccMax = 3.3;        // Maximum expected Vcc level, in Volts. (1.5V for 1 AA Alkaline)
    static const float VccCorrection = 3.29 / 3.31;  // Measured Vcc by multimeter divided by reported Vcc
    Vcc vcc(VccCorrection);
    
    #define CHILD_ID_PH 0
    #define ArrayLenth 10               // times of collection
    #define PH_SENSOR_ANALOG_PIN A0         // pH meter Analog output to Arduino Analog Input 0
    #define LED_DIGITAL_PIN 13
    #define Offset 0.25           //deviation compensate
    
    #define CHILD_ID_TEMP 1
    #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
    #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
    #define MAX_ATTACHED_DS18B20 16
    
    unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
    OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature.
    
    unsigned long lastSend = 0;
    static const unsigned long SEND_FREQUENCY = 30000;  // Minimum time between send (in milliseconds)
    
    MySensor gw;
    
    float lastPhHValue;
    static const float deltaPhValue = 0.5;
    
    float lastTemperature[MAX_ATTACHED_DS18B20];
    int numSensors=0;
    boolean receivedConfig = false;
    boolean metric = true; 
    
    MyMessage msgPH(CHILD_ID_PH, V_VAR1);
    MyMessage msg(CHILD_ID_TEMP,V_TEMP);
    
    void setup()
    {
        // Startup up the OneWire library
        sensors.begin();
        // requestTemperatures() will not block current thread
        sensors.setWaitForConversion(false);
        
        //gw.begin(NULL, 100, false); //deze gebruiken, 100 is de node_id, die weer gebruiken in pimatic
        gw.begin();
        //Serial.print("0;0;3;0;2;");Serial.print(LIBRARY_VERSION);
        
        pinMode(LED_DIGITAL_PIN, OUTPUT);
        numSensors = sensors.getDeviceCount();
        
        // Send the Sketch Version Information to the Gateway
        gw.sendSketchInfo("pHmeter", "1.0");
        
        // Register all sensors to gw (they will be created as child devices)
        gw.present(CHILD_ID_PH, S_WATER);
    
        // Present all sensors to controller
        for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
        gw.present(i, S_TEMP);
        }
    }
    
    void loop()
    {
        // By calling process() you route messages in the background
        gw.process();
        read_PH();
        read_TEMP();
    
        gw.sleep(SLEEP_TIME);
    }
    
    void read_PH(){
       unsigned long now = millis();
        bool sendTime = now - lastSend > SEND_FREQUENCY;
        if (sendTime)
        {
            lastSend = now;
            
            //    float v = vcc.Read_Volts();
            //    Serial.print("VCC = " );
            //    Serial.print(v);
            //    Serial.println(" Volts" );
            
            int batteryPcnt = (int)vcc.Read_Perc(VccMin, VccMax);
            //    Serial.print("VCC = " );
            //    Serial.print(batteryPcnt);
            //    Serial.println(" %" );
            
            gw.sendBatteryLevel(batteryPcnt);
        }
        
        // Read PH_SENSOR_ANALOG_PIN in phValue
        float voltage = analogReadAverage(PH_SENSOR_ANALOG_PIN, 10) * 5.0 / 1024;
        
        // convert the millivolt into pH value
        float PhValue = 3.5 * voltage+Offset;
        
        
        
        
        if (sendTime || abs(PhValue - lastPhHValue) > deltaPhValue)
        {
            Serial.print("    pH:");
            Serial.print(PhValue, 2);
            Serial.println(" ");
            
            gw.send(msgPH.set(PhValue, 2)); // envoi au reseau avec deux decimales
            
            digitalWrite(LED_DIGITAL_PIN, digitalRead(LED_DIGITAL_PIN) ^ 1);
            
            lastPhHValue = PhValue;
        }
    }
    
    
    void read_TEMP(){
      sensors.requestTemperatures();
    
      // query conversion time and sleep until conversion completed
      int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
      // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
      gw.sleep(conversionTime);
    
      // Read temperatures and send them to controller 
      for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
     
        // Fetch and round temperature to one decimal
        float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
     
        // Only send data if temperature has changed and no error
        #if COMPARE_TEMP == 1
        if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
        #else
        if (temperature != -127.00 && temperature != 85.00) {
        #endif
     
          // Send in the new temperature
          gw.send(msg.setSensor(i).set(temperature,1));
          // Save new temperatures for next compare
          lastTemperature[i]=temperature;
        }
      }   
    }
    
    
    
    
    
    
    
    double analogReadAverage(uint8_t pin, unsigned long ms)
    {
        double average = 0;
        int buffer[ArrayLenth];
        
        for (int i = 0; i < ArrayLenth; i++)
        {
            buffer[i] = analogRead(PH_SENSOR_ANALOG_PIN);
            delay(ms);
        }
        
        if (ArrayLenth < 5)
        {
            // less than 5, calculated directly statistics
            for (int i = 0; i < ArrayLenth; i++)
            {
                average += buffer[i];
            }
            average = average / ArrayLenth;
        }
        else
        {
            // Sort the values from small to large
            for (int i = 0; i < ArrayLenth; i++)
            {
                for (int j = i + 1; j < 10; j++)
                {
                    if (buffer[i] > buffer[j])
                    {
                        int temp = buffer[i];
                        buffer[i] = buffer[j];
                        buffer[j] = temp;
                    }
                }
            }
            
            // take the average value of center sample
            for (int i = 2; i < ArrayLenth - 2; i++)
            {
                average += buffer[i];
            }
            
            average = average / (ArrayLenth - 4);
        }
        
        return average;
    }
    
    
    1 Reply Last reply
    0
    • scalzS Offline
      scalzS Offline
      scalz
      Hardware Contributor
      wrote on last edited by scalz
      #2

      Hello.

      It seems that you have not converted your old sketch to 2.0 In the new release there is no need of declaring a Mysensor instance like before "Mysensor gw" and some other stuff ..

      So, what you can do:

      • convert your sketch to 2.0. For details see here : https://forum.mysensors.org/topic/4276/converting-a-sketch-from-1-5-x-to-2-0-x
      • or look at the 2.0 examples sketch to see how it looks now. and don't worry if there is not so much code in new sketch compared to before, the stuff is hidden that's all ;)

      If still issues, please post logs so we can help you. without not easy..

      S 1 Reply Last reply
      1
      • scalzS scalz

        Hello.

        It seems that you have not converted your old sketch to 2.0 In the new release there is no need of declaring a Mysensor instance like before "Mysensor gw" and some other stuff ..

        So, what you can do:

        • convert your sketch to 2.0. For details see here : https://forum.mysensors.org/topic/4276/converting-a-sketch-from-1-5-x-to-2-0-x
        • or look at the 2.0 examples sketch to see how it looks now. and don't worry if there is not so much code in new sketch compared to before, the stuff is hidden that's all ;)

        If still issues, please post logs so we can help you. without not easy..

        S Offline
        S Offline
        stingone
        wrote on last edited by
        #3

        @scalz said:

        Hello.

        It seems that you have not converted your old sketch to 2.0 In the new release there is no need of declaring a Mysensor instance like before "Mysensor gw" and some other stuff ..

        So, what you can do:

        • convert your sketch to 2.0. For details see here : https://forum.mysensors.org/topic/4276/converting-a-sketch-from-1-5-x-to-2-0-x
        • or look at the 2.0 examples sketch to see how it looks now. and don't worry if there is not so much code in new sketch compared to before, the stuff is hidden that's all ;)

        If still issues, please post logs so we can help you. without not easy..

        I will try to change the code. for now i installed the 1.5 again however compiling is fine but it says at the end error uploading sketch thats all no other messages.. i already tried 3 board other usb cable. com ports settings are fine and i can use the serial monitor with the existing code but somehow it wont upload the new.

        1 Reply Last reply
        0
        • sundberg84S Offline
          sundberg84S Offline
          sundberg84
          Hardware Contributor
          wrote on last edited by sundberg84
          #4

          @stingone - if you get an upload error, its not about the code. Its the connection between computer, usb, uploader and arduino.

          Do you have changed drivers for the programmer recently? got the right programmer set in arduino ide? Can you paste the log from arudino ide in here?

          Controller: Proxmox VM - Home Assistant
          MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
          MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
          RFLink GW - Arduino Mega + RFLink Shield, 433mhz

          1 Reply Last reply
          0
          • scalzS Offline
            scalzS Offline
            scalz
            Hardware Contributor
            wrote on last edited by
            #5

            @stingone oki. when it fails to upload (for the error you're describing), try again to upload, that should work. sometimes it can need multiple attempts. it's not mysensors related.

            1 Reply Last reply
            0
            • GertSandersG Offline
              GertSandersG Offline
              GertSanders
              Hardware Contributor
              wrote on last edited by
              #6

              After recompiling to 2.0.0 and uploading to your node, you will also need to bring the gateway to version 2.0.0

              A 2.0.0 gateway should work with older nodes. But new 2.0.0 nodes require a 2.0.0 gateway.

              1 Reply Last reply
              0
              • S Offline
                S Offline
                stingone
                wrote on last edited by
                #7

                Got it working with another laptop..wil recompile to 2.0 in the weekend.

                Just a quick question. I have 2 sensors on 1 arduino. Works fine however sometimes it shows the value of the temp sensor on the value of the ph sensor.

                #include <SPI.h>
                #include <MySensor.h>
                #include <DallasTemperature.h>
                #include <OneWire.h>
                #include "Vcc.h"        // https://github.com/Yveaux/Arduino_Vcc
                
                static const float VccMin = 0.0;        // Minimum expected Vcc level, in Volts. (0.6V for 1 AA Alkaline)
                static const float VccMax = 3.3;        // Maximum expected Vcc level, in Volts. (1.5V for 1 AA Alkaline)
                static const float VccCorrection = 3.29 / 3.31;  // Measured Vcc by multimeter divided by reported Vcc
                Vcc vcc(VccCorrection);
                
                #define CHILD_ID_PH 0
                #define ArrayLenth 10               // times of collection
                #define PH_SENSOR_ANALOG_PIN A0         // pH meter Analog output to Arduino Analog Input 0
                #define LED_DIGITAL_PIN 13
                #define Offset 0.25           //deviation compensate
                
                #define CHILD_ID_TEMP 1
                #define COMPARE_TEMP 0 // Send temperature only if changed? 1 = Yes 0 = No
                #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
                #define MAX_ATTACHED_DS18B20 16
                
                unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
                OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
                DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature.
                
                unsigned long lastSend = 0;
                static const unsigned long SEND_FREQUENCY = 30000;  // Minimum time between send (in milliseconds)
                
                MySensor gw;
                
                float lastPhHValue;
                
                float lastTemperature[MAX_ATTACHED_DS18B20];
                int numSensors=0;
                boolean receivedConfig = false;
                boolean metric = true; 
                
                MyMessage msgPH(CHILD_ID_PH, V_VAR1);
                MyMessage msg(CHILD_ID_TEMP,V_TEMP);
                
                void setup()
                {
                    // Startup up the OneWire library
                    sensors.begin();
                    // requestTemperatures() will not block current thread
                    sensors.setWaitForConversion(false);
                    
                    //gw.begin(NULL, 100, false); //deze gebruiken, 100 is de node_id, die weer gebruiken in pimatic
                    gw.begin();
                    //Serial.print("0;0;3;0;2;");Serial.print(LIBRARY_VERSION);
                    
                    pinMode(LED_DIGITAL_PIN, OUTPUT);
                    numSensors = sensors.getDeviceCount();
                    
                    // Send the Sketch Version Information to the Gateway
                    gw.sendSketchInfo("pHmeter", "1.1");
                    
                    // Register all sensors to gw (they will be created as child devices)
                    gw.present(CHILD_ID_PH, S_WATER);
                
                    // Present all sensors to controller
                    for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
                    gw.present(i, S_TEMP);
                    }
                }
                
                void loop()
                {
                    // By calling process() you route messages in the background
                    gw.process();
                    read_PH();
                    read_TEMP();
                
                    gw.sleep(SLEEP_TIME);
                }
                
                void read_PH(){
                   unsigned long now = millis();
                    bool sendTime = now - lastSend > SEND_FREQUENCY;
                    if (sendTime)
                    {
                        lastSend = now;
                        
                        //    float v = vcc.Read_Volts();
                        //    Serial.print("VCC = " );
                        //    Serial.print(v);
                        //    Serial.println(" Volts" );
                        
                        int batteryPcnt = (int)vcc.Read_Perc(VccMin, VccMax);
                        //    Serial.print("VCC = " );
                        //    Serial.print(batteryPcnt);
                        //    Serial.println(" %" );
                        
                        gw.sendBatteryLevel(batteryPcnt);
                    }
                    
                    // Read PH_SENSOR_ANALOG_PIN in phValue
                    float voltage = analogReadAverage(PH_SENSOR_ANALOG_PIN, 10) * 5.0 / 1024;
                    
                    // convert the millivolt into pH value
                    float PhValue = 3.5 * voltage+Offset;
                    
                    
                    
                        Serial.print("    pH:");
                        Serial.print(PhValue, 2);
                        Serial.println(" ");
                        
                        gw.send(msgPH.set(PhValue, 2)); // envoi au reseau avec deux decimales
                        
                        digitalWrite(LED_DIGITAL_PIN, digitalRead(LED_DIGITAL_PIN) ^ 1);
                        
                        lastPhHValue = PhValue;
                    
                }
                
                
                void read_TEMP(){
                  sensors.requestTemperatures();
                
                  // query conversion time and sleep until conversion completed
                  int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
                  // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
                  gw.sleep(conversionTime);
                
                  // Read temperatures and send them to controller 
                  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
                 
                    // Fetch and round temperature to one decimal
                    float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
                 
                    // Only send data if temperature has changed and no error
                    #if COMPARE_TEMP == 1
                    if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
                    #else
                    if (temperature != -127.00 && temperature != 85.00) {
                    #endif
                 
                      // Send in the new temperature
                      gw.send(msg.setSensor(i).set(temperature,1));
                      // Save new temperatures for next compare
                      lastTemperature[i]=temperature;
                    }
                  }   
                }
                
                
                
                
                
                
                
                double analogReadAverage(uint8_t pin, unsigned long ms)
                {
                    double average = 0;
                    int buffer[ArrayLenth];
                    
                    for (int i = 0; i < ArrayLenth; i++)
                    {
                        buffer[i] = analogRead(PH_SENSOR_ANALOG_PIN);
                        delay(ms);
                    }
                    
                    if (ArrayLenth < 5)
                    {
                        // less than 5, calculated directly statistics
                        for (int i = 0; i < ArrayLenth; i++)
                        {
                            average += buffer[i];
                        }
                        average = average / ArrayLenth;
                    }
                    else
                    {
                        // Sort the values from small to large
                        for (int i = 0; i < ArrayLenth; i++)
                        {
                            for (int j = i + 1; j < 10; j++)
                            {
                                if (buffer[i] > buffer[j])
                                {
                                    int temp = buffer[i];
                                    buffer[i] = buffer[j];
                                    buffer[j] = temp;
                                }
                            }
                        }
                        
                        // take the average value of center sample
                        for (int i = 2; i < ArrayLenth - 2; i++)
                        {
                            average += buffer[i];
                        }
                        
                        average = average / (ArrayLenth - 4);
                    }
                    
                    return average;
                }
                
                
                

                And in Pimatic

                {
                      "id": "temperatuur-aquarium",
                      "name": "Temperatuur Aquarium",
                      "class": "MySensorsDST",
                      "nodeid": 2,
                      "sensorid": 0
                    },
                    {
                      "id": "phmeter-aquarium",
                      "name": "pH Aquarium",
                      "class": "MySensorsPH",
                      "nodeid": 2,
                      "sensorid": 0,
                      "batterySensor": false
                    },
                

                debug [pimatic-mysensors]: <- MySensorsPH { sender: 2, sensor: 0, type: 0, value: '25.4' }
                22:23:06debug [pimatic-mysensors]: <- MySensorDST { sender: 2, sensor: 0, type: 0, value: '25.4' }
                22:23:06debug [pimatic-mysensors]: <- I_LOG_MESSAGE 0;0;3;0;9;read: 2-2-0 s=0,c=1,t=0,pt=7,l=5,sg=0:25.4
                22:23:05debug [pimatic-mysensors]: <- MySensorsPH { sender: 2, sensor: 0, type: 24, value: '6.60' }
                22:23:05debug [pimatic-mysensors]: <- I_LOG_MESSAGE 0;0;3;0;9;read: 2-2-0 s=0,c=1,t=24,pt=7,l=5,sg=0:6.60

                If you look at the output in pimatic you can see that the mysensorsPH and mysensorsDST have the temp value. This happens 50% of the time.

                mfalkviddM 1 Reply Last reply
                0
                • S stingone

                  Got it working with another laptop..wil recompile to 2.0 in the weekend.

                  Just a quick question. I have 2 sensors on 1 arduino. Works fine however sometimes it shows the value of the temp sensor on the value of the ph sensor.

                  #include <SPI.h>
                  #include <MySensor.h>
                  #include <DallasTemperature.h>
                  #include <OneWire.h>
                  #include "Vcc.h"        // https://github.com/Yveaux/Arduino_Vcc
                  
                  static const float VccMin = 0.0;        // Minimum expected Vcc level, in Volts. (0.6V for 1 AA Alkaline)
                  static const float VccMax = 3.3;        // Maximum expected Vcc level, in Volts. (1.5V for 1 AA Alkaline)
                  static const float VccCorrection = 3.29 / 3.31;  // Measured Vcc by multimeter divided by reported Vcc
                  Vcc vcc(VccCorrection);
                  
                  #define CHILD_ID_PH 0
                  #define ArrayLenth 10               // times of collection
                  #define PH_SENSOR_ANALOG_PIN A0         // pH meter Analog output to Arduino Analog Input 0
                  #define LED_DIGITAL_PIN 13
                  #define Offset 0.25           //deviation compensate
                  
                  #define CHILD_ID_TEMP 1
                  #define COMPARE_TEMP 0 // Send temperature only if changed? 1 = Yes 0 = No
                  #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected 
                  #define MAX_ATTACHED_DS18B20 16
                  
                  unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
                  OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
                  DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature.
                  
                  unsigned long lastSend = 0;
                  static const unsigned long SEND_FREQUENCY = 30000;  // Minimum time between send (in milliseconds)
                  
                  MySensor gw;
                  
                  float lastPhHValue;
                  
                  float lastTemperature[MAX_ATTACHED_DS18B20];
                  int numSensors=0;
                  boolean receivedConfig = false;
                  boolean metric = true; 
                  
                  MyMessage msgPH(CHILD_ID_PH, V_VAR1);
                  MyMessage msg(CHILD_ID_TEMP,V_TEMP);
                  
                  void setup()
                  {
                      // Startup up the OneWire library
                      sensors.begin();
                      // requestTemperatures() will not block current thread
                      sensors.setWaitForConversion(false);
                      
                      //gw.begin(NULL, 100, false); //deze gebruiken, 100 is de node_id, die weer gebruiken in pimatic
                      gw.begin();
                      //Serial.print("0;0;3;0;2;");Serial.print(LIBRARY_VERSION);
                      
                      pinMode(LED_DIGITAL_PIN, OUTPUT);
                      numSensors = sensors.getDeviceCount();
                      
                      // Send the Sketch Version Information to the Gateway
                      gw.sendSketchInfo("pHmeter", "1.1");
                      
                      // Register all sensors to gw (they will be created as child devices)
                      gw.present(CHILD_ID_PH, S_WATER);
                  
                      // Present all sensors to controller
                      for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
                      gw.present(i, S_TEMP);
                      }
                  }
                  
                  void loop()
                  {
                      // By calling process() you route messages in the background
                      gw.process();
                      read_PH();
                      read_TEMP();
                  
                      gw.sleep(SLEEP_TIME);
                  }
                  
                  void read_PH(){
                     unsigned long now = millis();
                      bool sendTime = now - lastSend > SEND_FREQUENCY;
                      if (sendTime)
                      {
                          lastSend = now;
                          
                          //    float v = vcc.Read_Volts();
                          //    Serial.print("VCC = " );
                          //    Serial.print(v);
                          //    Serial.println(" Volts" );
                          
                          int batteryPcnt = (int)vcc.Read_Perc(VccMin, VccMax);
                          //    Serial.print("VCC = " );
                          //    Serial.print(batteryPcnt);
                          //    Serial.println(" %" );
                          
                          gw.sendBatteryLevel(batteryPcnt);
                      }
                      
                      // Read PH_SENSOR_ANALOG_PIN in phValue
                      float voltage = analogReadAverage(PH_SENSOR_ANALOG_PIN, 10) * 5.0 / 1024;
                      
                      // convert the millivolt into pH value
                      float PhValue = 3.5 * voltage+Offset;
                      
                      
                      
                          Serial.print("    pH:");
                          Serial.print(PhValue, 2);
                          Serial.println(" ");
                          
                          gw.send(msgPH.set(PhValue, 2)); // envoi au reseau avec deux decimales
                          
                          digitalWrite(LED_DIGITAL_PIN, digitalRead(LED_DIGITAL_PIN) ^ 1);
                          
                          lastPhHValue = PhValue;
                      
                  }
                  
                  
                  void read_TEMP(){
                    sensors.requestTemperatures();
                  
                    // query conversion time and sleep until conversion completed
                    int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
                    // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
                    gw.sleep(conversionTime);
                  
                    // Read temperatures and send them to controller 
                    for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
                   
                      // Fetch and round temperature to one decimal
                      float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
                   
                      // Only send data if temperature has changed and no error
                      #if COMPARE_TEMP == 1
                      if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
                      #else
                      if (temperature != -127.00 && temperature != 85.00) {
                      #endif
                   
                        // Send in the new temperature
                        gw.send(msg.setSensor(i).set(temperature,1));
                        // Save new temperatures for next compare
                        lastTemperature[i]=temperature;
                      }
                    }   
                  }
                  
                  
                  
                  
                  
                  
                  
                  double analogReadAverage(uint8_t pin, unsigned long ms)
                  {
                      double average = 0;
                      int buffer[ArrayLenth];
                      
                      for (int i = 0; i < ArrayLenth; i++)
                      {
                          buffer[i] = analogRead(PH_SENSOR_ANALOG_PIN);
                          delay(ms);
                      }
                      
                      if (ArrayLenth < 5)
                      {
                          // less than 5, calculated directly statistics
                          for (int i = 0; i < ArrayLenth; i++)
                          {
                              average += buffer[i];
                          }
                          average = average / ArrayLenth;
                      }
                      else
                      {
                          // Sort the values from small to large
                          for (int i = 0; i < ArrayLenth; i++)
                          {
                              for (int j = i + 1; j < 10; j++)
                              {
                                  if (buffer[i] > buffer[j])
                                  {
                                      int temp = buffer[i];
                                      buffer[i] = buffer[j];
                                      buffer[j] = temp;
                                  }
                              }
                          }
                          
                          // take the average value of center sample
                          for (int i = 2; i < ArrayLenth - 2; i++)
                          {
                              average += buffer[i];
                          }
                          
                          average = average / (ArrayLenth - 4);
                      }
                      
                      return average;
                  }
                  
                  
                  

                  And in Pimatic

                  {
                        "id": "temperatuur-aquarium",
                        "name": "Temperatuur Aquarium",
                        "class": "MySensorsDST",
                        "nodeid": 2,
                        "sensorid": 0
                      },
                      {
                        "id": "phmeter-aquarium",
                        "name": "pH Aquarium",
                        "class": "MySensorsPH",
                        "nodeid": 2,
                        "sensorid": 0,
                        "batterySensor": false
                      },
                  

                  debug [pimatic-mysensors]: <- MySensorsPH { sender: 2, sensor: 0, type: 0, value: '25.4' }
                  22:23:06debug [pimatic-mysensors]: <- MySensorDST { sender: 2, sensor: 0, type: 0, value: '25.4' }
                  22:23:06debug [pimatic-mysensors]: <- I_LOG_MESSAGE 0;0;3;0;9;read: 2-2-0 s=0,c=1,t=0,pt=7,l=5,sg=0:25.4
                  22:23:05debug [pimatic-mysensors]: <- MySensorsPH { sender: 2, sensor: 0, type: 24, value: '6.60' }
                  22:23:05debug [pimatic-mysensors]: <- I_LOG_MESSAGE 0;0;3;0;9;read: 2-2-0 s=0,c=1,t=24,pt=7,l=5,sg=0:6.60

                  If you look at the output in pimatic you can see that the mysensorsPH and mysensorsDST have the temp value. This happens 50% of the time.

                  mfalkviddM Offline
                  mfalkviddM Offline
                  mfalkvidd
                  Mod
                  wrote on last edited by mfalkvidd
                  #8

                  @stingone this line

                   gw.send(msg.setSensor(i).set(temperature,1));
                  

                  will set the child id to 0 for the first temp sensor, to 1 for the second and so on. That's why you get temperature data on id 0, which is also used by the ph sensor.

                  S 1 Reply Last reply
                  1
                  • mfalkviddM mfalkvidd

                    @stingone this line

                     gw.send(msg.setSensor(i).set(temperature,1));
                    

                    will set the child id to 0 for the first temp sensor, to 1 for the second and so on. That's why you get temperature data on id 0, which is also used by the ph sensor.

                    S Offline
                    S Offline
                    stingone
                    wrote on last edited by
                    #9

                    @mfalkvidd said:

                    @stingone this line

                     gw.send(msg.setSensor(i).set(temperature,1));
                    

                    will set the child id to 0 for the first temp sensor, to 1 for the second and so on. That's why you get temperature data on id 0, which is also used by the ph sensor.

                    What would be best to do?

                    1 Reply Last reply
                    0
                    • mfalkviddM Offline
                      mfalkviddM Offline
                      mfalkvidd
                      Mod
                      wrote on last edited by
                      #10

                      It depends on how much work you are prepared to do and how much flexibility you want in the code.

                      If you only use one temperature sensor and don't have any plans to add more, change

                      gw.send(msg.setSensor(i).set(temperature,1));
                      

                      to

                      gw.send(msg.set(temperature,1));
                      
                      S 1 Reply Last reply
                      0
                      • mfalkviddM mfalkvidd

                        It depends on how much work you are prepared to do and how much flexibility you want in the code.

                        If you only use one temperature sensor and don't have any plans to add more, change

                        gw.send(msg.setSensor(i).set(temperature,1));
                        

                        to

                        gw.send(msg.set(temperature,1));
                        
                        S Offline
                        S Offline
                        stingone
                        wrote on last edited by
                        #11

                        @mfalkvidd said:

                        It depends on how much work you are prepared to do and how much flexibility you want in the code.

                        If you only use one temperature sensor and don't have any plans to add more, change

                        gw.send(msg.setSensor(i).set(temperature,1));
                        
                        gw.send(msg.set(temperature,1));
                        

                        Only using the ph sensor and 1 temperatuur sensor no need for more temp sensors.

                        1 Reply Last reply
                        1
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        14

                        Online

                        11.7k

                        Users

                        11.2k

                        Topics

                        113.1k

                        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