Bascom hc-05 i 3 PWM jak ???

Pytania, kody i porady dotyczące nie tylko Bascom.
grafii1
Posty: 58
Rejestracja: 23 wrz 2018, 11:28

Bascom hc-05 i 3 PWM jak ???

Post autor: grafii1 » 31 gru 2018, 11:55

Witam , pisze prosty programik sterujący PWM 3 ledy RGB przez androida po BT. Zatrzymałem się na rozbiciu składni wysyłanej przez androida np.
wysyłam apką "serial bluetooth terminal" G128 czyli zielona o poziomie 128 PWM (50% jasniści)
w odbioeniku:
IF dane = "G128" then... , oczywiście odbiera lecz tylko konkretny rozkaz i steruje PWM , można stworzyć tablice itp. lecz chodzi o to jak " rozbić " daną zmienna żeby odpowiednio sterować poszczególne wyjścia pwm np.
R128G64B0 , czyli żeby na PWM było odpowiednio PWM1 = 50% czerwona , PWM2 = 25% zielona , PWM3 = 0% niebieska , za pomoc dziękuje i pozdrawiam
Pikczu
Posty: 390
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Bascom hc-05 i 3 PWM jak ???

Post autor: Pikczu » 31 gru 2018, 15:19

A jesteś w stanie wysłać z aplikacji tablice albo trzy bajty na raz ?
jeśli tak to reszta jest już z górki.
W programie robisz tablice na trzy zmienne i odbierasz przez input bin.

Wysyłasz je wszystkie na raz czyli:255255255 bez dodatkowych znaków najlepiej binarnie.
Wtedy wszystkie trzy trafiają do tablicy i automatycznie w komórce pierwszej jest twój pierwszy bajt itd.
Jeśli będziesz chciał zmienić wartość tylko jednej nadal wysyłasz dwie pozostałe.
  1.  Dim Led_r As Byte
  2.  Dim Led_g As Byte
  3.  Dim Led_b As Byte
  4. Dim Serial_flag As Byte
  5.  Dim Serial_rx(3) As Byte
  6. Config Serialin = Buffered , Size = 20  
  7.  
  8. Do
  9.  Serial_flag = Ischarwaiting()
  10.  
  11.     If Serial_flag = 1 Then
  12.        Inputbin Serial_rx(1) , 3
  13.     End If
  14.    Led_r = Serial_rx(1) , 1                                'twoja led czerwona
  15.    Led_g = Serial_rx(2) , 1                                'twoja led zielona
  16.    Led_b = Serila_rx(3) , 1                                'twoja led niebieska
  17.  
  18.     Loop
  19.     End
tak w wielkim skrócie.
grafii1
Posty: 58
Rejestracja: 23 wrz 2018, 11:28

Re: Bascom hc-05 i 3 PWM jak ???

Post autor: grafii1 » 01 sty 2019, 11:35

Witam , sęk w tym że apka wysyła dodatkowy znak przed daną jaką ma mieć wypełnienie pwm np R1 lub G200 itd...
Oczywiście można to rozbić po 3 bajty lub zamienić R i G na byte 52 1 i 47 200 i co wtedy program z tym zrobi , abstrahując od tego , co jeżeli PWN dla każdego kanału będzie 2 , R2G2B2 czyli 52 2 , 47 2 , 42 2 lub bez znaków poprzedzających 222 jak ma to zdefiniować program bo tak wysyła apka . Gdy przesuwam jeden z suwaków w apce to wysyła ciąg np. R12R13R15R22 itd.
Awatar użytkownika
niveasoft
Posty: 1215
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Bascom hc-05 i 3 PWM jak ???

Post autor: niveasoft » 01 sty 2019, 11:44

Napisz dokładniej czy ta aplikacja wysyła Enter po każdej wiadomości R11R12R13 itd?
Czy możliwe jest że wyśle ciąg R12G30B100 ?
To nie jest skomplikowane tylko trzeba tę kwestię uściślić.
grafii1
Posty: 58
Rejestracja: 23 wrz 2018, 11:28

Re: Bascom hc-05 i 3 PWM jak ???

Post autor: grafii1 » 01 sty 2019, 12:49

Tak jest możliwy ciąg R12G30B100 ale nie wysyła entera tylko leci jeden za drugim .
Na elektrodzie zadałem to samo pytanie i w odpowiedzi ktoś zasugerował funkcje SPLIT , przyznam że o tej funkcji nie wiedziałem
Awatar użytkownika
niveasoft
Posty: 1215
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Bascom hc-05 i 3 PWM jak ???

Post autor: niveasoft » 01 sty 2019, 13:30

Zobacz tak. Sprawdziłem kilka możliwych stringów w symulatorze i wszystko wygląda dobrze. Łap i testuj
Wartości PWM masz w zmiennych R_val, G_val i B_val
Komenda Split też pewnie dałaby radę. Jest jeszcze komenda CHARPOS
Cały myk polega na tym że w tym długim R100G1B200 B może czasem mieć tylko jedną literkę i o tym trzeba pamiętać pisząc kod.
  1. $regfile = "m328pdef.dat"
  2. $crystal = 16000000
  3. $hwstack = 64
  4. $swstack = 16
  5. $framesize = 64
  6. $sim                                                        'USUNĄĆ/ZAREMOWAĆ BO TO TYLKO DO SYMULATORA
  7.  
  8. Config Submode = New
  9. Const _valcheck = 1                                         'sprawdzanie czy dla instrukcji Val podaliśmy tylko cyfry
  10.  
  11. Dim Command As String * 25 , Helpstr As String * 3
  12. Dim R_val As Byte , G_val As Byte , B_val As Byte
  13. Dim R_pos As Byte , G_pos As Byte , B_pos As Byte
  14. Dim Helpb As Byte , Char_cnt As Byte
  15.  
  16. Command = "R5G6B7"
  17. 'Command = "R20G30B40"
  18. 'Command = "R120G130B140"
  19. 'Command = "R255"
  20. 'Command = "G255"
  21. 'Command = "B255"
  22.  
  23. Sub Parse_command()
  24.  
  25.    B_pos = Instr(command , "B")                             'zaczynamy od końca stringa
  26.    If B_pos > 0 Then                                        'jeśli znaleziono B
  27.     Helpb = B_pos + 1                                       'pomijamy literkę B
  28.     Helpstr = Mid(command , Helpb)                          'i łapiemy wartość
  29.     Helpb = Val(helpstr)                                    'zamień string na wartość
  30.     If Err = 0 Then B_val = Helpb                           'jeśli w stringu nie było liter...
  31.    End If
  32.  
  33.    G_pos = Instr(command , "G")
  34.    If G_pos > 0 Then                                        'jeśli znaleziono G
  35.     Helpb = G_pos + 1
  36.     If B_pos > 0 Then                                       'jeśli w stringu było też B
  37.      Char_cnt = B_pos - Helpb                               'to oblicz ile liter jest od G do B  (1-3 literki)
  38.      Helpstr = Mid(command , Helpb , Char_cnt)              'łapiemy string
  39.     Else
  40.      Helpstr = Mid(command , Helpb)
  41.     End If
  42.     Helpb = Val(helpstr)                                    'zamieniamy na wartość
  43.     If Err = 0 Then G_val = Helpb                           'jeśli w stringu były tylko cyfry...
  44.    End If
  45.  
  46.    R_pos = Instr(command , "R")                             'dla R to samo co dla G
  47.    If R_pos > 0 Then
  48.     Helpb = R_pos + 1
  49.     If G_pos > 0 Then
  50.      Char_cnt = G_pos - Helpb
  51.      Helpstr = Mid(command , Helpb , Char_cnt)
  52.     Else
  53.      Helpstr = Mid(command , Helpb)
  54.     End If
  55.     Helpb = Val(helpstr)
  56.     If Err = 0 Then R_val = Helpb
  57.    End If
  58.  
  59. End Sub
  60.  
  61. Call Parse_command()
  62.  
  63.  
  64. Print "R_val=" ; R_val ; " G_val=" ; G_val ; " B_val=" ; B_val
  65.  
  66. End
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
grafii1
Posty: 58
Rejestracja: 23 wrz 2018, 11:28

Re: Bascom hc-05 i 3 PWM jak ???

Post autor: grafii1 » 01 sty 2019, 14:36

ok przetestuje i dam znać . Jak zachowa się program w chwili gdy ciąg będzie B12B45B244B33B210B11 cyfry po znaczniku b są przypadkowe .
Awatar użytkownika
niveasoft
Posty: 1215
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Bascom hc-05 i 3 PWM jak ???

Post autor: niveasoft » 01 sty 2019, 14:42

Nie napisałeś jaki procesor, jakie taktowanie i najważniejsze o co już pytałem : Czy aplikacja wystawia na końcu enter.
Ważne po prostu jest to czy tam coś rozdziela nowe wiadomości.
Inne podejście jak Enter jest a inne gdy go nie ma. Wtedy można to rozwiązać jak w Modbus mierząc czas od ostatnio odebranego znaku.
grafii1
Posty: 58
Rejestracja: 23 wrz 2018, 11:28

Re: Bascom hc-05 i 3 PWM jak ???

Post autor: grafii1 » 01 sty 2019, 14:47

Wcześniej...Tak jest możliwy ciąg R12G30B100 ale nie wysyła entera tylko leci jeden za drugim ...
atmega 328 , 16 Mhz
Awatar użytkownika
niveasoft
Posty: 1215
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Bascom hc-05 i 3 PWM jak ???

Post autor: niveasoft » 01 sty 2019, 14:59

Teraz widzę, nie zauważyłem. Jaki jest baudrate? Mamy jakiś wolny Timer?
ODPOWIEDZ