Pomiar pH wody - budowa sterownika do akwarium

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 30 maja 2019, 23:34

I po mojej (już drugiej) zabawce... Uśmierciłem kolejne Arduino :shock:

Nie wiem co to się dzieje, poprzednie Arduino nagle padło i to tak samo. Poprzednie trafiło do kosza, a to chciałem zobaczyć co się stało i wychodzi na to, że stabilizator nie wytrzymał - między wszystkimi pinami AMS1117 jest zwarcie :(
Nigdy nie spaliłem żadnego AVR'a a tu nagle dwa pod rząd...
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: niveasoft » 31 maja 2019, 8:51

A może bierzesz te 5V dla modułu z Arduino? To by może nawet tłumaczyło Twoje kłopoty ahahaha i znalazłeś rozwiązanie.
Te wszystkie regulatory najczęściej mają wbudowane zabezpieczenie termiczne i wtedy ograniczają zasilanie. Czyli taki gorący AMS mógł wprowadzać te zakłócenia.
Chociaż..on chyba jest pomijany kiedy pracujesz na USB.
Z drugiej strony to może ten moduł potrzebuje jakiegoś dużego prądu np. dlatego że ma tam jakąś prądożerną przetwornicę napięcia ujemnego. Zobacz że w Lajonie jest radiator, czyli pewnie LM7805 i można szarpać cały Amper.
Sprawdź miernikiem przełączonym na amperomierz ile ten moduł chce mA.

Co do AMS`ów to mi osobiście jeden padł w Arduino Mega, ale tam chyba tez za dużo od niego chciałem. Miałem kupionych dziesięć w zapasie. Podmieniłem i śmiga do dzisiaj.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 31 maja 2019, 9:40

niveasoft pisze:A może bierzesz te 5V dla modułu z Arduino? To by może nawet tłumaczyło Twoje kłopoty ahahaha i znalazłeś rozwiązanie.
Dokładnie tak, zasilanie Arduino z zewnętrznego zasilacza 12V, a moduł podpięty pod Arduino.
niveasoft pisze:Sprawdź miernikiem przełączonym na amperomierz ile ten moduł chce mA.
Pomiar wskazał 7.8mA
niveasoft pisze:Co do AMS`ów to mi osobiście jeden padł w Arduino Mega, ale tam chyba tez za dużo od niego chciałem. Miałem kupionych dziesięć w zapasie. Podmieniłem i śmiga do dzisiaj.
U mnie nigdy żaden nie padł, a używam ich dość często (AVR, ESP i inne) a tu taka niemiła niespodzianka :(
Po podłączeniu Arduino do USB grzeje się AVR i CH340 czyli wszytko dostało strzała 12V

No nic, lecę oddać krew, a jak wrócę to poskładam wszytko na płytce testowej (mam jeszcze Arduino MEGA, ale szkoda mi tej płytki) i będę testował dalej ;)
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 01 cze 2019, 10:55

Panowie, tak sobie zaglądam do opisów swoich zabawek:
sonda:
  1. Alkali Error: 0.2PH
  2. Theoretical Percentage Slope: ≧98.5%
  3. Internal Resistance: ≦250MΩ
  4. Response Time: ≦1min
  5. Operating Temperature: 0-60℃
  6. Terminal Blocks: BNC plug
  7. BNC Connector suitable for most PH meter and controller.
  8. Suitable for wide range of application: Aquariums, Hydroponics, Laboratory etc.
moduł:
  1. Heating voltage: 5±0.2V (AC -• DC)
  2. Working current: 5-10mA
  3. The detection concentration range: PH0-14
  4. The detection range of temperature: 0-60 centigrade
  5. The response time: ≤ 5S
  6. Stability time: ≤ 60S
  7. Power consumption: ≤ 0.5W
  8. The working temperature: -10~50 centigrade (the nominal temperature 20 centigrade)
  9. Working humidity: 95%RH (nominal humidity 65%RH)
  10. Service life: 3 years
  11. Size: 42mm x 32mm x 20mm
  12. Weight: 25g
  13. The output: analog voltage signal output
Co oznaczają wartości:
1. sonda
Alkali Error: 0.2PH
Response Time: ≦1min
2. moduł
The response time: ≤ 5S
Stability time: ≤ 60S
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 » 01 cze 2019, 14:01

Cześć
pimowo pisze:
01 cze 2019, 10:55
Co oznaczają wartości:
1. sonda
Alkali Error: 0.2PH
Response Time: ≦1min
2. moduł
The response time: ≤ 5S
Stability time: ≤ 60S
Alkali Error: 0.2PH - nie mam pojęcia
Ale Response Time: ≦1min czyli po zmianie PH dane z sonda wstanie pokazać po minucie lub mniej.

Podobnie dla modułu
Response time ≤ 5S czyli 5s lub mniej ale trzeba przyjąć zasadę ze 5s minimum.
Stability time: ≤ 60S to samo trzeba przyjąc 60s dla modułu.

Podsumowując zbieraj dane przez minute i uśrednij - wyświetl itd.
Nie zapomnij o wpływie temperatury
03_-_Automatic_Temperature_Compensation_Tech_tip.png
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 » 01 cze 2019, 21:05

Pikczu pisze:Podsumowując zbieraj dane przez minute i uśrednij - wyświetl itd.
To też niewiele daje. Jak sonda jest w kubku to odczyty są prawie idealne (czasami coś przeskoczy o jeden, max dwa kroki ADC) ale po przełożeniu sondy do akwarium już wszystkie odczyty pływają :(

W przyszłym tygodniu zamówię scalaki: TL074 i ICL7660, zmontuję wszytko według polecanego schematu i zobaczymy co z tego wyjdzie.
Pikczu pisze:Nie zapomnij o wpływie temperatury
Tak wiem, że temperatura ma wpływ na pH wody - to zagadnienie (kompensacja temperatury) zostawiłem sobie na później.
Temperatura w moim przypadku nie do końca ma wpływ na odczyty ponieważ sondę kalibruję w temperaturze 25°C, a docelowo będzie używana w akwarium z temperaturą 25.5-26°C

Zanim będę miał części chciałbym się zająć innymi opcjami, a dokładniej zrobić menu sterownika.
Podpowiedzcie jak zrobić proste, ale dobre menu. Menu nie może blokować działania sterownika.
Zmajstrowałem coś takiego (nakładka dla Arduino z LCD i klawiaturą analogową - obsługa klawiszy @niveasoft)
  1. $regfile = "m328pdef.dat"
  2. $crystal = 16000000
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 128
  6.  
  7. Config Submode = New
  8.  
  9. Config Timer0 = Timer , Prescale = 1024 , Clear_timer = 1 : Compare0a = 155       '10ms @16MHz
  10.  
  11. Config Adc = Single , Prescaler = Auto , Reference = Avcc
  12.  
  13. Config Scl = Portc.5
  14. Config Sda = Portc.4
  15. I2cinit : Config Twi = 100000
  16.  
  17. $lib "bl_Lcd_i2c.lib"
  18.  
  19. Config Lcd = 16x2
  20. Const Pcf_d4 = 4
  21. Const Pcf_d5 = 5
  22. Const Pcf_d6 = 6
  23. Const Pcf_d7 = 7
  24. Const Pcf_rs = 0
  25. Const Pcf_rw = 1
  26. Const Pcf_e1 = 2
  27.  
  28. Dim _lcd_e As Byte
  29. Dim Backlight As Byte
  30. Backlight_on Alias &H08
  31. Backlight_off Alias &H00
  32. Backlight = Backlight_on
  33. _lcd_e = 128
  34. Const Pcf8574_lcd = &H4E
  35.  
  36. Waitms 100 : Cls
  37.  
  38. Dim Tryb As Byte
  39. Dim Menu As Byte
  40. Dim X1 As Byte , X2 As Byte , X3 As Byte
  41.  
  42. Const Sw_r = 1
  43. Const Sw_u = 2
  44. Const Sw_d = 3
  45. Const Sw_l = 4
  46. Const Sw_s = 5
  47.  
  48. Dim Old_key As Byte , Key_cnt As Byte , Key As Byte
  49.  
  50. Function Read_keypad() As Byte
  51.  
  52. '---   function with autorepeat
  53.  
  54.    Local Adc_read_key As Word , Read_key As Byte , Key_val As Byte
  55.  
  56.    Adc_read_key = Getadc(0)
  57.  
  58.    Select Case Adc_read_key
  59.  
  60.       Case 0 To 100 : Read_key = Sw_r                       'right = 0
  61.       Case 101 To 250 : Read_key = Sw_u                     'up = 145
  62.       Case 251 To 400 : Read_key = Sw_d                     'dwn = 330
  63.       Case 401 To 600 : Read_key = Sw_l                     'left = 506
  64.       Case 601 To 850 : Read_key = Sw_s                     'select = 743
  65.       Case Is > 851 : Read_key = 0                          'no key = 1023
  66.  
  67.    End Select
  68.  
  69.    If Read_key <> 0 Then
  70.  
  71.       If Old_key = Read_key Then
  72.  
  73.          If Key_cnt < 20 Then
  74.  
  75.             Incr Key_cnt
  76.             Key_val = 0
  77.  
  78.          Else
  79.  
  80.             Key_cnt = 0
  81.             Key_val = Read_key
  82.  
  83.          End If
  84.  
  85.       End If
  86.  
  87.    Else
  88.  
  89.       Key_cnt = 15
  90.       Key_val = 0
  91.  
  92.    End If
  93.  
  94.    Old_key = Read_key
  95.    Read_keypad = Key_val
  96.  
  97. End Function
  98.  
  99. Locate 1 , 1 : Lcd "normalny        "
  100. Locate 2 , 1 : Lcd "ekran           "
  101.  
  102. X1 = 1
  103. X2 = 1
  104.  
  105. Menu = 0
  106.  
  107. Enable Interrupts
  108.  
  109. Do
  110.  
  111.    If Tifr0.ocf0a = 1 Then
  112.  
  113.       Tifr0.ocf0a = 1
  114.  
  115.       Key = Read_keypad()
  116.  
  117.    End If
  118.  
  119.    If Key <> 0 Then
  120.  
  121.       Select Case Tryb
  122.  
  123.          Case 0:
  124.  
  125.             If Key = Sw_s Then
  126.  
  127.                Locate 1 , 1 : Lcd "0.0.0           "
  128.                Locate 2 , 1 : Lcd "menu            "
  129.  
  130.                Tryb = 1
  131.  
  132.             End If
  133.  
  134.          Case 1
  135.  
  136.             Select Case Key
  137.  
  138.                Case Sw_r
  139.  
  140.                   Incr Menu
  141.  
  142.                   If Menu > 3 Then Menu = 3
  143.  
  144.                Case Sw_l
  145.  
  146.                   Decr Menu
  147.  
  148.                   If Menu < 1 Then Menu = 1
  149.  
  150.             End Select
  151.  
  152.             Select Case Menu
  153.  
  154.                Case 1
  155.  
  156.                   Select Case Key
  157.  
  158.                      Case Sw_u
  159.  
  160.                         Incr X1
  161.  
  162.                         If X1 > 9 Then X1 = 9
  163.  
  164.                      Case Sw_d
  165.  
  166.                         Decr X1
  167.  
  168.                         If X1 < 1 Then X1 = 1
  169.  
  170.                   End Select
  171.  
  172.                   Locate 1 , 1 : Lcd "1.0.0           "
  173.                   Locate 2 , 1 : Lcd X1 ; "               "
  174.  
  175.                Case 2
  176.  
  177.                   Select Case Key
  178.  
  179.                      Case Sw_u
  180.  
  181.                         Incr X2
  182.  
  183.                         If X2 > 9 Then X2 = 9
  184.  
  185.                      Case Sw_d
  186.  
  187.                         Decr X2
  188.  
  189.                         If X2 < 1 Then X2 = 1
  190.  
  191.                   End Select
  192.  
  193.                   Locate 1 , 1 : Lcd "2.0.0           "
  194.                   Locate 2 , 1 : Lcd X2 ; "               "
  195.  
  196.                Case 3
  197.  
  198.                   Locate 1 , 1 : Lcd "3.0.0           "
  199.                   Locate 2 , 1 : Lcd "Wyjscie         "
  200.  
  201.                   If Key = Sw_s Then
  202.  
  203.                      Tryb = 0
  204.                      Menu = 0
  205.  
  206.                      Locate 1 , 1 : Lcd "normalny        "
  207.                      Locate 2 , 1 : Lcd "ekran           "
  208.  
  209.                   End If
  210.  
  211.             End Select
  212.  
  213.       End Select
  214.  
  215.       Key = 0
  216.  
  217.    End If
  218.  
  219. Loop
  220. End
Wszytko działa, ale chciałbym zrobić jeszcze jeden poziom. W sumie miałoby to działać tak:
- ekran główny 0.0
- wciskam <SELECT> i przechodzę do trybu menu
- w trybie menu wciskając <LEFT> lub <RIGHT> przemieszczam się po menu 1.0 - x.0 (x to ostatnia pozycja menu - nie wiem ile ich dokładnie będzie)
- po wybraniu pozycji (np 5.0) wciskając <SELECT> przejdę do podmenu
- będąc w podmenu wciskając <LEFT> lub <RIGHT> przemieszczam się po menu 1.1 - x.1
- po wybraniu pozycji (np 5.1) wciskając <UP> lub <DOWN> będę zwiększał lub zmniejszał ustawianą wartość
- w menu oraz podmenu na ostatniej planszy będzie pozycja "powrót" gdzie klikając <SELECT> wrócę o poziom wyżej - będąc w menu wrócę do ekranu głównego, a będąc w podmenu wrócę do menu
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 » 01 cze 2019, 22:05

Kolego drogi w dziale biblioteki jest przykład klawiatury ADC.
viewtopic.php?f=13&t=140
Menu też mam gotowe ale na graficzny wyświetlacz.
Dodatkowo tak się składa że mam cały projekt w proteusie.
Potnij co ci potrzeba i użyj.
Aha nie przestrasz się kod napisany w tzw "Project mode" z chyba 49 subami, w sumie coś ponad 4tyś linijek.
Rotor full2019.rar
https://www.dropbox.com/s/azzer957ubnhn ... 9.rar?dl=0

Na postawie tego kody zrobiłem uniwersalny projekt testowy.
Czyli mam coś na zasadzie ramy programu i menu.
Funkcje ostateczne dopisuje w subach.
działa na tym samym projekcie z proteusa :)
https://www.dropbox.com/s/u8nxkrdm59rkq ... 1.rar?dl=0
Kopiuj co Ci pasuje.
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 » 01 cze 2019, 22:16

Klawiatura działa jak należy - użyłem kodu Bartka. Teraz potrzebuję zrobić bardziej rozbudowane menu.

Dzięki za pliki, mam nadzieję, że jakoś to ogarnę bo Twoje kody są tak rozbudowane, że głowa mała ;)
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 » 01 cze 2019, 22:17

Odpal proteusa będzie prościej testować.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 01 cze 2019, 23:40

Próbuję jeszcze na select-case i zrobiłem tak:
  1. $regfile = "m328pdef.dat"
  2. $crystal = 16000000
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 128
  6.  
  7. Config Submode = New
  8.  
  9. Config Timer0 = Timer , Prescale = 1024 , Clear_timer = 1 : Compare0a = 155       '10ms @16MHz
  10.  
  11. Config Adc = Single , Prescaler = Auto , Reference = Avcc
  12.  
  13. Config Scl = Portc.5
  14. Config Sda = Portc.4
  15. I2cinit : Config Twi = 100000
  16.  
  17. $lib "bl_Lcd_i2c.lib"
  18.  
  19. Config Lcd = 16x2
  20. Const Pcf_d4 = 4
  21. Const Pcf_d5 = 5
  22. Const Pcf_d6 = 6
  23. Const Pcf_d7 = 7
  24. Const Pcf_rs = 0
  25. Const Pcf_rw = 1
  26. Const Pcf_e1 = 2
  27.  
  28. Dim _lcd_e As Byte
  29. Dim Backlight As Byte
  30. Backlight_on Alias &H08
  31. Backlight_off Alias &H00
  32. Backlight = Backlight_on
  33. _lcd_e = 128
  34. Const Pcf8574_lcd = &H4E
  35.  
  36. Waitms 100 : Cls
  37.  
  38. Dim Tryb As Byte
  39. Dim Menu_1 As Byte , Menu_2 As Byte , Menu_3 As Byte
  40. Dim X1 As Byte , X2 As Byte , X3 As Byte , X4 As Byte
  41.  
  42. Const Sw_r = 1
  43. Const Sw_u = 2
  44. Const Sw_d = 3
  45. Const Sw_l = 4
  46. Const Sw_s = 5
  47.  
  48. Dim Old_key As Byte , Key_cnt As Byte , Key As Byte
  49.  
  50. Function Read_keypad() As Byte
  51.  
  52. '---   function with autorepeat
  53.  
  54.    Local Adc_read_key As Word , Read_key As Byte , Key_val As Byte
  55.  
  56.    Adc_read_key = Getadc(0)
  57.  
  58.    Select Case Adc_read_key
  59.  
  60.       Case 0 To 100 : Read_key = Sw_r                       'right = 0
  61.       Case 101 To 250 : Read_key = Sw_u                     'up = 145
  62.       Case 251 To 400 : Read_key = Sw_d                     'dwn = 330
  63.       Case 401 To 600 : Read_key = Sw_l                     'left = 506
  64.       Case 601 To 850 : Read_key = Sw_s                     'select = 743
  65.       Case Is > 851 : Read_key = 0                          'no key = 1023
  66.  
  67.    End Select
  68.  
  69.    If Read_key <> 0 Then
  70.  
  71.       If Old_key = Read_key Then
  72.  
  73.          If Key_cnt < 20 Then
  74.  
  75.             Incr Key_cnt
  76.             Key_val = 0
  77.  
  78.          Else
  79.  
  80.             Key_cnt = 0
  81.             Key_val = Read_key
  82.  
  83.          End If
  84.  
  85.       End If
  86.  
  87.    Else
  88.  
  89.       Key_cnt = 15
  90.       Key_val = 0
  91.  
  92.    End If
  93.  
  94.    Old_key = Read_key
  95.    Read_keypad = Key_val
  96.  
  97. End Function
  98.  
  99. Locate 1 , 1 : Lcd "normalny        "
  100. Locate 2 , 1 : Lcd "ekran           "
  101.  
  102. X1 = 1
  103. X2 = 1
  104. X3 = 1
  105. X4 = 1
  106.  
  107. Menu_1 = 0
  108. Menu_2 = 0
  109. Menu_3 = 0
  110.  
  111. Enable Interrupts
  112.  
  113. Do
  114.  
  115.    If Tifr0.ocf0a = 1 Then
  116.  
  117.       Tifr0.ocf0a = 1
  118.  
  119.       Key = Read_keypad()
  120.  
  121.    End If
  122.  
  123.    If Key <> 0 Then
  124.  
  125.       Select Case Tryb
  126.  
  127. 'EKRAN GLOWNY
  128.  
  129.          Case 0:
  130.  
  131.             If Key = Sw_s Then
  132.  
  133.                Locate 1 , 1 : Lcd "0.0.0           "
  134.                Locate 2 , 1 : Lcd "menu            "
  135.  
  136.                Tryb = 1
  137.                Menu_1 = 0
  138.                Menu_2 = 0
  139.                Menu_3 = 0
  140.  
  141.             End If
  142.  
  143. 'EKRAN MENU
  144.  
  145.          Case 1
  146.  
  147.             Select Case Key
  148.  
  149.                Case Sw_r
  150.  
  151.                   Incr Menu_1
  152.  
  153.                   If Menu_1 > 3 Then Menu_1 = 3
  154.  
  155.                Case Sw_l
  156.  
  157.                   Decr Menu_1
  158.  
  159.                   If Menu_1 < 1 Then Menu_1 = 1
  160.  
  161.             End Select
  162.  
  163.             Select Case Menu_1
  164.  
  165.                Case 1
  166.  
  167.                   Locate 1 , 1 : Lcd "1.0.0           "
  168.                   Locate 2 , 1 : Lcd "                "
  169.  
  170.                   If Key = Sw_s Then
  171.  
  172.                      Locate 1 , 1 : Lcd "1.1.0           "
  173.                      Locate 2 , 1 : Lcd "                "
  174.  
  175.                      Tryb = 2
  176.                      Menu_1 = 0
  177.                      Menu_2 = 0
  178.                      Menu_3 = 0
  179.  
  180.                   End If
  181.  
  182.                Case 2
  183.  
  184.                   Locate 1 , 1 : Lcd "2.0.0           "
  185.                   Locate 2 , 1 : Lcd "                "
  186.  
  187.                   If Key = Sw_s Then
  188.  
  189.                      Locate 1 , 1 : Lcd "2.1.0           "
  190.                      Locate 2 , 1 : Lcd "                "
  191.  
  192.                      Tryb = 3
  193.                      Menu_1 = 0
  194.                      Menu_2 = 0
  195.                      Menu_3 = 0
  196.  
  197.                   End If
  198.  
  199.                Case 3
  200.  
  201.                   Locate 1 , 1 : Lcd "3.0.0           "
  202.                   Locate 2 , 1 : Lcd "Wyjscie         "
  203.  
  204.                   If Key = Sw_s Then
  205.  
  206.                      Locate 1 , 1 : Lcd "normalny        "
  207.                      Locate 2 , 1 : Lcd "ekran           "
  208.  
  209.                      Tryb = 0
  210.                      Menu_1 = 0
  211.                      Menu_2 = 0
  212.                      Menu_3 = 0
  213.  
  214.                   End If
  215.  
  216.             End Select
  217.  
  218. 'EKRAN PODMENU
  219.  
  220.          Case 2
  221.  
  222.             Select Case Key
  223.  
  224.                Case Sw_r
  225.  
  226.                   Incr Menu_2
  227.  
  228.                   If Menu_2 > 3 Then Menu_2 = 3
  229.  
  230.                Case Sw_l
  231.  
  232.                   Decr Menu_2
  233.  
  234.                   If Menu_2 < 1 Then Menu_2 = 1
  235.  
  236.             End Select
  237.  
  238.             Select Case Menu_2
  239.  
  240.                Case 1
  241.  
  242.                   Select Case Key
  243.  
  244.                      Case Sw_u
  245.  
  246.                         Incr X1
  247.  
  248.                         If X1 > 9 Then X1 = 9
  249.  
  250.                      Case Sw_d
  251.  
  252.                         Decr X1
  253.  
  254.                         If X1 < 1 Then X1 = 1
  255.  
  256.                   End Select
  257.  
  258.                   Locate 1 , 1 : Lcd "1.1.0           "
  259.                   Locate 2 , 1 : Lcd "X1 " ; X1 ; "            "
  260.  
  261.                Case 2
  262.  
  263.                   Select Case Key
  264.  
  265.                      Case Sw_u
  266.  
  267.                         Incr X2
  268.  
  269.                         If X2 > 9 Then X2 = 9
  270.  
  271.                      Case Sw_d
  272.  
  273.                         Decr X2
  274.  
  275.                         If X2 < 1 Then X2 = 1
  276.  
  277.                   End Select
  278.  
  279.                   Locate 1 , 1 : Lcd "1.2.0           "
  280.                   Locate 2 , 1 : Lcd "X2 " ; X2 ; "            "
  281.  
  282.                Case 3
  283.  
  284.                   Locate 1 , 1 : Lcd "1.3.0           "
  285.                   Locate 2 , 1 : Lcd "Powrot          "
  286.  
  287.                   If Key = Sw_s Then
  288.  
  289.                      Tryb = 1
  290.                      Menu_1 = 0
  291.                      Menu_2 = 0
  292.                      Menu_3 = 0
  293.  
  294.                      Locate 1 , 1 : Lcd "1.0.0           "
  295.                      Locate 2 , 1 : Lcd "                "
  296.  
  297.                   End If
  298.  
  299.             End Select
  300.  
  301.          Case 3
  302.  
  303.             Select Case Key
  304.  
  305.                Case Sw_r
  306.  
  307.                   Incr Menu_3
  308.  
  309.                   If Menu_3 > 3 Then Menu_3 = 3
  310.  
  311.                Case Sw_l
  312.  
  313.                   Decr Menu_3
  314.  
  315.                   If Menu_3 < 1 Then Menu_3 = 1
  316.  
  317.             End Select
  318.  
  319.             Select Case Menu_3
  320.  
  321.                Case 1
  322.  
  323.                   Select Case Key
  324.  
  325.                      Case Sw_u
  326.  
  327.                         Incr X3
  328.  
  329.                         If X3 > 9 Then X3 = 9
  330.  
  331.                      Case Sw_d
  332.  
  333.                         Decr X3
  334.  
  335.                         If X3 < 1 Then X3 = 1
  336.  
  337.                   End Select
  338.  
  339.                   Locate 1 , 1 : Lcd "2.1.0           "
  340.                   Locate 2 , 1 : Lcd "X3 " ; X3 ; "            "
  341.  
  342.                Case 2
  343.  
  344.                   Select Case Key
  345.  
  346.                      Case Sw_u
  347.  
  348.                         Incr X4
  349.  
  350.                         If X4 > 9 Then X4 = 9
  351.  
  352.                      Case Sw_d
  353.  
  354.                         Decr X4
  355.  
  356.                         If X4 < 1 Then X4 = 1
  357.  
  358.                   End Select
  359.  
  360.                   Locate 1 , 1 : Lcd "2.2.0           "
  361.                   Locate 2 , 1 : Lcd "X4 " ; X4 ; "            "
  362.  
  363.                Case 3
  364.  
  365.                   Locate 1 , 1 : Lcd "2.3.0           "
  366.                   Locate 2 , 1 : Lcd "Powrot          "
  367.  
  368.                   If Key = Sw_s Then
  369.  
  370.                      Tryb = 1
  371.                      Menu_1 = 0
  372.                      Menu_2 = 0
  373.                      Menu_3 = 0
  374.  
  375.                      Locate 1 , 1 : Lcd "2.0.0           "
  376.                      Locate 2 , 1 : Lcd "                "
  377.  
  378.                   End If
  379.  
  380.             End Select
  381.  
  382.       End Select
  383.  
  384.       Key = 0
  385.  
  386.    End If
  387.  
  388. Loop
  389. End
Wszytko działa, ale...
1. będąc w pozycji "normalny ekran" nie chce mi przejść do pozycji "1.0.0" (teraz mam "menu 0.0.0", ale tego bym nie chciał)
2. przechodząc do pozycji "1.1.0" lub "2.1.0" nie pokazuje zmiennej X1 czy X3, muszę kliknąć w prawo i dopiero pokazują się te zmienne
Cała reszta jest OK

Czy budowanie menu na select-case to dobry pomysł tak w ogóle?
ODPOWIEDZ