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 » 09 mar 2021, 8:35

Edytowałem swój post i prośbę o tłumaczenie kodu Adruino przeniosłem do odpowiedniego działu ;)
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Pomiar pH wody - budowa sterownika do akwarium

Post autor: pimowo » 19 mar 2021, 18:09

Siedzę już drugie popołudnie nad sterowaniem na podstawie temperatury i prawie działa tak jak chciałem.

Brakuje mi pomysłu na:
1. jak podmienić ikony grzanie/chłodzenie i temperatura minimalna/maksymalna
- teraz mam te ikony obok siebie, a chciałbym aby były w jednym miejscu i zależnie od tego co się dzieje były podmieniane, tzn. grzanie, chłodzenie lub nic gdy sterownik nie grzeje lub nie chłodzi
- ikony alarmu "G!" i "C!" chciałbym wymienić na "Ikonę_alarm"
2. Zapis "If Bytes(8) = &H10 Then" wywala błąd i nie nie czyta mi DS18B20 - gdy nie ma tego to DS jest normalnie czytany

A tak po za tym... na tą chwilę gdy odłączę DS, zrobię zwarcie między pinami DATA i VCC lub DATA i GND wywala błąd, wyłącza wyjścia dla grzania i chłodzenia czyli tu jest sukces.

Zamieszczam kod z tym co wymodziłem. Dodałem trochę komentarzy, aby można było zrozumieć co autor miał na myśli pisząc ten wiersz :D
Z kodu zostawiłem tylko to co dotyczy DSa i sterowanie na podstawie temperatury.
.
  1. $regfile = "m328pdef.dat"                                   'Arduino UNO
  2. $crystal = 16000000                                         '16MHz
  3. $hwstack = 64
  4. $swstack = 64
  5. $framesize = 128
  6.  
  7. Config Submode = New                                        'deklaracja podprogramów
  8.  
  9. '--- BIBLIOTEKI
  10.  
  11. $lib "i2c_twi.lbx"                                          'TWI
  12. $lib "glcdSSD1306-I2C.lib"                                  'biblioteka OLED
  13.  
  14. '--- TIMER
  15.  
  16. Config Timer2 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1 : Compare2a = 155       '10ms@16MHz/1024
  17.  
  18. '--- WYJŚCIA
  19.  
  20. Pk_grzanie Alias Portd.4 : Config Pk_grzanie = Output       'grzanie
  21. Pk_chlodzenie Alias Portd.3 : Config Pk_chlodzenie = Output 'chłodzenie
  22.  
  23. Buzz Alias Portc.0 : Config Buzz = Output                   'buzzer
  24.  
  25. '--- 1-Wire
  26.  
  27. Config 1wire = Portd.2                                      'pin dla DS18B20
  28. 1wreset
  29. 1wwrite &HCC
  30. 1wwrite &H44
  31.  
  32. '--- I2C
  33.  
  34. Config Scl = Portc.5                                        'pin SCL
  35. Config Sda = Portc.4                                        'pin SDA
  36. Config Twi = 400000                                         'prędkość I2C
  37. I2cinit
  38.  
  39. '--- OLED
  40.  
  41. Config Graphlcd = Custom , Cols = 128 , Rows = 32 , Lcdname = "SSD1306"       'konfiguracja OLED
  42.  
  43. '- dodatkowe ustawienia dla OLED 128x32
  44.  
  45. I2cstart
  46. I2cwbyte &H78
  47. I2cwbyte &H00
  48. I2cwbyte &HDA
  49. I2cwbyte &H22
  50. I2cstop
  51.  
  52. Cls
  53.  
  54. '--- ZMIENNE
  55.  
  56. '- licz czas
  57.  
  58. Dim 100ms , 1s As Byte
  59.  
  60. '- DS18B20
  61.  
  62. Dim Bytes(9) As Byte , Sum As Byte
  63. Dim Temp_ds As Integer At Bytes(1) Overlay                  'dwa pierwsze bajty tablicy tworzą tez Integer ;)
  64.  
  65. Dim Alarm As Byte
  66.  
  67. '- sterowanie grzaniem/chłodzeniem
  68.  
  69. Dim Temp_ustaw As Integer
  70. Dim Temp_hist As Integer
  71.  
  72. Dim Temp_grzanie As Integer
  73. Dim Temp_chlodzenie As Integer
  74.  
  75. Dim Temp_alarm_min As Integer
  76. Dim Temp_alarm_max As Integer
  77.  
  78. '- zmienna pomocnicza
  79.  
  80. Dim Pomoc_str As String * 50
  81.  
  82. '--- ODCZYT TEMPERATURY
  83.  
  84. Sub Temperatura
  85.  
  86.    If Err = 0 Then                                          'gdy nie ma błędów
  87.  
  88.       1wreset
  89.       1wwrite &HCC
  90.       1wwrite &HBE
  91.       Bytes(1) = 1wread(9)                                  'odczytaj 9 bajtów do tablicy (8 bajtów i CRC obliczone przez czujnik)
  92.  
  93.       Sum = Crc8(bytes(1) , 8)                              'sam oblicz CRC z ośmiu bajtów
  94.  
  95.       'If Bytes(8) = &H10 Then                               'sprawdzenie czy ósmy bajt zawiera &H10
  96.  
  97.          If Sum = Bytes(9) Then                             'jeśli nasze obliczenia zgadzają się z tymi od czujnika...
  98.  
  99.             Alarm = 0                                       'wszytko OK to wyłącz alarm
  100.  
  101.             Temp_ds = Temp_ds * 10
  102.             Temp_ds = Temp_ds \ 16
  103.  
  104.             If Temp_ds > 150 And Temp_ds < 350 Then         'jeżeli temperatura wyższa niż 15st i niższa od 35st
  105.  
  106.                Setfont Font8x8                              'użyj malej czcionki
  107.  
  108.                If Temp_ds < Temp_alarm_min Then             'jeżeli temperatura niższa niż temperatura minimalna alarmu
  109.  
  110.                   Lcdat 1 , 17 , "G!"                       'wyświetl ikonę alarmu
  111.  
  112.                   Alarm = 1                                 'włącz alarm
  113.  
  114.                Elseif Temp_ds > Temp_grzanie Then           'jeżeli temperatura wyższa niż temperatura grzania
  115.  
  116.                   Lcdat 1 , 17 , "  "                       'wyczyść ikonę alarmu
  117.  
  118.                End If
  119.  
  120.                If Temp_ds < Temp_grzanie Then               'jeżeli temperatura niższa niż temperatura grzania
  121.  
  122.                   Set Pk_grzanie                            'włącz grzanie
  123.  
  124.                   Showpic 17 , 17 , Ikona_grzanie           'wyświetl ikonę grzania
  125.  
  126.                Elseif Temp_ds > Temp_ustaw Then             'jeżeli temperatura wyższa niż temperatura wymagana
  127.  
  128.                   Reset Pk_grzanie                          'wyłącz grzanie
  129.  
  130.                   Showpic 17 , 17 , Ikona_cls               'wyczyść ikonę grzania
  131.  
  132.                End If
  133.  
  134.                If Temp_ds > Temp_chlodzenie Then            'jeżeli temperatura wyższa niż temperatura chłodzenia
  135.  
  136.                   Set Pk_chlodzenie                         'włącz chłodzenie
  137.  
  138.                   Showpic 0 , 17 , Ikona_chlodzenie         'wyświetl ikonę chłodzenia
  139.  
  140.                Elseif Temp_ds < Temp_ustaw Then             'jeżeli temperatura niższa niż temperatura wymagana
  141.  
  142.                   Reset Pk_chlodzenie                       'wyłącz chłodzenie
  143.  
  144.                   Showpic 0 , 17 , Ikona_cls                'wyczyść ikonę chłodzenia
  145.  
  146.                End If
  147.  
  148.                If Temp_ds < Temp_chlodzenie Then            'jeżeli temperatura niższa niż temperatura chłodzenia
  149.  
  150.                   Lcdat 2 , 17 , "  "                       'wyczyść ikonę alarmu
  151.  
  152.                Elseif Temp_ds > Temp_alarm_max Then         'jeżeli temperatura wyższa niż temperatura maksymalna alarmu
  153.  
  154.                   Lcdat 2 , 17 , "C!"                       'wyświetl ikonę alarmu
  155.  
  156.                   Alarm = 1                                 'włącz alarm
  157.  
  158.                End If
  159.  
  160. '- wyświetl pomiar temperatury
  161.  
  162.                Setfont Font23x32                            'użyj dużej czcionki
  163.  
  164.                Pomoc_str = Str(temp_ds)                     'zmiana odczytu DS do str
  165.  
  166.                Lcdat 1 , 37 , Format(pomoc_str , "00.0")    'wyświetl odczyt temperatury
  167.  
  168.             Else                                            'jeżeli temperatura niższa niż 15st lub wyższa od 35st
  169.  
  170.                Gosub Temp_awaria                            'uruchom alarm
  171.  
  172.             End If
  173.  
  174.          Else                                               'jeśli wystąpił błąd CRC
  175.  
  176.             Gosub Temp_awaria                               'uruchom alarm
  177.  
  178.          End If
  179.  
  180.       'Else                                                  'jeżeli wystąpił błąd ósmego bajtu
  181.  
  182.          'Gosub Temp_awaria                                  'uruchom alarm
  183.  
  184.       'End If
  185.  
  186.    Else                                                     'gdy Err = 1
  187.  
  188.       Gosub Temp_awaria                                     'uruchom alarm
  189.  
  190.    End If
  191.  
  192. '- tu DS szykuje nowy odczyt
  193.  
  194.    1wreset
  195.    1wwrite &HCC
  196.    1wwrite &H44
  197.  
  198. End Sub
  199.  
  200. '- przelicz dane do sterowania grzaniem/chłodzeniem
  201.  
  202. Sub Przelicz_nastawy
  203.  
  204.    Temp_grzanie = Temp_ustaw - Temp_hist                    'jeżeli temperatura wyższa niż temperatura ustawiona + histereza
  205.    Temp_alarm_min = Temp_grzanie - Temp_hist                'temperatura ustawiona - 2x histereza
  206.    Temp_chlodzenie = Temp_ustaw + Temp_hist                 'jeżeli temperatura wyższa niż temperatura ustawiona + histereza
  207.    Temp_alarm_max = Temp_chlodzenie + Temp_hist             'temperatura ustawiona + 2x histereza
  208.  
  209. End Sub
  210.  
  211. Temp_ustaw = 280                                            'temperatura wymagana
  212. Temp_hist = 5                                               'histereza temperatury
  213.  
  214. Call Przelicz_nastawy                                       'skocz do programu aby obliczyć nastawy do sterowania
  215.  
  216. Gosub Ekran_3                                               'wczytaj ekran główny
  217.  
  218. Enable Interrupts                                           'włącz globalne przerwania
  219.  
  220. '********************************************************************************
  221. '***                              PROGRAM GŁÓWNY                              ***
  222.  
  223. Do
  224.  
  225.    If Tifr2.ocf2a = 1 Then                                  'minęło 10ms - flagę ustawia Timer
  226.  
  227.       Tifr2.ocf2a = 1                                       'kasuj flagę
  228.  
  229.       If 100ms < 9 Then
  230.  
  231.          Incr 100ms                                         'odliczaj 100ms
  232.  
  233.       Else                                                  'co 100ms
  234.  
  235.          100ms = 0
  236.  
  237.          Reset Buzz                                         'wyłącz buzzer gdy włączony
  238.  
  239.          If 1s < 9 Then
  240.  
  241.             Incr 1s                                         'odliczaj sekundę
  242.  
  243.          Else                                               'co 1s
  244.  
  245.             1s = 0
  246.  
  247.             Call Temperatura                                'czytaj termometr
  248.  
  249.             If Alarm = 1 Then Set Buzz                      'jeżeli występuje alarm to włącz buzzer
  250.  
  251.          '1s
  252.          End If
  253.  
  254.       '100ms
  255.       End If
  256.  
  257.    '10ms
  258.    End If
  259.  
  260. Loop
  261. End
  262.  
  263. '***                         KONIEC PROGRAMU GŁÓWNEGO                         ***
  264. '********************************************************************************
  265.  
  266. '--- EKRAN GŁÓWNY
  267.  
  268. Ekran_3:
  269.  
  270.    Cls                                                      'wyczyść ekran
  271.  
  272.    Showpic 1 , 1 , Ikona_temp                               'pokaż ikonę termometru
  273.  
  274. Return
  275.  
  276. '--- DZIAŁANIA ALARMU
  277.  
  278. Temp_awaria:
  279.  
  280.    Alarm = 1                                                'włącz alarm
  281.  
  282.    Setfont Font12x16                                        'użyj średniej czcionki
  283.  
  284.    Lcdat 1 , 33 , " Awaria!"                                'wyświetl, że jest problem z czujnikiem temperatury
  285.    Lcdat 3 , 33 , " DS18B20"
  286.  
  287.    Setfont Font8x8                                          'użyj średniej czcionki
  288.  
  289.    Lcdat 1 , 17 , "  "                                      'wyczyść ikonę
  290.    Lcdat 2 , 17 , "  "
  291.  
  292.    Showpic 0 , 17 , Ikona_cls                               'wyczyść ikonę
  293.    Showpic 17 , 17 , Ikona_cls
  294.  
  295.    Reset Pk_grzanie                                         'wyłącz grzanie
  296.    Reset Pk_chlodzenie                                      'wyłącz chłodzenie
  297.  
  298. Return
  299.  
  300. '--- CZCIONKI
  301.  
  302. $include "Font/Font8x8.font"                                'mała czcionka
  303. $include "Font/Font12x16.font"                              'średnia czcionka
  304. $include "Font/Font23x32.font"                              'duża czcionka
  305.  
  306. '--- IKONY
  307.  
  308. Ikona_temp:                                                 'ikona termometru
  309.  
  310.    $bgf "ICO/temp.bgf"
  311.  
  312. Ikona_grzanie:                                              'ikona ogrzewania
  313.  
  314.    $bgf "ICO/grzanie2.bgf"
  315.  
  316. Ikona_chlodzenie:                                           'ikona chłodzenia
  317.  
  318.    $bgf "ICO/chlodzenie2.bgf"
  319.  
  320. Ikona_cls:                                                  'czyszczenie ikony
  321.  
  322.    $bgf "ICO/cls.bgf"
  323.  
  324. Ikona_alarm:                                                'ikona alarmu
  325.  
  326.    $bgf "ICO/alarm.bgf"
ODPOWIEDZ