NeedToDIY
Published

The water cooling system that you don't need!

This water cooling system can take water from you water well, and so much more.

IntermediateFull instructions provided20 hours149
The water cooling system that you don't need!

Things used in this project

Hardware components

3 way valve 12VDC
Used to modify the hydraulic circuit.
×1
FLOW METER YF-S401
Used to measure flow speed and total water used.
×1
Arduino Nano R3
Arduino Nano R3
In this project I used a close but is not that relevant btw
×1
water block lga1155
×1
52MM 10W Water Level Float Switch
Used to detect the high level of the water
×1
DS18B20 Programmable Resolution 1-Wire Digital Thermometer
Maxim Integrated DS18B20 Programmable Resolution 1-Wire Digital Thermometer
Used on PCB but also the waterproof version on the water tank
×1
200mm Water Level Float Switch
Used to detect low water level
×1
12VDC water pump
Cheap 12vdc water pump
×1

Story

Read more

Schematics

Prototype board schematic.

This prototype board was driving the EVs, acquiring signals and transmit serial data to pc, the design is quite basic, feedbacks are welcome.

Code

Hybrid_cooling_09.ino

C/C++
This code was running inside the Arduino nano to manage the water flow according to the temperature and to transmit to the PC data about temperatures and water flow.
#include <OneWire.h>
#include <DallasTemperature.h>
volatile int count = 0;
unsigned long Old_flowmeter;
bool EV_1_STATE = 1;
bool EV_2_STATE = 1;
bool Pump_STATE = 1;
int Pump_Power = 255;
int Mode = 3; // 1 closed loop | 2 open loop | 3 Hybrid loop
int Hybrid_phase = 0;
float flux = 0 ;
float freq = 0; // frequency generate by the flow meter
float CL_Water_measured = 0;// water measured while to closed loop mode was in use
float OP_Water_measured = 0;// water measured while to open loop mode was in use
float ToCPU_water = 0;
float FromCPU_water = 0;
float AmbientTemp = 0;
float Max_water_temp = 45.00;
int flow_ms= 1000; //ms to sample flow measurement
int Water_LOWLVL=0;// zero is low level
int Water_HIGHLVL=0;// 1 is high level
bool tachstate = 0;
int Tachometer = 6;
unsigned long Millis=0;
unsigned long Serial_ms = 5000;
unsigned long old_serial = 0;
unsigned long old_tach=0;
unsigned long levelhigh = 0;
bool flag = 1;
#define ONE_WIRE_BUS A2
#define TEMPERATURE_PRECISION 9

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress AmbientTempADR = { 0x28, 0x61, 0x64, 0x08, 0xEE, 0x79, 0x3C, 0xD2 };
DeviceAddress FromCPUADR = { 0x28, 0xFF, 0x64, 0x18, 0x2D, 0xBD, 0x94, 0x1D };
DeviceAddress ToCPUADR   = { 0x28, 0xFF, 0x64, 0x18, 0x22, 0x47, 0x22, 0xD3 };
void pulse();
void setup() 
  {
  Serial.begin(9600);
  pinMode(2,INPUT);
  pinMode(5,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(A6,INPUT);
  pinMode(A7,INPUT);
  pinMode(Tachometer,OUTPUT);
 
  attachInterrupt(digitalPinToInterrupt(2), pulse, RISING);
  sensors.begin();
 
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");
  sensors.requestTemperatures();
  Serial.print("Timestamp");Serial.print(",");Serial.print("Water_HIGHLVL");Serial.print(","); Serial.print("Water_LOWLVL");Serial.print(",");Serial.print("ToCPU_water");Serial.print(",");Serial.print("FromCPU_water");Serial.print(",");Serial.print("AmbientTemp");Serial.print(",");Serial.print("CL_Water_measured");Serial.print(",");Serial.print("OP_Water_measured");Serial.print(",");Serial.print("flux");Serial.print("\n");
  
  }

void loop() 
{  Millis=millis();
   IO_update();
   Flowmeter();
   analog_to_digital();
   generate_tach();
   Serial_print();
  
   switch (Mode) {
    case 1:// closed loop both valves are OFF and the pump is always ON
     EV_1_STATE = 0;
     EV_2_STATE = 0;
     Pump_STATE = 1;
     Serial.print("mode 1");
      break;
      
    case 2: // closed loop both valves are ON and the pump is always OFF
      EV_1_STATE = 1;
      EV_2_STATE = 1;
      Pump_STATE = 0;
      break;
      
    case 3:
         if(Hybrid_phase==0)//closed loop
         {
         EV_1_STATE = 0;
         EV_2_STATE = 0;
         Pump_STATE = 1;
         
         }
         
         if((ToCPU_water>Max_water_temp)&&(Hybrid_phase==0)&&(ToCPU_water!=85))// empty the tank until low level triggers
         {
         EV_1_STATE = 1;
         EV_2_STATE = 0;
         Pump_STATE = 1;
         Hybrid_phase=1;
         
         }

         if((Hybrid_phase==1)&&(Water_LOWLVL==1)) // filling the tank until low high triggers
         {
         EV_1_STATE = 0;
         EV_2_STATE = 1;
         Pump_STATE = 0;
         Hybrid_phase=2;
         
         }

         if((Hybrid_phase==2)&&(Water_HIGHLVL==1)) // filling the tank until low high triggers
         {
         Hybrid_phase=0; 
         }

       
        
         
      break;
      
    default:
      Mode = 1;
      Serial.println("Invalid mode mode set to 1(closed loop)");
      break;
  }


  

   
   


}

void pulse() 
  {
  count++;
  }

void analog_to_digital() 
{
 
  if(analogRead(A6)>500)
  {
  Water_LOWLVL=1;
  }
  else
  {
  Water_LOWLVL=0;
  }
 
  if(analogRead(A7)>500)
  {
  Water_HIGHLVL=0;
  }
  else
  {
  Water_HIGHLVL=1;
  }

}

void Flowmeter() 
  {  
    if ((millis() - Old_flowmeter) > flow_ms) 
    {
    Old_flowmeter = millis();
    freq = (float)count / ((float)1000/flow_ms);
    flux = (freq*((float)1000/flow_ms)) /98.0f ;
    
    //Depending on the state of the EV1 I add the measured flow to the open loop water of closed loop.
    if (EV_2_STATE)
    {
    OP_Water_measured += flux;  
    }
    else
    {
    CL_Water_measured += flux;  
    }
    count = 0;



  
  }
 } 

void IO_update()
{
  
  if(Pump_STATE)
  {
  analogWrite(5,Pump_Power);
  } 
  else
  {
  digitalWrite(5,LOW);  
  } 
digitalWrite(7,EV_2_STATE);
digitalWrite(9,EV_1_STATE);


}

void Serial_print()
{
if (Millis-old_serial>=Serial_ms)
   {
      old_serial=millis(); 
  /* Serial.print("Water_HIGHLVL ");Serial.println(Water_HIGHLVL);
   Serial.print("Water_LOWLVL ");Serial.println(Water_LOWLVL);
   Serial.print("ToCPU_water");Serial.println(ToCPU_water);
   Serial.print("FromCPU_water ");Serial.println(FromCPU_water);
   Serial.print("AmbientTemp ");Serial.println(AmbientTemp);
   Serial.print("Total Closed loop water : ");Serial.print(CL_Water_measured);
   Serial.print("Total Open loop water : ");Serial.print(OP_Water_measured);
   Serial.print("\tflux: ");Serial.print(flux);Serial.println(" l/min ");*/

  
   Serial.print(",");Serial.print(Water_HIGHLVL);Serial.print(","); Serial.print(Water_LOWLVL);Serial.print(",");Serial.print(ToCPU_water);Serial.print(",");Serial.print(FromCPU_water);Serial.print(",");Serial.print(AmbientTemp);Serial.print(",");Serial.print(CL_Water_measured/60);Serial.print(",");Serial.print(OP_Water_measured/60);Serial.print(",");Serial.print(flux);Serial.print("\n");

   sensors.requestTemperatures();
   ToCPU_water=sensors.getTempC(ToCPUADR);
   FromCPU_water=sensors.getTempC(FromCPUADR);
   AmbientTemp=sensors.getTempC(AmbientTempADR);
  
   if(Water_HIGHLVL)
   {
   digitalWrite(7,LOW);
   digitalWrite(9,HIGH); 
   analogWrite(5,Pump_Power);
   delay (4000);
   }
 
    
   }
}

void generate_tach()
{
if (Millis-old_tach>=7)
   {
   tachstate=!tachstate;
   digitalWrite(Tachometer,tachstate);
   old_tach=Millis;
   }
}

Credits

NeedToDIY
3 projects • 3 followers
Contact

Comments

Please log in or sign up to comment.