Sonda pH cz.3 Test urządzenia

Po dosyć obszernej teorii którą mogliście przeczytać w części pierwszej oraz drugiej przyszedł czas na prezentację. Poniżej zaprezentowanych zostało kilka skryptów zastępujących oryginalny skrypt dostępny w internecie. Sonda pH została dostarczona ze sklepu Kamami.pl

 Pomiar wartości pH jest jednym z ważniejszych zaraz po temperaturze parametrów w akwarystyce. Jak pisałem w poprzednich częściach sposobów jego mierzenia jest kilka. W tej części skupię się na podłączeniu do Arduino. Dzięki temu sonda pH będzie w stanie w łatwy sposób pokazywać wartość pH a docelowo sterować elektrozaworem.

Sonda pH dostępna w sklepie Kamami.pl składa się z następujących elementów:

  • Czujnik pH ze złączem BNC x 1
  • Adapter ze złączem w standardzie Gravity
  • Kabel połączeniowy

Całość zapakowane w pudełko wyłożone gąbką zabezpieczającą moduły przed uszkodzeniem. Możecie to zobaczyć na zdjęciach poniżej oraz na filmie.

Najważniejsze właściwości urządzenia:

  • Zasilanie: 5 V
  • Wielkość adaptera: 43×32 mm
  • Adapter wykonany w standardzie Gravity
  • Zakres pomiaru: 0-14 pH
  • Temperatura pracy: 0-60℃
  • Dokładność pomiaru: ±0,1 pH (25℃)
  • Czas reakcji: ≤ 1 min.
  • Czujnik pH ze złączem BNC
  • Regulacja poziomu sygnału analogowego (potencjometr)
  • Dioda LED (zasilanie)

Płytka jak widać na poniższym filmie ma małe rozmiary a jej podłączenie do Arduino nie stanowi żadnych problemów. Na rynku dostępne są nakładki na Arduino Uno od Gravity. Można też użyć takiej płytki pokazanej na filmie. Posiada ona wszystkie wyprowadzenia z Arduino Nano przedstawione na filmie.

Dostępny w poprzednich częściach oryginalny kod został dość mocno zmieniony. Dodana została biblioteka „Average” (ang. Średnia) która pozwala używać bezproblemowy sposób

Sondy pH (każdy model i producent) działają poprawnie w wodzie stojącej. Wtedy odczyty są stabilne. Problemy pojawiają się po włożeniu takiej sondy do poruszającej się wody. Nawet w spokojnym rogu akwarium jest na tyle duży ruch wody, że odczyty z sondy wtedy bardzo skaczą. Jeśli nie mamy podpiętego przekaźnika – nie stanowi to większego problemu. Mając podłączone przekaźniki istnieje prawdopodobieństwo uszkodzenia ich przez ciągłe włączanie i wyłączanie. Warto też wspomnieć że uruchamianie się przekaźnika powoduje nieprzyjemne „cykanie” co też jest dość irytujące.

Modyfikacja skryptów za pomocą nowej biblioteki „Average”.

Rozwiązaniem tej kwestii jest właśnie biblioteka Average dostępna w dziale do pobrania. Poniżej przedstawiony jest oryginalny kod pokazujący obliczanie średniej wartości z dowolnej ilości pomiarów (oczywiście w granicach zdrowego rozsądku). Pokazuje także wartości minimalne oraz maksymalne i ich pozycje. Zasada jego działania jest prosta – wpisujemy ilość pomiarów, z których ma być brana średnia. Po wgraniu tego kodu uzyskujecie informacje na serial monitorze o wartości średniej, maksymalnej i minimalnej. Dodatkowo uzyskujemy informacje, na której pozycji aktualnie jest wartość minimalna oraz maksymalna.

#include <Average.h>
int ilosc = 20;              //ilość pomiarów z których brana jest średnia
Average<float> ave(ilosc);
void setup()
   {
      Serial.begin(9600);
   }
void loop()
   {
      int minat = 0;
      int maxat = 0;
      ave.push(random(10));
      Serial.println();
      Serial.print("Srednia: ");
      Serial.print(ave.mean());
      Serial.print("   Maksymalna: ");
      Serial.print(ave.maximum(&maxat));
      Serial.print(" Na pozycji: ");
      Serial.print(maxat+1);
      Serial.print("   Minimalna: ");
      Serial.print(ave.minimum(&minat));
      Serial.print(" Na pozycji: ");
      Serial.print(minat+1);
      Serial.print("     ");
      for (int i = 0; i < ilosc; i++)
         {
            Serial.print(ave.get(i),0);
            Serial.print(" ");
         }
      //site http://www.mn-tech.pl 
      //youtube https://www.youtube.com/user/mntechpl 
      //facebook https://www.facebook.com/mntechpl
      delay(1000);
   }

Powyższy kod pokazuje w dość ogólnym stopniu jak działa ta biblioteka. Dzięki kilku prostym komendom otrzymujemy wartości uśrednione, które w znaczny sposób powodują to, że nasz wynik jest bardziej wiarygodny i odporny na chwilowe zakłócenia. 

Jeśli chodzi o zintegrowanie biblioteki Average z kodem pokazanym w poprzedniej części skrypt przedstawia się  następująco:

#include <Average.h>
Average<float> sredniaPH(100);             //średnia ze 100 pomiarów
void setup()
   {
      Serial.begin(9600);    
   }
void loop()
   {
      int Volty = analogRead(A7);
      float V =(float) Volty * 5.0 / 1024.0;
      float peha =(float) V*2.8;
      sredniaPH.push(peha); 
      sredniaPH.mean(); 
      float pH =((float) sredniaPH.mean());
      Serial.println(pH);                              
      //site http://www.mn-tech.pl 
      //youtube https://www.youtube.com/user/mntechpl 
      //facebook https://www.facebook.com/mntechpl
      delay(1000)
   }

Po porównaniu działania powyższego kodu z oryginalnym widać wyraźnie brak gwałtownych skoków i większą stabilność działania.

Natomiast łącząc powyższy kod z kodem który został pokazany w części drugiej dostajemy taki oto wynik.

#include <Average.h> 
Average<float> sredniaPH(100);             //tu deklarujemy ilość wykonywanych pomiarów
int S1 = 2; 
int S2 = 3;
int O2; 
int CO2;
int pHd = 6.5; //tu deklarujemy dolną wartość pH
int pHs = 7; //tu deklarujemy środkową wartość pH 
int pHg = 7.5; //tu deklarujemy górną wartość pH
void setup() 
   {
      pinMode(S1, OUTPUT); //elektrozawór CO2
      pinMode(S2, OUTPUT); //napowietrzacz
      Serial.begin(9600);
   }
void loop() 
   {
      int Volty = analogRead(A7);
      float V =(float) Volty * 5.0 / 1024.0;
      float peha =(float) V*2.8;
 
      sredniaPH.push(peha); 
      sredniaPH.mean(); 
      float pH =((float) sredniaPH.mean());

      if(pH<pHd)
         {
            O2 = 1;
         }
      else if(pHs<=pH)
         {
            O2 = 0;
         }
      else
         {
         }
      if(pH<pHs)
         {
            CO2 = 0;
         }
      else if(pHg<=pH)
         {
            CO2 = 1;
         }
      else
         {
         }
      if(O2 == 1)
         { 
            digitalWrite(S1,LOW);
            Serial.print("co2- on ");
         }
      if(O2 == 0)
         { 
            digitalWrite(S1,HIGH);
            Serial.print("co2-off ");
         }
      else
         {
         }
      if(CO2 == 1)
         { 
            digitalWrite(S2,LOW);
            Serial.print("O2- on ");
         }
      if(CO2 == 0)
         { 
            digitalWrite(S1,HIGH);
            Serial.print("O2-off ");
         }
      else
         {
         } 
      Serial.println(pH);   
      delay(500); 
      //site http://www.mn-tech.pl 
      //youtube https://www.youtube.com/user/mntechpl 
      //facebook https://www.facebook.com/mntechpl
   }

Testy sondy pH wraz z zaimplementowanym skryptem do uśredniania wartości.

Wykresy poniżej przedstawiają wyniki pomiarów odpowiednio dla 1 pomiaru (bez uśredniania), 10, 50, 100 oraz 200 pomiarów wykonanych  w ciągu 200 sekund. Sonda pH została zamontowana na przeciw wylotu filtra w celu uzyskania jak największych różnic jeśli chodzi o wyniki. Oczywiście docelowo sonda pH będzie w miejscu, które jest najmniej narażone na ruchy wody aby jeszcze dodatkowo spłaszczyć wyniki. Czas oczekiwania przed wykonaniem pomiarów wynosił 200 sekund. Dzięki temu wyniki nie były narażone na zmiany zewnętrzne, takie jak zbieranie danych do średniej, czy też wahania napięcia. Położenie sondy nie zmieniało się.

Jak wyraźnie widać w pierwszego wykresu skoki odczytów są spore nawet jeśli weźmie się pod uwagę dwa sąsiednie pomiary robione w odstępie 1s.

Kolejny wykres jest dla 10 pomiarów – jak widać skoki nie są już tak duże jak poprzednio, pomimo tego iż nadal są spore. Na tym etapie montowanie elektrozaworu mija się z celem.

50 pomiarów – różnice są na tyle niewielkie, że można zamontować już elektrozawór sterujący podawaniem CO2.

100 pomiarów – wynik uległ znacznemu spłaszczeniu z niewielkimi tylko wahaniami.

200 pomiarów – skala otrzymanych wartości bardzo się zmniejszyła co przedstawia ostatni wykres

Jak widać wyraźnie z powyższych wyników skoki pH przestają być problemem. Dla porównania otrzymanych wyników poniżej przedstawiona została skrócona tabela z otrzymanymi najwyższymi oraz najniższymi wynikami oraz różnica pomiędzy nimi. Jak widać pomiędzy 1 pomiarem a 200 pomiarami różnica wynosi 0,36. Jeśli posiadamy oryginalny skrypt może to powodować ciągłe włączanie się i wyłączanie przekaźników. Zwiększenie ilości pomiarów przynajmniej do 50 skutecznie to niweluje.

ilość pomiarów  1 10 50 100 200
wartość maksymalna 6,73 6,62 6,54 6,56 6,57
wartość minimalna 6,34 6,39 6,45 6,50 6,54
różnica 0,39 0,23 0,09 0,06 0,03