Uploaded by Saif Uz Zaman

499B-final-report

advertisement
Declaration
This is to proclaim that this report on the implemented hardware project is self-contained for
the purpose of submission as a part of the Senior Design course (EEE/ETE 499) in Fall 2018 at
North South University and has not been utilized anywhere else for other reasons. All the sources
used for the purpose of the report has been mentioned with references in the bibliography
section. Any similarities, in phrasing and diction, if found to other existing papers, which has not
been cited, is a subject of pure coincidence.
.........................................................
Kazi Rafiu Ibn Matin
ECE Department
North South University, Bangladesh
.........................................................
Tasnuba Afrin Anika
ECE Department
North South University, Bangladesh
.........................................................
Saif Uz Zaman
ECE Department
North South University, Bangladesh
Approval
We, Tasnuba Afrin Anika(1321193645), Kazi Rafiu Ibn Matin(1330538043), and Saif Uz
Zaman(1410757642) members of EEE499/ETE499 Senior Design Project from the Electrical and
Computer Engineering department of North South University seek great pleasure to have worked on our
project titled as “Smart Water Monitoring System for Fisheries” under the supervision of Dr.
Mohammed Shazzad Hosain as a compulsory requirement to complete our degree of Bachelors of
Science in Engineering and it turned out to be with satisfactory outcome.
Supervisor’s signature
…………………………………………………………….
Md. Shazzad Hosain, PhD
Associate Professor and Chair
Department of Electrical and Computer Engineering
North South University
Acknowledgement
Firstly, we are grateful to Allah, for the good health and wellbeing that was needed to have completed
our project and paper with such success. We, as a team express our gratitude towards our supervisor,
Dr. M Shazzad Hosain for his tremendous support and guidance throughout the whole term of our
project. We are extremely thankful and indebted to him for sharing his expertise and encouragement
that was extended towards us. We would also like to take this opportunity to thank our university, North
South University and our department, Electrical and Computer Engineering for all the support provided
to us. We consider ourselves blessed and humbled to have worked within this territory.
Lastly, we are also very appreciative to all the other people who somehow helped and contributed in the
completion of this project.
Abstract
This report represents the novel design of a water condition monitoring device. Such devices can
be used to scan and observe the water qualities for various purposes from fisheries to agriculture
and other various industrial scale applications where monitoring water condition is necessary. A
leading company that manufactures such products is Libelium. The devices produced by
Libelium can be a bit on the expensive side, ranging from $999 to even greater amounts
depending on the kit. The purpose of such water monitoring device can be met at a low cost,
using simple designs and cheaper materials, which was the motivation towards the device that
was built in this project. The device can greatly benefit fishing economy of Bangladesh, since it
has the world’s largest delta and is mostly low marshy lands where many fish farms reside. If the
conditions of the fisheries are monitored by using the device and measures are taken to control
such conditions, it can greatly improve the fish production yield, since most Bangladeshi
fisheries don’t use any devices to monitor the water. Although Bangladesh is one of the largest
freshwater fish exporters in the world, a lot of freshwater fish in farms are known to die out due
to the poor water conditions and quality assurance. The device has a 10V Solarpanel that charges
a rechargeable battery which delivers the required power to the Arduino to function the sensors.
The readings can be received on a handheld device via Bluetooth and also alert the user for
harmful changes in water conditions which will be very convenient for the operators of various
fisheries.
Table of Content:
Name of the topics
Page Numbers
Chapter 1: Introduction
1.1-Project overview
Pg 8
1.2-Background and Motivation
Pg 9
1.3-Difficulties faced during the project Pg 10
1.4- Project Goal
Pg 10-11
Chapter 2: Related works
Pg 11-28
Chapter 3: Ethics, Safety & Standardization
Pg 28-37
Chapter 4: Theory I
4.1- Introduction
Pg 38
4.2-List of Components in the project
Pg 39-46
Chapter 5: Theory II
5.1-Introduction
Pg 48
5.2- Working principle
Pg 48
5.3- General Sensor Module
Connection
Pg 49
5.4-Battery and Solar Panel
Pg 49-50
5.5-Analog Dissolved Oxygen Sensor
Pg 51-52
5.6- Analog meter, pH, Salinity meter
Pg 52-54
5.7- Digital temperature sensor and
Pg 55
alarm
5.8- LCD display and Bluetooth module
connection
5.9- Android Application
Pg 56
Pg 57
5.10- Finished device and LCD reading
Pg 57 -59
Chapter 6: Results and Observation
6.1- Requirement Analysis
Pg 60-63
6.2- Real life test results
Pg 64
Chapter 7: Future Works
7.1- Introduction
Pg 65
7.2- More Sensors
Pg 65
7.3- Microcontrollers and Ports
Pg 66
7.4-Improved sensors
Pg 66
7.5- Improved batteries & solar panel
Pg 66
7.6- Upgraded Android app
Pg 67
7.7- Actuators
Pg 67
7.8- Waterproof device
Pg 68
7.9- Conclusion
Pg 69
Appendix
Pg 70-96
References
Pg 97
Table of Figures
Figure 2.1
Marker shows the latest measurement data
Figure 2.2
Power Source Block Diagram
Figure 2.3
System architecture based on WSN
Figure 2.4
Outline of the scope of work undertaken in
the design of the SmartCoast platform.
(MAC, National Microelectronics
Applications Centre; NCSR, National Centre
for Sensor Research.)
Figure 2.5
Sensor local area network. (DO, dissolved
oxygen; GPRS, general packet radio service;
MAC, National Microelectronics
Applications Centre.)
Figure 4.1,4.2,4.3, 4.4, 4.5, 4.6, 4.7, 4.8,4.9,
Block diagram, Arduino UNO, Solar Panel,
4.10, 4.11,4.12
ORP, DO sensor, Analog Turbidity Sensor,
Analog pH sensor, Analog Electrical
Conductivity Sensor, Temperature Sensor,
Bluetooth Module(HC-05), LCD
screen(20x4), Wooden frame and box, Buzzer
Alarm for arduino
Figure 5.1, 5.2, 5.3, 5.4, 5.5. 5.6, 5.7, 5.8, 5.9,
A general connection of the sensor module to
5.10, 5.11. 5.12
the arduino,The connection of the complete
device, Batteries connection, connection from
batteries,The module for the DO sensor,the
process of adding the solution to the
probe,ORP reducing and oxidizing agent,pH
characteristics,Codes for alarm
condition,Circuit diagram of LCD and BT
Chapter 1: Introduction
1.1- Project Overview:
Bangladesh has one of the largest export business in fisheries. There are different
research institutes, projects and farming guides whose sole purpose it to enlarge the
market more. Our project is about maintaining the water quality so that the growth of
fisheries can increase in Bangladesh and the mortal rate of fisheries decreases. Water
quality is the most important factor affecting fish health and performance in
aquaculture production systems. Good water quality refers to what the fish wants and
not what the farmer thinks the fish wants. This means that farmers must understand the
water quality requirements of the fish under culture very well. Fish lives and they are
entirely dependent on the water they live in, for all their needs.
Different fish species have different and specific range of water quality aspects
(temperature, pH, oxygen concentration, salinity, hardness, etc.) within which they can
survive, grow and reproduce. Each species has its own optimum range and different
build-up so it is necessary to maintain a basic chemical and physical condition of the
water for the fish to live long.
Our project proposes a smart monitoring system for the ponds, lakes etc. to monitor
elements such as temperature, pH level, dissolved oxygen (DO), oxidation-reduction
potential (ORP), conductivity (salinity), turbidity in water. Our solution will comprise of a
hardware attached to each individual water body, and the readings will be constantly
monitored through a software- android app. The data will also be stored as a back-up
and for further use. There will also be an alarm and an LCD display to monitor the result
and alert people working with it.To a great extent water determines the success or failure
of an aquaculture operation. Our device will help identify the problem in right time so
that proper measures can be taken to prevent death of fish in the water.
1.2- Background and Motivation:
To explain the background of our project we have to emphasis on the history of Bangladesh’s
history on agriculture of fisheries. Bangladesh being a first line littoral state of the Indian Ocean
has a very good source of marine resources in the Bay of Bengal. The country has an exclusive
economic zone of 41,000 square miles (110,000 km2), which is 73% of the country's land area.
More than 80 percent of the animal protein in the Bangladeshi diet comes from fish. Fish
accounted for 6 percent of GDP in the fiscal year of 1970, nearly 50 percent more than modern
industrial manufacturing at that time. From the very beginning Bangladesh has always been into
fish farming and aquaculture production.
As of the end of 1987, prevailing methods for culturing shrimp in Bangladesh were still relatively
unsophisticated, and average yields per hectare were low. In the late 1980s, almost all inland
shrimping was done by capture rather than by intensive aquaculture. Farmers relied primarily
on wild post larval and juvenile shrimp as their sources of stock, acquired either by trapping in
ponds during tidal water exchange or by gathering from local estuaries and stocking directly in
the ponds. Despite the seemingly low level of technology applied to shrimp aquaculture, it
became an increasingly important part of the frozen seafood industry in the mid-1980s. The
shrimp farming industry in Bangladesh has been handicapped by low-quality and low prices.
We also explored the current situation of Bangladesh’s market of fisheries. Bangladesh is
considered one of the most suitable regions for fisheries in the world, with the world's largest
flooded wetland and the third largest aquatic biodiversity in Asia after China and India. There
has been tremendous growth on the agriculture of fisheries in Bangladesh. This increase in the
aquaculture production has been made possible with the implementation of scientific and
technological modernization. From 2000 and 2016, aquaculture production increased from
712,640 and 2,060,408 metric tons, a much larger quantity than wild capture production (1.023
million t) in 2016. There has also been a recent increase in the value of fishery exports, with
more than US $34.08 billion in 2010 rising to more than US $46.60 billion in 2015. However,
fisheries production is well below production targets despite the large gains seen in the
aquaculture sector. This is because every year lots of fish dies due to poor water quality and lack
of balanced conditions of water. This was our main motivation to take on this project and work
out something to contribute in this vast arena and try to make a better survival rate for
fisheries. We also explored other similar projects that were done in other countries which also
helped us to work and improvise our project to make it fit for Bangladesh.
1.3- Difficulties faced during the project:
One of the few difficulties that we faced in this project was most of the components were not
available in Bangladesh and so we had to import them from outside the country. This took a lot
of time and also created trouble for us. Another factor which was more like a challenge to us
was to make the device budget friendly so that people in Bangladesh can afford it who are in
need of it. Our device is cost efficient and hence easier for purchase. One of the other problem
that triggered was insufficient amount of NaOH available which is limestone and it was needed
to activate the Dissolved Oxygen component but then we took help from our university labs and
was successful to work with it.
1.4- Project Goal:
The goal of this project was to make a cost-effective device that would help fisheries or pond
owners to monitor the various conditions that affects the life of fish. If people can identify it at
the right time, then they would be able to rectify the conditions that distresses the mortality
rate of fish. The smart monitoring system device helps the operators so that they can take
actions accordingly for proper fish health and eventually increase the production or yield of fish.
This would also be a huge contribution in the betterment of Bangladesh agriculture for fish.
Chapter 2- Related works:
a. Water Quality Monitoring System by Hao Jie Chan
In September 2016, a water treatment plant has to be shut down because polluted water
flowed into the plant. The water supply company was unable to pin point the contamination
source and this caused a serious water service disruption.
My university course requires the students to build a system to solve community problems. An
automated water quality monitoring system would ease the job of finding the pollution source!
4 sensors are interfaced to Arduino Genuino 101. All of them requires some interfacing circuit
because they are current-output sensors. Arduino Genuino 101 collects the measurements data
periodically, gets the GPS coordinates, and uploads the data bundle into a database using GPRS
data link. Users can go to the website to view the result as shown below.
Fig 2.1: Marker shows the latest measurement data
The three current output sensors are from Global Water, provided by the supervising lecturer. I
use temperature, pH and dissolved oxygen level sensors in this project. Unfortunately, the
dissolved oxygen level sensor is faulty.
The other sensor is a turbidity sensor, which output a voltage level proportional to the amount
of suspended solid particles in the water.
A schematic diagram of the Interfacing Sensors and Arduino is given below-
This A7 GPRS and GPS module module was chosen because it was relatively cheaper than
SIM900 variant, and it combined both GPRS and GPS in a single package. However, the cheaper
price did come with a price. First, the GPS antenna that comes with the module is not really a
GPS antenna, you will have to buy one yourself to cover up this flaw. Second, it only supports
115200 bps UART communication by default, and even if you change it using software, it will
return to the default baud rate after a power cycle, and Software Serial at 115200 bps is very
very unreliable. I pulled my hairs for 2 days for this problem. After that a baud was
implemented to rate change function in the Arduino code.
And, since this is a new module, creation of its own library was needed. The source codes
are collected from various places, like SIM900, and Adafruit GPS module.
A circuit has to be designed to switch on the module. It has two pins, RESET pin and PWR_KEY
pin to be controlled. A voltage is applied to the PWR_KEY for at least 2s to boot up the module.
To reset, pull the RESET pin to GND. Otherwise, the RESET pin should be pulled up to 5V. I first
reset the module, and then proceed to power up the module to make sure it starts up okay.
Power source deserves a special mention her because of the current output sensors. They
require a minimum of 10V to operate, higher than the preferred 5V. Since it was necessary to
demonstrate the capability of this system to work remotely, Li-Ion battery was opted here.
Fig2.2: Power Source Block Diagram
2 Li-Ion batteries in series will give 7.4-8.4V, one buck converter to bring it down to the
necessary 5V for Arduino and A7 module, another boost converter to provide a 11V power rail
for those water sensors. With this setup, the system will not run for a long time, but that is not
a main concern for this prototype.
b. MyRiver project by Andrei Florian
A river or lake can be a great source of fun and relaxation. But if the river becomes dirty
and contaminated, all the fun is gone. Many people depend on river water to feed their
livestock and cannot afford to give their animals dirty water.
Imagine living right next to a river (if you are not), you would not want to wake up in the
middle of the night with your house flooded because of the river. Or what if your
neighbour decides to dump some petrol in the river, you would not want your animals
getting sick.
MyRiver solves all of those problems, it can operate in isolated areas thanks to Sigfox so
that everyone has access to the device. The device will read the pH of the water, its
pollution level using an innovative method, and its water level. You will be able to monitor
the river live on your phone or computer anywhere thanks to Wia. This way you can know
if there is a problem with the stream and allows you to act before it is too late. It will notify
you if there is a problem with the river immediately.
The device is based on the Arduino MKR FOX, it is designed for remote use, the user can place
the device in a river or lake and monitor it from anywhere. Thanks to the SAM D's low power
mode, the device can work for an extended period of time on 2AA batteries.
The device takes readings every 30 minutes, going to sleep afterwards, the sleeping period can
be reset, though the minimum sleep time must be 20 minutes.
The MKR FOX reads the pH of the river using a pH sensor, it also gets its water level, using a
water level sensor, and it senses if it is polluted by insoluble substances by shining an LED at a
photoresistor, if the photoresistor reading is low, it means that a solid substance (oil, petrol,
mercury, etc.) is present in the river. The device then sends all the data to Sigfox, where it is
relayed on to Wia, processed and visualised. The user is notified on the state of the river. Below
is an image of the functionality overview.
The buffer will be sent to Sigfox encoded as HEX, Sigfox will relay the data to Wia, the data will
then pass through a flow, the data will be converted back to string and then into the sensor
values. They will then be processed and the user will be notified if the values are out of bounds.
Below is another image illustrating the project's code overview, described below.
Read Sensors will read the pH, water level and photoresistor sensor values and store them in
variables.
Format Buffer will merge all the values into a 12 Byte buffer that can be sent to Sigfox. Parse
Data will parse the buffer to Sigfox. The MKR FOX can only send 12 bytes through Sigfox, this
means that all the sensor values have to be merged into the 12 bytes, each sensor's maximum
raw value is 1024 (as they are all analog), so each sensor represents one third of the buffer (4
bytes). The Arduino has to merge the values and add zeros to the start of each value until the
value has 4 bytes. The image below illustrates this process.
The Arduino receives the sensor values as integers, it then converts the integers into strings and
adds zeros to the start of each value until it has 4 bytes, for example, if the photo-resistor value
is 620, one zero will be added, 0620. But if the water level sensor is equal to 24, two zeros are
added, 0024. The device then merges the values together into a 12b.
c. Design and Development of Water Quality Monitoring System based on
Wireless Sensor Network in Aquaculture
System architecture based on WSN is the process to monitor water quality environment
includes data acquisition, data transmission, data preservation and decision-making, which is
involved with software and hardware comprehensive integration, so the excellent architecture
becomes the top priority to the water quality monitoring system as a composite system.
Wireless sensor network (WSN) is composed of data acquisition node, wireless transmission
network and information processing center. Data acquisition nodes integrate sensors, data
processing module and communication module. Through the communication protocol, the
nodes form a distributed network. Then the network transmits the optimization data to
information processing center. The system adopts Zigbee based on IEEE 802.15.4
communication protocol. Zigbee is a wireless intercommunication technique that has low
transmitting rate and low cost advantages. It can be embed in devices, is particularly suitable
for industrial control, aquaculture water quality monitoring, wireless sensor networks and
smart devices such as the widely distributed applications.
Wireless network monitoring system includes the major technologies:
I.
Wireless communication technology—2.4GHz short range communication and GPRS
communication, wireless signals cover 3km range;
II.
Embed control technology—intelligent information acquisition and control;
III.
Wireless network technology—network routing layer, communication caching. Selfdiagnosis and maintenance technology;
IV.
Energy manage technology—low power consumption and energy management.
Wireless sensor networks are widely used throughout intelligent transportation,
environmental protection, public safety, peace at home, smart fire alarm, industrial
monitoring, elderly care, personal health, floriculture, food traceability, enemy
detection and intelligence gathering, and other fields
V.
Particularly in the areas of agriculture and rural information, WSN can be more widely
available, such as: precision agriculture-the precise application of sensor technology,
intelligent expert management system, remote monitoring and remote sensing systems,
bioinformatics and diagnostic systems, food safety traceability system.
Water quality monitoring system architecture applied WSN Based on WSN, the water quality
monitoring system uses three-layer structure: data acquisition layer, data transport layer and
application layer to establish its architecture.
The architecture as figure 1 shows:
Fig2.3- System architecture based on WSN
In the data acquisition layer, the water quality monitoring system uses WSN which is formed by
a large number of tiny sensor nodes through wireless self-organizing way. The sensors obtain
data in the network include PH, water level, water temperature, DO (dissolved oxygen) sensor.
WSN integrates sensor, MEMS and wireless communication technologies, can real-time
perception and handle object’s data information in network range, then send to the users. It
has many excellent characters, such as large cover range, remote monitor, high monitoring
precision, quick deployment and low cost. Through using WSN technology, the system can
effectively monitor transport data and ensure the real-time data to be transported to the water
quality monitoring software for analyzing and providing later control decisions. In the data
transport layer, there are two types of transmission methods: long-distance and short-distance
data transmission. The system uses the GPRS to transport long-distance data, and uses the
Zigbee to obtain the sensors’ monitoring data, and then utilizes application software to manage
the data and to make decisions to control devices. The real-time data through the sensors by
Zigbee stored in the database to ensure users can query any time any sensor monitoring data
information to analyze. In the application layer, the water quality monitoring software is the
main part. Through the software, users can monitor the quality of the water all the time from
the real-time data to ensure the water quality of the aquaculture. Water quality monitoring
software utilizes the expert knowledge stored in the data and knowledge database together
with the pretreatment data transported from sensors to make the decisions. Then the system
decides whether to open or close the valve on relation device to increase or decrease the
oxygen, water with the decisions. On-site users can receive early warning information from
smart handheld device and depend on the decisions to operate. In order to facilitate user
management, and data on water quality issues can occur in time to respond, the software also
uses SMS early warning function. Off-site users can receive early warning information from PDA
and other smart phones, and can send commands by SMS to control the valve on device. The
users can not only get the current water quality environmental data, but also analyze the data
in period to get the water environment trends to overall manage water quality. The system
collects temperature, PH, dissolved oxygen sensor signals by sensor module, via wireless
transport module transmit data, and combines with system software to achieve real-time
monitoring and control. The system based on users demand, can monitor the water quality
data at any time. It provides scientific evidences to automatic monitoring of water quality
information, automatic control and intelligent management.
d. SmartCoast Smart Water Quality Monitoring System
SmartCoast was a 3-year applied R&D Project, cofounded by the Marine Institute and the
Environmental Protection Agency (EPA) (Grant Aid Agreement No. AT-04-01-06), which was
aimed at developing novel sensing technologies that can continuously collect data on water
quality in lakes, rivers and estuaries and transmit this information via wireless links directly to a
computer, delivering detailed data at levels that would otherwise be difficult, if not impossible,
to achieve. In 2003, the Marine Institute commissioned a review of and feasibility study on
requirements, current developments and potential innovations in respect of sensor systems to
support the implementation of the WFD in freshwater catchments. This was carried out by TNI
and its findings included the following. Real-time sensing of water has a number of common
limitations which are distinctive of the technology. Sensor drift is one of the most serious
impairments of chemical and biochemical sensors. Despite efforts to improve long-term
stability, manufacturers have yet to release sensors that are not affected by some degree of
drift. One of the major challenges is to be able to systematically reduce the dimensionality of
the incoming data, while preserving all relevant information. So far there has been no
systematic approach to the problem of data reprocessing and analysis. It seems that the choice
of suitable output (desorption signal, baseline, transient/maximum response, etc. and analytical
protocol is often the result of trial and error, largely based on personal intuition or experience.
Unfortunately this is a time-consuming process, which requires highly skilled personnel. The
adequate validation of environmental sensing systems is rarely carried out and therefore
results are not always meaningful. The main reason for this is that validation takes too much
time and money for a single developer to bear full responsibility for the task. In practice, lack of
validation significantly hampers implementation. SmartCoast aimed to deploy its sensor
network to demonstrate to interested parties the benefits associated with continuous in-situ
monitoring.
In order to design a monitoring system of value, the SmartCoast Project established a user
group as part of its information gathering process. Initially, the project identified all relevant
public sector organisations and invited them to attend a project briefing meeting to create a
relationship between the user group and the project. The SmartCoast Project team engaged in
a series of meetings with the River Basin Districts (RBDs) in 2006 and 2007, which took the form
of briefings and discussions that allowed a two-way flow of information.
User Group Needs the following is a list of needs that were identified by users of water
monitoring systems in relation to developing an ideal monitoring system:

Innovation

Variable monitoring frequencies

A multi-sensor solution

Data integrity and presentation

Cost-effective

Real-time data collection/alarms

Portability

Scalable on demand

Reliability/Ruggedness.
Owing to SmartCoast and other related investments in environmental sensing R&D, Ireland is
well positioned relative to other countries, even the US, in terms of expertise. Therefore, there
is a real opportunity for Ireland to make critical contributions in this area. A number of
recommendations arose from discussions that took place during a SmartCoast workshop, and it
is important that these are given due consideration for future approaches to effective water
monitoring technologies, systems and programs. Those recommendations are stated below
It was recommended that partnerships should be built between academia,
agencies and end-users that will lead to long-term capability and trust in the
technology. Similarly, agencies must have a stake in the technology development
process and thus in the quality of the data.

Demonstrations Valuable reference data for research prototypes can be
obtained by using off-the-shelf commercial systems at certain test deployment
sites. The latter will also provide data for environmental systems research. It was
recommended that demonstrations must be led by the end-user.

Fundamental research needs to be continued in areas such as biological
contaminants and nutrient species.

Sustainability It is recommended that long-term funding is given to enable
further research into new technologies and effective technology transfer to small
and medium sized enterprises (SMEs). There is a need for the establishment of a
small number of reference/test sites at which there is an infrastructure to plug
devices into to enable continual development and testing of new
systems/devices.
The SmartCoast platform covers all aspects of user requirements for the viewing of sensor data
by endusers using a standard web browser as shown in Fig. 4.1.
A number of important decisions were taken early in the project that influenced the overall
system design approach taken to design the SmartCoast platform. These included:
• All communications with the sensors to be wireless (as opposed to wired or
manual display/keypad interface).
• A variety of sensors would be deployed at a monitoring site and sensors could
easily be added and removed when required, i.e. for seasonal monitoring purposes.
• The sensor nodes would be designed for ease of maintenance and deployment.
• While ‘real-time’ monitoring is not a strong requirement of the WFD, it was
agreed that alarm alerts on measurement thresholds, such as pollution alerts, would be
a critical component of the system and would add to the success of the project.
• Where possible, the design adheres to industry standards to ensure futureproof design and compatibility of the system with other possible available solutions.
An important aspect of the overall solution was the decision that each individual sensor would
have its own low-power radio capable of communicating from 75 to 100 m as an unobstructed
space using the IEEE
Fig 2.4. Outline of the scope of work undertaken in the design of the SmartCoast platform.
(MAC, National Microelectronics Applications Centre; NCSR, National Centre for Sensor
Research.)
Based on the user requirements and the choice of a wireless sensor interface, the following two
system architecture options were designed:

Local area network (‘drive-by’) for local monitoring of sensors A low-cost, lowpower sensor support network that requires manual extraction of the data from
the sensors by a handheld wireless device.

Wide area network for ‘real-time’ monitoring and control of sensors A low-cost,
low-power sensor support network that facilitates real-time monitoring of
sensors for sensor measurement, alarm alerts and fast data reporting.
Local area network (‘drive-by’) for sensor monitoring The main features of the local area
network, shown in Fig. 4.2, include

Each sensor unit shuts off ZigBee® communications to conserve power and only
wakes up periodically to check if a ‘parent’ hand-held device is present. This
period of sleep/wake-up is programmable from ‘always-on’ to once every few
minutes. The recommended period is every 60 s.

A standard off-the-shelf personal digital assistant (PDA) (such as a DELL Axim
X51) is used as the hand-held device and will have a ZigBee® radio unit
connected. It will include a standard Windows operating system with full
processing and display facilities.

A router node is used to extend the operating range of a network and also to
enable a mesh network to be formed.
Fig2.5: Sensor local area network. (DO, dissolved oxygen; GPRS, general packet radio service;
MAC, National Microelectronics Applications Centre.)

Each installation (site) network configuration is pre-programmed into the handheld device to enable ease of identification of the sensor network at this site and
ensure that all sensors located on the site are accounted for when read by the
handheld PDA.

Sensor monitoring data, alarm data and unit status are uploaded to the handheld device. It will also be possible to download new monitoring conditions to
the sensor, such as frequency of sensor monitoring, as well as real-time clock
synchronisation and wake-up frequency.

The hand-held device is capable of displaying individual sensor monitoring data
and any alarm data generated.

It is possible to download new updated software release versions to each sensor
unit from the hand-held device. This feature however will not be part of this
development.

Uploaded data files stored on the unit will have a date/time stamp of upload.

It is possible to upload the data to a remote office personal computer or server
via an optional general packet radio service (GPRS) connection to the hand-held
device or manually by simply plugging the PDA into its cradle when back in the
office and selecting the upload button.
The wide area network will provide a real-time monitoring and control facility for each sensor
network or site. To enable this to happen, a programmable access controller – gateway (PAC-G)
is used as a gateway for the sensor network to a remote (or local on-site) server. Initially, this is
a GPRS connection but other wireless options would also be possible, such as WiMax and
satellite. This network configuration is shown in Fig. 4.3.
The main features of the wide area network, shown in Fig. 4.3 include:

The PAC-G will continuously monitor the ZigBee® sensor network to ensure all
devices are operational and will log any unit not communicating.

Sensors will only communicate with the PAC-G when it has data to send or at a
pre-programmed interval, such as daily, to check if there are any parameter
monitoring changes requested, such as increased frequency of sampling. This
extended sleep time (not having to wake-up every 60 s to see if a ‘parent’ device
is there) of the sensors will assist in minimising power used on sensor units.

The network range can be expanded using a router node that will also enable
mesh networking.

The frequency at which sensors take sensor readings is remotely programmable
and will range from minutes to hours.

Sensors will immediately upload any monitoring data and the unit status to the
PAC-G.

The PAC-G first stores the data and then forwards them to a remote server via
the GPRS connection at pre-programmed intervals, e.g. once every 24 h.

Any sensor alarm data are transmitted immediately by the PAC-G to the remote
server, i.e. when a sensor measurement threshold is breached, such as a
pollution level.

All data are retained by the PAC-G until passed on to the server, so in the event
of a server failure no data are lost.

All sensor monitoring requirements and alarm thresholds can be changed
remotely.

New release versions of the application for sensor monitoring can be
downloaded remotely from a central server via the PAC-G; no data analysis is
performed by the PAC-G.
A multi-sensor water quality monitoring platform has been developed in the project. This
incorporates novel sensor interface technologies that can be reconfigured to meet the
monitoring requirements of a given scenario using a wide variety of sensor input types. The
sensor interface capabilities enabled by the developed wireless sensor network platform allow
for integration of a wide variety of commercially available sensors.
Two sensors capable of measuring phosphate and dissolved oxygen were developed by the
consortium during the project. The phosphate sensor is suitable for long-term monitoring of
phosphate levels in natural waters. The system incorporates sampling, pumping, reagent and
waste storage, colorimetric detection and wireless communication into a compact and portable
device. Currently, the system has a linear dynamic range between 0 and 20 mg/l and a limit of
detection of 0.3 mg/l. Dissolved oxygen sensor technology was developed, providing a sensor
probe that is fully waterproofed and ruggedized, incorporating a novel optical configuration,
and is capable of intermittent operation, facilitating its use in battery-powered systems. The
sensor is fully temperature compensated and utilizes three dimensional calibration equations,
which maximise accuracy. These two novel devices were tested in the demonstration phase and
while the phosphate system performed well, DO system is in need of further work to enable
long-term deployment in the aquatic environment.
Chapter 3-Ethics, safety and standardization:
Ensuring the safety of water is a challenge due the excessive sources of pollutants, most of
which are man-made. The main causes for water quality problems are over-exploitation of
natural resources. The rapid pace of industrialization and greater emphasis on agricultural
growth combined with latest advancements, agricultural fertilizers and non-enforcement of
laws have led to water pollution to a large extent. The problem is sometimes aggravated due to
the non-uniform distribution of rainfall. Individual practices also play an important role in
determining the quality of water.
Water quality is affected by both point and non-point sources of pollution, which include
sewage discharge, discharge from industries, run-off from agricultural fields and urban run-off.
Other sources of water contamination include floods and droughts and due to lack of
awareness and education among users. The need for user involvement in maintaining water
quality and looking at other aspects like hygiene, environment sanitation, storage and disposal
are critical elements to maintain the quality of water resources.
Poor water quality spreads disease, causes death and hampers socio-economic progress.
Around 5 million people die due to waterborne diseases around the world. Fertilizers and
pesticides used by farmers can be washed through the soil by rain, to end up in rivers. Industrial
waste products are also washed into rivers and lakes. Such contaminations enter the food chain
and accumulate until they reach toxic levels, eventually killing birds, fish and mammals.
Chemical factories also dispose wastes in the water. Factories use water from rivers to power
machinery or to cool down machinery. Raising the temperature of the water lowers the level of
dissolved oxygen and upsets the balance of life in the water. All the above factors make water
quality monitoring essential.
Water quality monitoring is defined as the collection of information at set locations and at
regular intervals in order to provide data which may be used to define current conditions,
establish trends, etc. Main objectives of online water quality monitoring include measurement
of critical water quality parameters such as microbial, physical and chemical properties, to
identify deviations in parameters and provide early warning identification of hazards. Also, the
monitoring system provides real time analysis of data collected and suggest suitable remedial
measures.
The aim of this paper is twofold. One is to provide a detailed survey of recent work carried out
in the area of smart water quality monitoring in terms of application, communication
technology used, types of sensors employed etc. Second, is to present a low cost, less complex
smart water quality monitoring system using a controller with inbuilt Wi-Fi module to monitor
parameters such as pH, turbidity and conductivity. The system also includes an alert facility, to
inform the user on deviation of water quality parameters.
The selection of a water-quality monitor involves four major interrelated elements—

The purpose of the data collection.

The type of installation.

The type of sensor deployed at the installation.

The specific sensors needed to satisfy the accuracy and precision requirements
of the data-quality objectives.
The most widely used water-quality sensors in monitoring installations are temperature,
specific conductance, dissolved oxygen (DO), pH, and turbidity. Sensors also are available to
measure oxidation-reduction potential, water level, depth, salinity, ammonia, nitrate, chloride,
and chlorophyll; but the focus of this report is on temperature, specific conductance, DO, pH,
and turbidity. The sensors needed to measure these properties are available as single
instruments or in various combinations. For clarity in this report, a sensor is referred to as a
particular lone sensor or a sensor that is detachable from a combination. A group of sensors
configured together commonly is referred to as a sonde, which typically has a single recording
unit or electronic data logger to record the output from the multiple sensors. Types of Monitor
Configuration In general, three types of configurations are used for water-quality monitors. The
flow-through monitoring system generally has a pump that delivers water to the sensor(s)
mounted in a shelter; the second configuration is one in which the sensors are placed in situ
(immersing a field measurement sensor directly into the water); and the third configuration is a
selfcontained sensor and recording system that requires no external power and is placed in situ.
Each configuration has advantages and disadvantages in relation to site location and dataquality objectives. The flow-through monitoring system has a pump to convey water from the
stream to a tank inside a shelter that contains the monitoring sensor or sonde (fig. 1). Typical
pumps require 120-volt alternating current (AC) and deliver about 10 gallons of water per
minute. If access to power is not a problem, then other site considerations become important;
the advantages and disadvantages of the flow-through monitoring system must be compared to
the data objectives.
The purposes of the sensor inspection are to provide an ending point for the interval of water
quality record since the last service visit, a beginning point for the next interval of water-quality
record, and verification that the sensor is working properly. This is accomplished by recording
the initial sensor readings, servicing the sensors, recording the cleaned sensor readings,
performing a calibration check of sensors by using appropriate standards, and if the readings of
the monitoring sensor are outside the range of acceptable differences (see next section,
Monitor Calibration Criteria), recalibrating the sensor. A final environmental sensor reading is
required after the calibration check or after recalibration. The difference between the initial
sensor reading and the cleaned sensor reading is the sensor error as a result of fouling; the
difference between the calibration-check reading and calibrated-sensor reading, if necessary, is
a result of drift. All information related to the sensor inspection must be recorded on a field
form or in a field notebook. The sensor readings in the field notes become the basis for
corrections (shifts) during the record-processing stage; thus, a complete and thorough
documentation of the sensor inspection is important. The initial sensor readings (before
cleaning) of the monitoring equipment are compared to a calibrated field meter before
removing the monitor sonde for servicing. The comparison ideally is made at the measuring
point in the stream. This initial sensor reading becomes the ending point of the data record
since the last servicing, and the field meter reading provides a sense of the reasonableness of
the monitor readings and an indication of potential drift and fouling. However, except for
temperature sensors, the field meter readings are not used directly in record computation. The
field meter is used as a tool to assess cross-sectional variability and environmental changes that
may occur while the monitor is being serviced. Upon removal from the water, the monitoring
sensors are inspected for signs of chemical precipitates, stains, siltation, or aquatic growth.
These observations are recorded in the field notes before cleaning, and the Monitor Operation
13 individual sensors must be cleaned according to the manufacturer’s specifications. The
cleaned sonde or sensor is then returned to the stream and checked against the field meter.
Both instrument readings are recorded in the field notes. The observed difference between the
initial sensor reading and the cleaned sensor reading is a result of fouling chemical precipitates,
stains, siltation, or aquatic growth.
The significance of water for bio-culture and aquaculture can scarcely be overstated, and hence
the pertinence of ethics to water utilization and management is clear in a general sense. It is
important for everyone involved in water resource management and in public health to have a
well-reasoned understanding of the moral values and obligations that correspond to that
significance. In the domain of ethics, questions of scientific knowledge come together with
aspects of cultural meaning and perception; questions of conservation, sanitation, and health
promotion come together with questions of justice, equity, and human rights; questions of
sustainability and biodiversity come together with questions of democratic governance, law,
and policy.
Access to clean water and adequate sanitation is a growing problem for many parts of the
world. More than one billion people are in need of clean water, and 2.6 billion lack access to
basic sanitation. Water intensive agricultural, manufacturing, and land use practices throughout
much of the world are drawing down or contaminating groundwater at an alarming rate.
Many questions confront the world today. How can we ensure that an adequate supply of clean
water is available, both for today and for coming generations? How equitable will access to it
be? How should it be managed, and by whom? What will the implications of climate change be
on the quality and quantity of fresh water? Is clean water destined to become for the twentyfirst century what petroleum was for the twentieth, a source of geopolitical power and conflict?
Will social change concerning water use come through technological innovation or through
cultural and value change, or some combination of both?
Concurrent with the ecological dimensions of the water crisis are public health dimensions,
including, but not limited to, the spread of water-borne diseases, particularly in the developing
world. Existing systems need to be modified, or new systems need to be created, so as to
achieve more just access to clean drinking water, as well as to provide for effective societal
responses to public health concerns. From a systems perspective, water is more than simply a
medium for vectors of infectious disease; it is a foundation for maintaining the social
determinants and human capacities that sustain and promote health and well-being. Water is
not so much a “resource” as it is a lynchpin in the entire web of planetary life. The focus of
ethics is therefore not on water in isolation, but on the water cycle and how the cycle connects
the land and the atmosphere. The notion of a “watershed” has this connotation, connecting
water, the soil, and the biotic community.
Water is dynamic, elusive, determined, and a fecund source for the human moral and spiritual
imagination. We talk about water as a medium of disease transmission, as a fluid essential for
biological functioning, and as a thing to be manipulated with wells, pumps, sluice gates, dams,
and dikes. When we talk about the scientific and engineering aspects of water, we should not
lose sight of the fact that water is also a vital source of cultural meaning, which not only
sustains our biological life but also our imagination and spirit. No culture or tradition known to
us is indifferent to it. It is a symbol of purification, rebirth, and reconciliation, even as it is also a
source of animosity and conflict. Water, with its close connection with fertility and life, figures
deeply in religious and metaphysical worldviews of virtually all peoples. There is a prototypically
two sided aspect to the way water is represented and imagined in most traditions.
Water is the place from which order comes, but it is itself without form. It is life nurturing and
yet unshapeable, uncontrollable at the same time. If the creator could manage it, human beings
cannot. It is protean and relentless. It floods and recedes, indifferent to human constructions
on a floodplain. It finds tiny fissures and eventually splits the hardest rock and enters the best
sealed dwellings. Its changing physical state slowly reshapes the geology of the planet as ice
sheets progress and recede, as sea levels rise, as rain falls, and as rivers find new channels.
Human things are small by comparison. We move and channel water, to be sure, and we must
use it (carefully), but effective, sustainable utilization of water is really more a form of
accommodation than a form of control. We are not always honest with ourselves about our
dependency on water, and our sheer frailty in the face of it.
Different ways of conceptualizing what water is and how human beings should use it have
different ethical implications. Understanding water supplies as commodities to be bought and
sold, and as property to be controlled unilaterally by certain individuals or groups, has different
implications for fulfilling the ethical principles (such as human rights and social and
environmental justice) than does understanding it as a fragile ecosystemic component of a
common ecosystem upon which we all depend in myriad ways. Of particular interest in the
chapter, therefore, will be the convergence between eco-systemic and public health
perspectives, on the one hand, and the appropriate ethical use of water to sustain and promote
human and eco-systemic health, on the other.
Taken together the ethical values of efficiency, equity, and stewardship can form a basis of a set
of ethical principles that can normatively guide water management and public health policy.
Additional principles of water ethics will be based on procedural and decision-making process
values, such as democratic governance rights, active participation, transparency, accountability,
and public-private collabor- ation and partnership. Implementing these ethical ideals and
obligations in practice is shaped by a number of factors: Who participates in the decisionmaking process? Is participation active and involved in formulating options or is it passive and
reactive to proposals that are already well-developed? What kind of information is open to the
public? How do professionals interact with non-professionals? Is there respect for cultural
diversity and traditional beliefs and practices? And finally, how is a balance determined
between the needs of human development and the need to preserve our natural resources?
With these ethical orientations and practical considerations in mind, we offer the following
principles of water ethics. In each case there is a meaningful application of the principle to the
relationship between humans and water and the effects of the various technologies of water
utilization (purification, sanitation, groundwater mining, agricultural irrigation, and the like).
Similar principles have been formulated by the Waters of Wisconsin Project and by UNESCO’s
International Hydrology Programme (IHP), intercultural and interdisciplinary working group on
the Ethics of the Uses of Fresh water and by the COMEST Sub-Commission on the Ethics of
Fresh Water Use.
In respect to water management in a political point of view there are two main chains of
thought on the question: should water be privatised? One believes and recognizes the “right to
water” of all citizens of a given country and their collective responsibility, so there should be a
public management of the quality of sanitary service. The other called Neoliberal view does not
recognize the so called “right to water” to citizens and see water as a commercial good and can
accept terms like the “water market”, the “water industry” or the “water business”. This view
defends that the water from rivers, lakes, and other resources are property of the State in
name of the Nation but since human intervention transforms a natural resource into a service
that requires costs and investment, it is transformed in something with economical value,
which can be traded and appropriated. This concept has been accepted in the International
Conference on Water and Development organized by the United Nation in Dublin1992. It is
based on a principal that private investment is the motor of economical and social development
and that public investment should create a favorable environment for private investment. In an
ethical approach it may seem far from the principal of equity and justice but in an economical
point of view there are no individual or collective rights inherent to human beings, just civil
rights, so each person is merely a consumer or a client. There is a difference between
ownership and management of a resource and the private sector should benefit from their
public service even though it doesn’t have the political power of decision over the natural
resource. According to this point of view liberalization can assure the equal repartition of goods
and services by total and equal access to the market, and it is more a question of efficiency of
the market that determines social equality. The problem with this mercantilist view is that it is
very profitable for the private sector and stockholders but in fact it does not provide an actual
solution for populations with no sanitary systems especially from poor and developing
countries. There is a dis-equal disperse of private investment geographically and this situation
reinforces dis-equality which can prove the failure of this kind of neoliberal model, as the
private sector has failed to success in developing countries. Private enterprises have serious
problems with financial risks and contractual risks and restrictions in developing countries
which make it non-profitable to invest in the poorest areas. Also in Europe there are problems
of equity. For example in France the prices practiced by private companies are 15 to 20% higher
than the public sector. The government has to guarantee user rights monitoring the prices and
evaluating them in connection with transport costs to irrigation and water supply, purification
costs. Data must be shared with decision makers so they give have the tools to choose the best
solutions and increase efficiency of systems of utilization of water. They need to be technically
and morally informed (user rights, transaction costs, conflicts between users – i.e.
transboundary and common waters). In order with this assumption we have to consider
different situations in the world. In many regions women are the principal managers of water
resources in the society. Especially in small villages and communities where they use it for
domestic works, they are employed in irrigation more than men. But they rarely participate in
the debate about water management and this leads back to problem of involvement and
sharing information. In that sense, safeguarding women rights, in some cases means also
optimizing the utilization of goods. International co-operation plays a fundamental role in the
management of transboundary and common waters. To evaluate the value of this argument we
have to consider that 40% of the world population lives downstream and depends from the
water flow to survive; moreover the most part of major river systems are shared by five or
more countries because of their lengthiness, and all countries depend on the one where the
flow originates. In this case dams, withdrawals to irrigate, industrial pollution, salinization,
deforestation and soil erosion can decrease the amount of water for the depending countries. It
could be a great motive of international conflicts, especially if the involved nations have military
potential. The international community tried to solve also this problem by creating a plan for
regulation of shared water. The Food and Agriculture Organization (FAO) has identified many
treaties about non-navigational waters related in the years and based on rights, needs and
efficiency. The United Nation Convention on the Non-Navigational Uses of International
Watercourses, approved in 1997, gives a leading low to share fresh waters taking in
consideration geographic, ecological, economic and ethical notions. Unquestionably the “water
framework Directive 2000 / 60/ CE”, settled on 23 October 2000 by European Parliament, is the
most representative document about water resource management. It establishes a framework
to protect and improve the quality of aquatic ecosystem and to promote sustainable water use.
It also encloses every kind of water except the sea one: - Surface water (i.e. watercourses,
lakes, etc.) - Underground water - Coastal water (i.e. water estuary, etc.) The water framework
Directive arranges four important objectives: - protecting the aquatic ecosystem: acting a
dilation of toxic polluting substances, as mercury, atrezin, plumb, nickel; recycling and using
flowing back purified waters (art. 6); prevention and restoring of natural condition in case of
disasters; - promoting cooperation between different countries about international water ports
- management: fixing common methods to preserve water healthiness; - ensure drinking water
supplies: ensuring the right quantity of water when and where it’s necessary according to
solidarity’s common sense; - optimize water as a consumer good; - recognition of
hydrographical areas, which are defined as the whole of terrestrial and sea areas, including just
one or more than one bordering basin within respective underground and sea water of a limit
zone; - monitorising a correct pricing of services related with water. The principle goal of the
Directive would be the restore of “good water condition” for any European Union State within
2015. In a second term it aims to obtain an equal distribution and destination of the resource
between all involved countries and their citizens and to ensure a correct charge of the costs on
the users and managers. Moreover, it aspires to establish a correct way to manage the different
realities of hydrographical areas.
Chapter 4: Theory I
4.1- Introduction:
The theory section discusses the important components like the sensor and their
functionalities and several applied applications are also discussed. The process of how
the components are connected and used are also described.
4.2- The List of Components used in the project:
Necessary information was collected for the design to be successful and the required hardware
was collected accordingly. Various tools were used to build the circuit and assemble the
prototype. Also measures were taken to hold and protect the assembled circuitry and hold it
safely and protect the device. In this section, all the components that were used for the
purpose of building the project prototype has been provided along with all the specifications
for the sensors that were used for this Water Monitoring Device. The components that were
used to make this project are listed below with their working protocol and description:
1. Arduino UNO- Arduino Uno is a microcontroller board supported on the
ATmega328P (datasheet). It has fourteen digital input/output pins (of that six
pins may be used as PWM outputs), and the other half dozen as analog inputs, a
sixteen MHz quartz crystal, a USB connection, a power jack, ICSP header and a
reset button. It contains everything required to support the microcontroller;
merely connect it to a laptop or a computer with a USB cable or power it with an
AC-to-DC adapter or battery to get started. The operating voltage is 5V and there
are 14 digital I/O pins, it has one LED built in and is very lightweight.
Fig 4.1: Arduino UNO
2. Solar panel: A solar panel is a gathering of solar cells together which converts
light energy into electricity. There is no need of outside source of power when
solar panel is used. Using solar panels sunlight that is free can be converted to
electricity easily. Silicon is mostly used for solar panels. Photovoltaic solar panels
absorb sunlight as a source of energy to generate electricity. A photovoltaic (PV)
module is a packaged, connected assembly of typically 6x10 photovoltaic solar
cells. Photovoltaic modules constitute the photovoltaic array of a photovoltaic
system that generates and supplies solar electricity in commercial and residential
applications. In this project we have used a 10 watt solar panel which starts to
charge from the sunlight after it reaches 12volts.This made our project selfsufficient as the device do not need outside sources of power to generate itself.
Fig 4.2: Solar Panel
3. Analog Oxidation-Reduction Potential (ORP) sensor- ORP (Oxidation
Reduction Potential) is a standard water quality parameter that is ordinarily
measured as the voltage between a platinum measuring electrode and a
reference conductor. Usually ORP is based on standard hydrogen electrode as a
reference but commercial ORP’s use AgCl. The result from the ORP sensor
measures the oxidation and reduction reactions in the sample of water. Positive
results indicate oxidizing setting and negative result indicates a reducing setting.
ORP is measured in millivolts. The ORP sensor helps to determine the cleanliness
of water and to break down the impurities in water. An ORP sensor has probes
that dips into water, the electrode is made either of platinum or gold which in a
reversed manner loses its electrons to the oxidiser. The parameter set for our
ORP sensor was less than or equal to 400mv.
Fig 4.3: Oxidation-Reduction Potential Sensor
4. Analog Dissolved Oxygen (DO) sensor- Dissolved oxygen is one of the
foremost production factor in Bangladesh in fish culture. Loss of fish because of
reduction in dissolved oxygen content of water is not uncommon in fish ponds of
Bangladesh. Low level of oxygen decrease appetite and rate of growth of fish.
Continuous exposure to low dissolved oxygen makes the fish prone to diseases.
Oxygen deficiency seems a frequent hazard issue once the intensity of fish
production gets enlarged. The dissolved oxygen sensor helps to determine the
amount of oxygen dissolved or carried in the water body. The parameter that
has been set for DO sensor is below 4.00.
Fig 4.4: Dissolved Oxygen Sensor Probe
5. Analog Turbidity Sensor-Turbidity is the measure to which extend the water
loses its clarity due to presence of deferred particulates. This unwanted
substances present in the water makes it murky and cloudy and turbidity sensor
is used to measure the degree of transparency of water. This effects the life of
fish in water greatly as less freshwater means the yield of fish would decrease,
also more amount of fish would die. This arduino based sensor detects water
quality by its active level of muddiness. It can distinguish suspended particles in
water by assessing the light transmittance and scattering rate which varies with
the amount of suspended particle in water.
Fig4.5: Analog Turbidity Senso
6. Analog pH Sensor-The analog pH sensor detects the pH level of water that is it
should be less than 7.00 more accurately around 6.00. This pH sensor has probes
to measure pH level of the water by calculating the voltage or potential
difference of the solution in which it is dipped. By measuring potential
difference, hydrogen ion concentration can be calculated using the Nernst
equation which gives the relationship between Hydrogen ion concentration and
Voltage or Potential. Since the Arduino receives only analog readings from the
sensor, the values had to be manipulated from 0- 1023 into the standard for
reading pH levels which is from 0-14.
Fig 4.6: Analog pH Sensor
7. Electrical Conductivity/Salinity Sensor: The electrical conductivity
measures the capacity of water to conduct electrical current, it is directly related
to the concentration of salts dissolved in water and hence to the total dissolved
solids. Electrical conductivity can be measured using sensors and portable
meters. The commonly used units for measuring electrical conductivity of water
are microSiemens/cm or deciSiemen/cm. The parameter that is used for the EC
sensor is 550 us/cm. The electrical conductivity of the water depends on the
water temperature: the higher the temperature, the higher the electrical
conductivity would be.
Fig4.7: Analog Electrical Conductivity Sensor
8. Temperature Sensor-The temperature sensor plays a very important role in
many applications. They have contact sensors which includes thermocouples and
thermistors that touch the object they are to measur e and noncontact sensors
measure the thermal radiation a heat source releases to determine its
temperature. These are used to measure the water temperature to determine
how hot or cold it is.
Fig 4.8: Temperature Sensor (DS18B20)
9. Bluetooth Module- The Bluetooth module that is used in the project is HC 05.
It is connected to the android app that was created later on.
Fig 4.9: Bluetooth module (HC-05)
10. One LCD monitor was also used in the device to project the results on the
screen, a buzzer was implemented which goes off when the sensors cross their
parameters in lower or higher ranges.
Fig 4.10: LCD screen 20x4, (DIS00014)
11. Three batteries each of 4.2volts were used in the device. The purpose of the
batteries are to provide power to the prototype in case other external power
supplies are not used, and to store power from the 12V solar panel.
12. Wooden framework for solar panel and box. To hold the device and its
components safely.
Fig 4.11: Wooden frame and box.
13. A buzzer was used as an alarm in case of a harmful change in water conditions.
Fig 4.12: Buzzer Alarm for Arduino.
Chapter 5: Theory II:
5.1- Introduction:
The design of the device and connections to the circuitry are discussed in this section.
The various functionalities of different components used for the prototype are discussed
and how they were assembled and put together. The overall functionality of the device,
the working principle, as well as the different configurations are discussed as well.
5.2- Working Principle:
The goal of the device is to successfully sense some important factors in water
conditions. To achieve the goal, various sensors for the appropriate measurements are
chosen. Analog sensors are chosen so that the electronic data sent to the Arduino can
from the components can be manipulated with the Arduino code according to
convenience of the user. Analog Oxidation Reduction Potential (ORP) sensor, Analog
Dissolved Oxygen (DO) sensor, Analog pH sensor, Analog Salinity/Conductivity sensor
and Analog Turbidity sensor has been connected to the analog inputs of the
ArduinoUNO (A0, A1, A2, A4, A5). A Digital temperature sensor (DS18B20) has been
used for the fact that the digital temperature sensor is more reliable and further
manipulation of input signals is not required for temperature readings. It is connected to
a digital input of the ArduinoUNO (D2). All the connections to the microcontroller are
connected according to requirements and are coded for output to the LCD display and
via the Bluetooth module. The digital connections from the LCD display are connected
from the digital PWM of the ArduinoUNO (D3, D4, D5, D6, D9, D10), and the power
supply and ground connections for the LCD display is taken from the 5V supply of the
microcontroller. The Bluetooth module (HC-05) is connected to the digital PWM for
receiving and transmission of data, and similarly the power for the module is connected
to the supply and ground of the ArduinoUNO. A buzzer has been used on the for the
alarm, which is connected to the digital PWM of the ArduinoUNO (D11). A veroboard
has been cut, to solder and assemble an extension to the 5V and GND connections of
the ArduinoUNO as every module of the sensors and other components has significant
use of it, and the ArduinoUNO does not have enough connection ports. The whole
device explained is perfectly capable transmitting data to any handheld or Bluetooth
supported device and of displaying the information of water conditions on the LCD
display.
Finally, the main power supply used for this device is a set of 3, 4.2V rechargeable
batteries which are series connected for a total of 12.6V, as the ArduinoUNO power
input is capable of handling voltages from 7-20 volts. The battery is connected to a 10W
Solar Panel which helps to charge the battery, in sunlight, making the device sustainable
and capable of fully charging the batteries for a great amount of runtime. This feature
makes the device capable of having self-sustained power, given the right conditions.
5.3- General Sensor Module Connections:
Each of the Analog sensor comes with a module which is a chip to connect the sensor to
any other microcontroller devices like the ArduinoUNO used for the prototype. Here,
the modules are designed by DFRobot, and are consisting of three significant
connections; power supply connections to the module for “+”, the GND connections for
“-” and the analog signal connections for the converted electric signals from the sensors
to be received into any microcontroller or converter device. The signals received from
the modules are usually in the range of 0 to 5 volts.
For the prototype, the “+” power supply are connected to a common node from the 5V
supply of the ArduinoUNO supply panel, which has been extended by the use of a
veroboard. Similar connections are established for the GND from ArduinoUNO to all the
GND of the sensor modules. A general circuit of the connections of the sensors to the
ArduinoUNO is shown below in Fig 5.1.
Fig 5.1: A general connection of the sensor module to the ArduinoUNO.
The actual connections are a lot more complicated, but eventually all the connections of
the modules follow to same pattern. All the analog connections are to the PWM of the
Arduino board from the modules, and connected to A0, A1, A2, A4, A5. The actual
connections are show below in Fig 5.2.
Fig 5.2: The connections of the complete device.
5.4: Battery and Solar panel:
A 10 Watts, 12V solar panel has been used which is connected to a set of three
batteries, each of which are 4.2 Volts. The batteries are rechargeable and are connected
in series to each other, and in parallel to the solar panel. The solar panel is capable of
charging the batteries under sunlight. Connecters has been used on the batteries and
the wires of the solar panel to use the connection of the battery and the solar panel
according to convenience, so a person could keep the solar panel separate from the
device when necessary. Another connector has been used to connect the battery to the
Arduino board, to provide power to the rest of the device.
Fig 5.3: Batteries connectio n.
Fig 5.4: Connectors from battery .
5.5: Analog Dissolved Oxygen (DO) Sensor:
Dissolved oxygen is one of the most important parameters for water quality. A good
water quality is very important for aquatic lives and water with greater DO is a sign of a
good water quality, and water with low DO will lead to difficulty in breathing for aquatic
lives and threaten the lives of aquatic organisms. The sensor used in the device is a
galvanic probe, the kind which usually uses a zinc or lead anode and a gold or silver
cathode and an electrolyte solution. Such sensors use 2 different types of metal and the
difference in them with the electrolyte results in an electromotive voltage. That voltage
is sent to the Arduino via the module and the information is received. The DO is
measured in milligrams per litre (mg/L).
Fig 5.5: The module for the DO sensor.
No.
1
2
3
4
Label
A
+
BNC
Description
Analog Signal Output (0~3.0V)
VCC (3.3~5.5V)
GND
Probe Cable Connector
Since, the sensor is a galvanic probe, some measures were taken to ensure the
calibration of the sensor. The electrolyte used in this sensor was NaOH solution. For a
new dissolved oxygen probe, 0.5 mol/L NaOH solution was added into the membrane
cap firstly as the filling solution. Also it was suggested that, if the probe has been used
for some time and the error grows greatly, it is time to change the filling solution.
Fig 5.6: The process of adding the solution to the probe.
Then, the sensor was connected to the Arduino board and dipped in water. The serial
monitor is used to calibrate the sensor to the electrolyte against the dissolved oxygen in
water. After calibration, the sensor is ready to be used for a long time. It was also
observed that the readings for the DO shows a great value initially when the device is
started or just dipped into water with different levels of DO, but the reading stabilized in
about 30-60 seconds.
5.6- Analog (ORP) Meter, pH Meter, Salinity Meter:
The analog oxidation reduction potential (ORP) meter is an important part of the device
which senses the ORP levels of the water. It is significant because in the current ever
growing world, contamination of water has become a great issue and water is the most
critical control point of contact where proper treatment can greatly reduce the
microbes, thereby reducing the chances of illness and pollution. ORP (OxidationReduction Potential) is a measure of the ability of oxidation and reduction of aqueous
solution, characterization of oxidizing or reducing the relative degree. Unlike a pH
measurement that follows a logarithmic curve and therefore requires more calibration
adjustments, ORP follows a linear relationship and does not need instrument
adjustment as much as it needs electrode maintenance. ORP has proven to be a reliable
method of measuring water quality and provides the operator with a single value of
measurement regardless of which product, commodity, operation, treatment or
sanitizer is used, and regardless of varying field conditions or method by which chemical
is applied. For the prototype the ORP is measured in millivolts (mV) and ranges from 2000mV to +2000 mV.
Fig 5.7: ORP reducing and oxidizing agents
A positive ORP indicates that the substances present in the water are oxidizing agents
and the negative indicates that the water has a presence of reducing agents. Beyond
this range of -400 to +400mV the water becomes harmful for aquatic life, hence the
device is designed to set off its alarm on such changes.
The ORP meter is connected to the Arduino in the same way as shown in the general
circuit connections for the sensor modules as shown in Fig 5.1.
For the pH sensor, any value below 7 indicates an acidic water and above 7 indicates
alkaline waters.
Fig 5.8 pH characteristics.
The device has been designed to set off the alarm when the pH is less than 6 or when it
greater than 8. A value below 6 would mean the water is acidic and unsuitable for
aquatic life, and a value above 8 would mean the water is alkaline and unsuitable for
many fishes in ponds. Fishes most thrive in waters that are closer to a pH of 7.
The Salinity/Conductivity of the water is measured by the analog salinity sensor. This
sensor functions similarly to the ORP and pH meter but in this case it is measure in
microSeimens or milliSeimens. For our device, it triggers the alarm when the electric
conductivity (EC) is greater than 550 microseimens since it is the condition where fresh
water aquatic organisms cannot thrive in such conditions or even not survive.
5.7- Digital temperature sensor and alarm:
The digital temperature sensor (DS18B20) is a waterproof probe that is useful for
measuring in any wet conditions. The sensor works properly up to 125 oC, while the
cable is jacketed with PVC, so must be kept under 100oC. Since the signal is digital, there
is no degradation in values and the reading for the temperature is highly accurate. The
temperature sensor is connected to the D2 terminal of the Arduino board, and proper
codes for it were placed for the device to show the value of the temperature in oC to the
nearest one decimal place.
The alarm has been connected to the D10 port of the Arduino board. It responds to
certain conditions of the water like conductivity, ORP, DO and pH. For harmful water
conditions, the Arduino is coded to set the alarm off. For example, when the ORP is
greater than +400mV, or when EC is greater than 500microSeimens, or when pH is less
than 6 or greater than 8, and when DO is lower than 4 mg/L, the alarm will set off and
not stop until the conditions have change to normal. The code for this is shown below:
Fig 5.9: Codes for the alarm conditions.
5.8- LCD display and Bluetooth module connections:
The LCD display used is a 20x4 display that always shows the values of the readings from
the sensors. Bluetooth module is connected according to its function where the
transmission of the Arduino is connected to the receiving end of the Bluetooth module,
and the receiving mode of the Arduino is connected to the transmission of the
Bluetooth module. The connections of the display and the Bluetooth module to the
Arduino board is shown below:
Fig 5.10: Circuit diagram of LCD and BT module.
5.9- Android application:
The android application is designed to connect to the Bluetooth (HC 05) only. It can
show the paired devices and connected devices and only connect to the HC-05. When
connected, the app displays the values that are shown on the LCD screen, on the display
portion of the android app as shown below in Fig 5.11:
Fig 5.11: Android app displaying the readings from the Arduino.
5.10- Finished Device and LCD reading:
The final product is shown in Fig 5.12 where the device has been enclosed in a wooden
casing and the sensors are put in a solution with a high pH value.
Fig 5.11: Final device.
Fig 5.12: LCD readings.
Chapter 6: Results and Observations
6.1- Requirement Analysis (Survey) :
We did a survey asking different people’s opinion on what could help them increase the yield of fish,
also what problems they face in the production process and this is the result:
From a private fish farmer—(Munshiganj, Sirajdikhan)
1.
What is the main problem to maintain the yield of fish production?
-----The feed of the fish and to make sure the water is not overcrowded.
2.
What conditions should be monitored for best water quality for fish production?
----- Water quality is not the main concern here, as they do not mostly understand it, for being a
small farm. But they want the water to be cleaner.
3.
What measurements are being taken currently?
-----Any water quality was not necessary according to the farmer, but the depth of the water
and the area of the pond was important according to him.
4.
What are they doing to maintain the conditions currently?
-----No specific things are being done to maintain the water conditions.
5.
What solution can be provided?
-----Something that can help to increase the amount of fish production in a small area of pond,
at a lower cost.
6.
What is the amount of loss?
----Sometimes the fish die due to bad water conditions and build-up of waste in the water. Fish
also die sometimes due to overcrowding of the pond. So, the losses vary depending on the
state, but usually they make a profit, since they buy fingerlings from the market and already
expect some of them to die.
7.
How frequently does the loss happen?
-----Does not happen too frequently.
8.
What is their response? How quick can they solve the problem?
-----They attempt to clean the pond of dead fish using a net and wait a few days before
releasing more fish.
9.
What percentage of the fry/fingerling survive in the pond?
-----Around 30-40% of the fingerling die in the first few days of being introduced to the pond.
10.
Are they using any devices? If so, what is the main function of the device and is it
working out for them?
-----No devices are being used.
11.
What condition is required for specific type of fish?
-----Nothing specific for the type of fish they are using.
12.
How much are they willing to spend, to maintain the water quality?
----- According to them, it will depend on the kind of device. But currently they are willing to
spend 10,000- 20,000 Tk on a working device if it actually helps to increase the yield, as they are
just a small fish farm and not a fishery.
AKM Fazlur Rashid
Owner, Rashfia Agro and Fisheries, Mymensingh
•
What conditions of water quality are needed to be monitored for fish production?
Basically we try to monitor the pH, Dissolved oxygen and Salinity of the water to our first
priority. Then comes the minerals part in the list.
•
What are the factors causing you troubles at most?
Dissolved oxygen so far is the biggest concern for us and the salinity is also a thing to be careful
about. Cause lack of oxygen and imbalance of salinity both lead to casualties.
•
What measurements are taken currently for the problems?
We have two caretakers for the fishery who check the water condition manually at regular
intervals.
•
What steps do you take if you see any problems?
On the basis of our caretakers’ reports we tend to supply the necessary elements.
•
How much time do you need for the response to the raised problems?
There’s no fixed time yet that we have calculated. Sometimes it takes up to 6-8 hours to figure
out the real problem for us.
•
Why is that so? As you have said that you have men who keep tracks?
Yes we have them but they are not that skilled to minimise the loss.
•
How much money do you lose during the problems ?
On December, 2017 we lost 400 Kgs of fishes worth of 1,20,000 taka.
•
How frequently do these losses occur ?
Yearly we at least experience these losses twice.
•
Which fishes are high on demand if you have to save among the whole?
Generally we try to save as much as we can and to be honest you can’t even figure out which to be
saved initially when the conditions are against you. Still if i have to pick from the lot then I’ll go for the
prawns.
•
Are you using any device for prevention?
No. Not yet.
•
Are you willing to own a device which will give you prevention from majority of these problems?
Yes. If that can alert us in advance then we would definitely give it a look.
•
How much are you willing to spend for a device which can alarm you?
We haven’t thought about that yet. Depends on the machine actually like what things it can
alarm about. But if it’s a complete device with the ability of detecting pH, temperature,
dissolved oxygen, minerals then I can spend 50,000 taka.
From a small private farm :( near Narayanganj,Sonargaon)
Personal interview was taken and various kind of answers were received through it.
1)
How many ponds do you have in your farm?
Ans: Three ponds altogether connected by a common drainage system.
2)
How many kinds of fish do you grown each year?
Ans: Many kinds of fish are grown or cultivated in the ponds like Rui,Katla,Hilsha,Shoal etc other
tiny fishes are also grown.
3)
What process do you use to rear fish?
Ans: Very basic process is adapted by them to rear fish. We use limestone to keep the water
clean for the fish. Small fish or eggs of them are released in the water. Provides the fish with
fish food which are already made with many substances to keep them alive.
4)
Do you use any devices to keep the quality of water well?
Ans: No.
5)
What conditions are required for the fish to grow?
Ans: Nothing specific only good weather and to make sure the water doesn’t overflow or dry
out.
6)
What are the chances of loss in their business?
Ans: Loss does not occur frequently unless its market or economy related. Fish could die in any
uncertain way but it’s rare. Unless there is use of poison in the water, fish remains healthy.
7)
Do you think if the water condition was better there would be even less loss?
Ans: “Maybe”. As they were not sure of it. Their concern is not that much about the water
quality because they are not aware of it.
8) What percentage of the fry/fingerling survive in the pond?
Ans: Few of them dies in the first few days. But as they start growing it gets better.
9) What is their investment throughout a year? Or how much are they willing to pay?
Ans: They would invest about 20,000 to 30,000 a year for the fish to rear and grow.
10) What is their response time when fish dies or loss occurs? How do they solve it?
Ans: They usually clean the water and try to pick out the dead fish by using a net. Sometimes
they change the food and put new fingerlings or small fish in the pond for them to grow.
11) Would you be willing to use a device that could track your problems in water and give you
less loss yearly and more benefit?
Ans: Yes we would at least consider to try it out.
6.2- Real life test result:
Water quality is deteriorated day by day due to numerous biological, physical and chemical
variables causing water toxicity. When concentration of any element or compound exceeds the
tolerance limit for organisms that element is treated as pollutants. Research work has been
carried out to determine some vital water quality parameters those abate the water quality and
find out the most vulnerable location of both Dhanmondi and Ramna Lake.The device was
tested in Dhanmondi Lake and the pond inside Ramna Park where there is production of fish in
the water. The pH value that we got in the Dhanmondi Lake water was 11.00 which is very high
as the average pH is between 6.00-7.00 . The EC value was also very high around 800 hence the
buzzer went off and an alert was sent to the device. When tested on the water in Ramna Park
the pH came around 8.5 which is also very high but not as high as the water in Dhanmondi Lake,
the turbidity value came around 4.5 NTU. The EC/Salinity value came around 650us/cm. The
alarzm went off this time as well because the collected values were higher than the expected
values.
Chapter 7: Future Works
7.1- Introduction:
All the things discussed in this section will improve the efficiency of the target device
and even increase its functionalities and even make it more user friendly and decrease
its price to make it more available to people. By addition of some more equipment and
the use of better and improved sensors, the device can be improved in various ways.
The possible additional features are various mineral sensors, sensors for water
parameters, improved microcontrollers, improved sensors, better batteries and solar
panels, upgrading the android application, or even water proofing the device and
making it smaller and more portable.
7.2- More Sensors:
It is possible to add more sensors to the prototype given the right resources. The device
is perfectly capable of handling more sensors and receiving more data and sending the
necessary information to the users. Additional sensors for parameters such as
Ammonium ion (NH4), Nitrate ion (NO3-) and Nitrite ion (NO2+), since these are the
main factors that indicate the presence of excretory substances from living organisms,
so monitoring such factors could help to improve aquatic conditions for fishes. Also
other sensors for minerals and other ions can be used, for example, sensors for ions
(Fluoride (F-), Calcium (Ca2+), Chloride (Cl-), Iodide (I-), Lithium (Li+), Magnesium
(Mg2+), Potassium (K+), Sodium (Na+), Iron (Fe2+/Fe3+) etc. The detection of the
presence of such ions can be a great improvement to the overall capacity of output for
this device and enhance its capabilities. Some of these are already used by some
products such as Libelium, as discussed before.
7.3- Microcontrollers and ports:
The use of a similar microcontroller chip like the ATMega328P used in the ArduinoUNO,
into a different and more improved microchip can cause a great improvement in device
performance and fewer connections. In the current project, a lot of connections were
needed, due to the various sensors and all the required supplies, GNDs and analogs; but
the ArduinoUNO did not have enough supply ports for all the sensors, hence an
extension of a veroboard was used, where all the 5V supply and grounds were
extended. Also, the ArduinoUNO has a limited number of analog inputs which could
limit the amount of analog sensors used in case of an improvement in device. It can be
considered to design a custom microcontroller similar to the ArduinoUNO, but with
greater number of supply inputs and outputs, for it to be capable of supporting a lot
more components like the sensors.
7.4- Improved sensors:
Better sensors can greatly bring improvements to the quality of the device as it can then
provide data with better efficiency. Probes with better materials for the cathodes and
anodes used within them can help to give electronic readings of greater accuracy. Also
the price of the overall device can be reduced if the sensors were produced locally
instead of being required to import.
7.5- Improved batteries and solar panels:
The use of better batteries and solar panels can bring changes to the self-sufficient
factor of the device. A better battery can sustain a greater load and store a lot more
energy for the device to run throughout the day. An improved solar panel can sustain
better current flow in case of light, since the current solar panel requires a bright
sunlight for it to function properly. A better battery and solar panel tech can eventually
lead to better charge storage throughout the day, so the device can function on its
charge by night without a problem.
7.5- Upgraded Android App:
Newer features can be added to the android app to make it more user friendly and
according to the convenience of the user. Features like notifying the user during any
harmful changes in water conditions, saving daily data on the device so the user can
access it anytime one wants. The app can be made to graphically represent all the data
throughout the day and compare it to the conditions from another time. Also a cloud
server can be used to store send or receive information from the device and access it
through the app.
7.6- Actuators:
The use of actuators can be a very significant addition to this device since then it will not
only be capable of viewing the data to the user, but also take certain actions when
certain water conditions are at a harmful level. For example, in a scenario where the
water has lower levels of dissolved oxygen, an actuator can be a certain type of motor
which activates when the device detects that the oxygen levels in the water has
lowered. This motor in turn increases the oxygen levels of the water and eventually
when the sensors detect that the oxygen levels have improved, the device can send
signals to the motors again to make it stop. Such actuator devices can be used for all the
parameters of water accordingly to gain control over the conditions in water.
7.7- Waterproof device:
Since the main function of the device is around water bodies, its feasibility could have
been improved by making the whole device completely waterproof and floatable. A
waterproof device would be much easier for fish farmers to use as it becomes easier for
them to carry around water. Also, if the device is floatable, the device could be left on a
pond as the user receives data from it via Bluetooth or a cloud server if the right module
is used.
7.8- Conclusion:
Bangladesh is a fast growing and developing country and pollution hazard is an
enormous problem in this country where proper there are still shortages of proper
sanitation, drainage system and sewage treatment systems. All the pollution and
environmental changes are causing great changes to the water bodies of the nation and
could be affecting fish production.
It is necessary to monitor water conditions for safety measures and for the marine
organisms to survive as their survival is a necessity for the economy and the survival of
the people in general.
Through this project, we have learned various skills and learned the various significance
of such devices and how these can come to use. Its applications can be of great benefits
to the fishery and hatchery industries of Bangladesh,
Appendix:
Arduino Code
#include<SoftwareSerial.h>
SoftwareSerial bt(7, 8);// for bt connection pin rx,tx
//#include <SoftwareSerial.h> // use the software uart
//SoftwareSerial bluetooth(0, 1); // RX, TX
#include <avr/pgmspace.h>
#include <EEPROM.h>
// stast EC
#include <OneWire.h>
#include<LiquidCrystal.h>
#define StartConvert 0
#define ReadTemperature 1
int buzzer = 11;
LiquidCrystal lcd(3, 4, 5, 6, 9, 10);
const byte numReadings = 20;
//the number of sample times
byte ECsensorPin = A5; //EC Meter analog output,pin on analog 1
byte DS18B20_Pin = 2; //DS18B20 signal, pin on digital 2
unsigned int AnalogSampleInterval = 25, printInterval = 700, tempSampleInterval = 850; //analog sample interval;serial print
interval;temperature sample interval
unsigned int readings[numReadings];
byte index = 0;
// the readings from the analog input
// the index of the current reading
unsigned long AnalogValueTotal = 0;
// the running total
unsigned int AnalogAverage = 0, averageVoltage = 0;
// the average
unsigned long AnalogSampleTime, printTime, tempSampleTime;
float temperature, ECcurrent;
//Temperature chip i/o
OneWire ds(DS18B20_Pin); // on digital pin 2
// end EC
//start do
#define DoSensorPin A4 //dissolved oxygen sensor analog output pin to arduino mainboard
#define VREF 5000 //for arduino uno, the ADC reference is the AVCC, that is 5000mV(TYP)
float doValue;
//current dissolved oxygen value, unit; mg/L
//float temperature = 25; //default temperature is 25^C, you can use a temperature sensor to read it
#define EEPROM_write(address, p) {int i = 0; byte *pp = (byte*)&(p);for(; i < sizeof(p); i++) EEPROM.write(address+i, pp[i]);}
#define EEPROM_read(address, p) {int i = 0; byte *pp = (byte*)&(p);for(; i < sizeof(p); i++) pp[i]=EEPROM.read(address+i);}
#define ReceivedBufferLength 20
char receivedBuffer[ReceivedBufferLength + 1]; // store the serial command
byte receivedBufferIndex = 0;
#define SCOUNT 30
// sum of sample point
int analogBuffer[SCOUNT]; //store the analog value in the array, readed from ADC
int analogBufferTemp[SCOUNT];
int analogBufferIndex = 0, copyIndex = 0;
#define SaturationDoVoltageAddress 12
#define SaturationDoTemperatureAddress 16
//the address of the Saturation Oxygen voltage stored in the EEPROM
//the address of the Saturation Oxygen temperature stored in the EEPROM
float SaturationDoVoltage, SaturationDoTemperature;
//float averageVoltage;
const float SaturationValueTab[41] PROGMEM = {
14.46, 14.22, 13.82, 13.44, 13.09,
12.74, 12.42, 12.11, 11.81, 11.53,
11.26, 11.01, 10.77, 10.53, 10.30,
10.08, 9.86, 9.66, 9.46, 9.27,
9.08, 8.90, 8.73, 8.57, 8.41,
8.25, 8.11, 7.96, 7.82, 7.69,
7.56, 7.43, 7.30, 7.18, 7.07,
6.95, 6.84, 6.73, 6.63, 6.53,
6.41,
};
//end do
//saturation dissolved oxygen concentrations at various temperatures
float pHpin = A0; // Connect the sensor's Po output to analogue pin 0.
float Po; // for data store
float turbidity = A2; // connect with turbidity sensor
float turvalue;
float turvoltage;
#define VOLTAGE 5.00 //system voltage
#define OFFSET 0
//zero drift voltage
double orpValue;
#define ArrayLenth 40 //times of collection
#define orpPin A1
//orp meter output,connect to Arduino controller ADC pin
int orpArray[ArrayLenth];
int orpArrayIndex = 0;
double avergearray(int* arr, int number) {
int i;
int max, min;
double avg;
long amount = 0;
if (number <= 0) {
printf("Error number for the array to avraging!/n");
return 0;
}
if (number < 5) { //less than 5, calculated directly statistics
for (i = 0; i < number; i++) {
amount += arr[i];
}
avg = amount / number;
return avg;
}
else {
if (arr[0] < arr[1]) {
min = arr[0]; max = arr[1];
}
else {
min = arr[1]; max = arr[0];
}
for (i = 2; i < number; i++) {
if (arr[i] < min) {
amount += min;
//arr<min
min = arr[i];
}
else
{
if (arr[i] > max) {
amount += max; //arr>max
max = arr[i];
} else {
amount += arr[i]; //min<=arr<=max
}
}//if
}//for
avg = (double)amount / (number - 2);
}//if
return avg;
}
void setup(void) {
Serial.begin(9600);
bt.begin(9600); // communication degler for bt
lcd.begin(20, 4);
for (byte thisReading = 0; thisReading < numReadings; thisReading++)
readings[thisReading] = 0;
TempProcess(StartConvert); //let the DS18B20 start the convert
AnalogSampleTime = millis();
printTime = millis();
tempSampleTime = millis();
pinMode(DoSensorPin, INPUT);
readDoCharacteristicValues();
//read Characteristic Values calibrated from the EEPROM
pinMode(buzzer, OUTPUT);
pinMode(13, OUTPUT); // for LED status
//bluetooth.begin(9600); // start the bluetooth uart at 9600 which is its default
delay(200); // wait for voltage stabilize
//bluetooth.print("AT+NAMEmcuhq.com"); // place your name in here to configure the bluetooth name.
// will require reboot for settings to take affect.
delay(3000); // wait for settings to take affect.
}
void loop(void) {
turvalue = analogRead(turbidity);// read the input on analog pin 0:
Po = 1023 - analogRead(pHpin); // Read and reverse the analogue input value from the pH sensor.
Po = map(Po, 0, 1023, 0, 14); // Map the '0 to 1023' result to '0 to 14'.
turvoltage = turvalue * (5.0 / 1024.0); // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
//orp
static unsigned long orpTimer = millis(); //analog sampling interval
static unsigned long printTime = millis();
if (millis() >= orpTimer)
{
orpTimer = millis() + 20;
orpArray[orpArrayIndex++] = analogRead(orpPin); //read an analog value every 20ms
if (orpArrayIndex == ArrayLenth) {
orpArrayIndex = 0;
}
orpValue = ((30 * (double)VOLTAGE * 1000) - (75 * avergearray(orpArray, ArrayLenth) * VOLTAGE * 1000 / 1024)) / 75 OFFSET;
//convert the analog value to orp according the circuit
}
// start EC
if (millis() - AnalogSampleTime >= AnalogSampleInterval)
{
AnalogSampleTime = millis();
// subtract the last reading:
AnalogValueTotal = AnalogValueTotal - readings[index];
// read from the sensor:
readings[index] = analogRead(ECsensorPin);
// add the reading to the total:
AnalogValueTotal = AnalogValueTotal + readings[index];
// advance to the next position in the array:
index = index + 1;
// if we're at the end of the array...
if (index >= numReadings)
// ...wrap around to the beginning:
index = 0;
// calculate the average:
AnalogAverage = AnalogValueTotal / numReadings;
}
/*
Every once in a while,MCU read the temperature from the DS18B20 and then let the DS18B20 start the convert.
Attention:The interval between start the convert and read the temperature should be greater than 750 millisecond,or the
temperature is not accurate!
*/
if (millis() - tempSampleTime >= tempSampleInterval)
{
tempSampleTime = millis();
temperature = TempProcess(ReadTemperature); // read the current temperature from the DS18B20
TempProcess(StartConvert);
//after the reading,start the convert for next reading
}
/*
Every once in a while,print the information on the serial monitor.
*/
if (millis() - printTime >= printInterval)
{
printTime = millis();
averageVoltage = AnalogAverage * (float)5000 / 1024;
//Serial.print("Analog value:");
//Serial.print(AnalogAverage); //analog average,from 0 to 1023
//Serial.print(" Voltage:");
//Serial.print(averageVoltage); //millivolt average,from 0mv to 4995mV
//Serial.print("mV ");
//Serial.print("temp:");
//Serial.print(temperature); //current temperature
//Serial.print("^C
EC:");
float TempCoefficient = 1.0 + 0.0185 * (temperature - 25.0); //temperature compensation formula: fFinalResult(25^C) =
fFinalResult(current)/(1.0+0.0185*(fTP-25.0));
float CoefficientVolatge = (float)averageVoltage / TempCoefficient;
if (CoefficientVolatge < 10)Serial.println("No solution!"); //25^C 1413us/cm<-->about 216mv if the
voltage(compensate)<150,that is <1ms/cm,out of the range
else if (CoefficientVolatge > 3300)Serial.println("Out of the range!"); //>20ms/cm,out of the range
else
{
if (CoefficientVolatge <= 448)ECcurrent = 6.84 * CoefficientVolatge - 64.32; //1ms/cm<EC<=3ms/cm
else if (CoefficientVolatge <= 1457)ECcurrent = 6.98 * CoefficientVolatge - 127; //3ms/cm<EC<=10ms/cm
else ECcurrent = 5.3 * CoefficientVolatge + 2278;
//10ms/cm<EC<20ms/cm
ECcurrent /= 1000; //convert us/cm to ms/cm
Serial.print(ECcurrent, 2); //two decimal
Serial.println("ms/cm");
}
}
// start do
static unsigned long analogSampleTimepoint = millis();
if (millis() - analogSampleTimepoint > 30U) //every 30 milliseconds,read the analog value from the ADC
{
analogSampleTimepoint = millis();
analogBuffer[analogBufferIndex] = analogRead(DoSensorPin); //read the analog value and store into the buffer
analogBufferIndex++;
if (analogBufferIndex == SCOUNT)
analogBufferIndex = 0;
}
static unsigned long tempSampleTimepoint = millis();
if (millis() - tempSampleTimepoint > 500U) // every 500 milliseconds, read the temperature
{
tempSampleTimepoint = millis();
//temperature = readTemperature(); // add your temperature codes here to read the temperature, unit:^C
}
static unsigned long printTimepoint = millis();
if (millis() - printTimepoint > 1000U)
{
printTimepoint = millis();
for (copyIndex = 0; copyIndex < SCOUNT; copyIndex++)
{
analogBufferTemp[copyIndex] = analogBuffer[copyIndex];
}
averageVoltage = getMedianNum(analogBufferTemp, SCOUNT) * (float)VREF / 1024.0; // read the value more stable by the
median filtering algorithm
//Serial.print(F("Temperature:"));
//Serial.print(temperature, 1);
//Serial.print(F("^C"));
doValue = pgm_read_float_near( &SaturationValueTab[0] + (int)(SaturationDoTemperature + 0.5) ) * averageVoltage /
SaturationDoVoltage; //calculate the do value, doValue = Voltage / SaturationDoVoltage * SaturationDoValue(with
temperature compensation)
//Serial.print(F(", DO Value:"));
//Serial.print(doValue, 2);
//Serial.println(F("mg/L"));
lcd.setCursor(0, 3);
lcd.print(F("DO Value:"));
lcd.print(doValue, 2);
lcd.print(F("mg/L"));
}
if (serialDataAvailable() > 0)
{
byte modeIndex = uartParse(); //parse the uart command received
doCalibration(modeIndex); // If the correct calibration command is received, the calibration function should be called.
}
// end do
if (millis() >= printTime) //Every 800 milliseconds, print a numerical, convert the state of the LED indicator
{
printTime = millis() + 800;
//Serial.print("PH:");
//Serial.println(Po);
//Serial.print("ORP: ");
//Serial.print((int)orpValue);
//Serial.println("mV");
//Serial.print("Turbidity: ");
//Serial.print(turvoltage);
//Serial.println("V");
//Serial.print("temp:");
//Serial.print(temperature); //current temperature
//Serial.println(" C");
//Serial.print("EC:");
//Serial.print(ECcurrent, 2); //two decimal
//Serial.println("ms/cm");
//Serial.print(F("DO Value:"));
//Serial.print(doValue, 2);
//Serial.println(F("mg/L"));
//Serial.println("");
lcd.setCursor(0, 0);
lcd.print("PH:");
lcd.print(Po);
lcd.setCursor(8, 0);
lcd.print("ORP:");
lcd.print((int)orpValue);
lcd.print("mV");
lcd.setCursor(0, 1);
lcd.print("Turbidity:");
lcd.print(turvoltage);
lcd.print("V");
lcd.setCursor(9, 2);
lcd.print("EC:");
lcd.print(ECcurrent*850, 1); //two decimal
lcd.print("uS");
lcd.setCursor(0, 2);
lcd.print("temp:");
lcd.print((int)temperature); //current temperature
lcd.print("C");
//lcd.setCursor(0, 3);
//lcd.print(F("DO Value:"));
//lcd.print(doValue, 2);
//lcd.print(F("mg/L"));
String no1 = " PH: ";
String no2 = " ORP ";
String no3 = "mV " ;
String no4 = " Turbidity: ";
String no5 = "V ";
String no6 = " temp: ";
String no7 = "C ";
String no8 = " EC: ";
String no9 = "us/cm ";
String no10 = " DO Value: ";
String no11 = " mg/L ";
String E = String(ECcurrent*850, 2);
String D = String(doValue,2);
String main = no1 + Po + no2 + orpValue + no3 + no4 + turvoltage + no5 + no6 + temperature + no7 + no8 + E + no9 + no10 +
D + no11;
bt.print(main);
//bt.print("PH: ");
//bt.println(Po);
//bt.print("ORP: ");
//bt.print((int)orpValue);
// bt.println("mV");
// bt.print("Turbidity: ");
// bt.print(turvoltage);
// bt.println("V");
// bt.print("temp:");
// bt.print(temperature); //current temperature
// bt.println(" C");
//bt.print("EC:");
// bt.print(ECcurrent*1000, 2); //two decimal
// bt.println("ms/cm");
//bt.println("");
// bt.print(F("DO Value:"));
// bt.print(doValue, 2);
// bt.println(F("mg/L"));
// bt.println("");
// bt.println("");
if (Po > 8.00 || Po < 6.00 || (int)orpValue > 400||(ECcurrent*850) > 550 || doValue < 4.00)
{
digitalWrite(buzzer, HIGH);
Serial.print("high");
}
else
{
digitalWrite(buzzer, LOW);
Serial.print("low");
}
delay(2000);
}
/*Serial.print("pH:");
Serial.println(Po);
Serial.print("ORP: ");
Serial.print((int)orpValue);
Serial.println("mV");
bt.print("PH: ");
bt.println(Po);
bt.print("ORP: ");
bt.print((int)orpValue);
bt.println("mV");
bt.println("");
delay(1000);*/
lcd.clear();
}
float TempProcess(bool ch)
{
//returns the temperature from one DS18B20 in DEG Celsius
static byte data[12];
static byte addr[8];
static float TemperatureSum;
if (!ch) {
if ( !ds.search(addr)) {
Serial.println("no more sensors on chain, reset search!");
ds.reset_search();
return 0;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return 0;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized!");
return 0;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
}
else {
byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float tempRead = ((MSB << 8) | LSB); //using two's compliment
TemperatureSum = tempRead / 16;
}
return TemperatureSum;
}
/// start do
boolean serialDataAvailable(void)
{
char receivedChar;
static unsigned long receivedTimeOut = millis();
while ( Serial.available() > 0 )
{
if (millis() - receivedTimeOut > 500U)
{
receivedBufferIndex = 0;
memset(receivedBuffer, 0, (ReceivedBufferLength + 1));
}
receivedTimeOut = millis();
receivedChar = Serial.read();
if (receivedChar == '\n' || receivedBufferIndex == ReceivedBufferLength)
{
receivedBufferIndex = 0;
strupr(receivedBuffer);
return true;
} else {
receivedBuffer[receivedBufferIndex] = receivedChar;
receivedBufferIndex++;
}
}
return false;
}
byte uartParse()
{
byte modeIndex = 0;
if (strstr(receivedBuffer, "CALIBRATION") != NULL)
modeIndex = 1;
else if (strstr(receivedBuffer, "EXIT") != NULL)
modeIndex = 3;
else if (strstr(receivedBuffer, "SATCAL") != NULL)
modeIndex = 2;
return modeIndex;
}
void doCalibration(byte mode)
{
char *receivedBufferPtr;
static boolean doCalibrationFinishFlag = 0, enterCalibrationFlag = 0;
float voltageValueStore;
switch (mode)
{
case 0:
if (enterCalibrationFlag)
Serial.println(F("Command Error"));
break;
case 1:
enterCalibrationFlag = 1;
doCalibrationFinishFlag = 0;
Serial.println();
Serial.println(F(">>>Enter Calibration Mode<<<"));
Serial.println(F(">>>Please put the probe into the saturation oxygen water! <<<"));
Serial.println();
break;
case 2:
if (enterCalibrationFlag)
{
Serial.println();
Serial.println(F(">>>Saturation Calibration Finish!<<<"));
Serial.println();
EEPROM_write(SaturationDoVoltageAddress, averageVoltage);
EEPROM_write(SaturationDoTemperatureAddress, temperature);
SaturationDoVoltage = averageVoltage;
SaturationDoTemperature = temperature;
doCalibrationFinishFlag = 1;
}
break;
case 3:
if (enterCalibrationFlag)
{
Serial.println();
if (doCalibrationFinishFlag)
Serial.print(F(">>>Calibration Successful"));
else
Serial.print(F(">>>Calibration Failed"));
Serial.println(F(",Exit Calibration Mode<<<"));
Serial.println();
doCalibrationFinishFlag = 0;
enterCalibrationFlag = 0;
}
break;
}
}
int getMedianNum(int bArray[], int iFilterLen)
{
int bTab[iFilterLen];
for (byte i = 0; i < iFilterLen; i++)
{
bTab[i] = bArray[i];
}
int i, j, bTemp;
for (j = 0; j < iFilterLen - 1; j++)
{
for (i = 0; i < iFilterLen - j - 1; i++)
{
if (bTab[i] > bTab[i + 1])
{
bTemp = bTab[i];
bTab[i] = bTab[i + 1];
bTab[i + 1] = bTemp;
}
}
}
if ((iFilterLen & 1) > 0)
bTemp = bTab[(iFilterLen - 1) / 2];
else
bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
return bTemp;
}
void readDoCharacteristicValues(void)
{
EEPROM_read(SaturationDoVoltageAddress, SaturationDoVoltage);
EEPROM_read(SaturationDoTemperatureAddress, SaturationDoTemperature);
if (EEPROM.read(SaturationDoVoltageAddress) == 0xFF && EEPROM.read(SaturationDoVoltageAddress + 1) == 0xFF &&
EEPROM.read(SaturationDoVoltageAddress + 2) == 0xFF && EEPROM.read(SaturationDoVoltageAddress + 3) == 0xFF)
{
SaturationDoVoltage = 1127.6; //default voltage:1127.6mv
EEPROM_write(SaturationDoVoltageAddress, SaturationDoVoltage);
}
if (EEPROM.read(SaturationDoTemperatureAddress) == 0xFF && EEPROM.read(SaturationDoTemperatureAddress + 1) == 0xFF
&& EEPROM.read(SaturationDoTemperatureAddress + 2) == 0xFF && EEPROM.read(SaturationDoTemperatureAddress + 3) ==
0xFF)
{
SaturationDoTemperature = 25.0; //default temperature is 25^C
EEPROM_write(SaturationDoTemperatureAddress, SaturationDoTemperature);
}
}
Android app:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimaryDark"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.mcuhq.simplebluetooth.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<CheckBox
android:id="@+id/checkboxLED1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/bluetoothStatus"
android:layout_alignStart="@+id/bluetoothStatus"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:checked="false"
android:scaleX="1.7"
android:scaleY="1.7"
android:text="Toggle LED"
android:textColor="@color/colorPrimaryDark"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_green_light"
android:ellipsize="end"
android:maxLines="1"
android:text="Reading From Arduino"
android:textStyle="bold|italic" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="70dp">
<TextView
android:id="@+id/readBuffer"
android:layout_width="match_parent"
android:layout_height="134dp"
android:layout_centerHorizontal="true"
android:background="@android:color/background_light"
android:ellipsize="end"
android:maxLines="6"
android:text="<Read Buffer>" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.1"
android:background="@android:color/holo_blue_bright"
android:ellipsize="end"
android:maxLines="1"
android:text="Status:"
android:textStyle="bold" />
<TextView
android:id="@+id/bluetoothStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/checkboxLED1"
android:layout_centerHorizontal="true"
android:layout_weight="0.9"
android:background="@android:color/holo_green_dark"
android:ellipsize="end"
android:maxLines="1"
android:text="<Bluetooth Status>"
android:textStyle="bold" />
</LinearLayout>
<Button
android:id="@+id/scan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/off"
android:background="@android:color/holo_green_dark"
android:text="Bluetooth ON" />
<Button
android:id="@+id/off"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/scan"
android:layout_toEndOf="@+id/PairedBtn"
android:layout_toRightOf="@+id/PairedBtn"
android:background="@android:color/holo_red_dark"
android:text="Bluetooth OFF" />
<Button
android:id="@+id/PairedBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/scan"
android:layout_toStartOf="@+id/discover"
android:background="@android:color/holo_orange_dark"
android:text="Show paired Devices" />
<Button
android:id="@+id/discover"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/off"
android:layout_toEndOf="@+id/checkboxLED1"
android:layout_toRightOf="@+id/checkboxLED1"
android:background="@android:color/holo_blue_light"
android:text="Discover New Devices" />
<ListView
android:id="@+id/devicesListView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/off"
android:layout_alignRight="@+id/off"
android:layout_below="@+id/PairedBtn"
android:background="@android:color/holo_purple"
android:choiceMode="singleChoice" />
</LinearLayout>
package com.mcuhq.simplebluetooth;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.util.Set;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
// GUI Components
private TextView mBluetoothStatus;
private TextView mReadBuffer;
private Button mScanBtn;
private Button mOffBtn;
private Button mListPairedDevicesBtn;
private Button mDiscoverBtn;
private BluetoothAdapter mBTAdapter;
private Set<BluetoothDevice> mPairedDevices;
private ArrayAdapter<String> mBTArrayAdapter;
private ListView mDevicesListView;
private CheckBox mLED1;
private final String TAG = MainActivity.class.getSimpleName();
private Handler mHandler; // Our main handler that will receive callback notifications
private ConnectedThread mConnectedThread; // bluetooth background worker thread to send and receive data
private BluetoothSocket mBTSocket = null; // bi-directional client-to-client data path
private static final UUID BTMODULEUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // "random"
unique identifier
// #defines for identifying shared types between calling functions
private final static int REQUEST_ENABLE_BT = 1; // used to identify adding bluetooth names
private final static int MESSAGE_READ = 2; // used in bluetooth handler to identify message update
private final static int CONNECTING_STATUS = 3; // used in bluetooth handler to identify message status
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBluetoothStatus = (TextView)findViewById(R.id.bluetoothStatus);
mReadBuffer = (TextView) findViewById(R.id.readBuffer);
mScanBtn = (Button)findViewById(R.id.scan);
mOffBtn = (Button)findViewById(R.id.off);
mDiscoverBtn = (Button)findViewById(R.id.discover);
mListPairedDevicesBtn = (Button)findViewById(R.id.PairedBtn);
mLED1 = (CheckBox)findViewById(R.id.checkboxLED1);
mBTArrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1);
mBTAdapter = BluetoothAdapter.getDefaultAdapter(); // get a handle on the bluetooth radio
mDevicesListView = (ListView)findViewById(R.id.devicesListView);
mDevicesListView.setAdapter(mBTArrayAdapter); // assign model to view
mDevicesListView.setOnItemClickListener(mDeviceClickListener);
// Ask for location permission if not already allowed
if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
mHandler = new Handler(){
public void handleMessage(android.os.Message msg){
if(msg.what == MESSAGE_READ){
String readMessage = null;
try {
readMessage = new String((byte[]) msg.obj, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
mReadBuffer.setText(readMessage);
}
if(msg.what == CONNECTING_STATUS){
if(msg.arg1 == 1)
mBluetoothStatus.setText("Connected to Device: " + (String)(msg.obj));
else
mBluetoothStatus.setText("Connection Failed");
}
}
};
if (mBTArrayAdapter == null) {
// Device does not support Bluetooth
mBluetoothStatus.setText("Status: Bluetooth not found");
Toast.makeText(getApplicationContext(),"Bluetooth device not found!",Toast.LENGTH_SHORT).show();
}
else {
mLED1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
if(mConnectedThread != null) //First check to make sure thread created
mConnectedThread.write("1");
}
});
mScanBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bluetoothOn(v);
}
});
mOffBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
bluetoothOff(v);
}
});
mListPairedDevicesBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v){
listPairedDevices(v);
}
});
mDiscoverBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
discover(v);
}
});
}
}
private void bluetoothOn(View view){
if (!mBTAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
mBluetoothStatus.setText("Bluetooth enabled");
Toast.makeText(getApplicationContext(),"Bluetooth turned on",Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(getApplicationContext(),"Bluetooth is already on", Toast.LENGTH_SHORT).show();
}
}
// Enter here after user selects "yes" or "no" to enabling radio
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent Data){
// Check which request we're responding to
if (requestCode == REQUEST_ENABLE_BT) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
// The user picked a contact.
// The Intent's data Uri identifies which contact was selected.
mBluetoothStatus.setText("Enabled");
}
else
mBluetoothStatus.setText("Disabled");
}
}
private void bluetoothOff(View view){
mBTAdapter.disable(); // turn off
mBluetoothStatus.setText("Bluetooth disabled");
Toast.makeText(getApplicationContext(),"Bluetooth turned Off", Toast.LENGTH_SHORT).show();
}
private void discover(View view){
// Check if the device is already discovering
if(mBTAdapter.isDiscovering()){
mBTAdapter.cancelDiscovery();
Toast.makeText(getApplicationContext(),"Discovery stopped",Toast.LENGTH_SHORT).show();
}
else{
if(mBTAdapter.isEnabled()) {
mBTArrayAdapter.clear(); // clear items
mBTAdapter.startDiscovery();
Toast.makeText(getApplicationContext(), "Discovery started", Toast.LENGTH_SHORT).show();
registerReceiver(blReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));
}
else{
Toast.makeText(getApplicationContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show();
}
}
}
final BroadcastReceiver blReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(action)){
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// add the name to the list
mBTArrayAdapter.add(device.getName() + "\n" + device.getAddress());
mBTArrayAdapter.notifyDataSetChanged();
}
}
};
private void listPairedDevices(View view){
mPairedDevices = mBTAdapter.getBondedDevices();
if(mBTAdapter.isEnabled()) {
// put it's one to the adapter
for (BluetoothDevice device : mPairedDevices)
mBTArrayAdapter.add(device.getName() + "\n" + device.getAddress());
Toast.makeText(getApplicationContext(), "Show Paired Devices", Toast.LENGTH_SHORT).show();
}
else
Toast.makeText(getApplicationContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show();
}
private AdapterView.OnItemClickListener mDeviceClickListener = new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {
if(!mBTAdapter.isEnabled()) {
Toast.makeText(getBaseContext(), "Bluetooth not on", Toast.LENGTH_SHORT).show();
return;
}
mBluetoothStatus.setText("Connecting...");
// Get the device MAC address, which is the last 17 chars in the View
String info = ((TextView) v).getText().toString();
final String address = info.substring(info.length() - 17);
final String name = info.substring(0,info.length() - 17);
// Spawn a new thread to avoid blocking the GUI one
new Thread()
{
public void run() {
boolean fail = false;
BluetoothDevice device = mBTAdapter.getRemoteDevice(address);
try {
mBTSocket = createBluetoothSocket(device);
} catch (IOException e) {
fail = true;
Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_SHORT).show();
}
// Establish the Bluetooth socket connection.
try {
mBTSocket.connect();
} catch (IOException e) {
try {
fail = true;
mBTSocket.close();
mHandler.obtainMessage(CONNECTING_STATUS, -1, -1)
.sendToTarget();
} catch (IOException e2) {
//insert code to deal with this
Toast.makeText(getBaseContext(), "Socket creation failed", Toast.LENGTH_SHORT).show();
}
}
if(fail == false) {
mConnectedThread = new ConnectedThread(mBTSocket);
mConnectedThread.start();
mHandler.obtainMessage(CONNECTING_STATUS, 1, -1, name)
.sendToTarget();
}
}
}.start();
}
};
private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {
try {
final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", UUID.class);
return (BluetoothSocket) m.invoke(device, BTMODULEUUID);
} catch (Exception e) {
Log.e(TAG, "Could not create Insecure RFComm Connection",e);
}
return device.createRfcommSocketToServiceRecord(BTMODULEUUID);
}
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()
// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.available();
if(bytes != 0) {
buffer = new byte[1024];
SystemClock.sleep(100); //pause and wait for rest of data. Adjust this depending on your sending speed.
bytes = mmInStream.available(); // how many bytes are ready to be read?
bytes = mmInStream.read(buffer, 0, bytes); // record how many bytes we actually read
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
.sendToTarget(); // Send the obtained bytes to the UI activity
}
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
/* Call this from the main activity to send data to the remote device */
public void write(String input) {
byte[] bytes = input.getBytes();
//converts entered String into bytes
try {
mmOutStream.write(bytes);
} catch (IOException e) { }
}
/* Call this from the main activity to shutdown the connection */
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) { }
}
}
}
References:
http://www.fao.org/docrep/field/003/ac375e/AC375E05.htm
www.ozoneapplications.com/info/orp.htm
https://www.ysi.com/parameters/orp-redox
https://envcoglobal.com/...sensors/analogue-sensors/analog-dissolved-oxygen-sensors
www.libelium.com/controlling-fish-farms-water-quality-with-smart-sensors-in-iran/
https://www.researchgate.net/.../262380185_Water_Quality_Monitoring_and_Control...
https://ieeexplore.ieee.org/document/7886720/
https://www.sciencedirect.com/science/article/pii/S1877050917329757
Download