NCD1Relay + Particle + Momentary Function


#1

Hi,

I got the a NCD1Relay + Particle and have been using the cloudcontrol code with some modification to the momentary part:

if(command.equalsIgnoreCase("momentary")){
	relayController.turnOffRelay();
	Particle.publish("Status", "OpeningFor10Min");
	commandEntered = "OpeningFor10Min";
	delay(600000);
	relayController.turnOnRelay();
	commandEntered = "ClosingAfter10Min";
	Particle.publish("Status", "ClosingAfter10Min");
	return 1;

This is not ideal as it causes the Photon go offline during this time. Is there a cleaner way to do this? I need it to turn off or on for 10 Minutes when a function is called. Any help greatly appreciated.


#2

Hi,
First thing I would try is something like this:
1- when the momentary command is received, you set a global flag
2- this flag is then catched by the loop() function and you delay(600000) there
3- I would make sure my firmware has this line:
SYSTEM_THREAD(ENABLED);

Second thing I would try (it builds on top of the first one):
I would change previous step 2 so instead of using a delay it would use a timer to turn off the relay.
This will guarantee the processor does not lose wifi connection I believe.

Good luck
Gustavo.


#3

To add to Gustavo’s comments, a safer substitute to your Delay() is this line:
for (uint32_t ms = millis(); millis() - ms < 600000; Particle.process());

The Photon won’t do much else during the 10 minutes, but it will stay online and be able to process a “Stop” Function, etc, over the Cloud.
( +1 to using SYSTEM_THREAD(ENABLED); ).

OR:
If you ever want to turn the Relay ON for a given amount of time, You could also try the Momentary Class seen Here
relayController.momentaryRelay(1, RunTimeSecs*1000);
That would automatically turn ON the Relay for the selected RunTime with no delays required, (the opposite of your use-case)

I use this scenario a lot with the NCD relays:

// Pass RunTimeSecs through a Particle Function over the Cloud
  relayController.turnOnRelay(1);   // Relay ON
  previousMillis = millis();        //  previousMillis is a Global unsigned long
  while (  (millis() - previousMillis)  < (  (RunTimeSecs * 1000) - 2000)   )    {   // a "Safe Delay"
  // This will Exit the While Loop() 2 seconds before the Pump Stops- so you can measure the pump's operating pressure, final Amps, etc
    Particle.process();
  }
  // Measure Operating Pressure, etc, here- before turning the Relay OFF. 
 relayController.turnOffRelay(1);   // Relay OFF

#4

Thanks @rfontaine @gusgonnet this worked perfectly .