Master Builders “Water Analyser” Arduino Project

Master Builders “Water Analyser” Arduino Project

https://youtu.be/mb66sebNbQM


Η ομάδα μας

          Η ομάδα μας ” Master Builders” δημιουργήθηκε το 2016 στα Πεύκα Θεσσαλονίκης ως μια ανεξάρτητη ομάδα ρομποτικής και απαρτίζονταν από 7 μέλη και τον μέντορα-προπονητή μας! Ο αρχικός στόχος της ομάδας μας ήταν να μάθουμε και να κατανοήσουμε την ρομποτική μεσώ των LEGO MINDSTORM. Στην συνέχεια της εξέλιξης της ομάδας μας το 2017 ξεκινήσαμε να ασχολούμαστε με μικροεπεξεργαστές όπως το ARDUINO!  Μάθαμε τον προγραμματισμό του και πως να χρησιμοποιούμε τους αισθητήρες και τους κινητήρες που μπορούμε να χρησιμοποιήσουμε με το Arduino.

 

      Άτομα Ομάδας:

  1. Βαρσαμάς Θεολόγος-Ταξιάρχης
  2. Ελευθεριάδης Νικόλαος
  3. Ομήρου Ανδρέας

      Μέντορες – Προπονητες:

  1. Βαρσαμάς Νικήτας
  2. Παπαζήσης Παναγιώτης 

 


Μόλυνση του νερού

Εισαγωγή

       Η καλή ποιότητα του νερού είναι απαραίτητη για την υγειά των υδάτινων οικοσυστημάτων μας αλλά και του ανθρωπίνου είδους. Η συνεχής παρακολούθηση της ποιότητας του νερού είναι ένα σημαντικό εργαλείο για τις αρχές διαχείρισης υδάτινων πόρων, παρέχοντας δεδομένα σε πραγματικό χρόνο για την προστασία του περιβάλλοντος και την παρακολούθηση των πηγών της ρύπανσης του νερού! Ωστόσο, η συνεχής παρακολούθηση της ποιότητας των υδάτινων πόρων σε υψηλή χρονική ανάλυση παραμένει απαγορευτικά ακριβή! Ένα προσιτό σύστημα παρακολούθησης υδάτων θα επέτρεπε την αποδοτική συλλογή δεδομένων για την ποιότητα των υδάτων, βοηθώντας την διατήρηση της υγείας των οικοσυστημάτων αυτών!

       Σε αυτό το έγγραφο, θα γίνει η ανάλυση της κατασκευής ενός χαμηλού κόστους  αισθητήρα με στόχο την καταγραφή της  φυσικοχημείας του  νερού . Τα αποτελέσματα που υπήρξαν μετά το πέρας της κατασκευής δείχνουν ότι με την κατάλληλη βαθμονόμησης ,  μπορεί να δημιουργηθεί ένα αξιόπιστο σύστημα παρακολούθησης . Αυτό θα επιτρέψει στον κάτοχο αυτής της συσκευής  να μπορεί να παρακολουθεί συνεχώς την ποιότητα του νερού σε υψηλή ανάλυση  και να διατηρηθεί αυτή η επιτήρηση για μεγάλο χρονικό διάστημα. Επιπλέον, βοηθάει στην κατανόηση και τη συμπεριφορά των υδρόβιων ζώων σε σχέση με τη ρύπανση των υδάτων.Η διατήρηση της καλής ποιότητας των υδάτων σε ποτάμια και ρέματα αφορά τόσο τους ανθρώπους όσο και τα υδάτινα οικοσυστήματα.

      Το νερό είναι το απαραίτητο στοιχείο για να ζήσουν οι άνθρωποι. Ομοίως,  η αρχή αυτή ισχύει και στα αμφίβια και στα υδρόβια ζώα. Οποιαδήποτε ανισορροπία στην ποιότητα του νερού θα επηρέαζε σοβαρά την υγεία των ανθρώπων και ταυτόχρονα την οικολογική ισορροπία μεταξύ των ειδών . Ως εκ τούτου, είναι πρωταρχικής σημασίας η προστασία της ποιότητας του νερού. Η ρύπανση των υδάτων παραμένει ένας βασικός παράγοντας που συμβάλλει στην πτώση της οικολογικής υγείας στα υδρόβια οικοσυστήματα παγκοσμίως. Η Αυστραλία και το κράτος της Βικτώριας αντιμετωπίζουν μεγάλο πρόβλημα στη διατήρηση της ποιότητας των υδάτων στα συστήματα γλυκού νερού. Σχεδόν το 80% των υδάτινων οδών στη Βικτώρια είναι σε κακή έως μέτρια κατάσταση. Οι προσπάθειες αποκατάστασης παρεμποδίζονται από τη δυσκολία της διάγνωσης των αιτίων της περιβαλλοντικής υποβάθμισης. Επί του παρόντος, πραγματοποιείται παρακολούθηση της ποιότητας των υδάτων χαμηλής ανάλυσης με δείγματα νερού που συλλέγονται σε τακτά χρονικά διαστήματα για χημικά ανάλυση στο εργαστήριο.

Τα μειονεκτήματα αυτής της προσέγγισης είναι:

α) Η συλλογή δεδομένων είναι αποσπασματική σε χώρο και χρόνο, τόσο σποραδική με αποτέλεσμα τα γεγονότα ρύπανσης να μπορούν εύκολα να χαθούν.

β) Χρονοβόρα και ακριβή για το προσωπικό , να συλλέγει δείγματα νερού , να τα επιστρέψει στο εργαστήριο για να γίνει η ανάλυση του και η επανάληψη της ίδια διαδικασίας για διαφορετικούς υδάτινους πόρους.

γ) Υπάρχουν ορισμένες βιολογικές και χημικές διεργασίες όπως το δυναμικό μείωσης της οξείδωσης που είναι απαραίτητο η μέτρηση να γίνεται επί τόπου για να εξασφαλίζεται η ακρίβεια του αποτελέσματος.

δ) Οι εργαστηριακές δοκιμές έχουν πολύ πιο αργό χρόνο επαναπαρακολούθησης σε σύγκριση με την δυναμική παρακολούθηση της ποιότητας του νερού.

ε) Η ερμηνεία των δεδομένων που συλλέγονται μεταξύ διαφορετικών εποχών είναι δύσκολη, καθώς τα δεδομένα είναι αραιά  στο διάστημα του χρόνου με αποτέλεσμα να υπάρχουν μεγάλες διαφορές από δείγμα σε δείγμα.


Το Project μας

            Με βάση το παραπάνω πρόβλημα που έχει δημιουργηθεί η ιδέα που εμπνεύστηκε η ομάδα είναι η κατασκευή ενός αναλυτής νερού με την χρήση του  Arduino . Στόχος είναι η κατασκευή μιας οικονομικής-καινοτόμου λύσης ώστε να μπορεί ο άνθρωπος να διαπιστώνει αν μπορεί να χρησιμοποιήσει το νερό π.χ. από μια πηγή,ένα πηγάδι ακόμα και από μια λίμνη χωρίς να είναι επικίνδυνο για τον οργανισμό του . Ακόμα και στα μεγάλα αστικά κέντρα θα μπορούσε να φανεί χρήσιμο μετά από μια διακοπή νερού να γνωρίζει αν το νερό έχει επανέλθει στα προβλεπόμενα επίπεδα χρήσης του κεντρικού δικτύου.

             Επίσης ο αναλυτής νερού μπορεί να χρησιμοποιηθεί και σε βιολογικές καλλιέργειες, ώστε να μπορούν να καλλιεργούνται βιολογικά προϊόντα βάση των πιστοποιήσεων που πρέπει να έχουν! Το αυτοματοποιημένο σύστημα άρδευσης των καλλιεργειών επιτρέπει να περνάει ένας προκαθορισμένος και εκλεγμένος όγκος νερού κατάλληλος για τις βιολογικές καλλιέργειες! Η εφαρμογή αυτοματισμού στις αρδεύσεις μπορεί να είναι εφικτή ακόμα και όταν υπάρχει απουσία ηλεκτρικού ρεύματος! Χρησιμοποιούνται ηλεκτροβαλβίδες 24V AC, στις οποίες οι εντολές μεταφέρονται ως ηλεκτρικό σήμα και ο έλεγχος τους γίνεται μέσω απομακρυσμένων εκλεκτών-προγραμματιστών άρδευσης! Η εγκατάσταση και λειτουργία των βελτιωμένων συστημάτων άρδευσης είναι μια διαδικασία που ξεκινάει με την ορθή εκτίμηση και αξιολόγηση των δεδομένων του περιλαμβάνουν το είδος της υπό άρδευση φυτείας, την ποιότητα του διαθέσιμου νερού, καθώς και τα χαρακτηριστικά του εδάφους!


Υλικά  για την υλοποίηση του Project

1) Αντλία νερού για την ροή μαζί με ένα αισθητήρα ροής για μέτρηση των λίτρων χρήσης (Water flow sensor)

2)Αισθητήρα θολότητας (Turbidity Sensor Suspended Turbidity Value Detection Module     Kit Liquid Suspended Particles Turbidity Detection)


         Ο αισθητήρας θολότητας εντοπίζει την ποιότητα του νερού μετρώντας το επίπεδο θολερότητας. Είναι σε θέση να ανιχνεύσει αιωρούμενα σωματίδια στο νερό μετρώντας τη διαπερατότητα του φωτός και το ρυθμό σκέδασης που αλλάζει με την ποσότητα των ολικών αιωρούμενων στερεών (TSS) στο νερό. Καθώς αυξάνεται το TTS, αυξάνεται το επίπεδο θολότητας υγρού.Αυτός ο αισθητήρας διαθέτει και λειτουργίες εξόδου σήματος αναλογικού και ψηφιακού σήματος. Μπορείτε να επιλέξετε τη λειτουργία σύμφωνα με το MCU καθώς το κατώφλι είναι ρυθμιζόμενο σε λειτουργία ψηφιακού σήματος.Οι αισθητήρες θολότητας μπορούν να χρησιμοποιηθούν για τη μέτρηση της ποιότητας των υδάτων σε ποτάμια και ρέματα, μετρήσεις λυμάτων και αποβλήτων, έρευνα μεταφοράς ιζημάτων και εργαστηριακές μετρήσεις.

3)Αισθητήρα θερμοκρασίας μαζί με το αδιάβροχο καλώδιο προέκτασης (tainless steel     package Waterproof DS18b20 temperature probe temperature sensor 18B20 For   Arduino) 

4)Αισθητήρα μέτρησης Ph (Liquid PH Value Detection Detect Regulator Sensor Module     Monitoring Control Meter Tester PH 0-14 For Arduino) 

 

 

            Τον αναλογικό  pH μετρητή, ειδικά σχεδιασμένο για ελεγκτές Arduino. Η σύνδεση με το Arduino είναι απλή και εύκολη για να έχετε μετρήσεις pH σε ± 0.1pH (25 ℃). Για τους περισσότερους χομπίστες, αυτό το μεγάλο εύρος ακρίβειας και το χαμηλό κόστος τους καθιστά ένα εξαιρετικό εργαλείο για βιοβιοτικά και άλλα έργα!

Χαρακτηριστικά :
Ισχύς αισθητήρα: 5.00V
Μέγεθος αισθητήρα: 43mm × 32mm
Εύρος μέτρησης: 0-14PH
Θερμοκρασία μέτρησης: 0-60 βαθμοί κελσίου
Ακρίβεια: ± 0.1pH
Χρόνος απόκρισης: ≤ 1 λεπτό

 

 5)Arduino Uno R3 με παρελκομενα 

6)12V Solenoid Valve – 3/4″ ηλεκτροβαλβίδα ροής 

7)Αισθητήρας διαληθέντων στερέων Analog TDS Sensor/Meter for Arduino

     Αυτός είναι ένας συμβατικός με Arduino αισθητήρας / μετρητής TDS για την μέτρηση της τιμής TDS του νερού, για να αντικατοπτρίζει την καθαρότητα του νερού. Μπορεί να εφαρμοστεί σε οικιακό νερό, υδροπονικό και άλλους τομείς της ποιότητας των υδάτων . Το TDS (Total Dissolved Solids) δείχνει  πόσα χιλιοστόγραμμα διαλυτών στερεών διαλύονται σε ένα λίτρο νερού. Γενικά, όσο υψηλότερη είναι η τιμή TDS, τόσο πιο διαλυτά στερεά διαλύονται σε νερό και τόσο λιγότερο καθαρίζεται το νερό. Ως εκ τούτου, η τιμή TDS μπορεί να χρησιμοποιηθεί ως μια από τις αναφορές για να αντικατοπτρίζει την καθαρότητα του νερού.

      Το στυλό TDS είναι ένας ευρέως χρησιμοποιούμενος εξοπλισμός για τη μέτρηση της τιμής TDS. Η τιμή είναι προσιτή και είναι εύκολη στη χρήση, αλλά δεν είναι σε θέση να μεταδώσει δεδομένα στο σύστημα ελέγχου για επιγραμμική παρακολούθηση για να κάνει κάποια ανάλυση ποιότητας νερού. Το επαγγελματικό εργαλείο έχει υψηλή ακρίβεια και μπορεί να στείλει δεδομένα στο σύστημα ελέγχου, αλλά η τιμή είναι δαπανηρή .  Σε συνδυασμό με τον ελεγκτή Arduino, μπορείτε να κατασκευάσετε έναν ανιχνευτή TDS, ο οποίος θα μετρά εύκολα την τιμή TDS του υγρού. Αυτό το προϊόν υποστηρίζει εισόδου τάσης 3,3 ~ 5,5V και αναλογική έξοδο τάσης 0 ~ 2,3V, γεγονός που το καθιστά συμβατό με σύστημα ελέγχου ή πίνακα ελέγχου 5V ή 3,3V. Η πηγή διέγερσης είναι σήμα AC, το οποίο μπορεί να εμποδίσει αποτελεσματικά τον αισθητήρα από την πόλωση και να παρατείνει τη διάρκεια ζωής του καθετήρα, εν τω μεταξύ, να αυξήσει τη σταθερότητα του σήματος εξόδου. Ο ανιχνευτής TDS είναι αδιάβροχος, μπορεί να βυθιστεί στο νερό για μεγάλη μέτρηση χρόνου.

      Αυτό το προϊόν μπορεί να χρησιμοποιηθεί σε εφαρμογές ποιότητας νερού, όπως οικιακό νερό, υδροπονία. Με αυτό το προϊόν, μπορείτε εύκολα να φτιάξετε έναν ανιχνευτή TDS που να αντικατοπτρίζει την καθαρότητα του νερού για να προστατεύσει την υγεία σας.

8)Αγωγημόμετρο Analog Electrical Conductivity Sensor / Meter For Arduino

Γιατί μετράτε την EC (Ηλεκτρική Αγωγιμότητα); Η αλατότητα του εδάφους, τα συστήματα νερού άρδευσης ή τα διαλύματα λιπασμάτων είναι μια σημαντική παράμετρος που επηρεάζει το περιβάλλον της ριζικής ζώνης των φυτών. Οποιοσδήποτε από αυτούς τους παράγοντες μπορεί να έχει σημαντική επίδραση στην ανάπτυξη και την ποιότητα των φυτών. Η παρουσία υψηλών επιπέδων αλατιού είναι το προειδοποιητικό σημάδι σας για να κάνετε προσαρμογές. Τα χαμηλά επίπεδα αλατιού θα μπορούσαν να οδηγήσουν σε ανεπάρκειες θρεπτικών ουσιών. Μην περιμένετε για πρόβλημα, μετρήστε πριν εμφανιστεί η ζημιά στα φυτά σας. Όσον αφορά το υγρό, χρησιμοποιούμε συχνά την αντίστροφη αντίσταση, η οποία είναι αγωγιμότητα, ως μέτρηση. Η αγωγιμότητα του νερού μπορεί να αντανακλά το επίπεδο των ηλεκτρολυτών που υπάρχουν στο νερό. Ανάλογα με τη συγκέντρωση του ηλεκτρολύτη, η αγωγιμότητα του υδατικού διαλύματος είναι διαφορετική.

    Αυτός ο αναλογικός μετρητής EC είναι μοναδικός. Έχει σχεδιαστεί ειδικά για ελεγκτές Arduino και έχει ενσωματωμένα απλά, βολικά και πρακτικά χαρακτηριστικά. Μετά απλές συνδέσεις σύμφωνα με το διάγραμμα μας και μεταφόρτωση του προγράμματος, θα μπορείτε να μετρήσετε εύκολα την τιμή της ΕΚ.

    Για να διευκολυνθεί η δυσκολία χρήσης αυτού του αισθητήρα, μια διασύνδεση Gravity είναι προσαρμοσμένη ώστε να επιτρέπει το plug & play. Η ασπίδα επέκτασης Arduino IO είναι ο καλύτερος συνδυασμός για αυτό το senior που συνδέει το Arduino σας.

ΕΦΑΡΜΟΓΕΣ:

  • Παρακολούθηση της ποιότητας του νερού.
  • Υδατοκαλλιέργεια.
  • Υδροπονικό και ακουανονικό.

9)Αισθητήρας στάθμης νερού Non-Contact Digital Water / Liquid Level Sensor For Arduino

      Αυτός είναι ένας αισθητήρας στάθμης νερού / υγρού χωρίς επαφή για το Arduino. Χρησιμοποιεί προηγμένη τεχνολογία επεξεργασίας σήματος χρησιμοποιώντας ένα ισχυρό τσιπ (XKC-Y25-T12V) με ικανότητα λειτουργίας υψηλής ταχύτητας για την επίτευξη ανίχνευσης στάθμης υγρού χωρίς επαφή. Καμία επαφή με το υγρό δεν καθιστά το δομοστοιχείο κατάλληλο για επικίνδυνες εφαρμογές όπως η ανίχνευση τοξικών ουσιών, ισχυρών οξέων, ισχυρών αλκαλίων και όλων των ειδών υγρών σε αεροστεγές δοχείο υπό υψηλή πίεση. Δεν υπάρχουν ειδικές απαιτήσεις για το υγρό ή το δοχείο και αυτός ο αισθητήρας υγρού είναι εύκολος στη χρήση και εύκολος στην εγκατάσταση.

10)Η/Υ

11)2 δοχεία μαζί με σωληνώσεις για υλοποίηση δοκιμών

Κόστος κατασκευής:

Το συνολικό κόστος κατασκευής του αναλυτή νερού ανέρχεται στα 185,67 € με τα μεταφορικά μαζί όπως αναγράφονται στον πίνακα της παραγγελιάς που πραγματοποιήθηκε από εμάς στην HELLAS DIGITAL! Ο αισθητήριας του PH και της Θολότητας υπήρχαν από παλαιότερα Project της ομάδας όπως και της μέτρησης ροής υγρών το κοστος των οποιων ηταν 53 €!

Προϊόν Τιμή Ποσότητα Υποσύνολο

12V Solenoid Valve – 3/4″ (ROB-10456)

Κωδικός είδους: 072.0100
€9.63  1  €9.63

Arduino Mega DIY Basic learning kit

Κωδικός είδους: 070.9574
€32.00  1  €32.00
€58.00  1  €58.00

Gravity: Analog TDS Sensor/Meter for Arduino(SEN0244)

Κωδικός είδους: 074.0289
€15.75  1  €15.75
€13.80  1  €13.80

Immersible Pump & WaterTube (FIT0200)

Κωδικός είδους: 074.0067
€10.80  1  €10.80

Waterproof DS18B20 Sensor Kit(KIT0021)

Κωδικός είδους: 074.0221
€6.93  1  €6.93

Περιγραφή λειτουργίας του Project μας “Αναλυτή νερού”


Κώδικας “Αναλυτή νερού”

Water Pump

int pump_pin = 7 ;//dilosi oti sto pin 7 tou arduino exei sundethei to water pump

void setup(){

pinMode(pump_pin,OUTPUT); //dilosi oti to water pump einai eksodos

}
void loop(){

digitaWrite(pump_pin,HIGH); //anoigoume to water pump prokeimenou na arxisei na trexei to nero

}

Flow sensor

byte statusLed = 13;

byte sensorInterrupt = 0; // 0 = digital pin 2
byte sensorPin = 2;

// The hall-effect flow sensor outputs approximately 4.5 pulses per second per
// litre/minute of flow.
float calibrationFactor = 4.5;

volatile byte pulseCount;

float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres;

unsigned long oldTime;

void setup()
{

// Initialize a serial connection for reporting values to the host
Serial.begin(9600);

// Set up the status LED line as an output
pinMode(statusLed, OUTPUT);
digitalWrite(statusLed, HIGH); // We have an active-low LED attached

pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH);

pulseCount = 0;
flowRate = 0.0;
flowMilliLitres = 0;
totalMilliLitres = 0;
oldTime = 0;

// The Hall-effect sensor is connected to pin 2 which uses interrupt 0.
// Configured to trigger on a FALLING state change (transition from HIGH
// state to LOW state)
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}

/**
* Main program loop
*/
void loop()
{

if((millis() – oldTime) > 1000) // Only process counters once per second
{
// Disable the interrupt while calculating flow rate and sending the value to
// the host
detachInterrupt(sensorInterrupt);

// Because this loop may not complete in exactly 1 second intervals we calculate
// the number of milliseconds that have passed since the last execution and use
// that to scale the output. We also apply the calibrationFactor to scale the output
// based on the number of pulses per second per units of measure (litres/minute in
// this case) coming from the sensor.
flowRate = ((1000.0 / (millis() – oldTime)) * pulseCount) / calibrationFactor;

// Note the time this processing pass was executed. Note that because we’ve
// disabled interrupts the millis() function won’t actually be incrementing right
// at this point, but it will still return the value it was set to just before
// interrupts went away.
oldTime = millis();

// Divide the flow rate in litres/minute by 60 to determine how many litres have
// passed through the sensor in this 1 second interval, then multiply by 1000 to
// convert to millilitres.
flowMilliLitres = (flowRate / 60) * 1000;

// Add the millilitres passed in this second to the cumulative total
totalMilliLitres += flowMilliLitres;

unsigned int frac;

// Print the flow rate for this second in litres / minute
Serial.print(“Flow rate: “);
Serial.print(int(flowRate)); // Print the integer part of the variable
Serial.print(“L/min”);
Serial.print(“\t”); // Print tab space

// Print the cumulative total of litres flowed since starting
Serial.print(“Output Liquid Quantity: “);
Serial.print(totalMilliLitres);
Serial.println(“mL”);
Serial.print(“\t”); // Print tab space
Serial.print(totalMilliLitres/1000);
Serial.print(“L”);

// Reset the pulse counter so we can start incrementing again
pulseCount = 0;

// Enable the interrupt again now that we’ve finished sending output
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
}

/*
Insterrupt Service Routine
*/
void pulseCounter()
{
// Increment the pulse counter
pulseCount++;
}

Water level sensor

int water_level = 50 ; //metavliti pou mas deixei se poio pin tou arduino exei sundethei o aisthitiras
bool water_level_value; //metavliti pou anaferetai sto an exei erthei to epipedo tou nerou ekei pou theloume emeis

void setup(){

pinMode(water_level,INPUT); //dilosi tou aisthitira os eisodo
}

void loop(){
water_level_value = digitalRead(water_level);//diavasma tis timis tou aisthitira

if(water_level_value == 1){ //an einai to water_level_value = 1 tote auto simenei pos to doxeio exei gemisei nero mexri ekei pou theloume

//tha prepei na stamatiso tin roi apo to water pump

}

Turbidity sensor

const int SENSOR = A2; //i metavliti sensor mas dilonei se poio pin tou arduino einai sundemenos o aisthitiras
float voltage; //metavliti pou anaferete sta mvolt pou vgazei os eksodo o aisthitiras analoga me to deigma
float turbidity; //metavliti pou mas deixnei tin timi tis tholotitas tou deigmatos

void setup(){

pinMode(SENSOR,INPUT); //dilosi tou aisthitira os eisodo
}
void loop()
{
voltage=0.004888*analogRead(SENSOR); //input voltage
turbidity=-1120.4*voltage*voltage+5742.3*voltage-4352.9; //me auti tin sunartisi mporoume na metatrepsoume ta volt se ph
Serial.println(” Turbidity=”+String(turbidity)+” NTU”); //emfanisi tis leksis turbidity = kai dipla tin timi tis tholotitas tou aisthitira sto monitor
delay(1000); //perimenoume 1 deuteroleto
}

TDS sensor

#include “GravityTDS.h”

#define TdsSensorPin A3
GravityTDS gravityTds;

float temperature1 = 25,tdsValue = 0;

void setup(){

gravityTds.setPin(TdsSensorPin); //dilosi gia to pin pou einai sindemenos o tds sensor
gravityTds.setAref(5.0); //reference voltage on ADC, default 5.0V on Arduino UNO
gravityTds.setAdcRange(1024); //1024 for 10bit ADC;4096 for 12bit ADC
gravityTds.begin(); //initialization

}

void loop(){

// temperature = readTemperature(); //o aisthitiras autos exei kai tin epilogi metrisis thermokrasias gia ton logo auto exei mpei auti i entoli se sxolia giati emeis xrisimopoioume ton ds
gravityTds.setTemperature(temperature1); // auti i sinartisi exei os orisma tin thermokrasia tou igrou giati analoga me autin exoume kai diaforetikes times tds
gravityTds.update(); //sample and calculate
tdsValue = gravityTds.getTdsValue(); // me auton ton tropo diavazoume tin timi tou tds

}

Ph sensor

float calibration = 22.00; //auti einai i timi kalimprarismatos tou aisthitira gia paradigma otan ton evala se nero pou eixe gnosto px (7) mou edine timi -15 ara prosthesa 22 kai eixa ton arithmo 7
const int analogInPin = A1; //i metavliti analogInPin mas enimeronei gia to pin pou einai sundemeno to ph sensor me to arduino
int sensorValue = 0; //arxikopoiisi tis timis tou aisthitira
unsigned long int avgValue; // metavliti pou anaferetai ston meso oro ton timon tou aisthitira
float b; // voithitiki metavliti
int buf[10],temp; // dilosi enos pinaka buffer gia na mporeso na eisago 10 deigmata kai na paro ton meso oro apo auta
float phValue ; // metavliti pou mas deixnei tin timi pou exei to ph
float pHVol; // metavliti pou mas deixei tin timi ton volt pou vgazei os eksodo o aisthitiras analoga me tis diaforetikes times ph pou pernoume apo to deigma mas

void setup()
{
pinMode(analogInPin,INPUT); //dilosi tou aisthitira oti einai eisodos sto arduino
}

void loop(){

for(int i=0;i<10;i++) //for loop gia na gemiso ton pinaka me ta 10 deigmata
{
buf[i]=analogRead(analogInPin); //vazo se kathe thesi tou pinaka tin timi pou diavazei to arduino apo ton aisthitira
delay(30); //perimeno gia 30 ms
}
for(int i=0;i<9;i++) //taksinomisi tou pinaka etsi oste stis pano theseis na vriskontai oi megales times tou ph
{
for(int j=i+1;j<10;j++)
{
if(buf[i]>buf[j])
{
temp=buf[i];
buf[i]=buf[j];
buf[j]=temp;
}
}
}
avgValue=0; //arxikopoisi tis mesis timis
for(int i=2;i<8;i++) //aferesi tou proton 2 kai teleftaion 2 akraion deigmaton giati theloume ton meso oro kai logika se ekeines tis thesis tha uparxoun polu megala i polu mikra noumera
avgValue+=buf[i]; //upologismos tou mesou orou
pHVol=(float)avgValue*5.0/1024/6; //upologismos ton mvolt pou dinei os eksodo o aisthitiras
phValue = -5.70 * pHVol + calibration; //upologismos tis timis tou ph me vasi ta mvolt pou dinei os eksodo o aisthitiras
Serial.print(“sensor = “); //ektiposi tis leksis sensor = sto monitor
Serial.println(phValue); //ektiposi tis timis tou ph sto monitor

delay(500); // perimenoume gia 0.5 deuterolepta

}

Electrical conductivity sensor and waterproof temperature sensor

#include <OneWire.h> //eisagogi tis vivliothikis onewire
#include <EEPROM.h> //eisagogi tis vivliothikis eeprom

#define StartConvert 0 //metavliti pou anaferetai poses fores exei diavastei timi apo ton aisthitira ds.Ksekiname apo to 0
#define ReadTemperature 1 //voithitiki metavliti gia to diavasma tou ds aisthitira

const byte numReadings = 20; //the number of sample times
byte ECsensorPin = A0; //metavliti pou mas deixnei se poio pin tou arduino exo sundesei ton ec aisthitira
byte DS18B20_Pin = 6; //metavliti pou mas deixnei se poio pin exo sundesei ton ds18b20 aisthitira

unsigned int AnalogSampleInterval=25,printInterval=1000,tempSampleInterval=850; //analog sample interval;serial print interval;temperature sample interval
unsigned int readings[numReadings]; // the readings from the analog input
byte index = 0; // 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,TempCoefficient,CoefficientVolatge;

//Temperature chip i/o
OneWire ds(DS18B20_Pin); // on digital pin 6

void setup()
{

//gia ton ec kai ton ds
// initialize all the readings to 0:
for(byte thisReading=0;thisReading<numReadings;thisReading++) readings[thisReading]=0;
TempProcess(StartConvert); //let the DS18B20 start the convert

pinMode(DS18B20_Pin,INPUT);
pinMode(ECsensorPin,INPUT);

}
void loop(){
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(“Voltage: “);
Serial.print(averageVoltage); //millivolt average,from 0mv to 4995mV
Serial.print(“mV\tTemperature: “);
Serial.print(temperature); //current temperature
Serial.print(“degC\tEC: “);

TempCoefficient=1.0+0.0185*(temperature-25.0); //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.0185*(fTP-25.0));
CoefficientVolatge=(float)averageVoltage/TempCoefficient;
if(CoefficientVolatge<150) 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+4322; //10ms/cm<EC<20ms/cm
ECcurrent/=1000; //convert us/cm to ms/cm
Serial.print(ECcurrent,2); //two decimal
Serial.println(“ms/cm”);
}
}
}
/*
ch=0,let the DS18B20 start the convert;ch=1,MCU read the current temperature from the DS18B20.
*/
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;
}

Lcd

#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; // dilosi gia tin sindesi tis othonis lcd me to arduino
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup(){

lcd.begin(16,2); //ksekinima tis diepafis metaksi lcd kai arduino

lcd.setCursor(0,0); //topothetisi tou kersora stin proti grami kai proti stili
lcd.print(” WATER ANALYSIS “); //grapsimo tis leksis water analysis stin othoni lcd
lcd.setCursor(0,1); //topothetisi tou kersora stin proti grami alla stin deuteri stili auti tin fora
lcd.print(” LOADING…”); //grapsimo tis leksis loading se ekeini akrivos tin thesi(2h stili)
delay(5000); //perimenoume gia 5 deuterolepta

}

void loop(){

lcd.setCursor(0,0); //epanatopothetisi tou kersora stin proti grammi kai stili gia tin ektuposi neas leksis
lcd.print(“PH = “+String(phValue)+” “); //grapsimo tis leksis ph = kai apo dipla tin timi tou ph pou pernoume os eisodo apo to arduino
lcd.setCursor(0,1); //topothetisi tou kersora stin proti grammi kai deuteri stili
delay(100); //perimenoume gia 100 ms.

lcd.print(“Turb=”+String(turbidity)+” NTU”); //grapsimo tis leksis turb = kai apo dipla tin timi pou pernoume os eisodo apo ton turbidity sensor kai telos i monada metrisis ntu
lcd.setCursor(0,0); //topothetisi tou kersora stin proti grammi proti stili
delay(2000); //perimenoume gia 2 deuterolepta

lcd.print(“TDS =”+String(tdsValue)+” ppm “); //grapsimo tis leksis tds = kai apo dipla tin timi tou tds pou pernoume os eisodo apo ton tds sensor
lcd.setCursor(0,1); //topothetisi tou kersora stin proti grammi deuteri stili
delay(2000);

lcd.print(“EC = “+String(ECcurrent)+”MS/CM”); //grapsimo tis leksis ec kai apo dipla tin timi tou ec current pou to pairnoume eisodo apo to ec sensor kai apo dipla tin monada metrisis ms/cm
lcd.setCursor(0,0); //topothetisi tou kersora stin proti seira kai proti stili
delay(2000); //perimenoume 2 deuterolepta

lcd.print(“TEMP = “+String(temperature)+” Cel”); //grapsimo stin othoni tis leksis temp = kai apo dipla tin timi tis thermokrasias pou tin pernoume os eisodo apo ton ds18b20 sensor kai dipla i monada metrisis cel
delay(2000); //perimenoume 2 deuterolepta

}

 


Εγγραφη στο Git hub: