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. One Arduino, two water pulse sensors

One Arduino, two water pulse sensors

Scheduled Pinned Locked Moved Troubleshooting
7 Posts 4 Posters 5.2k Views 4 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
    andriej
    wrote on last edited by
    #1

    Hello!

    Did anyone try/managed to run two water pulse sensors on one arduino?
    There's two interrupts available, but I struggle to change the code to actually measure and report two values from one unit...

    :-)

    1 Reply Last reply
    0
    • T Offline
      T Offline
      tbully
      wrote on last edited by
      #2

      I ended up having to use two. But honestly I didn't try that hard because I also had to switch a relay on each sensor. It made both programming and wiring easier to run two in my scenario.

      Let us know if you find a better solution!

      1 Reply Last reply
      0
      • D Offline
        D Offline
        derrij
        wrote on last edited by
        #3

        try this. working fine for me.

        	//#include <EEPROM.h>
        
        	//
        	// Use this sensor to measure volume and flow of your house watermeter.
        	// You need to set the correct pulsefactor of your meter (pulses per m3).
        	// The sensor starts by fetching current volume reading from gateway (VAR 1).
        	// Reports both volume and flow back to gateway.
        	//
        
        	#include <SPI.h>
        	#include <MySensor.h>
        
        	#define RADIO_ID 2
        
        	#define CHILD_ID_HUM 0
        	#define CHILD_ID_TEMP 1
        	unsigned long HUM_TEMP_SEND_FREQUENCY = 30;     // Minimum time between send (in seconds). We don't want to spam the gateway.
        	#define WATER_LEAK_SENSOR_DIGITAL_PIN 6
        	#define HUMIDITY_SENSOR_DIGITAL_PIN 5
        	#define HOT_WATER_SENSOR_DIGITAL_PIN 4
        	#define COLD_WATER_SENSOR_DIGITAL_PIN 3
        	#define PULSE_FACTOR 1000                       // Nummber of blinks per m3 of your meter (One rotation/liter)
        	#define CHILD_ID_HOT_WATER 5
        	#define CHILD_ID_COLD_WATER 4                    // Id of the sensor child
        	#define CHILD_ID_WATER_LEAK 2
        	unsigned long SEND_FREQUENCY = 20;              // Minimum time between send (in seconds). We don't want to spam the gateway.
        
        
        
        	MySensor gw;
        
        	double ppl = ((double)PULSE_FACTOR) / 1000;      // Pulses per liter
        
        	volatile unsigned long pulseCountHot = 0;
        	volatile unsigned long pulseCountCold = 0;
        	volatile unsigned long lastBlinkHot = 0;
        	volatile unsigned long lastBlinkCold = 0;
        	volatile double flowHot = 0;
        	volatile double flowCold = 0;
        	unsigned long oldPulseCountHot = 0;
        	unsigned long oldPulseCountCold = 0;
        	unsigned long newBlinkHot = 0;
        	unsigned long newBlinkCold = 0;
        	double oldflowHot = 0;
        	double oldflowCold = 0;
        	double oldtripped = 0;
        	double volumeHot;
        	double volumeCold;
        	double oldvolumeHot;
        	double oldvolumeCold;
        	unsigned long lastSendHot;
        	unsigned long lastSendCold;
        	unsigned long lastSendHumTemp;
        	unsigned long lastPulseHot;
        	unsigned long lastPulseCold;
        	unsigned long currentTimeHot;
        	unsigned long currentTimeCold;
        	unsigned long currentHumTemp;
        	boolean pcReceivedHot = false;
        	boolean pcReceivedCold = false;
        
        
        	int lastSensorStateHot = 1;   // the previous reading from the input pin
        	int sensorStateHot;             // the current reading from the input pin
        	long lastDebounceTimeHot = 0;  // the last time the output pin was toggled
        	long debounceDelayHot = 50;    // the debounce time; increase if the output flickers
        
        	int lastSensorStateCold = 1;   // the previous reading from the input pin
        	int sensorStateCold;             // the current reading from the input pin
        	long lastDebounceTimeCold = 0;  // the last time the output pin was toggled
        	long debounceDelayCold = 50;    // the debounce time; increase if the output flickers
        
        	boolean metric;
        	MyMessage flowMsgHot(CHILD_ID_HOT_WATER, V_FLOW);
        	MyMessage volumeMsgHot(CHILD_ID_HOT_WATER, V_VOLUME);
        	MyMessage pcMsgHot(CHILD_ID_HOT_WATER, V_VAR1);
        
        	MyMessage flowMsgCold(CHILD_ID_COLD_WATER, V_FLOW);
        	MyMessage volumeMsgCold(CHILD_ID_COLD_WATER, V_VOLUME);
        	MyMessage pcMsgCold(CHILD_ID_COLD_WATER, V_VAR1);
        
        	MyMessage msg(CHILD_ID_WATER_LEAK, V_TRIPPED);
        	void setup() {
        
        	  gw.begin(incomingMessage, RADIO_ID);
        	  delay(40);
        	  // Send the sketch version information to the gateway and Controller
        	  gw.sendSketchInfo("Water Meter", "1.0");
        		delay(40);
        	  // Register this device as Waterflow sensor
        	  gw.present(CHILD_ID_COLD_WATER, S_WATER);
        		delay(40);
        	  gw.present(CHILD_ID_HOT_WATER, S_WATER);
        		delay(40);
        	  gw.present(CHILD_ID_WATER_LEAK, S_MOTION);
        		delay(40);
        	  // Fetch last known pulse count value from gw
        
        
        	  lastSendCold  = millis();
        	  lastSendHot = millis();
        
        	  pinMode(COLD_WATER_SENSOR_DIGITAL_PIN, INPUT);
        	  pinMode(HOT_WATER_SENSOR_DIGITAL_PIN, INPUT);
        	  gw.request(CHILD_ID_COLD_WATER, V_VAR1);
        	   
        	  gw.request(CHILD_ID_HOT_WATER, V_VAR1);
        	}
        
        	void incomingMessage(const MyMessage &message) {
        
        	  if (message.type == V_VAR1 && message.sensor == 4) {
        		pulseCountCold = oldPulseCountCold = message.getLong();
        		Serial.print("Received last pulse count from gw for sensor:");
        		Serial.print(message.sensor);
        		Serial.print(" pulseCountCold ");
        		Serial.println(pulseCountCold);
        		pcReceivedCold = true;
        	  }
        	  else if (message.type == V_VAR1 && message.sensor == 5) {
        		pulseCountHot = oldPulseCountHot = message.getLong();
        		Serial.print("Received last pulse count from gw for sensor:");
        		Serial.print(message.sensor);
        		Serial.print(" pulseCountHot ");
        		Serial.println(pulseCountHot);
        		pcReceivedHot = true;
        	  }
        	}
        
        	void loop() {
        	  gw.process();
        	  int readingCold = digitalRead(COLD_WATER_SENSOR_DIGITAL_PIN);
        	  // If the switch changed, due to noise or pressing:
        	  if (readingCold != lastSensorStateCold) {
        		// reset the debouncing timer
        		lastDebounceTimeCold = millis();
        	  }
        	  if ((millis() - lastDebounceTimeCold) > debounceDelayCold) {
        		// whatever the reading is at, it's been there for longer
        		// than the debounce delay, so take it as the actual current state:
        
        		// if the button state has changed:
        		if (readingCold != sensorStateCold) {
        		  sensorStateCold = readingCold;
        
        		  // only toggle the LED if the new button state is HIGH
        		  if (sensorStateCold == 0) {
        			pulseCountCold++;
        
        			unsigned long newBlinkCold = micros();
        			unsigned long intervalCold = newBlinkCold - lastBlinkCold;
        			lastPulseCold = millis();
        
        			flowCold = (60000000.0 / intervalCold) / ppl;
        			lastBlinkCold = newBlinkCold;
        
        			Serial.print("flowCold");
        			Serial.println(flowCold);
        		  }
        		}
        
        	  }
        
        	  int readingHot = digitalRead(HOT_WATER_SENSOR_DIGITAL_PIN);
        	  // If the switch changed, due to noise or pressing:
        	  if (readingHot != lastSensorStateHot) {
        		// reset the debouncing timer
        		lastDebounceTimeHot = millis();
        	  }
        	  if ((millis() - lastDebounceTimeHot) > debounceDelayHot) {
        		// whatever the reading is at, it's been there for longer
        		// than the debounce delay, so take it as the actual current state:
        
        		// if the button state has changed:
        		if (readingHot != sensorStateHot) {
        		  sensorStateHot = readingHot;
        
        		  // only toggle the LED if the new button state is HIGH
        		  if (sensorStateHot == 0) {
        			pulseCountHot++;
        
        			unsigned long newBlinkHot = micros();
        			unsigned long intervalHot = newBlinkHot - lastBlinkHot;
        			lastPulseHot = millis();
        
        			flowHot = (60000000.0 / intervalHot) / ppl;
        			lastBlinkHot = newBlinkHot;
        
        			Serial.print("flowHot");
        			Serial.println(flowHot);
        		  }
        		}
        
        	  }
        
        	  currentTimeCold = millis();
        	  currentTimeHot = millis();
        	  // No Pulse count in 2min reset flow
        	  if (currentTimeCold - lastPulseCold > 120000) {
        		flowCold = 0;
        		if (flowCold != oldflowCold) {
        		  gw.send(flowMsgCold.set(flowCold, 2));                   // Send flow value to gw
        		  oldflowCold = flowCold;
        		  Serial.println("flowCold Reset");
        		}
        	  }
        	  // No Pulse count in 2min reset flow
        	  if (currentTimeHot - lastPulseHot > 120000) {
        		flowHot = 0;
        		if (flowHot != oldflowHot) {
        		  gw.send(flowMsgHot.set(flowHot, 2));                   // Send flow value to gw
        		  oldflowHot = flowHot;
        		  Serial.println("flowHot Reset");
        		}
        
        	  }
        	  // Only send values at a maximum frequency
        	  if ((currentTimeCold - lastSendCold > 1000 * SEND_FREQUENCY) || (currentTimeHot - lastSendHot > 1000 * SEND_FREQUENCY)) {
        
        		// Pulse count has changed
        		if (pulseCountCold != oldPulseCountCold) {
        		  gw.send(pcMsgCold.set(pulseCountCold));                  // Send  volumevalue to gw VAR1
        
        		  // gw.sendVariable(CHILD_ID_COLD_WATER, V_VAR1, pulseCountCold);                  // Send  volumevalue to gw VAR1
        		  double volumeCold = ((double)pulseCountCold / ((double)PULSE_FACTOR));
        		  oldPulseCountCold = pulseCountCold;
        		  Serial.print("PulseCold count:");
        		  Serial.println(pulseCountCold);
        		  if (volumeCold != oldvolumeCold) {
        			gw.send(volumeMsgCold.set(volumeCold, 3));
        			// gw.sendVariable(CHILD_ID_COLD_WATER, V_VOLUME, volumeCold, 3);               // Send volume value to gw
        			Serial.print("m3Cold:");
        			Serial.println(volumeCold, 3);
        			oldvolumeCold = volumeCold;
        		  }
        		  if (flowCold != oldflowCold) {
        			gw.send(flowMsgCold.set(flowCold, 2));
        			//gw.sendVariable(CHILD_ID_COLD_WATER, V_FLOW, flowCold, 2);                   // Send flow value to gw
        
        			Serial.print("l/min Cold:");
        			Serial.println(flowCold);
        			oldflowCold = flowCold;
        		  }
        		  lastSendCold = currentTimeCold;
        		}
        
        		// Pulse count has changed
        		if (pulseCountHot != oldPulseCountHot) {
        		  gw.send(pcMsgHot.set(pulseCountHot));                  // Send  volumevalue to gw VAR1
        
        		  //gw.sendVariable(CHILD_ID_HOT_WATER, V_VAR1, pulseCountHot);                  // Send  volumevalue to gw VAR1
        		  double volumeHot = ((double)pulseCountHot / ((double)PULSE_FACTOR));
        		  oldPulseCountHot = pulseCountHot;
        		  Serial.print("PulseHot count:");
        		  Serial.println(pulseCountHot);
        		  if (volumeHot != oldvolumeHot) {
        			gw.send(volumeMsgHot.set(volumeHot, 3));
        			//gw.sendVariable(CHILD_ID_HOT_WATER, V_VOLUME, volumeHot, 3);               // Send volume value to gw
        			Serial.print("m3Hot:");
        			Serial.println(volumeHot, 3);
        			oldvolumeHot = volumeHot;
        		  }
        		  if (flowHot != oldflowHot) {
        			gw.send(flowMsgHot.set(flowHot, 2));
        			//gw.sendVariable(CHILD_ID_HOT_WATER, V_FLOW, flowHot, 2);                   // Send flow value to gw
        
        			Serial.print("l/min Hot:");
        			Serial.println(flowHot);
        			oldflowHot = flowHot;
        		  }
        		  lastSendHot = currentTimeHot;
        		}
        
        
        
        	  }
        
        
        	  lastSensorStateCold = readingCold;
        	  lastSensorStateHot = readingHot;
        
        
        	  boolean tripped = digitalRead(WATER_LEAK_SENSOR_DIGITAL_PIN) == LOW;
        	  if (tripped != oldtripped) {
        		Serial.println(tripped);
        		gw.send(msg.set(tripped?"1":"0")); // Send tripped value to gw
        
        		//gw.sendVariable(CHILD_ID_WATER_LEAK, V_TRIPPED, tripped?"1":"0");  // Send tripped value to gw
        		oldtripped = tripped;
        	  }
        
        
        
        	}
        

        or this, can't remember which is final one

        	#include <SPI.h>
        	#include <MySensor.h>
        
        	#define RADIO_ID 2
        
        	#define WATER_LEAK_SENSOR_DIGITAL_PIN 6
        	#define HOT_WATER_SENSOR_DIGITAL_PIN 4
        	#define COLD_WATER_SENSOR_DIGITAL_PIN 3
        	#define PULSE_FACTOR 1000                       // Nummber of blinks per m3 of your meter (One rotation/liter)
        	#define CHILD_ID_HOT_WATER 5
        	#define CHILD_ID_COLD_WATER 4                   // Id of the sensor child
        	#define CHILD_ID_WATER_LEAK 2
        	unsigned long SEND_FREQUENCY = 20;              // Minimum time between send (in seconds). We don't want to spam the gateway.
        
        	MySensor gw;
        
        	double ppl = ((double)PULSE_FACTOR) / 1000;      // Pulses per liter
        
        	volatile unsigned long pulseCountHot = 0;
        	volatile unsigned long pulseCountCold = 0;
        	volatile unsigned long lastBlinkHot = 0;
        	volatile unsigned long lastBlinkCold = 0;
        	volatile double flowHot = 0;
        	volatile double flowCold = 0;
        	unsigned long oldPulseCountHot = 0;
        	unsigned long oldPulseCountCold = 0;
        	unsigned long newBlinkHot = 0;
        	unsigned long newBlinkCold = 0;
        	double oldflowHot = 0;
        	double oldflowCold = 0;
        	double oldtripped = 0;
        	double volumeHot;
        	double volumeCold;
        	double oldvolumeHot;
        	double oldvolumeCold;
        	unsigned long lastSendHot;
        	unsigned long lastSendCold;
        	unsigned long lastPulseHot;
        	unsigned long lastPulseCold;
        	unsigned long currentTimeHot;
        	unsigned long currentTimeCold;
        	boolean pcReceivedHot = false;
        	boolean pcReceivedCold = false;
        	int readingCold;
        	int readingHot;
        
        	int lastSensorStateHot = 1;   // the previous reading from the input pin
        	int sensorStateHot;             // the current reading from the input pin
        	long lastDebounceTimeHot = 0;  // the last time the output pin was toggled
        	long debounceDelayHot = 50;    // the debounce time; increase if the output flickers
        
        	int lastSensorStateCold = 1;   // the previous reading from the input pin
        	int sensorStateCold;             // the current reading from the input pin
        	long lastDebounceTimeCold = 0;  // the last time the output pin was toggled
        	long debounceDelayCold = 50;    // the debounce time; increase if the output flickers
        
        	boolean metric;
        	MyMessage flowMsgHot(CHILD_ID_HOT_WATER, V_FLOW);
        	MyMessage volumeMsgHot(CHILD_ID_HOT_WATER, V_VOLUME);
        	MyMessage pcMsgHot(CHILD_ID_HOT_WATER, V_VAR1);
        
        	MyMessage flowMsgCold(CHILD_ID_COLD_WATER, V_FLOW);
        	MyMessage volumeMsgCold(CHILD_ID_COLD_WATER, V_VOLUME);
        	MyMessage pcMsgCold(CHILD_ID_COLD_WATER, V_VAR1);
        
        	MyMessage msg(CHILD_ID_WATER_LEAK, V_TRIPPED);
        	void setup() {
        
        	  gw.begin(incomingMessage, RADIO_ID);
        		delay(90);
        	  // Send the sketch version information to the gateway and Controller
        	  gw.sendSketchInfo("Water Meter", "1.0");
        		delay(90);
        	  // Register this device as Waterflow sensor
        	  gw.present(CHILD_ID_COLD_WATER, S_WATER);
        		delay(90);
        	  gw.present(CHILD_ID_HOT_WATER, S_WATER);
        		delay(90);
        	  gw.present(CHILD_ID_WATER_LEAK, S_MOTION);
        		delay(90);
        	  // Fetch last known pulse count value from gw
        	  gw.request(CHILD_ID_COLD_WATER, V_VAR1);
        	 
        	  gw.request(CHILD_ID_HOT_WATER, V_VAR1);
        		
        	  lastSendCold  = millis();
        	  lastSendHot = millis();
        
        	  pinMode(COLD_WATER_SENSOR_DIGITAL_PIN, INPUT);
        	  pinMode(HOT_WATER_SENSOR_DIGITAL_PIN, INPUT);
        
        	}
        
        	void incomingMessage(const MyMessage &message) {
        
        	  if (message.type == V_VAR1 && message.sensor == 4 && pcReceivedCold == false) {
        		pulseCountCold = oldPulseCountCold = message.getLong();
        		Serial.print("Received last pulse count from gw for sensor:");
        		Serial.print(message.sensor);
        		Serial.print(" pulseCountCold ");
        		Serial.println(pulseCountCold);
        		pcReceivedCold = true;
        		delay(100);
        		gw.request(CHILD_ID_HOT_WATER, V_VAR1);
        	  }
        	  else if (message.type == V_VAR1 && message.sensor == 5 && pcReceivedHot == false) {
        		pulseCountHot = oldPulseCountHot = message.getLong();
        		Serial.print("Received last pulse count from gw for sensor:");
        		Serial.print(message.sensor);
        		Serial.print(" pulseCountHot ");
        		Serial.println(pulseCountHot);
        		pcReceivedHot = true;
        		delay(100);
        		gw.request(CHILD_ID_COLD_WATER, V_VAR1);
        	  }
        	}
        
        	void loop() {
        	  gw.process();
        
        	  currentTimeCold = millis();
        	  bool sendTimeCold = currentTimeCold - lastSendCold > 1000 * SEND_FREQUENCY;
        	 
        	  if (pcReceivedCold)  {
        	  
        	  readingCold = digitalRead(COLD_WATER_SENSOR_DIGITAL_PIN);
        	  // If the switch changed, due to noise or pressing:
        	  if (readingCold != lastSensorStateCold) {
        		// reset the debouncing timer
        		lastDebounceTimeCold = millis();
        	  }
        	  if ((millis() - lastDebounceTimeCold) > debounceDelayCold) {
        		// whatever the reading is at, it's been there for longer
        		// than the debounce delay, so take it as the actual current state:
        
        		// if the button state has changed:
        		if (readingCold != sensorStateCold) {
        		  sensorStateCold = readingCold;
        
        		  // only toggle the LED if the new button state is HIGH
        		  if (sensorStateCold == 0) {
        			pulseCountCold++;
        		Serial.print(" pulseCountCold ");
        		Serial.println(pulseCountCold);
        			unsigned long newBlinkCold = micros();
        			unsigned long intervalCold = newBlinkCold - lastBlinkCold;
        			lastPulseCold = millis();
        
        			flowCold = (60000000.0 / intervalCold) / ppl;
        			lastBlinkCold = newBlinkCold;
        
        			Serial.print("flowCold");
        			Serial.println(flowCold);
        		  }
        		}
        
        	  }
        	  }else if (sendTimeCold) {
        	   // No count received. Try requesting it again
        		gw.request(CHILD_ID_COLD_WATER, V_VAR1);
        	  }
        	  
        	  currentTimeHot = millis();  
        	  bool sendTimeHot = currentTimeHot - lastSendHot > 1000 * SEND_FREQUENCY;
        	  
        	if (pcReceivedHot)  {
        	  readingHot = digitalRead(HOT_WATER_SENSOR_DIGITAL_PIN);
        	  // If the switch changed, due to noise or pressing:
        	  if (readingHot != lastSensorStateHot) {
        		// reset the debouncing timer
        		lastDebounceTimeHot = millis();
        	  }
        	  if ((millis() - lastDebounceTimeHot) > debounceDelayHot) {
        		// whatever the reading is at, it's been there for longer
        		// than the debounce delay, so take it as the actual current state:
        
        		// if the button state has changed:
        		if (readingHot != sensorStateHot) {
        		  sensorStateHot = readingHot;
        
        		  // only toggle the LED if the new button state is HIGH
        		  if (sensorStateHot == 0) {
        			pulseCountHot++;
        		Serial.print(" pulseCountHot ");
        		Serial.println(pulseCountHot);
        			unsigned long newBlinkHot = micros();
        			unsigned long intervalHot = newBlinkHot - lastBlinkHot;
        			lastPulseHot = millis();
        
        			flowHot = (60000000.0 / intervalHot) / ppl;
        			lastBlinkHot = newBlinkHot;
        
        			Serial.print("flowHot");
        			Serial.println(flowHot);
        		  }
        		}
        
        	  }
        	  }else if (currentTimeHot) {
        	   // No count received. Try requesting it again
        		gw.request(CHILD_ID_HOT_WATER, V_VAR1);
        	  }
        	  
        		// Only send values at a maximum frequency
        	  if (pcReceivedCold && sendTimeCold)  {
        
        		// No Pulse count in 2min reset flow
        	  if (currentTimeCold - lastPulseCold > 120000) {
        		flowCold = 0;
        		if (flowCold != oldflowCold) {
        		  gw.send(flowMsgCold.set(flowCold, 2));                   // Send flow value to gw
        		  oldflowCold = flowCold;
        		  Serial.println("flowCold Reset");
        		}
        	  }
        		// Pulse count has changed
        		if (pulseCountCold != oldPulseCountCold) {
        		  gw.send(pcMsgCold.set(pulseCountCold));                  // Send  volumevalue to gw VAR1
        		  double volumeCold = ((double)pulseCountCold / ((double)PULSE_FACTOR));
        		  oldPulseCountCold = pulseCountCold;
        		  Serial.print("PulseCold count:");
        		  Serial.println(pulseCountCold);
        		  if (volumeCold != oldvolumeCold) {
        			gw.send(volumeMsgCold.set(volumeCold, 3));
        			Serial.print("m3Cold:");
        			Serial.println(volumeCold, 3);
        			oldvolumeCold = volumeCold;
        		  }
        		  if (flowCold != oldflowCold) {
        			gw.send(flowMsgCold.set(flowCold, 2));
        			Serial.print("l/min Cold:");
        			Serial.println(flowCold);
        			oldflowCold = flowCold;
        		  }
        		  lastSendCold = currentTimeCold;
        		}  
        	  }
        		
        	if  (pcReceivedHot && sendTimeHot) {	
        
        	  // No Pulse count in 2min reset flow
        	  if (currentTimeHot - lastPulseHot > 120000) {
        		flowHot = 0;
        		if (flowHot != oldflowHot) {
        		  gw.send(flowMsgHot.set(flowHot, 2));                   // Send flow value to gw
        		  oldflowHot = flowHot;
        		  Serial.println("flowHot Reset");
        		}
        	  }
        		// Pulse count has changed
        		if (pulseCountHot != oldPulseCountHot) {
        		  gw.send(pcMsgHot.set(pulseCountHot));                  // Send  volumevalue to gw VAR1
        		  double volumeHot = ((double)pulseCountHot / ((double)PULSE_FACTOR));
        		  oldPulseCountHot = pulseCountHot;
        		  Serial.print("PulseHot count:");
        		  Serial.println(pulseCountHot);
        		  if (volumeHot != oldvolumeHot) {
        			gw.send(volumeMsgHot.set(volumeHot, 3));
        			Serial.print("m3Hot:");
        			Serial.println(volumeHot, 3);
        			oldvolumeHot = volumeHot;
        		  }
        		  if (flowHot != oldflowHot) {
        			gw.send(flowMsgHot.set(flowHot, 2));
        			Serial.print("l/min Hot:");
        			Serial.println(flowHot);
        			oldflowHot = flowHot;
        		  }
        		  lastSendHot = currentTimeHot;
        		}
        
        	  }
        
        	  lastSensorStateCold = readingCold;
        	  lastSensorStateHot = readingHot;
        
        	  boolean tripped = digitalRead(WATER_LEAK_SENSOR_DIGITAL_PIN) == LOW;
        	  if (tripped != oldtripped) {
        		Serial.println(tripped);
        		gw.send(msg.set(tripped?"1":"0")); 
        		oldtripped = tripped;
        	  }
        
        
        
        	}
        
        1 Reply Last reply
        0
        • A Offline
          A Offline
          andriej
          wrote on last edited by
          #4

          I've tried both codes and I've also wrote mine...
          I just basically don't know why gateway (domoticz) sees only ONE water sensor and don't even create/see the second one.

          I don't know what could be wrong with the code, as it compiles and is exactly doubled for two of water-types (cold/hot).
          I've even added motion sensor for test and it works...

            gw.present(COLD_CHILD_ID, S_WATER); 
            gw.present(WARM_CHILD_ID, S_WATER);
          

          Warm one didn't show up in Domoticz even once...

          :-)

          1 Reply Last reply
          0
          • rvendrameR Offline
            rvendrameR Offline
            rvendrame
            Hero Member
            wrote on last edited by
            #5

            Did you try to put a delay (sleep) between each gw.present? Maybe the controller is busy processing the first gw.present while the second gets in?

            Home Assistant / Vera Plus UI7
            ESP8266 GW + mySensors 2.3.2
            Alexa / Google Home

            1 Reply Last reply
            0
            • A Offline
              A Offline
              andriej
              wrote on last edited by
              #6

              I did.
              I've even managed to run two instances of MySensors (just gw. and gw2) - I've switched hot/cold to seperate nodes on one Nano, they register in Domoticz but no water meter at all (even cold).

              :-)

              1 Reply Last reply
              0
              • A Offline
                A Offline
                andriej
                wrote on last edited by
                #7

                Well, I've cleared EEProm, changed nanos, fixed new IDs much higher than ever manually and eventually after few minutes Domoticz sent readings to node so now it have 2 pulsemeters on 2 node ID's.

                :-)

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


                23

                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