Water control project

From Wiki2

little app to communicate between browser/app and microcontroller to run a small waterfall

We have two little ponds in the yard fed by the rainwater from the roof. They are at the base of a big outcropping of roxbury pudding stone. Water is pumped from the lower pond to the upper pond and from the upper pond up the side of the ledge.

There is an app, "cascada" that starts the pumps and energizes the circuits to turn on the waterfall and control the level of the lower pond.

If it hasn't rained in a while, over time water evaporates and leaks out. The level of the pond is controlled using a $10 lawn sprinkler valve to inject water into the pond when the falls below a certain level. Water gets added while the pumps are on until it reaches the max level then it goes off. If you turn on the pumps again it doesn't continue filling but waits to inject water til the water falls to the low water sensor.

The water level control is independent of the pond timer, is located in its own circuit box on the porch and is activated whenever the waterfall is on.

The other circuit is connected to the house ethernet and contains a server, relays and timers to turn the system on and off. Its microcontroller is connected to an Enc28j60 chip that implements a server capable of delivering GET string variables to the microcontroller.

The app is written in HTML5/javascript, resides on http://cascada.sitebuilt.net and uses $.get to send a string to a php script on the that server which transfers it by curl to the external Enc28j60 server located in the house. It does this via a http://www.noip.com/ since the home network's IP can change. It tells the controller which circuit it wants on and for how long. more info casc {"user":"tim","token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidGltIn0.LmoK1Nr8uA4hrGr25L2AlKXs6U832Z_lE6JGznHJfFs"}
back to electronics projects in process

Your apikey for stuff2get is: Ricuhiqozarulerofekuqepa

controlling the water level

water-control_circuit.JPG

comparators - LM324N quad op amp
flip flop - 74HC74AP dual D flip flop pin-out

The water level sensors are just thermostat wire. When immersed the resistance decreases to about 50K. Each sensor goes to a comparator. Comparators work in this setup by outputing LO if the minus input is a lower voltage than the +input and HI if the + input is higher.

For the bottom sensor, the -input was hard wired with an even voltage divider that gave it 1/2 VCC. The +input had an uneven divider of 47K to VCC and 57K to GND when the sensor was out of water. More of the voltage dropped across the 57K than the 47K so the +input was higher than the -input and the output was HI. Submerging the sensor put approx 50K in parallel with the 57K so then the equiv resistance wasless than 47K so the -input is at a higher voltage and wins. The hi water sensor had a similar comparison.

The low level comparator goes HI when out of water and the high water sensor goes HI when immersed. The output of the low level comparator goes to the D input and the output of the high level comparator drives the clock. When the D flip flop output Q is HI the pump goes on.


D-flipflop74HC74AP_truth.PNG

how the flip flop works

The flip flop was setup with pre set to HI. Then, whenever a clock pulse goes HI, whatever is on the D input gets transferred to 'memory' and shows up on the Q output, EXCEPT, if pre goes LO, it forces Q HI no matter what.

water-control_TRUTH.JPG

how this circuit works

loop

set is always HI
The bottom sensor comparator(out1) is wired to the D and through a NOT gate to reset. out1 is HI when dry and reset is LO forcing !Q HI which only happens when the water level is below the low sensor. The HI turns the pump on.
rising water
Once the water reaches the lower sensor and forces it LO that LO on D just hangs there waiting to be transferred by a rising clock pulse. That doesn't happen until the water rises sufficiently so the high sensor is immersed. Then it sends a rising pulse to the clock which puts what's on the D input on the Q output. In this case that is a LO. So the output goes LO and the pump goes off.
falling water
When the water falls below the high limit it goes LO, sending a falling pulse into clk which doesn't change Q. So the pump stays off until it falls past the lower sensor. LOOP

loop


revision

After using for awhile I decide to change the function a bit.

As designed, when the switch was thrown to run the circulation pumps if the state of things was between high and low water then D saw a LO & pre saw HI, and Clk saw a LO. When you flipped the switch that state caused the pump to come on, ie be HI. I decided I didn't like that, I'd be filling the pond when I didn't really need to and end up wasting water.

So I had to change what happened on power up. If I could force a rising pulse on the clock I could drive it HI and since the lower sensor was LO it would transfer that LO from D to Q and keep the water relay off. Putting a capacitor between ground and the -input of the upper sensor comparator drove that pin to ground when the power came on (as the capacitor momentarily looked like a short) which sent a rising pulse to the CLK which transferred the LO on D to Q turning off the pump. When the capacitor charged then the -input went back to winning the comparison and sent the CLK LO which as we know has no effect on the Q output.

the app

Normally, the server serves up the webpages by loading the html and javascript to the client browser/app and responding to user input sent up from the client browser/app. A server running on a microcontroller can do that for very small and simple apps. Even loading images and script resources from somewhere else, microcontroller servers could quickly run out of memory and choke.

system design with microcontrollers

version2 -pi

gpio
     import RPi.GPIO as GPIO
     GPIO.setmode(GPIO.BCM)
     GPIO.setup(int(pin), GPIO.OUT)
     GPIO.output(int(pin), 1)

pi can't drive a relay like the arduino can so it needs this

NPN Relay Switch Circuit

A typical relay switch circuit has the coil driven by a NPN transistor switch, TR1 as shown depending on the input voltage level. When the Base voltage of the transistor is zero (or negative), the transistor is cut-off and acts as an open switch. In this condition no Collector current flows and the relay coil is de-energised because being current devices, if no current flows into the Base, then no current will flow through the relay coil.

If a large enough positive current is now driven into the Base to saturate the NPN transistor, the current flowing from Base to Emitter (B to E) controls the larger relay coil current flowing through the transistor from the Collector to Emitter.

For most bipolar switching transistors, the amount of relay coil current flowing into the Collector would be somewhere between 50 to 800 times that of the required Base current to drive the transistor into saturation. The current gain, or beta value ( β ) of the general purpose BC109 shown is typically about 290 at 2mA (Datasheet).

NPN Relay Switch Circuit

switch1.gif


Note that the relay coil is not only an electromagnet but it is also an inductor. When power is applied to the coil due to the switching action of the transistor, a maximum current will flow as a result of the DC resistance of the coil as defined by Ohms Law, (I = V/R). Some of this electrical energy is stored within the relay coil’s magnetic field.

When the transistor switches “OFF”, the current flowing through the relay coil decreases and the magnetic field collapses. However the stored energy within the magnetic field has to go some where and a reverse voltage is developed across the coil as it tries to maintain the current in the relay coil. This action produces a high voltage spike across the relays coil that can damage the switching NPN transistor if allowed to build up.

So in order to prevent damage to the semiconductor transistor, a “flywheel diode”, also known as a freewheeling diode, is connected across the relay coil. This flywheel diode clamps the reverse voltage across the coil to about 0.7V dissipating the stored energy and protecting the switching transistor. Flywheel diodes are only applicable when the supply is a polarized DC voltage. An AC coil requires a different protection method, and for this an RC snubber circuit is used.

version1 -arduino

microSERVER <- CURLonLAMPserver <-> CLIENTbrowser/app

Creating and interacting with the user interface happens from a regular LAMPserver which communicates with the microSERVER with some simple string (GET or JSON). But since the microSERVER is on a home network that likely has a dynamic IP that might change anytime then you need to go through http://www.noip.com/

microSERVER <- no-ip.com <- CURLonLAMPserver <-> CLIENTbrowser/app

This application needs to switch on the chosen waterfall for a user-determined amount of time. The relays and the timers reside on the microSERVER. ?status=ON&relay=0&til=1 would turn ON relay 0 for 1 minute. Relay 0 is the waterfall.

The server can also run and time two other relays. They are connected to other water valves in the yard. If you wanted to programmatically control a system to water your garden, for instance you could use the same microSERVER unchanged. The application would do all the calculations on which days and times the sprinklers should come on and just send a string to the microserver at the appropriate intervals.

the microcontroller code

The microcontroller endlessly loops. Each time it checks whether new packets have arrived and whether timers have expired. If they have, their relays are turned off. <syntaxhighlight lang='cpp'> void loop() {

 word len = ether.packetReceive();
 word pos = ether.packetLoop(len);
if (millis() > timer[0]) {
  digitalWrite(repin[0], reoff[0]);
} 
 if (millis() > timer[1]) {
  digitalWrite(repin[1], reoff[1]);
} 
 if (millis() > timer[2]) {
  digitalWrite(repin[2], reoff[2]);
} 

</syntaxhighlight>

If a packet has arrived then the get string is read using the ether.findKeyVal() function of ethercard library. First it reads which 'relay' is to be controlled and then if it is to be turned ON then ether.findKeyVal() grabs the 'til' value. <syntaxhighlight lang="cpp">

 if(pos) {
   char* data = (char *) Ethernet::buffer + pos;
   Serial.println(data); 
   ether.findKeyVal(data + 6, rel , sizeof rel , "relay");
   byte rela = atoi(rel);   
   Serial.println(rel); 
   if(strstr(data, "GET /?status=ON") != 0) {
     ether.findKeyVal(data + 6, til , sizeof til , "til");

</syntaxhighlight>

code on LAMP server

Nothing much to this. The get string produced by the app and sent by jQuery is forwarded to the microcontroller by CURL via no-ip.com. <syntaxhighlight lang="javascript"> from casc.js:

  $.get("../../services/curl.php", { status: state, relay: "0",til: til } );

from curl.php:

  $data = $_SERVER['QUERY_STRING'];
  //http://cascada.sitebuilt.net/services/curl.php?status=ON&relay=0&til=1                           
  $ch = curl_init('sitebuilt.no-ip.biz/?'.$data);                              
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");  

</syntaxhighlight>

development log

cascada 2.0

but actually the board has errors, my mind has errors

The bottom sensor comparator(out1) is wired to the D and through a NOT gate to set. out1 is HI when dry and set is LO forcing !Q HI which only happens when the water level is below the low sensor. The HI turns the pump on.

if reset is always HI (proposed pcb hack)

when completely dry, out1 HI D2 ON

set would be LO D would be HI(doesn't matter) CLK would be LO, !Q wouldand pump would be ON

once low sensor is covered out1 LO D2 OFF, (pump should stay ON)

set would be HI, rest HI, D would be LO, CLK would be LO, no change !Q stays LO so ON (now reset is actually LO oops)

once water reaches upper sensor ^ D3 ON

set would be HI, reset HI, CLK ^ so D LO would be Q so !Q would be HI and pum would go OFF

once water falls below upper sensor | D3 OFF

set would be HI, reset HI, CLK | so D LO(doesn't matter) no change !Q stays HI so OFF

once water falls below lower sensor out1 HI

set would be LO, reset HI, D would be HI(doesn't matter) CLK would be LO, !Q would and pump would be ON

What happens when power comes on with the pond partly filled??? (pump off would be good)

once low sensor is covered out1 LO D2 OFF, upper sensor uncovered out7 LO, Clk LO

set would be HI, rest HI, D would be LO, CLK would be LO, no change from ???

you would like Q to be LO (!Q HI, pump OFF)

since D would be LO, if LO could be forced on Q, !Q would be hi and the pump would stay off. That could happen if we could get clock to issue a rising pulse.

The only time clock issues a rising pulse is when j2 shorts or its resistance is lower than 5.1M. or when the voltage on pin 5 is greater than the voltage on 6. How can you make that happen for a minute?? charge a capacitor somewhere, maybe inline with some resistor. which one??

you could short out r8 5.1M Once the cap is charged it would look open and back to just the 5.1. But at first it would(oops no current path to ground)

with no current flowing through the 5.1, the voltage on pin6- should be 5v (it is 3.6 vs 2.5 on pin5-) so - wins . + could win if the upper r6 was temporarily shorted

redesign ideas

circuit, pcboard, microcontroller program, server and client understanding-24vac-sprinkler-valves

Redesign to eliminate powering normally closed valves for garden watering. So only one valve near porch for pond, another in center of garden, maybe another facing out from the porch or in kitchen garden. Each will need 24vac to power the valve and 5vdc to p0wer the relay and microcontroller. In the same cable?

If you start with four insulated wires, the + and- for one signal and the + and - for another signal, and run them parallel to each other in that order and as close as possible (so insulation touching) , then youi have a ribbon cable and a signal on any of them couples inductively and capacitively to all of the others. If you then twist the two signal pairs together you have very littel effect on the capacitive properties between the wires in a pair since theystay pretty much the same distance from each other. You will reduce the capacitance between wires in different pairs, but probably not by more than a factor of two or so. However, you greatly reduce the inductive coupling, particularly if the twist pitch is different between the two pairs, because whatever is induced by one loop of the twist is largely cancelled out by another. https://forum.allaboutcircuits.com/threads/why-does-twisting-two-wires-create-capacitance.83777/

To reduce power in transformer, power it on whenever (or right before) any microcontroller wants to be on. How? Maybe use the pond microcontroller to act on mqtt commands to activate the (120v side of the )24v relay when any of the devices is calling. Then, an additional relay will be needed to activate the pond (on the 24 side)

tests

op amp tests

  1. connect power to opamp
  2. ground the inputs output should be zero
  3. + to 5v, output should be 5
  4. - to 5v, output should be 0
  5. jumper 1 shorted -> D1 led should go out (brings pin 3+ to zero so 2- wins(out1 goes lo))
  6. jumper 2 shorted -> D3 led should come on (bring pin 6- to ground so pin 5+ wins(out7 goes hi))

not gate test

  1. jumper 1 open, out1 hi -> not gate 2,3in hi 1out low and visa versa

D flip flop tests

  • 4 - set = !out1
  • 2 - data = out1
  • 3 - clock = out7
  • 1 - reset =
  • 5 - Q1
  • 6 - !Q1


D flip flop truth table

set clk data out
L x x H
H x x L


suggested tests

  1. check the 8 input nor gate to see if having th signal on A(2) and all the other 7 grounded give a not signal on X(13) with vcc(14) and ground(7)
  2. test an op amp and its voltage dividers on the bottom and top pond sensors to see if the output is right
  3. test relays
  4. test a transistor circuit to see if the collector is hi when its conducting (seems not)

refs

voltage drop

So power will run to the location of sprinkler in 18 gauge thermostat cable, voltage drop for 24vac at 1.8 amp for 100 ft is 2.3v volts 10% is OK.

for a 5 volt in that same wire drawin .3A over 100 ft, the voltage drop is .38V (7.6%


cascada 0.2 - http://10.0.1.186/?status=ON&relay=0&til=60 pond

next:

alanesq.com uses findKeyVal <syntaxhighlight lang="cpp">

 if(pos) {
   char* data = (char *) Ethernet::buffer + pos;
 Serial.println(data);    
 if(strstr(data, "GET /?status=ON") != 0) {
   ether.findKeyVal(data + 6, til , sizeof til , "til");
   Serial.print("Will stay on for ");
   Serial.print(til);
   Serial.println( " minutes.\n");
   int until = atoi(til);
   //Serial.println(until);    
   timer = millis() + until*60000;

... </syntaxhighlight>

cascada 0.1 - Enc28j60, timer

  • simple timer
    • setup
    • loop
      turn of ligth after 5 seconds

<syntaxhighlight lang="cpp"> ...

 pinMode(RELAY_PIN, OUTPUT);
 digitalWrite(RELAY_PIN, HIGH);  
 timer = millis() + 5000;

} void loop() {

   if (millis() > timer) {
     digitalWrite(RELAY_PIN, false);
   } 		

} </syntaxhighlight>

cascada 0

Click the button pump goes on in pond.

  • send '1' to arduino, to tun on relay
  • send '0' to arduino to turn off device

Arduino-Ethernet-Shield-Tutorial

version 1

todo

Pick up my phone, go to a web site, have there be a series of buttons on, off, 10, 20, 30, 60.

The idea was to automatically control the level of the pond by using a (cheap) lawn sprinkler relay to inject water into the pond when it falls below a critical level. Water gets added while the pumps are on until it reaches the max level then it goes off. If you turn on the pumps again it doesn't continue filling but waits to inject water til the water falls to the low water sensor.

The buttons could be from a client side jquery-mobile page. Timing would seem suited to the server. Server would send an on message and start a timer. After the time elapsed it would send an off message. Client would poll server to see what the status is and the time remaining.

Basic control is working in an outdoor circuit box mounted on the bridge next to the lawn sprinkler relay.