Pomiar pH wody - budowa sterownika do akwarium

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
grzeniu 73
Posty: 31
Rejestracja: 07 lip 2019, 0:32

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: grzeniu 73 » 07 lip 2019, 8:23

Witam! Moj pierwszy post wiec witam wszystkich. Mam dość spore doświadczenie z PH z racji akwarium. Po walce z adc z procka w końcu przerobiłem to na ADS1110 i zaczęło to dzialc jak należy. Nie trzeba dodawać żadnych wzmacniaczy, tylko sonda bezpośrednio do układu. A wybrałem ten układ ,bo akurat dostałem go w gratisie sampli. Jeśli nic więcej nie będziesz mierzył to proponuje ten układ, bo łatwiej polutować. ads1115 ma tragiczny raster do płytek DIY.
Na sadzie masz napiecie ujemne i dodatnie w sumie na ads1115 nie pamiętam czy tez mierzy takie ,ale na pewno ads1110 sie nadaje.
Tu masz kod do ads1115 z sieci,ale dziala. Troche chyba w nim chyba zmieniałem w czasie testow.
  1. 'ADS1115 16Bit A/D Wandler
  2.  
  3.      '
  4. Dim N As Byte
  5. Dim High_byte(4) As Byte
  6. Dim Low_byte(4) As Byte
  7. Dim Ads_high(4) As Byte
  8. Dim Ads_low(4) As Byte
  9. Dim Volt(4) As Single
  10. Dim Wert(4) As Integer
  11.  
  12. 'Adresse ADS1115 Adresspin = low
  13. Const Ads1115_write = &H90
  14. Const Ads1115_read = &H91
  15. 'Const Ad_wert = 1.024 / 32767                               '1024
  16. 'Const Ad_wert = 2.048 / 32767                               '2048
  17. 'Const Ad_wert = 4.096 / 32767                               '4096
  18. Const Ad_wert = 6.144 / 32767                               '6144
  19. 'High Byte
  20. 'Bit 15 Operational status
  21. 'When writing
  22. 'No effect                 = &B0xxxxxxx xxxxxxxx
  23. 'Start a single conversion = &B1xxxxxxx xxxxxxxx
  24. 'When reading
  25. 'Device is currently performing a conversion     = &B0xxxxxxx xxxxxxxx
  26. 'Device is not currently performing a conversion = &B1xxxxxxx xxxxxxxx
  27. 'Bit 14..12   Input Multiplexer configuration
  28. 'Ain0+Ain1= &Bx000xxxx xxxxxxxx default
  29. 'Ain0+Ain3= &bx001xxxx xxxxxxxx
  30. 'Ain1+Ain3= &Bx010xxxx xxxxxxxx
  31. 'Ain2+Ain3= &bx011xxxx xxxxxxxx
  32. 'Ain0+GND=  &Bx100xxxx xxxxxxxx
  33. 'Ain1+GND=  &Bx101xxxx xxxxxxxx
  34. 'Ain2+GND=  &Bx110xxxx xxxxxxxx
  35. 'Ain3+GND=  &Bx111xxxx xxxxxxxx
  36. 'Bit 11..9   Gain amplifier configuration
  37.  'FSR 6.144V= &Bxxxx000x xxxxxxxx
  38.  'FSR 4.096V= &Bxxxx001x xxxxxxxx
  39.  'FSR 2.048V= &Bxxxx010x xxxxxxxx  default
  40.  'FSR 1.024V= &Bxxxx011x xxxxxxxx
  41.  'FSR 0.512V= &Bxxxx100x xxxxxxxx
  42.  'FSR 0.256V= &Bxxxx101x xxxxxxxx
  43.  'FSR 0.256V= &Bxxxx110x xxxxxxxx
  44.  'FSR 0.256V= &Bxxxx111x xxxxxxxx
  45.  'Bit 8   Device operating mode
  46. 'Continuous-conversion mode = &Bxxxxxxx0 xxxxxxxx
  47. 'Single-Shot mode           = &Bxxxxxxx1 xxxxxxxx  default
  48. '------------------------------------------------------------------------
  49. 'Low Byte
  50. 'Bit 7..5   Data Rate
  51. '  8SPS= &Bxxxxxxxx 000xxxxx
  52. ' 16SPS= &Bxxxxxxxx 001xxxxx
  53. ' 32SPS= &Bxxxxxxxx 010xxxxx
  54. ' 64SPS= &Bxxxxxxxx 011xxxxx
  55. '128SPS= &Bxxxxxxxx 100xxxxx   default
  56. '250SPS= &Bxxxxxxxx 101xxxxx
  57. '475SPS= &Bxxxxxxxx 110xxxxx
  58. '860SPS= &Bxxxxxxxx 111xxxxx
  59. 'Bit 4 Comparator Mode
  60.  'Traditonal  = &Bxxxxxxxx  xxx0xxxx   default
  61.  'Window      = &Bxxxxxxxx  xxx1xxxx
  62. 'Bit 3 Comparator polarity
  63. 'Active low = &Bxxxxxxxx xxxx0xxx default
  64. 'Active high= &Bxxxxxxxx xxxx1xxx
  65. 'Bit 2 Latching Comparator
  66. 'Nonlatching = &Bxxxxxxxx xxxxx0xx  default
  67. 'Latching    = &Bxxxxxxxx xxxxx1xx
  68. 'Bit 1.0 Comparator queue and disable
  69. 'Assert after one conversion   = &Bxxxxxxxx xxxxxx00
  70. 'Assert after two conversiosn  = &Bxxxxxxxx xxxxxx01
  71. 'Assert after four conversions = &Bxxxxxxxx xxxxxx10
  72. 'Disable Comparator             = &Bxxxxxxxx xxxxxx11  default
  73. High_byte(1) = &B11000000
  74. High_byte(2) = &B11010000
  75. High_byte(3) = &B11100000
  76. High_byte(4) = &B11110000
  77. Low_byte(1) = &B00000000
  78. Low_byte(2) = &B00000000
  79. Low_byte(3) = &B00000000
  80. Low_byte(4) = &B00000000
  81. '******************* Hauptprogramm *************************************
  82. Do
  83.    For N = 1 To 4
  84.       Gosub On_ads1115                                      'ADS1115 auslesen
  85.       Wert(n) = 256 * Ads_high(n) : Wert(n) = Wert(n) + Ads_low(n)
  86.       Volt(n) = Ad_wert * Wert(n)
  87.       Locate N , 1 : Lcd "              "
  88.       Locate N , 1 : Lcd Fusing(volt(n) , "#.######") ; " Volt"
  89.       Waitms 250
  90.    Next
  91. Loop
  92. End
  93. '***************** Ende Hauptprogramm **********************************
  94. On_ads1115:
  95.    I2cstart
  96.    I2cwbyte Ads1115_write
  97.    I2cwbyte &B00000001
  98.    I2cwbyte High_byte(n)
  99.    I2cwbyte Low_byte(n)
  100.    I2cstop
  101.    I2cstart
  102.    I2cwbyte Ads1115_write
  103.    I2cwbyte 0
  104.    I2cstart
  105.    I2cwbyte Ads1115_read
  106.    I2crbyte Ads_high(n) , Ack
  107.    I2crbyte Ads_low(n) , Nack
  108.    I2cstop
  109. Return
Tu masz pomiar 4 napiec ,ale wystarczy wyłączyć petle for i czytać konkretny pin. U gory masz wszystkie ustawienia wystarczy tylko je dopasować do swojego układu. Działa bardzo fajnie. Pamiętaj tez ,ze musisz robić kalibracje co jakiś czas i w programie to musisz uwzględnić. Dokładność PH 0.1 jest w zupełności wystarczająca ,bo parametry wody zmieniają sie co kilkadziesiąt minut ,a nie w sekundach. W zasadzie jak dobrze ustawisz dozowanie co2 to zawór będzie sie przełączał parę razy w ciągu doby zwłaszcza po zgaszeniu i zapaleniu światła. Sonde oczywiście polecam nasza rodzima polska, ale kupiłem kiedyś najtańsza z chin i tez działała poprawnie.
grzeniu 73
Posty: 31
Rejestracja: 07 lip 2019, 0:32

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: grzeniu 73 » 07 lip 2019, 8:35

Witam! Obie wartosci :)
  1.  
  2.  'FSR 1.024V= &Bxxxx011x xxxxxxxx te bity musisz ustawic  w High Byte
  3. Const Ad_wert = 1.024 / 32767
  4.  
  5.                  Wert(n) = 256 * Ads_high(n)
  6.                  Wert(n) = Wert(n) + Ads_low(n)
  7.                  Volt(n) = Ad_wert * Wert(n)
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 07 lip 2019, 12:01

Dzięki @grzeniu 73 za odpowiedź. Kod który zamieściłeś to jest ten sam który ja znalazłem i wcześniej wkleiłem ;)

Niestety nie kumam o co w tym kodzie chodzi, ale jak go próbowałem rozgryźć
'FSR 1.024V= &Bxxxx011x xxxxxxxx te bity musisz ustawic w High Byte
Tu ustawiam napięcie odniesienia - u siebie ustawiłem 0.512V
Const Ad_wert = 1.024 / 32767
Tu (chyba) obliczenie napięcia na krok ADC - napięcie odniesienia (1.024V) podzielone przez rozdzielczość przetwornika (tu 32767 ponieważ tylko napięcia dodatnie czyli 15 bit)
Wert(n) = 256 * Ads_high(n)
Co to jest za wartość "256"?
Wert(n) = Wert(n) + Ads_low(n)
Tu dodanie odczytów Ads_high + Ads_low i pomnożone przez tajemniczą wartość "256"
Volt(n) = Ad_wert * Wert(n)
Tu przeliczam na napięcie - ja potrzebuję tylko odczyt ADC
Awatar użytkownika
Oldman
Posty: 61
Rejestracja: 19 cze 2019, 11:15

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: Oldman » 07 lip 2019, 12:47

Kod: Zaznacz cały

Co to jest za wartość "256"?
Myślę, że to jest przesunięcie wartości o 8 miejsc w lewo, żeby umieścić ją w części "górnej". W następnej linijce dodajesz część "dolną" i w ten sposób masz cały pomiar.
grzeniu 73
Posty: 31
Rejestracja: 07 lip 2019, 0:32

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: grzeniu 73 » 07 lip 2019, 13:04

* 256 to przesuniecie można to zrobić z shift.
Nie jestem pewien ,ale jesli nie pomnozesz przez napiecie odniesiaenia to bedziesz mial ADC
  1. Wert(n) = 256 * Ads_high(n)
  2. Wert(n) = Wert(n) + Ads_low(n)
ale sprawdź. Przy sadzie PH będziesz miał łatwiej z voltami ,bo podane wartości PH sa przy konkretnym napięciu. Ale w sumie można sobie to przeliczyć.
Ogólnie jak sie wczytasz na spokojnie w te ustawienia to po chwili okazują się bardzo proste.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 08 lip 2019, 17:12

Coś mi cały czas głupoty wychodzą z ADS1015 Dziś zamówiłem na Allegro ADS1115 bo na paczkę z Chin jeszcze długo będę czekał. Jak dotrze to zobaczę czy coś dała zmiana modułu - tak czy tak dam znać co z tego wyszło ;)
ADC ATmegi jest jakieś prostsze do opanowania niż to zewnętrzne.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 09 lip 2019, 16:40

To mnie Chińczycy zaskoczyli... moduł ADS1115 zamówiłem 23 czerwca, a dziś już dotarł do mnie ;)

Po podłączeniu modułu pod ATmegę + kod z niemieckiej strony wszystko ruszyło od kopa. Czyli coś z tym ADS1015 jest nie tak lub jakoś on inaczej działa - wcześniej wyczytałem, że te dwa moduły różnią się tylko rozdzielczością.

Panowie, mam jeszcze pytanie... Te moduły mają cztery kanały gdzie pomiary robimy względem GND, ale można też robić pomiary różnicowe (dwa kanały) Czy może mi ktoś wytłumaczyć czym to się różni tak na chłopski rozum?
Jaka będzie różnica gdy będę robił "normalny" pomiar, a pomiar różnicowy tylko z tym, że z jednej strony podłącze się pod GND
grzeniu 73
Posty: 31
Rejestracja: 07 lip 2019, 0:32

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: grzeniu 73 » 09 lip 2019, 17:49

Przy pomiarze różnicowym możesz mierzyć napięcia inne niż względem gnd. Np za dioda gdy masz spadek napięcia na plusie np. Pewnie względem masy tez zmierzysz ale stracisz dwa wejścia na to zamiast jednego. A wez zobacz u siebie jaki wynik dostaniesz jak przy pomiarze napięcia kanał pomiarowy do masy dasz? Nie wiem dlaczego ale u mnie głupoty pokazuje wtedy. Parę dni siedziałem nad tym za czym skumałem to. Myślałem ,ze coś z układami. Na dwóch miałem to samo. Ciekawi mnie czy to moje moduły czy one tak maja.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 09 lip 2019, 18:37

grzeniu 73 pisze:Przy pomiarze różnicowym możesz mierzyć napięcia inne niż względem gnd. Np za dioda gdy masz spadek napięcia na plusie np. Pewnie względem masy tez zmierzysz ale stracisz dwa wejścia na to zamiast jednego.
Czyli nie ma żadnej różnicy między takimi pomiarami?
1. Ain0 (napięcie) + GND
2. Ain0 (napięcie) + Ain1 (GND)
Na kanałach i tak mi nie zależy- na tą chwilę potrzebuje jeden, a może w przyszłości jeszcze jeden się przyda.

Patrzyłem na polecany przez Ciebie ADS1110 i całkiem ciekawy scalak, ale jednak widzę jeden minus, napięcie odniesienia. W tym ADS'ie jest 2.048V, a w ADS1115 mogę sobie ustawić 0.512V Różnica jest dość znaczna ponieważ:
1. ADS1110
2.048V / 32768 = 0,0000625V/krok ADC
2. ADS1115
0.512V / 32768 = 0,000015625V/krok ADC

Docelowo chcę zrobić pomiar pH 4-9, a na wzmacniaczu ustawić tak aby na ADC trafiał tylko ten zakres + błąd sondy czyli +/-30mV
Jak dobrze kombinuję to biorąc pod uwagę błędy etc wyjdzie mi zakres -210mV...+150mV czyli 6 stopni pH - po wzmocnieniu i przesunięciu da mi (teoretycznie) rozdzielczość 0.0001 pH

*tak swoją drogą... w opisach modułów ADS jest małe oszustwo ponieważ one wszystkie maja o 1bit mniej niż by się człowiek spodziewał - ten dodatkowy bit to jest tylko znak +/-
ADS1015 12bit ma pomiar 11bit
ADS1110 16bit ma pomiar 15bit
ADS1115 16bit ma pomiar 15bit
**tak czy siak to i tak dużo lepiej niż ADC ATmegi ;)
grzeniu 73 pisze:A wez zobacz u siebie jaki wynik dostaniesz jak przy pomiarze napięcia kanał pomiarowy do masy dasz? Nie wiem dlaczego ale u mnie głupoty pokazuje wtedy. Parę dni siedziałem nad tym za czym skumałem to. Myślałem ,ze coś z układami. Na dwóch miałem to samo. Ciekawi mnie czy to moje moduły czy one tak maja.
Odczytuję tylko ADC bez przeliczania na napięcie i pokazuje "0", ale czasami sobie skoczy +/-2 - obstawiam, że to przez płytkę stykową
grzeniu 73
Posty: 31
Rejestracja: 07 lip 2019, 0:32

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: grzeniu 73 » 09 lip 2019, 19:27

Ja mam sonde podłączoną bezpośrednio do Ads1110. Bez żadnego wzmocnienia. Kalibruje ja na buforze 4 i 7 . Innych buforów nie miałem wiec nie mam pojęcia jak pokazuje po za ph 7. W akwarium mam ustawione na 7.6. pewnie lepiej byloby kalibrować na 9 i 7 PH. Wtedy miał bym akurat ten zakres co potrzebuje. A ilość gazu i tak sprawdzam obserwując rybki i daje max ile mogę. Komputer ,tylko to utrzymuje na określonym poziomie. I w sumie jest mi obojętne czy te 7.6 to faktycznie tyle jest. Ważne ze zawsze tyle samo. Z tym 0.00001 PH to chyba przesadzasz,bo nie mam pojęcia skąd ty weźmiesz tak precyzyjna sondę :) No chyba ,ze tylko tak dla oka sobie to wyświetlisz :). 0.1 w akwarium to już za duzo. I tak wahania będziesz miał na poziomie 0.1 -0.3 PH. Ads1110 ma ustawiane wzmocnie do 10 razy. Ale nie robiłem tego.
ODPOWIEDZ