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)
$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 32
$framesize = 128
Config Submode = New
Config Timer0 = Timer , Prescale = 1024 , Clear_timer = 1 : Compare0a = 155 '10ms @16MHz
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Scl = Portc.5
Config Sda = Portc.4
I2cinit : Config Twi = 100000
$lib "bl_Lcd_i2c.lib"
Config Lcd = 16x2
Const Pcf_d4 = 4
Const Pcf_d5 = 5
Const Pcf_d6 = 6
Const Pcf_d7 = 7
Const Pcf_rs = 0
Const Pcf_rw = 1
Const Pcf_e1 = 2
Dim _lcd_e As Byte
Dim Backlight As Byte
Backlight_on Alias &H08
Backlight_off Alias &H00
Backlight = Backlight_on
_lcd_e = 128
Const Pcf8574_lcd = &H4E
Waitms 100 : Cls
Dim Tryb As Byte
Dim Menu As Byte
Dim X1 As Byte , X2 As Byte , X3 As Byte
Const Sw_r = 1
Const Sw_u = 2
Const Sw_d = 3
Const Sw_l = 4
Const Sw_s = 5
Dim Old_key As Byte , Key_cnt As Byte , Key As Byte
Function Read_keypad() As Byte
'--- function with autorepeat
Local Adc_read_key As Word , Read_key As Byte , Key_val As Byte
Adc_read_key = Getadc(0)
Select Case Adc_read_key
Case 0 To 100 : Read_key = Sw_r 'right = 0
Case 101 To 250 : Read_key = Sw_u 'up = 145
Case 251 To 400 : Read_key = Sw_d 'dwn = 330
Case 401 To 600 : Read_key = Sw_l 'left = 506
Case 601 To 850 : Read_key = Sw_s 'select = 743
Case Is > 851 : Read_key = 0 'no key = 1023
End Select
If Read_key <> 0 Then
If Old_key = Read_key Then
If Key_cnt < 20 Then
Incr Key_cnt
Key_val = 0
Else
Key_cnt = 0
Key_val = Read_key
End If
End If
Else
Key_cnt = 15
Key_val = 0
End If
Old_key = Read_key
Read_keypad = Key_val
End Function
Locate 1 , 1 : Lcd "normalny "
Locate 2 , 1 : Lcd "ekran "
X1 = 1
X2 = 1
Menu = 0
Enable Interrupts
Do
If Tifr0.ocf0a = 1 Then
Tifr0.ocf0a = 1
Key = Read_keypad()
End If
If Key <> 0 Then
Select Case Tryb
Case 0:
If Key = Sw_s Then
Locate 1 , 1 : Lcd "0.0.0 "
Locate 2 , 1 : Lcd "menu "
Tryb = 1
End If
Case 1
Select Case Key
Case Sw_r
Incr Menu
If Menu > 3 Then Menu = 3
Case Sw_l
Decr Menu
If Menu < 1 Then Menu = 1
End Select
Select Case Menu
Case 1
Select Case Key
Case Sw_u
Incr X1
If X1 > 9 Then X1 = 9
Case Sw_d
Decr X1
If X1 < 1 Then X1 = 1
End Select
Locate 1 , 1 : Lcd "1.0.0 "
Locate 2 , 1 : Lcd X1 ; " "
Case 2
Select Case Key
Case Sw_u
Incr X2
If X2 > 9 Then X2 = 9
Case Sw_d
Decr X2
If X2 < 1 Then X2 = 1
End Select
Locate 1 , 1 : Lcd "2.0.0 "
Locate 2 , 1 : Lcd X2 ; " "
Case 3
Locate 1 , 1 : Lcd "3.0.0 "
Locate 2 , 1 : Lcd "Wyjscie "
If Key = Sw_s Then
Tryb = 0
Menu = 0
Locate 1 , 1 : Lcd "normalny "
Locate 2 , 1 : Lcd "ekran "
End If
End Select
End Select
Key = 0
End If
Loop
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