Pomiar pH wody - budowa sterownika do akwarium
- pimowo
- Posty: 392
- Rejestracja: 28 maja 2016, 10:07
Re: Pomiar pH wody - budowa sterownika do akwarium
Edytowałem swój post i prośbę o tłumaczenie kodu Adruino przeniosłem do odpowiedniego działu
- pimowo
- Posty: 392
- Rejestracja: 28 maja 2016, 10:07
Re: Pomiar pH wody - budowa sterownika do akwarium
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
Z kodu zostawiłem tylko to co dotyczy DSa i sterowanie na podstawie temperatury.
.
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
Z kodu zostawiłem tylko to co dotyczy DSa i sterowanie na podstawie temperatury.
.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m328pdef.dat" 'Arduino UNO
- $crystal = 16000000 '16MHz
- $hwstack = 64
- $swstack = 64
- $framesize = 128
- Config Submode = New 'deklaracja podprogramów
- '--- BIBLIOTEKI
- $lib "i2c_twi.lbx" 'TWI
- $lib "glcdSSD1306-I2C.lib" 'biblioteka OLED
- '--- TIMER
- Config Timer2 = Timer , Prescale = 1024 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1 : Compare2a = 155 '10ms@16MHz/1024
- '--- WYJŚCIA
- Pk_grzanie Alias Portd.4 : Config Pk_grzanie = Output 'grzanie
- Pk_chlodzenie Alias Portd.3 : Config Pk_chlodzenie = Output 'chłodzenie
- Buzz Alias Portc.0 : Config Buzz = Output 'buzzer
- '--- 1-Wire
- Config 1wire = Portd.2 'pin dla DS18B20
- 1wreset
- 1wwrite &HCC
- 1wwrite &H44
- '--- I2C
- Config Scl = Portc.5 'pin SCL
- Config Sda = Portc.4 'pin SDA
- Config Twi = 400000 'prędkość I2C
- I2cinit
- '--- OLED
- Config Graphlcd = Custom , Cols = 128 , Rows = 32 , Lcdname = "SSD1306" 'konfiguracja OLED
- '- dodatkowe ustawienia dla OLED 128x32
- I2cstart
- I2cwbyte &H78
- I2cwbyte &H00
- I2cwbyte &HDA
- I2cwbyte &H22
- I2cstop
- Cls
- '--- ZMIENNE
- '- licz czas
- Dim 100ms , 1s As Byte
- '- DS18B20
- Dim Bytes(9) As Byte , Sum As Byte
- Dim Temp_ds As Integer At Bytes(1) Overlay 'dwa pierwsze bajty tablicy tworzą tez Integer ;)
- Dim Alarm As Byte
- '- sterowanie grzaniem/chłodzeniem
- Dim Temp_ustaw As Integer
- Dim Temp_hist As Integer
- Dim Temp_grzanie As Integer
- Dim Temp_chlodzenie As Integer
- Dim Temp_alarm_min As Integer
- Dim Temp_alarm_max As Integer
- '- zmienna pomocnicza
- Dim Pomoc_str As String * 50
- '--- ODCZYT TEMPERATURY
- Sub Temperatura
- If Err = 0 Then 'gdy nie ma błędów
- 1wreset
- 1wwrite &HCC
- 1wwrite &HBE
- Bytes(1) = 1wread(9) 'odczytaj 9 bajtów do tablicy (8 bajtów i CRC obliczone przez czujnik)
- Sum = Crc8(bytes(1) , 8) 'sam oblicz CRC z ośmiu bajtów
- 'If Bytes(8) = &H10 Then 'sprawdzenie czy ósmy bajt zawiera &H10
- If Sum = Bytes(9) Then 'jeśli nasze obliczenia zgadzają się z tymi od czujnika...
- Alarm = 0 'wszytko OK to wyłącz alarm
- Temp_ds = Temp_ds * 10
- Temp_ds = Temp_ds \ 16
- If Temp_ds > 150 And Temp_ds < 350 Then 'jeżeli temperatura wyższa niż 15st i niższa od 35st
- Setfont Font8x8 'użyj malej czcionki
- If Temp_ds < Temp_alarm_min Then 'jeżeli temperatura niższa niż temperatura minimalna alarmu
- Lcdat 1 , 17 , "G!" 'wyświetl ikonę alarmu
- Alarm = 1 'włącz alarm
- Elseif Temp_ds > Temp_grzanie Then 'jeżeli temperatura wyższa niż temperatura grzania
- Lcdat 1 , 17 , " " 'wyczyść ikonę alarmu
- End If
- If Temp_ds < Temp_grzanie Then 'jeżeli temperatura niższa niż temperatura grzania
- Set Pk_grzanie 'włącz grzanie
- Showpic 17 , 17 , Ikona_grzanie 'wyświetl ikonę grzania
- Elseif Temp_ds > Temp_ustaw Then 'jeżeli temperatura wyższa niż temperatura wymagana
- Reset Pk_grzanie 'wyłącz grzanie
- Showpic 17 , 17 , Ikona_cls 'wyczyść ikonę grzania
- End If
- If Temp_ds > Temp_chlodzenie Then 'jeżeli temperatura wyższa niż temperatura chłodzenia
- Set Pk_chlodzenie 'włącz chłodzenie
- Showpic 0 , 17 , Ikona_chlodzenie 'wyświetl ikonę chłodzenia
- Elseif Temp_ds < Temp_ustaw Then 'jeżeli temperatura niższa niż temperatura wymagana
- Reset Pk_chlodzenie 'wyłącz chłodzenie
- Showpic 0 , 17 , Ikona_cls 'wyczyść ikonę chłodzenia
- End If
- If Temp_ds < Temp_chlodzenie Then 'jeżeli temperatura niższa niż temperatura chłodzenia
- Lcdat 2 , 17 , " " 'wyczyść ikonę alarmu
- Elseif Temp_ds > Temp_alarm_max Then 'jeżeli temperatura wyższa niż temperatura maksymalna alarmu
- Lcdat 2 , 17 , "C!" 'wyświetl ikonę alarmu
- Alarm = 1 'włącz alarm
- End If
- '- wyświetl pomiar temperatury
- Setfont Font23x32 'użyj dużej czcionki
- Pomoc_str = Str(temp_ds) 'zmiana odczytu DS do str
- Lcdat 1 , 37 , Format(pomoc_str , "00.0") 'wyświetl odczyt temperatury
- Else 'jeżeli temperatura niższa niż 15st lub wyższa od 35st
- Gosub Temp_awaria 'uruchom alarm
- End If
- Else 'jeśli wystąpił błąd CRC
- Gosub Temp_awaria 'uruchom alarm
- End If
- 'Else 'jeżeli wystąpił błąd ósmego bajtu
- 'Gosub Temp_awaria 'uruchom alarm
- 'End If
- Else 'gdy Err = 1
- Gosub Temp_awaria 'uruchom alarm
- End If
- '- tu DS szykuje nowy odczyt
- 1wreset
- 1wwrite &HCC
- 1wwrite &H44
- End Sub
- '- przelicz dane do sterowania grzaniem/chłodzeniem
- Sub Przelicz_nastawy
- Temp_grzanie = Temp_ustaw - Temp_hist 'jeżeli temperatura wyższa niż temperatura ustawiona + histereza
- Temp_alarm_min = Temp_grzanie - Temp_hist 'temperatura ustawiona - 2x histereza
- Temp_chlodzenie = Temp_ustaw + Temp_hist 'jeżeli temperatura wyższa niż temperatura ustawiona + histereza
- Temp_alarm_max = Temp_chlodzenie + Temp_hist 'temperatura ustawiona + 2x histereza
- End Sub
- Temp_ustaw = 280 'temperatura wymagana
- Temp_hist = 5 'histereza temperatury
- Call Przelicz_nastawy 'skocz do programu aby obliczyć nastawy do sterowania
- Gosub Ekran_3 'wczytaj ekran główny
- Enable Interrupts 'włącz globalne przerwania
- '********************************************************************************
- '*** PROGRAM GŁÓWNY ***
- Do
- If Tifr2.ocf2a = 1 Then 'minęło 10ms - flagę ustawia Timer
- Tifr2.ocf2a = 1 'kasuj flagę
- If 100ms < 9 Then
- Incr 100ms 'odliczaj 100ms
- Else 'co 100ms
- 100ms = 0
- Reset Buzz 'wyłącz buzzer gdy włączony
- If 1s < 9 Then
- Incr 1s 'odliczaj sekundę
- Else 'co 1s
- 1s = 0
- Call Temperatura 'czytaj termometr
- If Alarm = 1 Then Set Buzz 'jeżeli występuje alarm to włącz buzzer
- '1s
- End If
- '100ms
- End If
- '10ms
- End If
- Loop
- End
- '*** KONIEC PROGRAMU GŁÓWNEGO ***
- '********************************************************************************
- '--- EKRAN GŁÓWNY
- Ekran_3:
- Cls 'wyczyść ekran
- Showpic 1 , 1 , Ikona_temp 'pokaż ikonę termometru
- Return
- '--- DZIAŁANIA ALARMU
- Temp_awaria:
- Alarm = 1 'włącz alarm
- Setfont Font12x16 'użyj średniej czcionki
- Lcdat 1 , 33 , " Awaria!" 'wyświetl, że jest problem z czujnikiem temperatury
- Lcdat 3 , 33 , " DS18B20"
- Setfont Font8x8 'użyj średniej czcionki
- Lcdat 1 , 17 , " " 'wyczyść ikonę
- Lcdat 2 , 17 , " "
- Showpic 0 , 17 , Ikona_cls 'wyczyść ikonę
- Showpic 17 , 17 , Ikona_cls
- Reset Pk_grzanie 'wyłącz grzanie
- Reset Pk_chlodzenie 'wyłącz chłodzenie
- Return
- '--- CZCIONKI
- $include "Font/Font8x8.font" 'mała czcionka
- $include "Font/Font12x16.font" 'średnia czcionka
- $include "Font/Font23x32.font" 'duża czcionka
- '--- IKONY
- Ikona_temp: 'ikona termometru
- $bgf "ICO/temp.bgf"
- Ikona_grzanie: 'ikona ogrzewania
- $bgf "ICO/grzanie2.bgf"
- Ikona_chlodzenie: 'ikona chłodzenia
- $bgf "ICO/chlodzenie2.bgf"
- Ikona_cls: 'czyszczenie ikony
- $bgf "ICO/cls.bgf"
- Ikona_alarm: 'ikona alarmu
- $bgf "ICO/alarm.bgf"