Group Details Private

Tech Evangelist

Spreading the word about MySensors Technology

 

Member List

  • RE: Is Sale of personal hardware acceptable in this group?

    Yes, selling boards (none commercially) is ok.

    posted in General Discussion
  • RE: Set forum search to only look back 2 years?

    @mfalkvidd
    Sorry, can't find any way of setting default options this this for the Solr forum plugin.

    posted in General Discussion
  • RE: 💬 OpenHAB

    Sure!

    henrik.ekblad@mysensors.org

    .. and any updates you want to see in the text as well.

    posted in Announcements
  • RE: Gateway with Relays (4) on WEMOS D1 R1

    @zachflem sorry for your frustrations my friend. It's something we all experience every once in a while. Could you give us more details? Like serial logging and photo's of your wiring. Because people don't have X-ray eyes and they can't peek at your project table. So it's very hard to help when you have no eyes 😛

    posted in Hardware
  • RE: Esp8266 gateway with RFM69 433

    @quby Looks to me as if the radio is not correctly connected. Because I'd expect more lines in the serial log. You could check:

    • Whether wiring is correct.
    • Whether the radio can get the power it needs

    In most cases it's either one of these. But no expert on the MQTT gateway. Also share a photo of how you've connected everything. Because people can't help if they can't see what you're ding.

    posted in Troubleshooting
  • RE: 2 dallas temp + 4 relays

    @dzjr If removed all unused variables and stuff. And the use of the bracelets was actually smart of you. Because you combined the different functions between them. The problem with it, is that is makes hard to read the code. So what I've done is I've made new functions of them outside the loop() and give them meaningful names. That way you have the lines of code, need for a specific function together in a method.
    Especially when you start learning how to program, using functions is a good practice. It will help you understand the code better.

    This code should work if it was only because the wait was removed. You need it in this case. It compiles, but I can't test it for you.

    Thanks for the oliebol 🙂 If you have any questions just ask. I'm glad that I could escape from the oudjaar-ellende 🙂 so my thanx for that.

    /******************************************************************
      Created with PROGRAMINO IDE for Arduino - 28.12.2018 12:45:52
      Project     :MySensors Watermeter Node RS485
      Libraries   :MySensors, Dallas temp etc
      Author      :MySensors community & dzjr
      Description :Mysensors Watermeter node & leiding temperatuur
                  met lekkage detectie en optie voor waterdruk
    ******************************************************************/
    
    #define MY_DEBUG
    
    //RS 485 transport zaken
    #define MY_RS485                  //RS-485 transport
    #define MY_RS485_DE_PIN 11        //De DE pin benoemen, normaal is dit PIN-3
    #define MY_RS485_BAUD_RATE 9600
    //#define MY_RS485_MAX_MESSAGE_LENGTH 40
    //#define MY_RS485_SOH_COUNT 3 // gebruiken bij Collision op de bus
    
    //eerst wat administratie en dergelijk
    #define SN "PWN_Node" //Software Naam
    #define SV "1.01"      //Software versie
    #define MY_NODE_ID 20 //Node nummer
    #define MY_TRANSPORT_WAIT_READY_MS 3000    //wachten tot de gateway is opgestart
    
    
    //libaries activeren
    #include <MySensors.h>
    #include <DallasTemperature.h>
    #include <OneWire.h>
    #include <Bounce2.h>
    
    //Dallas settings
    #define ONE_WIRE_BUS 7
    
    #define TEMPERATURE_PRECISION 10 // 10 = 0,25°C 
    #define MAX_ATTACHED_DS18B20 4
    
    OneWire oneWire(ONE_WIRE_BUS); //Een oneWire-exemplaar instellen om te communiceren met alle OneWire-apparaten
    DallasTemperature sensors(&oneWire); //OneWire naar Dallas
    
    float lastTemperature[MAX_ATTACHED_DS18B20];
    
    int numSensors = 0;
    bool receivedConfig = false;
    //bool metric = true;
    
    DeviceAddress Probe03 = { 0x28, 0x80, 0x43, 0x77, 0x91, 0x0F, 0x02, 0x5A  }; // leiding temp
    DeviceAddress Probe02 = { 0x28, 0xFF, 0x64, 0x1D, 0xF9, 0x9D, 0xDC, 0x5E  }; // op print1
    DeviceAddress Probe01 = { 0x28, 0xFF, 0x64, 0x1D, 0xF8, 0x4F, 0x3A, 0x08  }; // op print2
    
    
    MyMessage msgTemp(0, V_TEMP);
    
    #define CHILD_ID_PWN 11                 //Child ID Sensor watermeter
    #define CHILD_ID_LEKKAGE 21             //Child ID Lekkage sensor
    #define CHILD_ID_DRUK 22                //Child ID Water druk sensor
    #define PWN_SENSOR 2                    //Pin waar sensor watermeter op is aangesloten
    #define LEKKAGE_PIN A0                  //Pin waarop de lekkage sensor op is aangesloten
    #define WATERDRUK_PIN A1                //Pin waarom de druksensor is aangesloten
    #define SENSOR_INTERRUPT PWN_SENSOR-2   //Usually the interrupt = pin -2 
    #define PULSE_FACTOR 1000               //Pulsen per m³ water 1000=één rotatie per 10 liter
    #define MAX_FLOW 60ul                     //flitert meetfouten eruit (40 van @RBisschops en 100 van @Rejoe) <-- Theo: ul toegevoegd hoef je niet te casten
    #define wachtTime 5000ul              // Theo: added ul which makes it an unsigned long also mixing dutch and english in names is very confusing. At least to me.
    
    MyMessage flowmsg (CHILD_ID_PWN, V_FLOW);
    MyMessage volumemsg (CHILD_ID_PWN, V_VOLUME);
    MyMessage lastcountermsg (CHILD_ID_PWN, V_VAR1);
    MyMessage lekmsg (CHILD_ID_LEKKAGE, V_TEXT);
    MyMessage drukmsg (CHILD_ID_DRUK, V_PRESSURE);
    
    #define SEND_FREQUENCY 30000ul // Theo it's a constant 
    
    double ppl = ((double)PULSE_FACTOR) / 1000;      // Pulses per liter
    volatile unsigned long pulseCount = 0;
    volatile unsigned long lastBlink = 0;
    volatile double flow = 0;
    boolean pcReceived = false; // Theo: This value never changes...???
    unsigned long oldPulseCount = 0;
    
    double oldflow = 0;
    double volume = 0;
    double oldvolume = 0;
    unsigned long lastSend = 0;
    unsigned long lastPulse = 0;
    #define SLEEP_MODE false        // Watt-value can only be reported when sleep mode is false.
    
    volatile unsigned long dryPulseCount = 0;
    int lastdrukValue = 0;
    
    // lowest and highest sensor readings:
    const int sensorMin = 0;     // sensor minimum
    const int sensorMax = 600;  // sensor maximum
    
    
    void before() {
      wait(wachtTime); // Theo: Since this is only used one, a constant is not really needed. You can keep it for better readability
      sensors.begin(); // Theo: I always use meaningfull names. To me sensors is to vague, I'd use dallasSensors or temperatureSensors.
    }
    
    void setup() {
      sensors.setWaitForConversion(false);
      pinMode(PWN_SENSOR, INPUT_PULLUP);
      sensors.setResolution(TEMPERATURE_PRECISION);
      //  pulseCount = oldPulseCount = 0; // Theo not needed they're initialized with 0 in their declaration
      attachInterrupt(SENSOR_INTERRUPT, onPulse , FALLING );
    
      // Theo: initialize the array with 0.0 as a value.
      for (int i = 0; i < numSensors && i < MAX_ATTACHED_DS18B20; i++) {
        lastTemperature[MAX_ATTACHED_DS18B20] = 0.0;
      };
    }
    
    void presentation() {
      sendSketchInfo(SN, SV);
    
      numSensors = sensors.getDeviceCount();
    
      for (int i = 0; i < numSensors && i < MAX_ATTACHED_DS18B20; i++) {
        //  metric = getControllerConfig().isMetric;
        // Registreer alle sensors naar de Gateway
        present(i + 0, S_TEMP, "temp sensors");
        //present(i+1, S_TEMP, "MK Node temp");
        //present(i+2, S_TEMP, "PWN Leiding temp");
        present(CHILD_ID_PWN, S_WATER, "PWN_Meter");
        request(CHILD_ID_PWN, V_VAR1, "Req PWN data" );
        present(CHILD_ID_LEKKAGE, S_INFO, "Lekkage MK");
        present(CHILD_ID_DRUK, S_BARO, "PWN Waterdruk");
      }
    }
    
    unsigned long currentTime;
    
    void sendPulseValue() {
      if (flow != oldflow) {
        oldflow = flow;
    
        // Check that we dont get unresonable large flow value.
        // could hapen when long wraps or false interrupt triggered
        if (flow < MAX_FLOW ) { // Theo: <-- cast (unsigned long) removed. No longer needed constant defined is ul (unsigned long) saves a bit of cpu time.
          send(flowmsg.set(flow, 2 ) ); // Send flow value to gw
        }
      }
    
      // No Pulse count received in 2min
      if (currentTime - lastPulse > 120000) {
        flow = 0;
      }
    
      // Pulse count has changed
      if (pulseCount != oldPulseCount) {
        oldPulseCount = pulseCount;
    #ifdef MY_DEBUG
        Serial.print(F("pulsecnt:"));
        Serial.println(pulseCount);
    #endif
        if (!pcReceived) { // Because this value never changes you're requesting the value from the gateway every other 30 seconds....??
          request(CHILD_ID_PWN, V_VAR1);
        }
        send(flowmsg.set(pulseCount));                  // Send  pulsecount value to gw in VAR1
    
        double volume = ((double)pulseCount / ((double)PULSE_FACTOR));
        if (volume != oldvolume) {
          oldvolume = volume;
    #ifdef MY_DEBUG
          Serial.print(F("vol:"));
          Serial.println(volume, 3);
    #endif
          send(volumemsg.set(volume, 3));               // Send volume value to gw
        }
      }
    }
    
    void sendWaterPressure() {
      //Waterdruk meten
      int Waterdruk = (analogRead(WATERDRUK_PIN)) * 10;
      if (Waterdruk != lastdrukValue) {
        send (drukmsg.set(Waterdruk));
        lastdrukValue = Waterdruk;
      }
    }
    
    void sendWaterLeakageText() {
      //waterlekkage sensor
      int lekLevel = map(analogRead(LEKKAGE_PIN), sensorMin, sensorMax, 0, 3);
    
      switch (lekLevel) {
        case 0:    // Sensor is droog
          send(lekmsg.set("Geen lekkage"));
          break;
        case 1:    // Sensor raakt nat
          send(lekmsg.set("Vochtig"));
          break;
        case 2:   // Sensor is volledig bedekt met water
          send(lekmsg.set("Lekkage"));
          break;
      }
    }
    
    void sendTemperatureValues() {
      //Dallas temperature sensoren
      // Fetch temperatures from Dallas sensors
      sensors.requestTemperatures();
    
      // query conversion time and sleep until conversion completed
      wait( sensors.millisToWaitForConversion( sensors.getResolution() ) );
    
      // 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>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
        float temperature;
        // voor geadreseerde sensoren
        switch (i)  {
          case 0:
            temperature = sensors.getTempC(Probe01);
            break;
          case 1:
            temperature = sensors.getTempC(Probe02);
            break;
          case 2:
            temperature = sensors.getTempC(Probe03);
            break;
          default:
            temperature = sensors.getTempCByIndex(Probe03);
            break;
        }
    
        // Only send data if temperature has changed and no error
        if ( lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
    
          // Send in the new temperature
          send( msgTemp.setSensor( i ).set( temperature, 1 ) );
          // Save new temperatures for next compare
          lastTemperature[i] = temperature;
        }
      }
    }
    
    void loop() {
      currentTime = millis();
    
      //Watermeter sensor
      //WaterPulse counter
      // Only send values at a maximum frequency or woken up from sleep
      if (currentTime - lastSend > SEND_FREQUENCY) {
        lastSend = currentTime;
    
        sendPulseValue();
        sendWaterPressure();
        sendWaterLeakageText();
        sendTemperatureValues();
      }
    }
    
    // unsigned long newBlink = 0; Theo: <-- removed from top because it's never used since it's a local in your interrupt handler
    void onPulse() {
      if ( !SLEEP_MODE )  { // Theo: since you've declared it as a constant with value false the check is not needed. The evaluation of the if statement will always be true
        unsigned long newBlink = micros();
        unsigned long interval = newBlink - lastBlink;
    
        if (interval != 0) {
          lastPulse = millis();
          if (interval < 1000000L) {
            // Sometimes we get interrupt on RISING,  1000000 = 1sek debounce ( max 60 l/min)
            return;
          }
          flow = (60000000.0 / interval) / ppl;
        }
        lastBlink = newBlink;
      }
      pulseCount++;
      dryPulseCount++;
    }
    
    posted in Troubleshooting
  • RE: 2 dallas temp + 4 relays

    @dzjr here is the code with my comments. It compiles but I can't test it I use NRF24L01 and don't have any dallas temp sensors. I'll be cleaning up the code more like removing unused variables. Let's use that one for debugging purposes. Don't add anything else, because there's already a lot in it and it'll be harder to find the bug.

    /******************************************************************
      Created with PROGRAMINO IDE for Arduino - 28.12.2018 12:45:52
      Project     :MySensors Watermeter Node RS485
      Libraries   :MySensors, Dallas temp etc
      Author      :MySensors community & dzjr
      Description :Mysensors Watermeter node & leiding temperatuur
                  met lekkage detectie en optie voor waterdruk
    ******************************************************************/
    
    #define MY_DEBUG
    
    //RS 485 transport zaken
    #define MY_RS485                  //RS-485 transport
    #define MY_RS485_DE_PIN 11        //De DE pin benoemen, normaal is dit PIN-3
    #define MY_RS485_BAUD_RATE 9600
    //#define MY_RS485_MAX_MESSAGE_LENGTH 40
    //#define MY_RS485_SOH_COUNT 3 // gebruiken bij Collision op de bus
    
    //eerst wat administratie en dergelijk
    #define SN "PWN_Node" //Software Naam
    #define SV "1.01"      //Software versie
    #define MY_NODE_ID 20 //Node nummer
    #define MY_TRANSPORT_WAIT_READY_MS 3000    //wachten tot de gateway is opgestart
    
    
    //libaries activeren
    #include <MySensors.h>
    #include <DallasTemperature.h>
    #include <OneWire.h>
    #include <Bounce2.h>
    
    //Dallas settings
    #define COMPARE_TEMP 0 // 1= zenden alleen bij verandering 0= direct zenden
    #define ONE_WIRE_BUS 7
    #define TEMPERATURE_PRECISION 10 // 10 = 0,25°C 
    #define MAX_ATTACHED_DS18B20 4
    unsigned long SLEEP_TIME = 3000; //slaaptijd tussen twee metingen in ms
    OneWire oneWire(ONE_WIRE_BUS); //Een oneWire-exemplaar instellen om te communiceren met alle OneWire-apparaten
    DallasTemperature sensors(&oneWire); //OneWire naar Dallas
    float lastTemperature[MAX_ATTACHED_DS18B20];
    int numSensors = 0;
    bool receivedConfig = false;
    //bool metric = true;
    
    DeviceAddress Probe03 = { 0x28, 0x80, 0x43, 0x77, 0x91, 0x0F, 0x02, 0x5A  }; // leiding temp
    DeviceAddress Probe02 = { 0x28, 0xFF, 0x64, 0x1D, 0xF9, 0x9D, 0xDC, 0x5E  }; // op print1
    DeviceAddress Probe01 = { 0x28, 0xFF, 0x64, 0x1D, 0xF8, 0x4F, 0x3A, 0x08  }; // op print2
    
    
    MyMessage msgTemp(0, V_TEMP);
    
    #define CHILD_ID_PWN 11                 //Child ID Sensor watermeter
    #define CHILD_ID_LEKKAGE 21             //Child ID Lekkage sensor
    #define CHILD_ID_DRUK 22                //Child ID Water druk sensor
    #define PWN_SENSOR 2                    //Pin waar sensor watermeter op is aangesloten
    #define LEKKAGE_PIN A0                  //Pin waarop de lekkage sensor op is aangesloten
    #define WATERDRUK_PIN A1                //Pin waarom de druksensor is aangesloten
    #define SENSOR_INTERRUPT PWN_SENSOR-2   //Usually the interrupt = pin -2 
    #define PULSE_FACTOR 1000               //Pulsen per m³ water 1000=één rotatie per 10 liter
    #define MAX_FLOW 60ul                     //flitert meetfouten eruit (40 van @RBisschops en 100 van @Rejoe) <-- Theo: ul toegevoegd hoef je niet te casten
    #define wachtTime 5000ul              // Theo: added ul which makes it an unsigned long also mixing dutch and english in names is very confusing. At least to me.
    
    MyMessage flowmsg (CHILD_ID_PWN, V_FLOW);
    MyMessage volumemsg (CHILD_ID_PWN, V_VOLUME);
    MyMessage lastcountermsg (CHILD_ID_PWN, V_VAR1);
    MyMessage lekmsg (CHILD_ID_LEKKAGE, V_TEXT);
    MyMessage drukmsg (CHILD_ID_DRUK, V_PRESSURE);
    
    
    //unsigned long SEND_FREQUENCY = 30000; // Minimum time between send (in milliseconds). We don't want to spam the gateway.
    #define SEND_FREQUENCY 30000ul // Theo it's a constant 
    
    double ppl = ((double)PULSE_FACTOR) / 1000;      // Pulses per liter
    volatile unsigned long pulseCount = 0;
    volatile unsigned long lastBlink = 0;
    volatile double flow = 0;
    boolean pcReceived = false;
    unsigned long oldPulseCount = 0;
    unsigned long newBlink = 0;
    double oldflow = 0;
    double volume = 0;
    double oldvolume = 0;
    unsigned long lastSend = 0;
    unsigned long lastPulse = 0;
    #define SLEEP_MODE false        // Watt-value can only be reported when sleep mode is false.
    unsigned long maxTimeDryRun = 30000;
    unsigned long startTimeDryRun = 0;
    volatile unsigned long dryPulseCount = 0;
    
    int lastlekValue = 0;
    int lastdrukValue = 0;
    
    // lowest and highest sensor readings:
    const int sensorMin = 0;     // sensor minimum
    const int sensorMax = 600;  // sensor maximum
    
    
    void before() {
      wait(wachtTime); // Theo: Since this is only used one, a constant is not really needed. You can keep it for better readability
      sensors.begin(); // Theo: I always use meaningfull names. To me sensors is to vague, I'd use dallasSensors or temperatureSensors.
    }
    
    void setup() {
      sensors.setWaitForConversion(false);
      pinMode(PWN_SENSOR, INPUT_PULLUP);
      sensors.setResolution(TEMPERATURE_PRECISION);
      pulseCount = oldPulseCount = 0;
      attachInterrupt(SENSOR_INTERRUPT, onPulse , FALLING );
    }
    
    void presentation() {
      sendSketchInfo(SN, SV);
    
      numSensors = sensors.getDeviceCount();
    
      for (int i = 0; i < numSensors && i < MAX_ATTACHED_DS18B20; i++) {
        //  metric = getControllerConfig().isMetric;
        // Registreer alle sensors naar de Gateway
        present(i + 0, S_TEMP, "temp sensors");
        //present(i+1, S_TEMP, "MK Node temp");
        //present(i+2, S_TEMP, "PWN Leiding temp");
        present(CHILD_ID_PWN, S_WATER, "PWN_Meter");
        request(CHILD_ID_PWN, V_VAR1, "Req PWN data" );
        present(CHILD_ID_LEKKAGE, S_INFO, "Lekkage MK");
        present(CHILD_ID_DRUK, S_BARO, "PWN Waterdruk");
      }
    }
    
    unsigned long currentTime; // Theo: <--- removed declaration from loop. Not necessary but a good practice to make large variables global. That way heap gets less fragmented
    
    void loop() {
      currentTime = millis();
    
      //Watermeter sensor
      //WaterPulse counter
      // Only send values at a maximum frequency or woken up from sleep
      if (currentTime - lastSend > SEND_FREQUENCY) {
        lastSend = currentTime;
    
        if (flow != oldflow) { // Theo <--- Removed the bracelet at the start of the line?
          oldflow = flow;
    #ifdef MY_DEBUG_LOCAL
          Serial.print("l/min:");
          Serial.println(flow);
    #endif
          // Check that we dont get unresonable large flow value.
          // could hapen when long wraps or false interrupt triggered
          if (flow < MAX_FLOW ) { // Theo: <-- cast (unsigned long) removed. No longer needed constant defined is ul (unsigned long) saves a bit of cpu time.
            send(flowmsg.set(flow, 2 ) ); // Send flow value to gw
          }
        }
    
        // No Pulse count received in 2min
        if (currentTime - lastPulse > 120000) {
          flow = 0;
        }
    
        // Pulse count has changed
        if (pulseCount != oldPulseCount) {
          oldPulseCount = pulseCount;
    #ifdef MY_DEBUG
          Serial.print(F("pulsecnt:"));
          Serial.println(pulseCount);
    #endif
          if (!pcReceived) {
            request(CHILD_ID_PWN, V_VAR1);
          }
          send(flowmsg.set(pulseCount));                  // Send  pulsecount value to gw in VAR1
    
          double volume = ((double)pulseCount / ((double)PULSE_FACTOR));
          if (volume != oldvolume) {
            oldvolume = volume;
    #ifdef MY_DEBUG
            Serial.print(F("vol:"));
            Serial.println(volume, 3);
    #endif
            send(volumemsg.set(volume, 3));               // Send volume value to gw
          }
        }
    
    
        //    { Theo
        //Waterdruk meten
        int Waterdruk = (analogRead(WATERDRUK_PIN)) * 10;
        if (Waterdruk != lastdrukValue) {
          send (drukmsg.set(Waterdruk));
          lastdrukValue = Waterdruk;
        }
    
    
        //waterlekkage sensor
        int lekLevel = map(analogRead(LEKKAGE_PIN), sensorMin, sensorMax, 0, 3);
    
        switch (lekLevel) {
          case 0:    // Sensor is droog
            send(lekmsg.set("Geen lekkage"));
            break;
          case 1:    // Sensor raakt nat
            send(lekmsg.set("Vochtig"));
            break;
          case 2:   // Sensor is volledig bedekt met water
            send(lekmsg.set("Lekkage"));
            break;
        }
        //    } Theo
    
        //    } Theo
    
    
    
    
    
    
    
        //    { Theo
        //Dallas temperature sensoren
        // Fetch temperatures from Dallas sensors
        sensors.requestTemperatures();
        // query conversion time and sleep until conversion completed
    //    int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
    
    
    //    wait(500);
    
        wait( sensors.millisToWaitForConversion( sensors.getResolution() ) );
    
        // 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>((getControllerConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
          float temperature;
          // voor geadreseerde sensoren
          switch (i)  {
            case 0:
              temperature = sensors.getTempC(Probe01);
              break;
            case 1:
              temperature = sensors.getTempC(Probe02);
              break;
            case 2:
              temperature = sensors.getTempC(Probe03);
              break;
            default:
              temperature = sensors.getTempCByIndex(Probe03);
              break;
          }
    
    
          // 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) { // Theo: COMPARE_TEMP looks like a constant with value 0 so the #if looks unneeded to me.??
            //#endif
    
            // Send in the new temperature
            send( msgTemp.setSensor( i ).set( temperature, 1 ) );
            // Save new temperatures for next compare
            lastTemperature[i] = temperature;
          }
          //      } Theo
        }
      }
    }
    
    void onPulse() {
      if ( !SLEEP_MODE )  {
        unsigned long newBlink = micros();
        unsigned long interval = newBlink - lastBlink;
    
        if (interval != 0) {
          lastPulse = millis();
          if (interval < 1000000L) {
            // Sometimes we get interrupt on RISING,  1000000 = 1sek debounce ( max 60 l/min)
            return;
          }
          flow = (60000000.0 / interval) / ppl;
        }
        lastBlink = newBlink;
      }
      pulseCount++;
      dryPulseCount++;
    }
    

    Another MAX_ATTACHED_DS18B20 is 4. You only have 3 probes. This means that the 3rd and 4th will always report the same values.

    posted in Troubleshooting
  • RE: 2 dallas temp + 4 relays

    @dzjr Would be so much easier to discuss it in Dutch 🙂

    What is the problem you encounter at the moment?

    I'm looking at the code, and just asking why you use so many unneeded blocks. e.g.

    { if (flow != oldflow) { // Theo <--- Removed the bracelet at the start of the line?
    ...

    That first starting bracelet ({) is not needed because the part that is being executed if the if statement evaluates to true is after the last bracelet. I'll see if I can clean up the code a bit for you. I'll add comments with what I've changed.

    posted in Troubleshooting
  • RE: 2 dallas temp + 4 relays

    @rejoe2 changing
    wait(500);

    to

    wait( millisToWaitForConversion );

    Should do the trick.
    But wait has an unsigned long as parameter and your conversionTime is a signed int16_t, you might need to cast it. Best to update the millisWaitForConversion to unsigned long as well.

    // This function helps to avoid a problem with the latest Dallas temperature library.
    unsigned long millisToWaitForConversion(uint8_t bitResolution)
    {
      switch (bitResolution) {
        case 9:
          return 94;
        case 10:
          return 188;
        case 11:
          return 375;
        default:
          return 750;
      }
    }
    

    But it's hard to help with only a fragment of the code. I'm guessing that the resolution doesn't change when your sketch is running. In that case I'd declare a global unsigned long conversionWaitDuration and initialize it in the setup. I honestly would never ever use a wait in a sketchs main loop though. I always use a none blocking wait which uses millis().

    But again hard to help with coding when you can only see a fragment of the code.

    posted in Troubleshooting
  • RE: 2 dallas temp + 4 relays

    You calculate the conversion time, but you don't use it. So it makes sense that you won't get any readings without a wait, because the sensors don't get anytime to read. You should wait for the conversionTime before you read the sensors. Which is I'm guessing shorter than 500 ms, but I don't use Dallas temp sensors. So no expert on that.

    posted in Troubleshooting