Project showcase

SCADA Control of a Water Pumping Station © GPL3+

A demo SCADA control system to operate and monitor a pumping water station.

  • 1 comment
  • 10 respects

Components and supplies

Apps and online services

About this project

This is a helpful student project that teaches theory and application by applying all the courses learned especially the ones that are about Instrumentation, Process Application, Digital and Analog Electronics, and computer programming.

Delivery of the potable water requires little to no pumping, as the water is gravity fed from the large storage tank. But how it can be controlled and monitored?


The project team selected Supervisory Control and Data Acquisition (SCADA) based pumping water station which is designed to collect field information, transfer it to central computer facility, and display real time operational data to the operator graphically or textually. SCADA can turn devices on or off remotely.

SCADA systems are designed to collect field information, transfer it to a central computer facility, and display the information to the operator graphically or textually, thereby allowing the operator to monitor or control an entire system from a central location in real time.

SCADA can:

  • turn devices on or off
  • display real time operational data
  • provide equipment-wide to system-wide views of operation
  • trend data, and alarms
  • SCADA systems consist of both hardware and software.

The project team used the latest technology and components for the main instrumentation and control courses studied to develop this project.

The Process Model

To achieve our aim which is a SCADA system, we had to build a process model (prototype) according to a drawing made by "VISIO" software:

Using three tanks, three pumps, and four valves, the actual model is as follows:

Install one ultrasonic sensor under each cover of the three tanks, thus, the water level in each tank can be measured.

All device wiring in the field gathered to one area. We called it "Central Control Room."

Until now, we have just been preparing our station. In the next part we will see how the control system was implemented.

Hardware Components of a SCADA System

1. RTU (Remote Terminal Unit)

We used an Arduino board. All field equipment is connected to it. It is a representative of a standalone data acquisition and control unit, which monitors and controls equipment in the field. Besides that, the Arduino is connected to a tablet for local control in the field.

2. Communication (transmission system)

Communication hardware allows the transfer of information and data back and forth between the MTU (Master Terminal Unit) and the RTU. The APC220 radio module provides a simple and economic solution to wireless data communications. It integrates an embedded high speed microprocessor and high performance IC that creates a transparent interface. We connect it to the local tablet to transfer information to the MTU.

Here is how to configure it with Windows.

3. MTU (Master Terminal Unit)

We used a Touch-Screen computer placed in a central location with an operator as our MTU. It collects and logs information gathered by the field sites, displays information to the HMI (Human Machine Interface), and may generate action based upon detected events. The operator is able to make set point changes on the distant process.

The general communication flow is as follows:

Software Components OR (Human Machine Interface)

We integrated between C# on the desktop and C++ on the Arduino via USB.

Our strategy here is to build a C++ program to run on the Arduino for the purpose of taking the three Ultrasonic sensor inputs and send them via USB. At the same time, it must listen to the port for any incoming command, such as, turn on the pump.

The desktop program made in C# to work as HMI gives the user control over the plant. We used Microsoft Blend to design the graphical interface and Microsoft Visual Studio for writing the actual code.

There are two directions the plant can work in:

1. Forward, where water travels from the Main tank to the City tank,

2. Backwards, where water comes back from the City tank to the Main tank.

As a result, we have to write the C# code to control these two paths.


wiring diagram


Using Arduino platform
#define trig1 44
#define echo1 45
#define trig2 38
#define echo2 39
#define trig3 30
#define echo3 31

#define led1 2  //pump 1
#define led2 3  //pump 2
#define led3 4  //pump 3
#define led4 5
#define led5 6  //valve 1
#define led6 7  //valve 2
#define led7 8  //valve 3
#define led8 9  //valve 4

String d1,d2,d3;

long duration;
int distance;
char r;

void setup()

pinMode(trig1, OUTPUT);
  pinMode(echo1, INPUT);

  pinMode(trig2, OUTPUT);
  pinMode(echo2, INPUT);

  pinMode(trig3, OUTPUT);
  pinMode(echo3, INPUT);
	pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
 pinMode(led4, OUTPUT);
 pinMode(led5, OUTPUT);
 pinMode(led6, OUTPUT);
 pinMode(led7, OUTPUT);
 pinMode(led8, OUTPUT);

void loop()
// ultra 1
  digitalWrite(trig1, LOW);

  digitalWrite(trig1, HIGH);
  digitalWrite(trig1, LOW);

  duration = pulseIn(echo1, HIGH);
  distance = duration / 58;
  d1 = String(distance);

 // ultra 2
 digitalWrite(trig2, LOW);

  digitalWrite(trig2, HIGH);
  digitalWrite(trig2, LOW);

  duration = pulseIn(echo2, HIGH);
  distance = duration / 58;
  d2 = String(distance);

  // ultra 3
 digitalWrite(trig3, LOW);

  digitalWrite(trig3, HIGH);
  digitalWrite(trig3, LOW);

  duration = pulseIn(echo3, HIGH);
  distance = duration / 58;
  d3 = String(distance);

 // mySerial.println(d1+',' + d2+',' + d3);
  Serial.println(d1+',' + d2+',' + d3);
   digitalWrite(led1, HIGH);
   digitalWrite(led1, LOW);
   digitalWrite(led2, HIGH);
   digitalWrite(led2, LOW);
   digitalWrite(led3, HIGH);
   digitalWrite(led3, LOW);

   digitalWrite(led5, HIGH);
   digitalWrite(led5, LOW);
   digitalWrite(led6, HIGH);
   digitalWrite(led6, LOW);
   digitalWrite(led7, HIGH);
   digitalWrite(led7, LOW);
   digitalWrite(led8, HIGH);
   digitalWrite(led8, LOW);


It is important to note that this code in C# is just how we read and analyze the reading from serial port. NOT the whole program code
private void MyPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            in_data = myPort.ReadLine();
            Dispatcher.Invoke(() =>
                char[] separator = {','};
                string[] splitarray;
                in_data = in_data.Trim();
                splitarray = in_data.Split(separator);
              // mailServer();

                    tank1.currentValue = Convert.ToInt32(splitarray[0]);
                    tank2.currentValue = Convert.ToInt32(splitarray[1]);
                    tank3.currentValue = Convert.ToInt32(splitarray[2]);


               // myPort.WriteLine(i);


Similar projects you might like

Plant Communicator

Project tutorial by Arduino

  • 5 respects

The Nerd

Project tutorial by Arduino

  • 1 comment
  • 1 respect

LED Matrix Display Badge

Project tutorial by FabLabAQ

  • 3 respects

PICASO 4.0 The Infinite X- Axis CNC Wall Engraver

Project tutorial by Arnab Kumar Das

  • 1 comment
  • 2 respects

Object Tracker and Updater

by Rupin Chheda

  • 1 comment
  • 2 respects

Temperature Control

Project tutorial by reteprelleum

  • 1 comment
  • 10 respects
Add projectSign up / Login