Projekt systemu nawadniania

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

Projekt systemu nawadniania

Post autor: pimowo » 17 lis 2016, 15:32

Piszę na forum ponieważ już nie daję rady...
Próbuję zrobić menu, ale nic mi nie działa :(

Na początek chciałbym "ogarnąć" zegarek na ATmega328p + OLED SSD1307 0,96" (i2c) Dane udało mi się wczytać z DS'a ale nie potrafię go ustawić.
Mam pięć przycisków: UP, DOWN, OK, LEFT i RIGHT chciałbym aby moje MENU docelowo działało tak:
- UP zwiększanie ustawianej wartości
- DOWN zmniejszanie ustawianej wartości
- LEFT i RIGHT przesuwanie się po MENU w lewo i prawo
- OK długie naciśnięcie to wejście do MENU, zatwierdzenie ustawionej wartości czy coś w ten deseń
- OK krótkie naciśnięcie w stanie "normalnym" wybudzanie wyświetlacza (jak na razie jeszcze nie wiem jak go wygasić np po 3 minutach nie aktywności)
- w stanie "normalnym" długie naciśnięcie przycisków: UP, DOWN, LEFT i RIGHT ma załączać cztery wyjścia (przekaźniki)
$regfile = "m328pdef.dat" $crystal = 16000000 $hwstack = 64 $swstack = 64 $framesize = 64 Config Submode = New $lib "glcdSSD1306-I2C.lib" Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306" 'buzzer Config Portc.0 = Output : Portc.0 = 0 : Buzzer Alias Portc.0 'przyciski Config Pinb.0 = Input : Portb.0 = 1 : Sw_up Alias Pinb.0 Config Pinb.1 = Input : Portb.1 = 1 : Sw_down Alias Pinb.1 Config Pinb.2 = Input : Portb.2 = 1 : Sw_ok Alias Pinb.2 Config Pinb.3 = Input : Portb.3 = 1 : Sw_right Alias Pinb.3 Config Pinb.4 = Input : Portb.4 = 1 : Sw_left Alias Pinb.4 'TIMER Config Timer0 = Timer , Prescale = 1024 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1 Enable Compare0a : On Compare0a Int10ms Nosave : Compare0a = 155 '10ms @16MHz Declare Sub Oled(byval Text As String * 16 , Byval Col As Integer , Byval Page As Integer) Declare Sub Oled_init Declare Sub Set_clock(byval Numer_b As Byte , Byval Wartosc As Byte) 'Zmienne Dim 10ms As Byte , 100ms As Byte , 500ms As Byte , 1s As Byte Dim Resetflag As Bit Dim Odczyt(2) As Byte , T As Integer , T1 As Single , Wynik As String * 5 Dim Dzien_tygodnia As Byte , Nazwa_dnia(7) As String * 2 Dim Pik As Byte , Tryb As Byte , Index As Byte Dim Mig As Bit , Temp_b As Byte , Offset As Byte Dim Dzien As Byte , Miesiac As Byte , Rok As Byte Dim Sekunda As Byte , Minuta As Byte , Godzina As Byte Dim Licz1 As Byte , Licz2 As Byte , Licz3 As Byte , Licz4 As Byte , Licz5 As Byte Dim Flaga_ok As Byte , Flaga_up As Byte , Flaga_right As Byte , Flaga_down As Byte , Flaga_left As Byte 'nazwy Dnia Tygodnia Nazwa_dnia(1) = "Pn" Nazwa_dnia(2) = "Wt" Nazwa_dnia(3) = "Sr" Nazwa_dnia(4) = "Cz" Nazwa_dnia(5) = "Pi" Nazwa_dnia(6) = "So" Nazwa_dnia(7) = "Nd" 'i2c Config Scl = Portc.5 Config Sda = Portc.4 Const Ds1307w = 208 Const Ds1307r = 209 Call Oled_init Cls 'powitanie Setfont Font8x8tt Lcdat 5 , 24 , "*" , 0 Waitms 500 Lcdat 5 , 44 , "*" , 0 Waitms 500 Lcdat 5 , 64 , "*" , 0 Waitms 500 Lcdat 5 , 84 , "*" , 0 Waitms 500 Lcdat 5 , 104 , "*" , 0 Wait 1 Cls Enable Interrupts '*** START *** Do 'co 10ms If 10ms = 1 Then 10ms = 0 Gosub Sprawdz_wejscia If 100ms < 10 Then Incr 100ms Else 100ms = 0 If 1s < 10 Then Incr 1s Else 1s = 0 Gosub Zegarek Gosub Miganie_dwukropek End If If Pik > 0 Then Decr Pik Toggle Buzzer End If End If End If If Flaga_ok = 1 Then Flaga_ok = 0 Select Case Tryb Case 0 If Flaga_ok = 1 Then Flaga_ok = 0 Cls Tryb = 1 End If Pik = 2 Case 1 If Flaga_ok = 1 Then Flaga_ok = 0 If Index < 6 Then Incr Index Else Index = 0 Cls Tryb = 0 End If End If If Flaga_up = 1 Then Flaga_up = 0 Select Case Index Case 0 Incr Godzina If Godzina > 23 Then Godzina = 1 Call Set_clock(2 , Godzina) Case 1 Incr Minuta If Minuta > 59 Then Minuta = 0 Call Set_clock(1 , Minuta) Case 2 Incr Dzien If Dzien > 31 Then Dzien = 1 Call Set_clock(4 , Dzien) Case 3 Incr Miesiac If Miesiac > 12 Then Miesiac = 1 Call Set_clock(5 , Miesiac) Case 4 Incr Rok If Rok > 30 Then Rok = 00 Call Set_clock(6 , Rok) Case 5 Incr Dzien_tygodnia If Dzien_tygodnia > 7 Then Dzien_tygodnia = 1 Call Set_clock(3 , Dzien_tygodnia) End Select End If Pik = 2 End Select End If Loop End 'przerwania do odmierzania czasu Int10ms: $asm PUSH R24 !in R24, sreg PUSH R24 $end Asm 10ms = 1 $asm POP R24 !out sreg, r24 POP R24 $end Asm Return 'przyciski Sprawdz_wejscia: 'UP If Sw_up = 0 Then If Licz1 < 255 Then Incr Licz1 If Licz1 = 10 Then 'cos End If Else If Licz1 > 1 Then If Licz1 < 10 Then Flaga_up = 1 End If End If Licz1 = 0 End If 'DOWN If Sw_down = 0 Then If Licz2 < 255 Then Incr Licz2 If Licz2 = 10 Then 'cos End If Else If Licz2 > 1 Then If Licz2 < 10 Then Flaga_down = 1 End If End If Licz2 = 0 End If 'OK If Sw_ok = 0 Then If Licz3 < 255 Then Incr Licz3 If Licz3 = 10 Then 'cos End If Else If Licz3 > 1 Then If Licz3 < 10 Then Flaga_ok = 1 End If End If Licz3 = 0 End If 'right If Sw_right = 0 Then If Licz4 < 255 Then Incr Licz4 If Licz4 = 10 Then 'cos End If Else If Licz4 > 1 Then If Licz4 < 10 Then Flaga_right = 1 End If End If Licz4 = 0 End If 'left If Sw_left = 0 Then If Licz5 < 255 Then Incr Licz5 If Licz5 = 10 Then 'cos End If Else If Licz5 > 1 Then If Licz5 < 10 Then Flaga_left = 1 End If End If Licz5 = 0 End If Return Zegarek: I2cstart I2cwbyte Ds1307w I2cwbyte 0 I2cstart I2cwbyte Ds1307r I2crbyte Sekunda , Ack I2crbyte Minuta , Ack I2crbyte Godzina , Ack I2crbyte Dzien_tygodnia , Ack I2crbyte Dzien , Ack I2crbyte Miesiac , Ack I2crbyte Rok , Nack I2cstop Sekunda = Makedec(sekunda) : Minuta = Makedec(minuta) : Godzina = Makedec(godzina) Dzien_tygodnia = Makedec(dzien_tygodnia) : Dzien = Makedec(dzien) : Miesiac = Makedec(miesiac) : Rok = Makedec(rok) If Godzina < 10 Then Lcdat 1 , 1 , "0" ; Godzina , 0 Else Lcdat 1 , 1 , Godzina , 0 End If Lcdat 1 , 16 , ":" , 0 If Minuta < 10 Then Lcdat 1 , 21 , "0" ; Minuta , 0 Else Lcdat 1 , 21 , Minuta , 0 End If Lcdat 1 , 36 , ":" , 0 If Sekunda < 10 Then Lcdat 1 , 41 , "0" ; Sekunda , 0 Else Lcdat 1 , 41 , Sekunda , 0 End If If Dzien < 10 Then Lcdat 1 , 60 , "0" ; Dzien , 0 Else Lcdat 1 , 60 , Dzien , 0 End If Lcdat 1 , 72 , "/" , 0 If Miesiac < 10 Then Lcdat 1 , 80 , "0" ; Miesiac , 0 Else Lcdat 1 , 80 , Miesiac , 0 End If Lcdat 1 , 92 , "/" , 0 Lcdat 1 , 100 , Rok , 0 Lcdat 1 , 116 , Nazwa_dnia(dzien_tygodnia) , 0 Return Miganie: Mig = Not Mig Select Case Index Case 0 Offset = 1 Temp_b = Godzina Case 1 Offset = 21 Temp_b = Minuta Case 2 Offset = 60 Temp_b = Dzien Case 3 Offset = 80 Temp_b = Miesiac Case 4 Offset = 100 Temp_b = Rok End Select Select Case Index Case 0 To 4 If Mig = 1 Then If Temp_b > 9 Then Lcdat 1 , Offset , Temp_b , 1 Else Lcdat 1 , Offset , "0" ; Temp_b , 1 End If Else Lcdat 1 , Offset , " " , 1 End If Case 5 If Mig = 1 Then Lcdat 1 , 116 , Nazwa_dnia(dzien_tygodnia) , 1 Else Lcdat 1 , 116 , " " , 1 End If End Select Return Miganie_dwukropek: Mig = Not Mig If Mig = 1 Then Lcdat 1 , 16 , ":" , 0 Lcdat 1 , 36 , ":" , 0 Else Lcdat 1 , 16 , "'" , 0 Lcdat 1 , 36 , "'" , 0 End If Return Sub Set_clock(byval Numer_b As Byte , Byval Wartosc As Byte) Wartosc = Makebcd(wartosc) I2cstart I2cwbyte Ds1307w I2cwbyte Numer_b I2cwbyte Wartosc I2cstop End Sub 'OLED Sub Oled(byval Byval Text As String * 16 , Byval Col As Integer , Byval Page As Integer) Dim Buchstabe As String * 1 Dim Q As Integer Dim H As Integer Dim Temp As Integer Dim Senden As Byte Col = Col + 16 Page = Page + 175 I2cstart I2cwbyte &H78 I2cwbyte &H80 I2cwbyte Page I2cstop I2cstart I2cwbyte &H78 I2cwbyte &H80 I2cwbyte &H00 I2cstop I2cstart I2cwbyte &H78 I2cwbyte &H80 I2cwbyte Col 'Bestimmung Page (Y) I2cstop I2cstart I2cwbyte &H78 I2cwbyte &H80 I2cstop I2cstart I2cwbyte &H78 I2cwbyte &H40 For Q = 1 To 16 Temp = 0 Buchstabe = Mid(text , Q , 1) Temp = Asc(buchstabe) Temp = Temp - 32 Temp = Temp * 8 For H = 1 To 8 Senden = Lookup(temp , Asciitab) I2cwbyte Senden Incr Temp Next H Next Q I2cstop End Sub Sub Oled_init I2cstart I2cwbyte &H78 I2cwbyte &HAE 'DISPLAYOFF I2cwbyte &HD5 'SETDISPLAYCLOCKDIV I2cwbyte &H80 'ratio 0x80 I2cwbyte &H00 'SETMULTIPLEX I2cwbyte &H3F ' 1f 128x32 I2cwbyte &HD3 'SETDISPLAYOFFSET I2cwbyte &H00 I2cwbyte &H40 'SETSTARTLINE I2cwbyte &H8D 'CHARGEPUMP I2cwbyte &H14 'vccstate 14 I2cwbyte &H20 'MEMORYMODE I2cwbyte &H00 ' I2cwbyte &HA1 'A0 upside down SEGREMAP I2cwbyte &HC8 'COMSCANDEC I2cwbyte &HDA 'SETCOMPINS I2cwbyte &H12 ' 02 128x32 12 I2cwbyte &H81 'SETCONTRAST I2cwbyte &HFF 'value 1-->256 I2cwbyte &HD9 'SETPRECHARGE I2cwbyte &HF1 'vccstate f1 I2cwbyte &HDB 'SETVCOMDETECT I2cwbyte &H40 I2cwbyte &HA4 'DISPLAYALLON_RESUME I2cwbyte &HA6 'NORMALDISPLAY I2cwbyte &HAF I2cstop End Sub 'czcionki Font8x8tt: $asm .db 1 , 8 , 8 , 2 .db 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ; .db 0 , 0 , 6 , 95 , 6 , 0 , 0 , 0 ; ! .db 0 , 7 , 3 , 0 , 7 , 3 , 0 , 0 ; "" .db 0 , 36 , 126 , 36 , 126 , 36 , 0 , 0 ; # .db 0 , 36 , 43 , 106 , 18 , 0 , 0 , 0 ; $ .db 0 , 99 , 19 , 8 , 100 , 99 , 0 , 0 ; % .db 0 , 54 , 73 , 86 , 32 , 80 , 0 , 0 ; & .db 0 , 0 , 7 , 3 , 0 , 0 , 0 , 0 ; ' .db 0 , 0 , 62 , 65 , 0 , 0 , 0 , 0 .db 0 , 0 , 65 , 62 , 0 , 0 , 0 , 0 .db 0 , 8 , 62 , 28 , 62 , 8 , 0 , 0 ; * .db 0 , 8 , 8 , 62 , 8 , 8 , 0 , 0 ; + .db 0 , 0 , 224 , 96 , 0 , 0 , 0 , 0 ; , .db 0 , 8 , 8 , 8 , 8 , 8 , 0 , 0 ; - .db 0 , 0 , 96 , 96 , 0 , 0 , 0 , 0 ; . .db 0 , 32 , 16 , 8 , 4 , 2 , 0 , 0 ; / .db 0 , 62 , 81 , 73 , 69 , 62 , 0 , 0 ; 0 .db 0 , 0 , 66 , 127 , 64 , 0 , 0 , 0 ; 1 .db 0 , 98 , 81 , 73 , 73 , 70 , 0 , 0 ; 2 .db 0 , 34 , 73 , 73 , 73 , 54 , 0 , 0 ; 3 .db 0 , 24 , 20 , 18 , 127 , 16 , 0 , 0 ; 4 .db 0 , 47 , 73 , 73 , 73 , 49 , 0 , 0 ; 5 .db 0 , 60 , 74 , 73 , 73 , 48 , 0 , 0 ; 6 .db 0 , 1 , 113 , 9 , 5 , 3 , 0 , 0 ; 7 .db 0 , 54 , 73 , 73 , 73 , 54 , 0 , 0 ; 8 .db 0 , 6 , 73 , 73 , 41 , 30 , 0 , 0 ; 9 .db 0 , 0 , 108 , 108 , 0 , 0 , 0 , 0 ; : .db 0 , 0 , 236 , 108 , 0 , 0 , 0 , 0 ; ; .db 0 , 8 , 20 , 34 , 65 , 0 , 0 , 0 ; < .db 0 , 36 , 36 , 36 , 36 , 36 , 0 , 0 ; = .db 0 , 0 , 65 , 34 , 20 , 8 , 0 , 0 ; > .db 0 , 2 , 1 , 89 , 9 , 6 , 0 , 0 ; Print .db 0 , 62 , 65 , 93 , 85 , 30 , 0 , 0 ; @ .db 0 , 126 , 17 , 17 , 17 , 126 , 0 , 0 ; A .db 0 , 127 , 73 , 73 , 73 , 54 , 0 , 0 ; B .db 0 , 62 , 65 , 65 , 65 , 34 , 0 , 0 ; C .db 0 , 127 , 65 , 65 , 65 , 62 , 0 , 0 ; D .db 0 , 127 , 73 , 73 , 73 , 65 , 0 , 0 ; E .db 0 , 127 , 9 , 9 , 9 , 1 , 0 , 0 ; F .db 0 , 62 , 65 , 73 , 73 , 122 , 0 , 0 ; G .db 0 , 127 , 8 , 8 , 8 , 127 , 0 , 0 ; H .db 0 , 0 , 65 , 127 , 65 , 0 , 0 , 0 ; I .db 0 , 48 , 64 , 64 , 64 , 63 , 0 , 0 ; J .db 0 , 127 , 8 , 20 , 34 , 65 , 0 , 0 ; K .db 0 , 127 , 64 , 64 , 64 , 64 , 0 , 0 ; L .db 0 , 127 , 2 , 4 , 2 , 127 , 0 , 0 ; M .db 0 , 127 , 2 , 4 , 8 , 127 , 0 , 0 ; N .db 0 , 62 , 65 , 65 , 65 , 62 , 0 , 0 ; O .db 0 , 127 , 9 , 9 , 9 , 6 , 0 , 0 ; P .db 0 , 62 , 65 , 81 , 33 , 94 , 0 , 0 ; Q .db 0 , 127 , 9 , 9 , 25 , 102 , 0 , 0 ; R .db 0 , 38 , 73 , 73 , 73 , 50 , 0 , 0 ; S .db 0 , 1 , 1 , 127 , 1 , 1 , 0 , 0 ; T .db 0 , 63 , 64 , 64 , 64 , 63 , 0 , 0 ; U .db 0 , 31 , 32 , 64 , 32 , 31 , 0 , 0 ; V .db 0 , 63 , 64 , 60 , 64 , 63 , 0 , 0 ; W .db 0 , 99 , 20 , 8 , 20 , 99 , 0 , 0 ; X .db 0 , 7 , 8 , 112 , 8 , 7 , 0 , 0 ; Y .db 0 , 113 , 73 , 69 , 67 , 0 , 0 , 0 ; Z .db 0 , 0 , 127 , 65 , 65 , 0 , 0 , 0 ; [ .db 0 , 2 , 4 , 8 , 16 , 32 , 0 , 0 ; \ .db 0 , 0 , 65 , 65 , 127 , 0 , 0 , 0 ; ] .db 0 , 4 , 2 , 1 , 2 , 4 , 0 , 0 ; ^ .db 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128 .db 0 , 0 , 3 , 7 , 0 , 0 , 0 , 0 ; ` .db 0 , 32 , 84 , 84 , 84 , 120 , 0 , 0 ; A .db 0 , 127 , 68 , 68 , 68 , 56 , 0 , 0 ; B .db 0 , 56 , 68 , 68 , 68 , 40 , 0 , 0 ; C .db 0 , 56 , 68 , 68 , 68 , 127 , 0 , 0 ; D .db 0 , 56 , 84 , 84 , 84 , 8 , 0 , 0 ; E .db 0 , 8 , 126 , 9 , 9 , 0 , 0 , 0 ; F .db 0 , 24 , 164 , 164 , 164 , 124 , 0 , 0 ; G .db 0 , 127 , 4 , 4 , 120 , 0 , 0 , 0 ; H .db 0 , 0 , 0 , 125 , 64 , 0 , 0 , 0 ; I .db 0 , 64 , 128 , 132 , 125 , 0 , 0 , 0 ; J .db 0 , 127 , 16 , 40 , 68 , 0 , 0 , 0 ; K .db 0 , 0 , 0 , 127 , 64 , 0 , 0 , 0 ; L .db 0 , 124 , 4 , 24 , 4 , 120 , 0 , 0 ; M .db 0 , 124 , 4 , 4 , 120 , 0 , 0 , 0 ; N .db 0 , 56 , 68 , 68 , 68 , 56 , 0 , 0 ; O .db 0 , 252 , 68 , 68 , 68 , 56 , 0 , 0 ; P .db 0 , 56 , 68 , 68 , 68 , 252 , 0 , 0 ; Q .db 0 , 68 , 120 , 68 , 4 , 8 , 0 , 0 ; R .db 0 , 8 , 84 , 84 , 84 , 32 , 0 , 0 ; S .db 0 , 4 , 62 , 68 , 36 , 0 , 0 , 0 ; T .db 0 , 60 , 64 , 32 , 124 , 0 , 0 , 0 ; U .db 0 , 28 , 32 , 64 , 32 , 28 , 0 , 0 ; V .db 0 , 60 , 96 , 48 , 96 , 60 , 0 , 0 ; W .db 0 , 108 , 16 , 16 , 108 , 0 , 0 , 0 ; X .db 0 , 156 , 160 , 96 , 60 , 0 , 0 , 0 ; Y .db 0 , 100 , 84 , 84 , 76 , 0 , 0 , 0 ; Z .db 0 , 8 , 62 , 65 , 65 , 0 , 0 , 0 ; { .db 0 , 0 , 0 , 119 , 0 , 0 , 0 , 0 ; | .db 0 , 0 , 65 , 65 , 62 , 8 , 0 , 0 ; } .db 0 , 2 , 1 , 2 , 1 , 0 , 0 , 0 ; ~ $end Asm Będę przeogromnie wdzięczny za pomoc ;)
Ostatnio zmieniony 20 lis 2016, 17:51 przez pimowo, łącznie zmieniany 1 raz.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: OLED MENU

Post autor: pimowo » 17 lis 2016, 23:48

Siedzę cały wieczór nad tym i nic mądrego nie mogę wymyślić :(
Zostawałem na chwilę ustawienia i zająłem się samym MENU. Wygląda to mniej więcej jak bym chciał...
$regfile = "m328pdef.dat" $crystal = 16000000 $hwstack = 64 $swstack = 64 $framesize = 64 Config Submode = New $lib "glcdSSD1306-I2C.lib" Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306" 'buzzer Config Portc.0 = Output : Portc.0 = 0 : Buzzer Alias Portc.0 'przyciski Config Pinb.0 = Input : Portb.0 = 1 : Sw_up Alias Pinb.0 Config Pinb.1 = Input : Portb.1 = 1 : Sw_down Alias Pinb.1 Config Pinb.2 = Input : Portb.2 = 1 : Sw_ok Alias Pinb.2 Config Pinb.3 = Input : Portb.3 = 1 : Sw_right Alias Pinb.3 Config Pinb.4 = Input : Portb.4 = 1 : Sw_left Alias Pinb.4 'TIMER Config Timer0 = Timer , Prescale = 1024 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1 Enable Compare0a : On Compare0a Int10ms Nosave : Compare0a = 155 '10ms @16MHz Declare Sub Oled(byval Text As String * 16 , Byval Col As Integer , Byval Page As Integer) Declare Sub Oled_init Declare Sub Set_clock(byval Numer_b As Byte , Byval Wartosc As Byte) 'Zmienne Dim 10ms As Byte , 100ms As Byte , 500ms As Byte , 1s As Byte Dim Resetflag As Bit Dim Odczyt(2) As Byte , T As Integer , T1 As Single , Wynik As String * 5 Dim Dzien_tygodnia As Byte , Nazwa_dnia(7) As String * 2 Dim Pik As Byte , Tryb As Byte , Index As Byte Dim Mig As Bit , Temp_b As Byte , Offset As Byte Dim Dzien As Byte , Miesiac As Byte , Rok As Byte Dim Sekunda As Byte , Minuta As Byte , Godzina As Byte Dim Licz1 As Byte , Licz2 As Byte , Licz3 As Byte , Licz4 As Byte , Licz5 As Byte Dim Flaga_ok_menu As Byte , Flaga_ok As Byte , Flaga_up As Byte , Flaga_right As Byte , Flaga_down As Byte , Flaga_left As Byte 'nazwy Dnia Tygodnia Nazwa_dnia(1) = "Pn" Nazwa_dnia(2) = "Wt" Nazwa_dnia(3) = "Sr" Nazwa_dnia(4) = "Cz" Nazwa_dnia(5) = "Pi" Nazwa_dnia(6) = "So" Nazwa_dnia(7) = "Nd" 'i2c Config Scl = Portc.5 Config Sda = Portc.4 Const Ds1307w = 208 Const Ds1307r = 209 Call Oled_init Cls 'powitanie Setfont Font8x8tt Lcdat 5 , 24 , "*" , 0 Waitms 500 Lcdat 5 , 44 , "*" , 0 Waitms 500 Lcdat 5 , 64 , "*" , 0 Waitms 500 Lcdat 5 , 84 , "*" , 0 Waitms 500 Lcdat 5 , 104 , "*" , 0 Wait 1 Cls Tryb = 1 Enable Interrupts '*** START *** Do 'co 10ms If 10ms = 1 Then 10ms = 0 Gosub Sprawdz_wejscia If 100ms < 10 Then Incr 100ms Else 100ms = 0 If 1s < 10 Then Incr 1s Else 1s = 0 Gosub Zegarek Gosub Miganie_dwukropek End If End If End If If Flaga_ok_menu = 1 Then Flaga_ok_menu = 0 Cls Tryb = 2 Lcdat 1 , 10 , "Zegar " , 0 Lcdat 2 , 10 , "Cos 1 " , 0 Lcdat 3 , 10 , "Cos 2 " , 0 Lcdat 4 , 10 , "Cos 3 " , 0 Lcdat 5 , 10 , "Cos 4 " , 0 Lcdat 6 , 10 , "Cos 5 " , 0 Lcdat 7 , 10 , "Cos 6 " , 0 Lcdat 8 , 10 , "Wyswietlacz " , 0 End If If Flaga_down = 1 Then Flaga_down = 0 If Tryb = 2 Then If Index < 10 Then Incr Index Else Index = 0 Cls Tryb = 2 End If Select Case Index Case 1 Lcdat 1 , 10 , " Zegar" , 1 Case 2 Lcdat 1 , 10 , "Zegar " , 0 Lcdat 2 , 10 , " Cos 1" , 1 Case 3 Lcdat 2 , 10 , "Cos 1 " , 0 Lcdat 3 , 10 , " Cos 2" , 1 Case 4 Lcdat 3 , 10 , "Cos 2 " , 0 Lcdat 4 , 10 , " Cos 3" , 1 Case 5 Lcdat 4 , 10 , "Cos 3 " , 0 Lcdat 5 , 10 , " Cos 4" , 1 Case 6 Lcdat 5 , 10 , "Cos 4 " , 0 Lcdat 6 , 10 , " Cos 5" , 1 Case 7 Lcdat 6 , 10 , "Cos 5 " , 0 Lcdat 7 , 10 , " Cos 6" , 1 Case 8 Lcdat 7 , 10 , "Cos 6 " , 0 Lcdat 8 , 10 , " Wyswietlacz" , 1 Case 9 Cls Lcdat 1 , 10 , " Buzzer" , 1 Lcdat 2 , 10 , "Wyjscie" , 0 Case 10 Lcdat 1 , 10 , "Buzzer " , 0 Lcdat 2 , 10 , " Wyjscie" , 1 If Flaga_ok = 1 Then Flaga_ok = 0 Index = 0 Cls Tryb = 1 End If End Select End If End If Loop End 'przerwania do odmierzania czasu Int10ms: $asm PUSH R24 !in R24, sreg PUSH R24 $end Asm 10ms = 1 $asm POP R24 !out sreg, r24 POP R24 $end Asm Return 'przyciski Sprawdz_wejscia: 'UP If Sw_up = 0 Then If Licz1 < 255 Then Incr Licz1 If Licz1 = 75 Then 'cos End If Else If Licz1 > 1 Then If Licz1 < 75 Then Flaga_up = 1 End If End If Licz1 = 0 End If 'DOWN If Sw_down = 0 Then If Licz2 < 255 Then Incr Licz2 If Licz2 = 75 Then 'cos End If Else If Licz2 > 1 Then If Licz2 < 75 Then Flaga_down = 1 End If End If Licz2 = 0 End If 'OK If Sw_ok = 0 Then If Licz3 < 255 Then Incr Licz3 If Licz3 = 75 Then Flaga_ok_menu = 1 End If Else If Licz3 > 1 Then If Licz3 < 75 Then Flaga_ok = 1 End If End If Licz3 = 0 End If 'right If Sw_right = 0 Then If Licz4 < 255 Then Incr Licz4 If Licz4 = 75 Then 'cos End If Else If Licz4 > 1 Then If Licz4 < 75 Then Flaga_right = 1 End If End If Licz4 = 0 End If 'left If Sw_left = 0 Then If Licz5 < 255 Then Incr Licz5 If Licz5 = 75 Then 'cos End If Else If Licz5 > 1 Then If Licz5 < 75 Then Flaga_left = 1 End If End If Licz5 = 0 End If Return Zegarek: I2cstart I2cwbyte Ds1307w I2cwbyte 0 I2cstart I2cwbyte Ds1307r I2crbyte Sekunda , Ack I2crbyte Minuta , Ack I2crbyte Godzina , Ack I2crbyte Dzien_tygodnia , Ack I2crbyte Dzien , Ack I2crbyte Miesiac , Ack I2crbyte Rok , Nack I2cstop Sekunda = Makedec(sekunda) : Minuta = Makedec(minuta) : Godzina = Makedec(godzina) Dzien_tygodnia = Makedec(dzien_tygodnia) : Dzien = Makedec(dzien) : Miesiac = Makedec(miesiac) : Rok = Makedec(rok) If Tryb = 1 Then If Godzina < 10 Then Lcdat 1 , 1 , "0" ; Godzina , 0 Else Lcdat 1 , 1 , Godzina , 0 End If Lcdat 1 , 16 , ":" , 0 If Minuta < 10 Then Lcdat 1 , 21 , "0" ; Minuta , 0 Else Lcdat 1 , 21 , Minuta , 0 End If Lcdat 1 , 36 , ":" , 0 If Sekunda < 10 Then Lcdat 1 , 41 , "0" ; Sekunda , 0 Else Lcdat 1 , 41 , Sekunda , 0 End If If Dzien < 10 Then Lcdat 1 , 60 , "0" ; Dzien , 0 Else Lcdat 1 , 60 , Dzien , 0 End If Lcdat 1 , 72 , "/" , 0 If Miesiac < 10 Then Lcdat 1 , 80 , "0" ; Miesiac , 0 Else Lcdat 1 , 80 , Miesiac , 0 End If Lcdat 1 , 92 , "/" , 0 Lcdat 1 , 100 , Rok , 0 Lcdat 1 , 116 , Nazwa_dnia(dzien_tygodnia) , 0 End If Return Miganie_dwukropek: Mig = Not Mig If Tryb = 1 Then If Mig = 1 Then Lcdat 1 , 16 , ":" , 0 Lcdat 1 , 36 , ":" , 0 Else Lcdat 1 , 16 , "'" , 0 Lcdat 1 , 36 , "'" , 0 End If End If Return Sub Set_clock(byval Numer_b As Byte , Byval Wartosc As Byte) Wartosc = Makebcd(wartosc) I2cstart I2cwbyte Ds1307w I2cwbyte Numer_b I2cwbyte Wartosc I2cstop End Sub 'OLED Sub Oled(byval Byval Text As String * 16 , Byval Col As Integer , Byval Page As Integer) Dim Buchstabe As String * 1 Dim Q As Integer Dim H As Integer Dim Temp As Integer Dim Senden As Byte Col = Col + 16 Page = Page + 175 I2cstart I2cwbyte &H78 I2cwbyte &H80 I2cwbyte Page I2cstop I2cstart I2cwbyte &H78 I2cwbyte &H80 I2cwbyte &H00 I2cstop I2cstart I2cwbyte &H78 I2cwbyte &H80 I2cwbyte Col 'Bestimmung Page (Y) I2cstop I2cstart I2cwbyte &H78 I2cwbyte &H80 I2cstop I2cstart I2cwbyte &H78 I2cwbyte &H40 For Q = 1 To 16 Temp = 0 Buchstabe = Mid(text , Q , 1) Temp = Asc(buchstabe) Temp = Temp - 32 Temp = Temp * 8 For H = 1 To 8 Senden = Lookup(temp , Asciitab) I2cwbyte Senden Incr Temp Next H Next Q I2cstop End Sub Sub Oled_init I2cstart I2cwbyte &H78 I2cwbyte &HAE 'DISPLAYOFF I2cwbyte &HD5 'SETDISPLAYCLOCKDIV I2cwbyte &H80 'ratio 0x80 I2cwbyte &H00 'SETMULTIPLEX I2cwbyte &H3F ' 1f 128x32 I2cwbyte &HD3 'SETDISPLAYOFFSET I2cwbyte &H00 I2cwbyte &H40 'SETSTARTLINE I2cwbyte &H8D 'CHARGEPUMP I2cwbyte &H14 'vccstate 14 I2cwbyte &H20 'MEMORYMODE I2cwbyte &H00 ' I2cwbyte &HA1 'A0 upside down SEGREMAP I2cwbyte &HC8 'COMSCANDEC I2cwbyte &HDA 'SETCOMPINS I2cwbyte &H12 ' 02 128x32 12 I2cwbyte &H81 'SETCONTRAST I2cwbyte &HFF 'value 1-->256 I2cwbyte &HD9 'SETPRECHARGE I2cwbyte &HF1 'vccstate f1 I2cwbyte &HDB 'SETVCOMDETECT I2cwbyte &H40 I2cwbyte &HA4 'DISPLAYALLON_RESUME I2cwbyte &HA6 'NORMALDISPLAY I2cwbyte &HAF I2cstop End Sub 'czcionki Font8x8tt: $asm .db 1 , 8 , 8 , 2 .db 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ; .db 0 , 0 , 6 , 95 , 6 , 0 , 0 , 0 ; ! .db 0 , 7 , 3 , 0 , 7 , 3 , 0 , 0 ; "" .db 0 , 36 , 126 , 36 , 126 , 36 , 0 , 0 ; # .db 0 , 36 , 43 , 106 , 18 , 0 , 0 , 0 ; $ .db 0 , 99 , 19 , 8 , 100 , 99 , 0 , 0 ; % .db 0 , 54 , 73 , 86 , 32 , 80 , 0 , 0 ; & .db 0 , 0 , 7 , 3 , 0 , 0 , 0 , 0 ; ' .db 0 , 0 , 62 , 65 , 0 , 0 , 0 , 0 .db 0 , 0 , 65 , 62 , 0 , 0 , 0 , 0 .db 0 , 8 , 62 , 28 , 62 , 8 , 0 , 0 ; * .db 0 , 8 , 8 , 62 , 8 , 8 , 0 , 0 ; + .db 0 , 0 , 224 , 96 , 0 , 0 , 0 , 0 ; , .db 0 , 8 , 8 , 8 , 8 , 8 , 0 , 0 ; - .db 0 , 0 , 96 , 96 , 0 , 0 , 0 , 0 ; . .db 0 , 32 , 16 , 8 , 4 , 2 , 0 , 0 ; / .db 0 , 62 , 81 , 73 , 69 , 62 , 0 , 0 ; 0 .db 0 , 0 , 66 , 127 , 64 , 0 , 0 , 0 ; 1 .db 0 , 98 , 81 , 73 , 73 , 70 , 0 , 0 ; 2 .db 0 , 34 , 73 , 73 , 73 , 54 , 0 , 0 ; 3 .db 0 , 24 , 20 , 18 , 127 , 16 , 0 , 0 ; 4 .db 0 , 47 , 73 , 73 , 73 , 49 , 0 , 0 ; 5 .db 0 , 60 , 74 , 73 , 73 , 48 , 0 , 0 ; 6 .db 0 , 1 , 113 , 9 , 5 , 3 , 0 , 0 ; 7 .db 0 , 54 , 73 , 73 , 73 , 54 , 0 , 0 ; 8 .db 0 , 6 , 73 , 73 , 41 , 30 , 0 , 0 ; 9 .db 0 , 0 , 108 , 108 , 0 , 0 , 0 , 0 ; : .db 0 , 0 , 236 , 108 , 0 , 0 , 0 , 0 ; ; .db 0 , 8 , 20 , 34 , 65 , 0 , 0 , 0 ; < .db 0 , 36 , 36 , 36 , 36 , 36 , 0 , 0 ; = .db 0 , 0 , 65 , 34 , 20 , 8 , 0 , 0 ; > .db 0 , 2 , 1 , 89 , 9 , 6 , 0 , 0 ; Print .db 0 , 62 , 65 , 93 , 85 , 30 , 0 , 0 ; @ .db 0 , 126 , 17 , 17 , 17 , 126 , 0 , 0 ; A .db 0 , 127 , 73 , 73 , 73 , 54 , 0 , 0 ; B .db 0 , 62 , 65 , 65 , 65 , 34 , 0 , 0 ; C .db 0 , 127 , 65 , 65 , 65 , 62 , 0 , 0 ; D .db 0 , 127 , 73 , 73 , 73 , 65 , 0 , 0 ; E .db 0 , 127 , 9 , 9 , 9 , 1 , 0 , 0 ; F .db 0 , 62 , 65 , 73 , 73 , 122 , 0 , 0 ; G .db 0 , 127 , 8 , 8 , 8 , 127 , 0 , 0 ; H .db 0 , 0 , 65 , 127 , 65 , 0 , 0 , 0 ; I .db 0 , 48 , 64 , 64 , 64 , 63 , 0 , 0 ; J .db 0 , 127 , 8 , 20 , 34 , 65 , 0 , 0 ; K .db 0 , 127 , 64 , 64 , 64 , 64 , 0 , 0 ; L .db 0 , 127 , 2 , 4 , 2 , 127 , 0 , 0 ; M .db 0 , 127 , 2 , 4 , 8 , 127 , 0 , 0 ; N .db 0 , 62 , 65 , 65 , 65 , 62 , 0 , 0 ; O .db 0 , 127 , 9 , 9 , 9 , 6 , 0 , 0 ; P .db 0 , 62 , 65 , 81 , 33 , 94 , 0 , 0 ; Q .db 0 , 127 , 9 , 9 , 25 , 102 , 0 , 0 ; R .db 0 , 38 , 73 , 73 , 73 , 50 , 0 , 0 ; S .db 0 , 1 , 1 , 127 , 1 , 1 , 0 , 0 ; T .db 0 , 63 , 64 , 64 , 64 , 63 , 0 , 0 ; U .db 0 , 31 , 32 , 64 , 32 , 31 , 0 , 0 ; V .db 0 , 63 , 64 , 60 , 64 , 63 , 0 , 0 ; W .db 0 , 99 , 20 , 8 , 20 , 99 , 0 , 0 ; X .db 0 , 7 , 8 , 112 , 8 , 7 , 0 , 0 ; Y .db 0 , 113 , 73 , 69 , 67 , 0 , 0 , 0 ; Z .db 0 , 0 , 127 , 65 , 65 , 0 , 0 , 0 ; [ .db 0 , 2 , 4 , 8 , 16 , 32 , 0 , 0 ; \ .db 0 , 0 , 65 , 65 , 127 , 0 , 0 , 0 ; ] .db 0 , 4 , 2 , 1 , 2 , 4 , 0 , 0 ; ^ .db 128 , 128 , 128 , 128 , 128 , 128 , 128 , 128 .db 0 , 0 , 3 , 7 , 0 , 0 , 0 , 0 ; ` .db 0 , 32 , 84 , 84 , 84 , 120 , 0 , 0 ; A .db 0 , 127 , 68 , 68 , 68 , 56 , 0 , 0 ; B .db 0 , 56 , 68 , 68 , 68 , 40 , 0 , 0 ; C .db 0 , 56 , 68 , 68 , 68 , 127 , 0 , 0 ; D .db 0 , 56 , 84 , 84 , 84 , 8 , 0 , 0 ; E .db 0 , 8 , 126 , 9 , 9 , 0 , 0 , 0 ; F .db 0 , 24 , 164 , 164 , 164 , 124 , 0 , 0 ; G .db 0 , 127 , 4 , 4 , 120 , 0 , 0 , 0 ; H .db 0 , 0 , 0 , 125 , 64 , 0 , 0 , 0 ; I .db 0 , 64 , 128 , 132 , 125 , 0 , 0 , 0 ; J .db 0 , 127 , 16 , 40 , 68 , 0 , 0 , 0 ; K .db 0 , 0 , 0 , 127 , 64 , 0 , 0 , 0 ; L .db 0 , 124 , 4 , 24 , 4 , 120 , 0 , 0 ; M .db 0 , 124 , 4 , 4 , 120 , 0 , 0 , 0 ; N .db 0 , 56 , 68 , 68 , 68 , 56 , 0 , 0 ; O .db 0 , 252 , 68 , 68 , 68 , 56 , 0 , 0 ; P .db 0 , 56 , 68 , 68 , 68 , 252 , 0 , 0 ; Q .db 0 , 68 , 120 , 68 , 4 , 8 , 0 , 0 ; R .db 0 , 8 , 84 , 84 , 84 , 32 , 0 , 0 ; S .db 0 , 4 , 62 , 68 , 36 , 0 , 0 , 0 ; T .db 0 , 60 , 64 , 32 , 124 , 0 , 0 , 0 ; U .db 0 , 28 , 32 , 64 , 32 , 28 , 0 , 0 ; V .db 0 , 60 , 96 , 48 , 96 , 60 , 0 , 0 ; W .db 0 , 108 , 16 , 16 , 108 , 0 , 0 , 0 ; X .db 0 , 156 , 160 , 96 , 60 , 0 , 0 , 0 ; Y .db 0 , 100 , 84 , 84 , 76 , 0 , 0 , 0 ; Z .db 0 , 8 , 62 , 65 , 65 , 0 , 0 , 0 ; { .db 0 , 0 , 0 , 119 , 0 , 0 , 0 , 0 ; | .db 0 , 0 , 65 , 65 , 62 , 8 , 0 , 0 ; } .db 0 , 2 , 1 , 2 , 1 , 0 , 0 , 0 ; ~ $end Asm Po przemyśleniach...
Chciałbym używać do wszystkich ustawień tylko trzech przycisków: UP, OK i DOWN.
- długie naciśnięcie w stanie normalnym ma nas przenieść do MENU
- gdy już jesteśmy w MENU to przycisk OK ma zatwierdzać wszystko
- przyciski UP i DOWN będą służyć do przewijania MENU: góra, dół oraz zwiększać i zmniejszać zmieniane parametry

Ideałem było by mieć TAKIE MENU-tylko zamiast strzałek zaznaczony/ustawiany element w negatywie :D
Awatar użytkownika
kaktus
Posty: 32
Rejestracja: 19 sie 2015, 15:13
Lokalizacja: opolskie
Kontakt:

Re: OLED MENU

Post autor: kaktus » 20 lis 2016, 12:20

Zacznij od nauczenia MPU rozpoznawania długiego i krótkiego klik, a potem podejmuj stosowne akcje w zależności od uaktywnionego wyboru / pozycji menu.
Wyświetlacz możesz "wygaszać" nie rysując nic - innymi słowy ustawić wszystkie piksele w stan nieaktywny. Ewentualnie poznaj obsługę kontrolera i wygaś podświetlenie ale nie wiem czy uzyskany efekt będzie zgodny z zamierzonym.
teraz życie można rozdzielić między NOP i SLEEP
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: OLED MENU

Post autor: pimowo » 20 lis 2016, 13:15

Dzięki za odzew ;)
kaktus pisze:Zacznij od nauczenia MPU rozpoznawania długiego i krótkiego klik
To już działa :)
Mam w sumie pięć przycisków czyli dziesięć kombinacji-krótkie i długie naciśnięcia.
kaktus pisze:potem podejmuj stosowne akcje w zależności od uaktywnionego wyboru / pozycji menu.
No i tu jest właśnie największy problem...
To co wyżej pokazałem to działa tak, przytrzymuję "OK" to wchodzę do MENU, później "DOWN" to przewijam MENU i na tym koniec. Nie mam różowego pojęcia jak to rozgryźć aby przejść do jakiś ustawień czy coś :(

Może @niveasoft coś podpowie jak zrobił swoje MENU które widać na filmie-bardzo mi się podoba to rozwiązanie :)
kaktus pisze:Wyświetlacz możesz "wygaszać" nie rysując nic - innymi słowy ustawić wszystkie piksele w stan nieaktywny. Ewentualnie poznaj obsługę kontrolera i wygaś podświetlenie ale nie wiem czy uzyskany efekt będzie zgodny z zamierzonym.
Czyli jak użyje Cls i nic nie wyświetlę to to wystarczy?
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: OLED MENU

Post autor: niveasoft » 20 lis 2016, 16:47

Muszę sprawdzić czy czasem po tym jak O2 zmieniło interfejs poczty nie wrzucają mi powiadomień z forum do spamu bo nie przyszło mi żadne powiadomienie :lol:

Sama idea przewijania menu pozostaje ta sama, ale lekko różnią się przewijania na LCD alfanumerycznych lub takich z funkcją text, a takimi graficznymi. Przykład takiego tekstowego jest w kodzie do projektu MIKA.

Nie napisałeś ile chcesz mieć linii w menu wyświetlanych jednocześnie. Może jakiś rysunek poglądowy.
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: OLED MENU

Post autor: pimowo » 20 lis 2016, 17:46

niveasoft pisze:Muszę sprawdzić czy czasem po tym jak O2 zmieniło interfejs poczty nie wrzucają mi powiadomień z forum do spamu bo nie przyszło mi żadne powiadomienie :lol:
Ja również nie otrzymuję powiadomień :(
niveasoft pisze:Sama idea przewijania menu pozostaje ta sama, ale lekko różnią się przewijania na LCD alfanumerycznych lub takich z funkcją text, a takimi graficznymi.
To co wyżej próbowałem z kodem to nawet zadziałało mniej więcej jak na alfanumerycznym LCD.
niveasoft pisze:Przykład takiego tekstowego jest w kodzie do projektu MIKA.
Oglądałem kody projektu MIKA i powiem szczerze, że mój mały móżdżek tego nie ogarnia.
niveasoft pisze:Nie napisałeś ile chcesz mieć linii w menu wyświetlanych jednocześnie. Może jakiś rysunek poglądowy.
Postaram się opisać na konkretach o co mi chodzi, a nie na jakiś "cosiach" :D

Próbuję zbudować podlewaczkę do kwiatów doniczkowych w domu na parapecie (przy okazji ma to też służyć do podlewania ogrodu u mojego brata) ;)
Jak to ma działać?
Moduł o ustalonej godzinie, minucie i w ustalone dni tygodnia ma załączać pompy wody (u mnie pompki 5V, a u brata 230V) poprzez przekaźniki.
W zestawie ma być: ATmega328p, a konkretnie klon ARduino NANO, ESP-12, OLED SSD1306 0.96" DS1307 (docelowo chyba jednak wybiorę DS3231SN) buzzer, HTU21D, cztery sondy wilgotności gleby i prosty wskaźnik wody ON/OFF (jak w samochodach w zbiorniku płynu do spryskiwaczy)
Co ustalony czas dane będą wysyłane na serwer-AVR wysyła "print dana, dana, dana... a ESP już się zajmie resztą

Meritum... MENU
0.0 podstawowy ekran gdzie będą się wyświetlać dane:
czas, data, dzień tygodnia
temp. powietrza
wilgotność powietrza
wilgotność gleby 1
wilgotność gleby 2
wilgotność gleby 3
wilgotność gleby 4
stan wody-jest/nie ma
1.0 ustaw czas
2.0 ustaw datę i dzień tygodnia
3.0 pompa 1
włączona/wyłączona
przez jaki czas ma pracować
czas włączenia
dzień tygodnia w który/które dni ma pracować
4.0 pompa 2
włączona/wyłączona
przez jaki czas ma pracować
czas włączenia
dzień tygodnia w który/które dni ma pracować
5.0 pompa 3
włączona/wyłączona
przez jaki czas ma pracować
czas włączenia
dzień tygodnia w który/które dni ma pracować
6.0 pompa 4
włączona/wyłączona
przez jaki czas ma pracować
czas włączenia
dzień tygodnia w który/które dni ma pracować
7.0 serwer
co ile minut dane mają być posyłane
8.0 buzzer
włącz/wyłącz
9.0 wyświetlacz
czas działania tzn. po jakim czasie bezczynności ma jeszcze działać
10.0 praca
samodzielna/zdalna (to jak na razie marzenia)
11.0 zapisz ustawienia
nie wiem czy to dobry pomysł, ale chciałbym wszystkie ustawienia zapisywać do eeprom, a po odłączeniu modułu od prądu czy coś program wystartuje z ustawieniami tam zapisanymi
12.0 wyjście z MENU

Wiem, że to na razie jeden wielki chaos i moje umiejętności biedne, ale może z Waszą pomocą uda mi się ogarnąć wymarzony projekt :)
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Projekt systemu nawadniania

Post autor: niveasoft » 21 lis 2016, 14:43

Okay. Z pomocą Obsługi hostingu CBA udało się naprawić powiadomienia :D

Co do tego projektu to, na sam początek proponowałbym zintegrować RTC z wbudowanymi funkcjami Bascom.
Czyli dla DS1307 użyć dedykowanej biblioteki. Co ciekawe - mam to przetestowane - nowszy RTC DS2331 o którym wspomniałeś, podłączony zamiast starszego DS1307 działa zamiennie i normalnie w zakresie podstawowych funkcjonalności.

Potem użyłbym biblioteki do tego wyświetlacza OLED. Normalnie jest dołączana do Bascom od wersji 2079, ale ktoś udostępnił ją na rosyjskiej stronie i możesz wtedy używać wbudowanych w Bascom poleceń.
Podeślę link później ;)

Na końcu coś pomyślimy nad tym Menu ;)
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Projekt systemu nawadniania

Post autor: pimowo » 21 lis 2016, 15:05

niveasoft pisze:Okay. Z pomocą Obsługi hostingu CBA udało się naprawić powiadomienia :D
Działa jak należy.
niveasoft pisze:Co do tego projektu to, na sam początek proponowałbym zintegrować RTC z wbudowanymi funkcjami Bascom.
Czyli dla DS1307 użyć dedykowanej biblioteki. Co ciekawe - mam to przetestowane - nowszy RTC DS2331 o którym wspomniałeś, podłączony zamiast starszego DS1307 działa zamiennie i normalnie w zakresie podstawowych funkcjonalności.
I to jest bardzo dobra wiadomość. Na razie trenuję na DS1307 bo taki mam, a chciałbym go wymienić na DS3231 ponieważ wyczytałem, że jest dokładniejszy, zintegrowany rezonator kwarcowy, kompensacja temperaturowa-czyli same zalety :)
niveasoft pisze:Potem użyłbym biblioteki do tego wyświetlacza OLED. Normalnie jest dołączana do Bascom od wersji 2079, ale ktoś udostępnił ją na rosyjskiej stronie i możesz wtedy używać wbudowanych w Bascom poleceń.
Co ja się z nim nakombinowałem to moje... Jakoś się udało patrząc jak to robią inni ;)
niveasoft pisze:Na końcu coś pomyślimy nad tym Menu ;)
Czyli na początek opanować wszystkie opcje, a na koniec dopiero MENU aby tym zarządzać? ;)

Wrócę z pracy i będę działał dalej. Postaram się wieczorkiem podrzucić co mam-@niveasoft zaparz sobie melisę bo możesz nie wytrzymać jak zobaczysz moje "wypociny" :lol:
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Projekt systemu nawadniania

Post autor: pimowo » 21 lis 2016, 22:01

Na tą chwilę mój chaos wygląda tak ja w załączniku ;)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Projekt systemu nawadniania

Post autor: niveasoft » 22 lis 2016, 0:21

Jako że osób pytających czasem o coś jest dużo to muszę to jakoś "planować" ;)
Tak więc kiedy na Elektrodzie kolega zapytał o zapis do Eeprom a wiem że używa też Mega328P to pomyślałem, że kompleksowo już to połączę.
Na płytce z RTC jest bowiem eeprom. Wprawdzie podmieniłem 24C32 na 24C04, ale RTC jest i teraz pokażę w następnej odsłonie jak podłączyc to pod Bascom`owe biblioteki Timedate ;)
OLED już jest i to na bibliotece :P

Musze jeszcze się pochylić nad zawijaniem kodów na Forum i chyba włączę miniaturki fotek ;)

Obrazek
$regfile = "m328pdef.dat" $crystal = 16000000 $hwstack = 32 $swstack = 32 $framesize = 64 $lib "i2c_twi.lbx" Config Submode = New ' najpierw piszemy funkcje i suby, potem używamy bez deklaracji Config Scl = Portc.5 Config Sda = Portc.4 Config Twi = 100000 I2cinit $lib "glcdSSD1306-I2C.lib" Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306" Cls Const Addressw = &HAE ' = 174 EEPROM Const Addressr = &HAF '&H78 = 120 'adres wyświetlacza LCD Dim N As Byte Dim Test_str As String * 19 Dim Buff(20) As Byte At Test_str Overlay Setfont Font8x8tt 'wybieram font dla GLCD Test_str = "Hello World" 'wpis do zmiennej celem zapisu i testu 'sub zapisuje Eeprom wartością pod podanym adresem Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte) I2cstart I2cwbyte Addressw I2cwbyte Adres I2cwbyte Value I2cstop Waitms 10 End Sub 'funkcja zwraca wartosć bajtu pod podanym adresem w eepromie Function Read_eeprom(byval Adres As Byte )as Byte I2cstart I2cwbyte Addressw I2cwbyte Adres I2cstart I2cwbyte Addressr I2crbyte Read_eeprom , Nack I2cstop End Function '***************************************** '*********** START PRZYKŁADU ************* 'zapisz wszystkie 20 bajtów , a co! 'kolejno i zacznij od miejsca 11 w pamięci For N = 1 To 20 Call Write_eeprom(n + 10 , Buff(n)) 'przekazując można robić obliczenia Next Test_str = "" 'wyczyśc string, więc nie ma bata, pusty 'wczytaj bajty z powrotem z Eeproma For N = 1 To 20 Buff(n) = Read_eeprom(n + 10) Next 'zobaczmy co się zapisało/odczytało Lcdat 4 , 10 , Test_str End $include "font8x8TT.font" ' this is a true type font with variable spacing
ODPOWIEDZ