Pomiar pH wody - budowa sterownika do akwarium

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: niveasoft » 06 cze 2019, 22:09

Mhihi @pikczu - testowałeś cos takiego : Debug #usb, "Testowe na COM4"

Chodzi m io to że Debug można mieć na każdym COM`ie

Słowo Debug kiedy jest ON to znaczy Print, ale kiedy jest OFF to na każdym COM`ie nie kompiluje już wiadomości i kod mniejszy naturalnie.
Awatar użytkownika
Pikczu
Posty: 392
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: Pikczu » 07 cze 2019, 8:34

Testowałem dość dawno na xmedze i niedzialalo.
w sumie to sie nosiłem z zamiarem napisania do Marka czemu nie działa ale jakoś tak zeszło.
Natomiast nie wiem czy działa np na mega2560.
Zwyczajnie nie było kiedy.
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: niveasoft » 07 cze 2019, 9:03

Przyznam się do swojego hobby - zbieram/kolekcjonuję słuchawki. Kupuje jak kobiety buty :D
Na razie mam około dziesięciu, ale choroba się pogłębia :D
A może to się kiedyś skończy jak kupie "idealne", bo każde które kupuje odsłuchuje i uważam, że grają lepiej niż poprzednie i muszę mieć :D

Mój najnowszy zakup to MDR-XB550 - cudne. Wiem że to podbite basy, ale w urządzeniach zasilanych 3.2V sprawdzają się idealnie.
Stać mnie było na Schenheiser`y i miałem na głowie, ale te pobiły konkurentów - no cudne :D
Inne słuchawki do smartfona, inne do porządnego wzmaka. Te sa do smartfona idealne.

->zmierzam do puenty :D
...ale fajnie posłuchać takiej nuty na nich :D

..a na samym końcu dodam, że te słuchafony współpracują z telefonem. 1Klik odbierz/pause/play, 2kliki następny utwór, 3 kliki poprzedni utwór , ale najważniejsze jak grają :D

dzięki za wrzutę :D

- podsumowując ocenę słuchawek - są tak lekkie że można trzepać głową i nie spadną ahahahahahaha a graja jak marzenie :P
Awatar użytkownika
Pikczu
Posty: 392
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: Pikczu » 07 cze 2019, 9:45

Fajny offtop jestem na kupnie słuchawek. Mam już kilka lat Audio technica MH50 z kablem ale chce sobie kupic wersje BT.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 07 cze 2019, 16:04

OK, poddaję się z menu+podmenu - jestem za cienki na to :( Będzie po prostu tasiemiec menu.

Podpowiedzcie mi jak ugryźć zmienną STRING 16 znaków? Dokładniej mówiąc będzie to zmienna o zmiennej długości. Jeżeli zrobię zmienną "Dim x As String * 16", ale będę potrzebował wpisać tylko np 5 znaków to co wtedy?
Chodzi mi o to, że chcę mieć możliwość wpisania do sterownika hasła i klucza API, ale hasło nie zawsze będzie miało jednakową długość.
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: Henryk » 07 cze 2019, 17:32

Witam :D
pimowo pisze:
07 cze 2019, 16:04
Podpowiedzcie mi jak ugryźć zmienną STRING 16 znaków? Dokładniej mówiąc będzie to zmienna o zmiennej długości. Jeżeli zrobię zmienną "Dim x As String * 16", ale będę potrzebował wpisać tylko np 5 znaków to co wtedy?
Ja załatwiłem problem bardzo prymitywnie , ale działa , potrzebowałem tylko 6 znaków ;)
  1.   Zapis:       ' wprowadzanie średnicy kola
  2.    Cls
  3.    Locate 1 , 1 : Lcd "Nowe dane kola . "
  4.     Locate 2 , 1 : Lcd "Wpisz -"
  5.     Locate 3 , 1 : Lcd "Max. wart.255 mm"
  6.     Locate 4 , 1 : Lcd "#..zapisz nowe dane "
  7.      Wartosc = Space(6)       ' zmienna string .(6)ilość spacji max długość edytowanygo ciągu znakow
  8.       Pozycja = 0       ' zmienna byte ...ustawia kursor na kolejnym znaku do edycji
  9.  Do
  10.   Klw = Getkbd()
  11.      If Klw <> 16 Then : Znak = Lookupstr(klw , Dta) :
  12.        Insertchar Wartosc , Pozycja , Znak : Locate 2 , 8 : Lcd Wartosc ; "  " : Pozycja = Pozycja + 1 : End If
  13.  
  14.          Waitms 300
  15.           If Klw = 14 Then
  16.            Kolo = Val(wartosc)
  17.             If Kolo < 1 Then
  18.              Goto Zapis
  19.               End If
  20.                If Kolo > 255 Then
  21.                 Goto Zapis
  22.                  End If
  23.                   Cls
  24.                   Goto Skok
  25.                    End If
  26.  Loop       ' zmienna Dword Kolo przyjmuje wartość dziesiętną val(wartosc)
  27. Return
  28.           ' edycja Wartosc działa tylko w jednym kierunku....jeśli przekroczę zakres 255 , program ma nie przyjąć tych danych ;-)
  29.  
  30.  
  31. Dta:       '0.....1.....2.....3.....4.....5.....6.....7.....8.....9....10....11....12....13....14....15
  32. Data "1" , "2" , "3" , " " , "4" , "5" , "6" , " " , "7" , "8" , "9" , " " , " " , "0" , " " , " "
  33.  
  34.         'Tablica zmodyfikowana dla klawiatury 3x4 :-)
Tu przykład z MCS Wiki AVR odnośnie insertchar https://wiki.mcselec.com/bavr/INSERTCHAR
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 09 cze 2019, 21:11

@Henryk, dzięki za kod ;)

Wracając do mojego sterownika i odczytów pH...
Kombinowałem na przeróżne sposoby - zasilacze, kody etc. Odczyt zawsze sobie skakał, mniej lub bardziej, ale nie nadawało się to do sterowania elektrozaworem CO2
Chciałem się dowiedzieć czy coś jest nie tak z tym modułem pH czy ja naprawdę coś źle robię - pomijałem już kod do odczytu bo użyłem ich tyle różnych, że głowa mała. Kupiłem części i zmontowałem wszytko według schematu:
schemat_pH.png
Co się okazało? Odczyty już nie skaczą (sonda w akwarium) czyli ten moduł (nawet dwa) który kupiłem jest o kant du** rozbić - szkoda mi tylko mojego i Waszego czasu który przepadł na uruchomienie tego badziewia.
Teraz odczyt co jakiś czas sobie skoczy 0.01-0.03, ale to już zwalam na sposób połączenia wszystkiego - płytka stykowa:
sterownik.jpg
Sondę odczytuję co 10ms, a przeliczenia na pH robię co 1s kodem bez Dominaty
  1. $regfile = "m8def.dat"
  2. $crystal = 8000000
  3. $hwstack = 40
  4. $swstack = 16
  5. $framesize = 32
  6.  
  7. $sim
  8. 'OZNACZA PRZYGOTOWANIE KODU DO SYMULACJI - USUNĄĆ DLA PRAWDZIWEGO MIKROKONTROLERA
  9.  
  10. Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
  11. Config Lcd = 16x2
  12. Deflcdchar 0 , 32 , 32 , 14 , 17 , 31 , 16 , 14 , 1
  13. Deflcdchar 2 , 32 , 32 , 14 , 1 , 15 , 17 , 15 , 1
  14. Cursor Off
  15. Cls
  16.  
  17. Config Adc = Single , Prescaler = Auto , Reference = Avcc
  18.  
  19.  
  20. Dim Adc_read As Word
  21. Dim Suma As Dword
  22. Dim Wynik As Word
  23. Dim Help As Dword
  24.  
  25. Do
  26.  
  27.       Adc_read = Getadc(0)
  28.        Help = Suma
  29.        Shift Help , Right , 3
  30.        Suma = Suma - Help
  31.        Suma = Suma + Adc_read
  32.        Help = Suma
  33.        Shift Help , Right , 3
  34.        Wynik = Help
  35.  
  36.        Locate 1 , 1 : Lcd Wynik ; "    "
  37.  
  38. Loop
  39. End
Jeszcze muszę pomęczyć temat odczytu ADC, ogarnąć MENU, posprzątać cały kod i jak wszytko będzie OK trzeba będzie zrobić PCB :D
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 05 lip 2019, 15:23

To znowu ja :P
Musiałem zrobić sobie małą przerwę ze swoją zabawką, a ponownym spojrzeniu na to naszły mnie myśli aby zmienić wewnętrzny przetwornik ADC ATmegi328 na zewnętrzny ADS1x15 - "x" z powodu, że mam w domu moduł ADS1015 czyli 12 bitowy, ale zamówiłem w Chinach ADS1115 czyli 16 bitowy.
No to do sedna... Podpowiedzcie mi jak się tym posługiwać? Z tego co wyczytałem to ADS1015 ma 12 bit ale przy pomiarze +/-2.048V (to niby można zmienić) więc jak dobrze rozumiem gdybym chciał robić pomiary dodatnie to mam do dyspozycji tylko 11 bit - to i tak lepiej niż 10 bit ATmegi

Znalazłem w Internecie kod dla ADS1115, ale ADS1015 też z tym działa. Nie mam pojęcia jak to skonfigurować.
Nie mogę zrozumieć jak to jest z tym napięciem odniesienia (ADS ma własne wbudowane) W kodzie można sobie wybrać FSR: 6.144V, 4.096V, 2.048V, 1.024V, 0.512V i 0.256V czy to znaczy, że mogę sobie wybrać to napięcie odniesienia?

Najbardziej interesowałby mnie pomiar 12 bit napięcia 0-0.512V - jako, że tylko napięcie dodatnie więc 11 bit czyli 0-2048 więc rozdzielczość 0.0002V (docelowo ADS1115 więc 0,00001V) Teraz swój pomiar musiałbym rozciągnąć do 1.1V (Vref ATmegi) co przy 10 bitach dałoby mi rozdzielczość 0.001V
  1. 'ADS1115 16Bit A/D Wandler
  2. $regfile = "m328pdef.dat"
  3. $crystal = 16000000
  4. $hwstack = 32
  5. $swstack = 32
  6. $framesize = 32
  7.      '
  8. Dim N As Byte
  9. Dim High_byte(4) As Byte
  10. Dim Low_byte(4) As Byte
  11. Dim Ads_high(4) As Byte
  12. Dim Ads_low(4) As Byte
  13. Dim Volt(4) As Single
  14. Dim Wert(4) As Integer
  15. Config Sda = Portc.4                                        'I2C-Pins definieren
  16. Config Scl = Portc.5
  17. Dim Lcd_backlight As Byte
  18. $lib "YwRobot_Lcd_i2c.lIb"
  19. Const Pcf8574_lcd = 64                                      'Adresse LCD
  20. Config Lcd = 20x4                                           '40x4,16x1, 16x2, 16x4, 16x4, 20x2, 20x4, 16x1a or 20x4A.
  21. Config I2cdelay = 2
  22. Initlcd                                                     'LCD initialisieren
  23. Cursor Off Noblink                                          'Noblink , Blink, On, Off
  24. Cls
  25. Waitms 300
  26. 'Adresse ADS1115 Adresspin = low
  27. Const Ads1115_write = &H90
  28. Const Ads1115_read = &H91
  29. 'Const Ad_wert = 1.024 / 32767                               '1024
  30. 'Const Ad_wert = 2.048 / 32767                               '2048
  31. 'Const Ad_wert = 4.096 / 32767                               '4096
  32. Const Ad_wert = 6.144 / 32767                               '6144
  33. 'High Byte
  34. 'Bit 15 Operational status
  35. 'When writing
  36. 'No effect                 = &B0xxxxxxx xxxxxxxx
  37. 'Start a single conversion = &B1xxxxxxx xxxxxxxx
  38. 'When reading
  39. 'Device is currently performing a conversion     = &B0xxxxxxx xxxxxxxx
  40. 'Device is not currently performing a conversion = &B1xxxxxxx xxxxxxxx
  41. 'Bit 14..12   Input Multiplexer configuration
  42. 'Ain0+Ain1= &Bx000xxxx xxxxxxxx default
  43. 'Ain0+Ain3= &bx001xxxx xxxxxxxx
  44. 'Ain1+Ain3= &Bx010xxxx xxxxxxxx
  45. 'Ain2+Ain3= &bx011xxxx xxxxxxxx
  46. 'Ain0+GND=  &Bx100xxxx xxxxxxxx
  47. 'Ain1+GND=  &Bx101xxxx xxxxxxxx
  48. 'Ain2+GND=  &Bx110xxxx xxxxxxxx
  49. 'Ain3+GND=  &Bx111xxxx xxxxxxxx
  50. 'Bit 11..9   Gain amplifier configuration
  51.  'FSR 6.144V= &Bxxxx000x xxxxxxxx
  52.  'FSR 4.096V= &Bxxxx001x xxxxxxxx
  53.  'FSR 2.048V= &Bxxxx010x xxxxxxxx  default
  54.  'FSR 1.024V= &Bxxxx011x xxxxxxxx
  55.  'FSR 0.512V= &Bxxxx100x xxxxxxxx
  56.  'FSR 0.256V= &Bxxxx101x xxxxxxxx
  57.  'FSR 0.256V= &Bxxxx110x xxxxxxxx
  58.  'FSR 0.256V= &Bxxxx111x xxxxxxxx
  59.  'Bit 8   Device operating mode
  60. 'Continuous-conversion mode = &Bxxxxxxx0 xxxxxxxx
  61. 'Single-Shot mode           = &Bxxxxxxx1 xxxxxxxx  default
  62. '------------------------------------------------------------------------
  63. 'Low Byte
  64. 'Bit 7..5   Data Rate
  65. '  8SPS= &Bxxxxxxxx 000xxxxx
  66. ' 16SPS= &Bxxxxxxxx 001xxxxx
  67. ' 32SPS= &Bxxxxxxxx 010xxxxx
  68. ' 64SPS= &Bxxxxxxxx 011xxxxx
  69. '128SPS= &Bxxxxxxxx 100xxxxx   default
  70. '250SPS= &Bxxxxxxxx 101xxxxx
  71. '475SPS= &Bxxxxxxxx 110xxxxx
  72. '860SPS= &Bxxxxxxxx 111xxxxx
  73. 'Bit 4 Comparator Mode
  74.  'Traditonal  = &Bxxxxxxxx  xxx0xxxx   default
  75.  'Window      = &Bxxxxxxxx  xxx1xxxx
  76. 'Bit 3 Comparator polarity
  77. 'Active low = &Bxxxxxxxx xxxx0xxx default
  78. 'Active high= &Bxxxxxxxx xxxx1xxx
  79. 'Bit 2 Latching Comparator
  80. 'Nonlatching = &Bxxxxxxxx xxxxx0xx  default
  81. 'Latching    = &Bxxxxxxxx xxxxx1xx
  82. 'Bit 1.0 Comparator queue and disable
  83. 'Assert after one conversion   = &Bxxxxxxxx xxxxxx00
  84. 'Assert after two conversiosn  = &Bxxxxxxxx xxxxxx01
  85. 'Assert after four conversions = &Bxxxxxxxx xxxxxx10
  86. 'Disable Comparator             = &Bxxxxxxxx xxxxxx11  default
  87. High_byte(1) = &B11000000
  88. High_byte(2) = &B11010000
  89. High_byte(3) = &B11100000
  90. High_byte(4) = &B11110000
  91. Low_byte(1) = &B00000000
  92. Low_byte(2) = &B00000000
  93. Low_byte(3) = &B00000000
  94. Low_byte(4) = &B00000000
  95. '******************* Hauptprogramm *************************************
  96. Do
  97.    For N = 1 To 4
  98.       Gosub On_ads1115                                      'ADS1115 auslesen
  99.       Wert(n) = 256 * Ads_high(n) : Wert(n) = Wert(n) + Ads_low(n)
  100.       Volt(n) = Ad_wert * Wert(n)
  101.       Locate N , 1 : Lcd "              "
  102.       Locate N , 1 : Lcd Fusing(volt(n) , "#.######") ; " Volt"
  103.       Waitms 250
  104.    Next
  105. Loop
  106. End
  107. '***************** Ende Hauptprogramm **********************************
  108. On_ads1115:
  109.    I2cstart
  110.    I2cwbyte Ads1115_write
  111.    I2cwbyte &B00000001
  112.    I2cwbyte High_byte(n)
  113.    I2cwbyte Low_byte(n)
  114.    I2cstop
  115.    I2cstart
  116.    I2cwbyte Ads1115_write
  117.    I2cwbyte 0
  118.    I2cstart
  119.    I2cwbyte Ads1115_read
  120.    I2crbyte Ads_high(n) , Ack
  121.    I2crbyte Ads_low(n) , Nack
  122.    I2cstop
  123. Return
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: niveasoft » 05 lip 2019, 17:10

Pisze softy od rana do nocy..jak nie weekenduję ahahaha oczywiście, ale...
bardzo chętnie Tobie pomogę, jak napiszesz konkretnie czego nie rozumiesz z noty katalogowej, jakiś rejestr, jakieś ustawienie..ale przytoczenie softu z niemieckiej strony nie oznacza, że próbowałeś zgłębić temat.

Rozumiem że masz taki ADC w domu i taki byś chciał wykorzystać, dla mnie tez by to było naturalne. Niestety wcześniej się z nim nie spotkałem.

Napisze inaczej. Pytaj o konkrety z noty których nie rozumiesz to postaram się pomóc chociaż wcale nie czuję się tu kimś, po prostu co dwie głowy to nie jedna.
Natomiast mam kilka opanowanych ADC do których jeszcze nie opublikowałem bibliotek, po prostu z natłoku pracy, ale mógłbym je polecić.
Tak więc ''ADC które masz w domu->rozszyfrujemy raz na zawsze", albo idziemy na łatwiznę i kupisz cos nowego, taniego do czego jest gotowy soft :P
-Twój wybór :P
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 05 lip 2019, 18:02

Nie do końca rozumiem co piszą w nocie i stąd problemy :(
Kod który wkleiłem działa, ale chcę zmienić ustawienia układu.

Tak konkretnie to chcę robić pomiar 0-0.512V z jak największą dokładnością, raz na sekundę - wystarczy odczyt ADC bo z przeliczeniem sobie poradzę. Potrzebuję tylko jeden kanał - w module można robić pomiary z czterech kanałów lub dwóch różnicowych (nie wiem co lepiej wybrać)
.
  1. $regfile = "m328pdef.dat"
  2. $crystal = 16000000
  3. $hwstack = 32
  4. $swstack = 32
  5. $framesize = 32
  6.  
  7. 'deklaracja podprogramów
  8. Config Submode = New
  9.  
  10. 'wyświetlacz
  11. Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.1 , Rs = Portb.0
  12. Config Lcd = 16x2
  13. Cursor Off , Noblink
  14. Cls
  15.  
  16. 'konfiguracja i2c
  17. $lib "i2c_twi.lbx"
  18. Config Sda = Portc.4
  19. Config Scl = Portc.5
  20. Config Twi = 100000
  21.  
  22. 'zmienne programu
  23. Dim High_byte As Byte , Low_byte As Byte
  24. Dim Ads_high As Byte , Ads_low As Byte
  25.  
  26. 'adres ADS
  27. Const Ads1115_write = &H90
  28. Const Ads1115_read = &H91
  29.  
  30. High_byte = &B10000010
  31.  
  32. 'bit 15     &B1xxxxxxx xxxxxxxx
  33. 'bit 14..12 &Bx000xxxx xxxxxxxx Ain0+Ain1
  34. 'bit 11..9  &Bxxxx100x xxxxxxxx FSR 0.512V
  35. 'bit 8      &Bxxxxxxx0 xxxxxxxx
  36.  
  37. Low_byte = &B10000011
  38.  
  39. 'Bit 7..5  &Bxxxxxxxx 100xxxxx 128SPS
  40. 'Bit 4     &Bxxxxxxxx xxx0xxxx
  41. 'Bit 3     &Bxxxxxxxx xxxx0xxx
  42. 'Bit 2     &Bxxxxxxxx xxxxx0xx
  43. 'Bit 1..0  &Bxxxxxxxx xxxxxx11
  44.  
  45. Sub Ads_ustaw
  46.  
  47.    I2cstart
  48.    I2cwbyte Ads1115_write
  49.    I2cwbyte &B00000001
  50.    I2cwbyte High_byte
  51.    I2cwbyte Low_byte
  52.    I2cstop
  53.    I2cstart
  54.    I2cwbyte Ads1115_write
  55.    I2cwbyte 0
  56.    I2cstop
  57.  
  58. End Sub
  59.  
  60. Sub Ads_odczyt
  61.  
  62.    I2cstart
  63.    I2cwbyte Ads1115_read
  64.    I2crbyte Ads_high , Ack
  65.    I2crbyte Ads_low , Nack
  66.    I2cstop
  67.  
  68. End Sub
  69.  
  70. Call Ads_ustaw
  71.  
  72. Do
  73.  
  74.    Call Ads_odczyt
  75.  
  76.    Locate 1 , 1 : Lcd Ads_low ; "     "
  77.    Locate 2 , 1 : Lcd Ads_high ; "     "
  78.  
  79. Loop
  80. End
.
Która wartość to jest odczytane ADC: "Ads_low" czy "Ads_high"?
ODPOWIEDZ