Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Световые эффекты » Ох уж эта RAINBOW О_О


Ох уж эта RAINBOW О_О

Сообщений 1 страница 30 из 45

1

Привет товарищи.
Заморочился тут с вазой в которую встроены световоды.
Кому интересно это здесь: Ссылка
Немного подправил размеры, напечатал и приступил к электронной начинке.
Использую NeoPixelRing на 16 светодиодов WS2812B и процессор ATmega328PB (тупо взял, что было под рукой.)
Использую библиотеку RAINBOW (будь она не ладна)  :crazyfun:
Когда светики начали светиться заметил, что цвета совсем не те и решил проверить так ли это.
Написал коротенький тест:

Код:
$regfile = "m328pbdef.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 16
$swstack = 8
$framesize = 32

'Настройка параметров для библиотеки WS2812b
Config RAINBOW = 1 , RB0_LEN = 16 , RB0_PORT = PORTB , rb0_pin = 0
RB_SelectChannel 0                                          'Выбираем первый канал
'Массив RGB-цветов
Dim Color(3) as Byte
R alias Color(_base) : G alias Color(_base + 1) : B alias Color(_base + 2)
Dim i as Byte
'Основной цикл
Do
   For i = 1 to 3
      Select case i
         Case 1 : R = 100 : G = 0 : B = 0
         Case 2 : R = 0 : G = 100 : B = 0
         Case 3 : R = 0 : G = 0 : B = 100
      End Select
      RB_SetColor 6 , Color(1)                        'Установим цвет
      RB_Send                                               'Обновляем состояние светодиодов
      Wait 1
   Next i
   Waitms 500
Loop

Как вы думаете, что должно было произойти? Я думаю, что должен загораться 7-й светодиод в последовательности R G B.
А вот фиг вам, загорается красный, потом зелёный и... потом пусто, синий не горит.
На любом светодиоде синий не горит. Скажете кольцо бракованное, а вот нет. Загонял программу из (где то в инете откопал) синий есть, но если его пытаться включить принудительно, то его нет.  o.O
Короче, мозг кипит, дело стоит.
Может кто чем поможет?
И ещё, при конфигурации библиотеки формируется массив RAINBOW0_ Так и не понял зачем он нужен? Смотрел в отладчике так там всегда пусто. Чтобы это значило?  :glasses:

А вот такая программка уверенно зажигает синий

Код:
RB_SETTABLECOLOR 10 , 2
RB_Send

end
Rainbow_Colors:
' R , G ,B
Data &HFF , &H00 , &H00                                     ' 0  - Red
Data &H00 , &HFF , &H00                                     ' 1  - Green
Data &H00 , &H00 , &HFF                                     ' 2   - Blue
Data &HFF , &HA5 , &H00                                     ' 3  - Orange
Data &HFF , &HFF , &H00                                     ' 4   - Yellow
Data &HFF , &H69 , &HB4                                     ' 5  - HotPink

Отредактировано sva-don (2022-05-16 15:32:32)

+1

2

sva-don
вы будете смеяться - но в Протеусе Ваш код работает как положено. единственно - я частоту выставил 8МГц от внутреннего генератора

+1

3

IDok написал(а):

вы будете смеяться - но в Протеусе Ваш код работает как положено. единственно - я частоту выставил 8МГц от внутреннего генератора

Она и должна работать, алгоритм то простейший, а вот в железе не работает. :angry:
Протеус есть протеус, у меня тоже была мысль, что частота великовата. Сделаю 8 мГц и посмотрю, что изменится.

Отредактировано sva-don (2022-05-17 09:59:17)

0

4

Снижение частоты ничего не дало, а вот так всё прекрасно работает.  :dontknow:

Код:
Do
   For i = 1 to 3
      Select case i
         Case 1 : Rainbow0_(0) = 100 : Rainbow0_(1) = 0 : Rainbow0_(2) = 0
         Case 2 : Rainbow0_(0) = 0 : Rainbow0_(1) = 100 : Rainbow0_(2) = 0
         Case 3 : Rainbow0_(0) = 0 : Rainbow0_(1) = 0 : Rainbow0_(2) = 100
      End Select
      RB_Send                                               'Обновляем состояние светодиодов
      Wait 1
   Next i
   Waitms 500
Loop

0

5

sva-don
не понял. а выбор номера светодиода где?

0

6

в общем, столкнулся с той же проблемой - код, исполняемый в протеусе, не исполняется в железе. решение смешное - запитать макетку от внешнего источника, а не от программатора. почему-то помогло  :flirt:
и во фьюзах поставил задержку 14СК+4.1мсек

Отредактировано IDok (2022-05-17 15:59:22)

0

7

IDok написал(а):

решение смешное - запитать макетку от внешнего источника, а не от программатора. почему-то помогло

Вполне ожидаемо, т.к. ИП программатора слабенький, а WS-ки хомячат хорошо. Сделал для экспериментов отдельные на разъемах, можно наращивать до 10 шт. Программатор более 6 не тянет, особенно если медленное переключение.

0

8

Кстати !
Не увидел в листинге #1 "заветных" строчек:

Код:
$lib "Rainbow1.21.lib"
$external WS2812b

Declare Sub Select_Rainbow(byval Channel As Byte)
Declare Sub Setcolor(byval Lednr As Word , Color() As Byte)
Declare Sub Send()
Declare Sub Shift_left(byval Left_index As Word , Byval Width As Word) : $external Use_shift_left
Declare Sub Shift_right(byval Left_index As Word , Byval Width As Word) : $external Use_shift_right
Declare Sub Rotate_left(byval Left_index As Word , Byval Width As Word) : $external Use_rotate_left
Declare Sub Rotate_right(byval Left_index As Word , Byval Width As Word) : $external Use_rotate_right
Declare Sub Clear_colors() : $external Use_clear_colors
Declare Sub Fill(color() As Byte) : $external Use_fill

Не знаю, у кого как, а у меня только с ними WS-ки "белые и пушистые"... ;)
Неиспользуемые Declare Sub можно безболезненно закомментировать.

0

9

Nord
гм. у меня  и без этого работает.

0

10

IDok написал(а):

у меня  и без этого работает.

А как же тогда:

Использую библиотеку RAINBOW

если в программе нет указания на ее подключение ? ;)

0

11

Nord
всегда думал, что заклинания Config Rainbow достаточно. да оно и работает в принципе

0

12

Перевод из хелпа команды CONFIG RAINBOW:

В версии 2081 библиотека была обновлена для поддержки светодиодов RGBW. Некоторые функции в старой библиотеке манипулировали неправильными цветами. Мы исправили это в новой библиотеке. Но для обеспечения совместимости мы также включаем старую библиотеку.

Когда вы используете RGB=4, вы будете использовать новую библиотеку автоматически. Без этой опции или при использовании значения 3 : RGB=3 вы будете использовать старую библиотеку.

Чтобы использовать новую библиотеку с опцией 3, вам необходимо включить библиотеку в свой код, используя директиву $LIB: $lib "RAINBOWBSCN.lib"

Это должно быть сделано ПЕРЕД инструкцией CONFIG RAINBOW.

Всегда отталкиваюсь от рекомендаций производителя... ;)
В вашем случае значение RGB не указано (выделено в переводе), прямого указания на подключение старой библиотеки нет.
Если работа вас устраивает - карты в руки, но я бы перестраховался от неожиданностей. ;)

0

13

Nord
тогда встает вопрос - КАК оно тогда работает без явного подключения библиотеки?  :confused:
и как я понял - указывать либу надо для принудительного использования новой библиотеки с трехцветным диодом. без этого должна автоматом подключаться старая (видимо 1.21 которая)

0

14

Возможно, начиная с какой-то версии так и есть, но привычка осталась еще с 2.0.7.8... ;)

0

15

IDok написал(а):

не понял. а выбор номера светодиода где?

Необходимо учесть, что в самом светодиоде цвета раполагаются иак: GRB.
Номер светодиода определяется индексом массива Rainbow0_
Например Rainbow0_(0) - это зелёный пиксель первого СД, Rainbow0_(1) - красный пиксель первого СД, Rainbow0_(2) - синий пиксель первого светодиода и т.д.

0

16

IDok написал(а):

запитать макетку от внешнего источника

У меня всё питается от внешнего источника.  :canthearyou:

0

17

Nord написал(а):

Не увидел в листинге #1 "заветных" строчек:

Начиная с версии 2.0.7.9, библиотека Rainbow переобразована в RainbowBSC. Lib, входящей в состав BASCOM-AVR и не требует подключения и декларирования.
Она автоматически подключается при конфигурации библиотеки соответствующим кодом Config RAINBOW.

+1

18

Nord написал(а):

В вашем случае значение RGB не указано (выделено в переводе), прямого указания на подключение старой библиотеки нет.

При исполнении Config RAINBOW без явного указания RGB она автоматически подставляет RGB=3. Но это неважно, дело в том, что я пробовал разные варианты и это ничего не меняет.
Вообще столкнувшись с этой Rainbow я понял, что это безуспешная попытка составить конкуренцию FastLed или NeoPixel. Глючная и совершенно бесполезная в практическом плане.
Скудность её функций весьма удручает.  :angry:

0

19

sva-don написал(а):

У меня всё питается от внешнего источника

вот этот код

$Regfile="attiny2313a.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32

Config RAINBOW=1, RB0_LEN=4, RB0_PORT=PORTB, rb0_pin=3                           'настройка Rainbow

Dim Color(3) as Byte
R alias Color(_base) : G alias Color(_base + 1) : B alias Color(_base + 2)

Dim  A as Integer , X as Integer , C as Integer , P as Byte , T as Integer , N as Integer  , D as Byte

RB_SelectChannel 0
P = 2

Do
For A = 1 to 127     'красный вверх
   For N = 0 to 3
   If P <> 2 Then Goto 2
     R = lookup (A , TAB_PWM) : G = 0 : B = 0
     RB_SetColor N, Color(1)
     RB_Send
   Next
     waitms 30
Next

For A = 1 to 127     'зеленый вверх
   For N = 0 to 3
   If P <> 2 Then Goto 2
     G = lookup (A , TAB_PWM) : R = 255 : B = 0
     RB_SetColor N, Color(1)
     RB_Send
   Next
     waitms 30
Next

For A = 127 to 1 step -1     'красный вниз
   For N = 0 to 3
   If P <> 2 Then Goto 2
     R = lookup (A , TAB_PWM) : G = 255 : B = 0
     RB_SetColor N, Color(1)
     RB_Send
   Next
     waitms 30
Next

For A = 1 to 127     'синий вверх
   For N = 0 to 3
   If P <> 2 Then Goto 2
     B = lookup (A , TAB_PWM) : G = 255 : R = 0
     RB_SetColor N, Color(1)
     RB_Send
   Next
     waitms 30
Next

For A = 127 to 1 step -1     'зеленый вниз
   For N = 0 to 3
   If P <> 2 Then Goto 2
     G = lookup (A , TAB_PWM) : R = 0 : B = 255
     RB_SetColor N, Color(1)
     RB_Send
   Next
     waitms 30
Next

For A = 1 to 127     'красный вверх
   For N = 0 to 3
   If P <> 2 Then Goto 2
     R = lookup (A , TAB_PWM) : G = 0 : B = 255
     RB_SetColor N, Color(1)
     RB_Send
   Next
     waitms 30
Next

For A = 127 to 1 step -1     'синий вниз
   For N = 0 to 3
   If P <> 2 Then Goto 2
     B = lookup (A , TAB_PWM) : G = 0 : R = 255
     RB_SetColor N, Color(1)
     RB_Send
   Next
     waitms 30
Next
Loop
End

'*************************************************************************************************
TAB_PWM:  'таблица значений для светодиодов
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 3 , 3 , 3
Data 4 , 5 , 5 , 6 , 6 , 7 , 8 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 14 , 15
Data 16 , 17 , 19 , 20 , 21 , 22 , 23 , 24 , 26 , 27 , 28 , 30 , 31 , 32 , 34 , 35
Data 37 , 38 , 40 , 42 , 43 , 45 , 47 , 48 , 50 , 52 , 54 , 56 , 57 , 59 , 61 , 63
Data 65 , 67 , 69 , 71 , 74 , 76 , 78 , 80 , 82 , 85 , 87 , 89 , 92 , 94 , 97 , 99
Data 102 , 104 , 107 , 109 , 112 , 115 , 117 , 120 , 123 , 126 , 128 , 131 , 134 , 137 , 140 , 143
Data 146 , 149 , 152 , 155 , 158 , 161 , 165 , 168 , 171 , 174 , 178 , 181 , 184 , 188 , 191 , 195
Data 198 , 202 , 205 , 209 , 213 , 216 , 220 , 224 , 227 , 231 , 235 , 239 , 243 , 247 , 251 , 255

абсолютно успешно запустился и не раз в железе при соблюдении следующих параметров:
- внешний ИП
- отключенный программатор
- выставленный BOD
- подтянутый внешним резистором Ресет
- отключенный ватчдог
что в итоге сыграло свою роль - не знаю

Отредактировано IDok (2022-05-18 16:02:57)

+2

20

IDok написал(а):

вот этот код

Мне не нравится хранить цвета в таблице. Дело в том, что я пытаюсь сделать следующее:
Есть кольцо с 16 светодиодами и мне нужно чтобы каждый светодиод плавно переключал цвета в случайном порядке.
Т.е. независимо от других каждый СД будет переливаться своим цветом. Поэтому таблица здесь не вариант.
Вот такая штука должна получиться.
https://upforme.ru/uploads/0000/25/b8/819/t611757.jpg

+1

21

sva-don написал(а):

мне нужно чтобы каждый светодиод плавно переключал цвета в случайном порядке.

:D
полный код моей поделки выглядит так:

Код:
$Regfile="attiny45.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32


Config PINb.2 = Input ': Set Portb.2                                            'íàñòðàèâàåì ïîðò êíîïêè íà âõîä è âêëþ÷àåì ïîäòÿæêó
Config PINB.5 = Input ': Set Portb.5                                            'íàñòðàèâàåì Reset íà âõîä è âêëþ÷àåì ïîäòÿæêó

On Int0 Button : Config Int0 = falling  : Enable Interrupts : Enable Int0    'íàñòðàèâàåì ïðåðûâàíèå ïî íèçêîìó óðîâíþ äëÿ ðàáîòû êíîïêè
Config RAINBOW=1, RB0_LEN=8, RB0_PORT=PORTB, rb0_pin=3                           'íàñòðîéêà Rainbow

Dim Color(3) as Byte
R alias Color(_base) : G alias Color(_base + 1) : B alias Color(_base + 2)
Dim  A as Byte , X as Byte , C as Byte , P as Byte , T as Byte , N as Byte  , D as Byte , Y as Byte , Led(2) as Byte

RB_SelectChannel 0
P = 1

Do
Select Case P
Case 1
   Gosub Main
Case 2
   Gosub Rainbow
Case 3
   Gosub Migalka
End Select
Loop
End

'************************************************
Migalka:
if P <> 3 then goto 3
 R = 0 : G = 0 : B = 0
 RB_SetColor Led(1), Color(1)
 RB_SetColor Led(2), Color(1)
 RB_Send
 For Y = 1 to 2
 Incr T
 If T> 50 Then T = 1
 Incr A
 If A> 50 Then A = 1
 Incr X
 If X>50 Then X = 1
 C = lookup (X , TAB_COLOR)

 Select Case C
 Case 1
    R = lookup (A , TAB_VOLUME) : G = 0 : B = 0
 Case 2
    G = lookup (A , TAB_VOLUME) : R = 0 : B = 0
 Case 3
    B = lookup (A , TAB_VOLUME) : R = 0 : G = 0
 End Select
 Led(Y)= lookup (T , TAB_LED)
 RB_SetColor Led(Y), Color(1)
 RB_Send
 waitms  100
 Next
 waitms 200
 'Wend
 3:
Return


'**********************************************************
Rainbow:
For A = 1 to 127     'êðàñíûé ââåðõ
   For N = 0 to 7
   If P <> 2 Then Goto 2
     R = lookup (A , TAB_PWM) : G = 0 : B = 0
     RB_SetColor N, Color(1)
     RB_Send
   Next
     waitms 30
Next

Do

 A = 127
 For X = 1 to 127     'óâåëè÷èâàåì çåëåíûé   óìåíüøàåì êðàñíûé
 Decr A
 For N = 0 to 7
   If P <> 2 Then Goto 2
      R = lookup (A , TAB_PWM)  : B = 0
      G =lookup (X , TAB_PWM)
      RB_SetColor N, Color(1)
      RB_Send
     Next
     waitms 40
 Next
    waitms 100


    X = 127
    For C = 1 to 127
    Decr X
    For N = 0 to 7
    If P <> 2 Then Goto 2             'óâåëè÷âàåì ñèíèé óìåíüøàåì çåëåíûé
      R = 0 : G = lookup(X , TAB_PWM)
      B =lookup (C , TAB_PWM)
      RB_SetColor N, Color(1)
      RB_Send
    Next
    waitms 40
 Next
    waitms 100


    C = 127
    For A =1 to 127                'óâåëè÷èâàåì êðàñíûé óìåíüøàåì ñèíèé
    Decr C
    For N = 0 to 7
    If P <> 2 Then Goto 2
      G = 0 : B = lookup (C , TAB_PWM)
      R =lookup (A , TAB_PWM)
      RB_SetColor N, Color(1)
      RB_Send
    Next
    waitms 40
 Next
 waitms 100
Loop
2:
Return
'*******************************************************
Main:
For N = 0 to 7
 R = 0 : G = 0 : B = 0
 RB_SetColor N, Color(1)
 RB_Send
Next
Do
For A = 1 to 127     'íèæíèé ðÿä ñèíèé
     If P <> 1 Then Goto 1
     B = lookup (A , TAB_PWM) : G = 0 : R = 0
     RB_SetColor 1, Color(1)
     RB_SetColor 0, Color(1)
     RB_SetColor 7, Color(1)
     RB_Send
     waitms 40
Next
waitms 500

'---------------------------------------------

For A = 1 to 127     'ñðåäíèé ðÿä çåëåíûé
   If P <> 1 Then Goto 1
     G = lookup (A , TAB_PWM) : B = 0 : R = 0
     RB_SetColor 2, Color(1)
     RB_SetColor 6, Color(1)
     RB_Send
     waitms 40
Next
waitms 500

'-------------------------------------------

For A = 1 to 127     'âåðõíèé ðÿä îðàíæåâûé
   If P <> 1 Then Goto 1
     R = lookup (A , TAB_PWM) : B = 0
     G = lookup (A , TAB_PWM) : B = 0
     If G>50 Then G = 50
     RB_SetColor 3, Color(1)
     RB_SetColor 5, Color(1)

     RB_Send
     waitms 40
Next
waitms 1000

'---------------------------------------------
     R = 255 : B = 0 : G = 0   'çâåçäà êðàñíûé
     RB_SetColor 4, Color(1)
     RB_Send
     wait 3
'--------------------------------------------
For A = 127 to 1 step -1     'îáùåå óáûâàíèå
    For N = 0 to 7
    If P <> 1 Then Goto 1
     R = lookup (A , TAB_PWM) : B = 0
     G = lookup (A , TAB_PWM) : B = 0
     If G>50 Then G = 50
     RB_SetColor 3, Color(1)
     RB_SetColor 5, Color(1)

     G = lookup (A , TAB_PWM) : B = 0 : R = 0
     RB_SetColor 2, Color(1)
     RB_SetColor 6, Color(1)

     B = lookup (A , TAB_PWM) : G = 0 : R = 0
     RB_SetColor 1, Color(1)
     RB_SetColor 0, Color(1)
     RB_SetColor 7, Color(1)

     RB_Send
     waitms 10
     Next
Next
waitms 500
For A = 127 to 1 step -1
If P <> 1 Then Goto 1
     R = lookup (A , TAB_PWM) : B = 0 : G = 0   'çâåçäà óáûâàíèå
     RB_SetColor 4, Color(1)
     RB_Send
     waitms 40
next
Loop
1:
Return
'****************************Ãëàâíûé öèêë***************************************



'*******************************************************************************
 Button:     'ïîäïðîãðàììà êíîïêè
 Disable INT0
 Waitms 100
 'Incr P
 If PINB.2 = 0 Then Incr P
 If P>3 Then P = 1
 Gifr = 64
 Enable INT0
 Return

'*************************************************************************************************
TAB_PWM:  'òàáëèöà çíà÷åíèé äëÿ ñâåòîäèîäîâ
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 3 , 3 , 3
Data 4 , 5 , 5 , 6 , 6 , 7 , 8 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 14 , 15
Data 16 , 17 , 19 , 20 , 21 , 22 , 23 , 24 , 26 , 27 , 28 , 30 , 31 , 32 , 34 , 35
Data 37 , 38 , 40 , 42 , 43 , 45 , 47 , 48 , 50 , 52 , 54 , 56 , 57 , 59 , 61 , 63
Data 65 , 67 , 69 , 71 , 74 , 76 , 78 , 80 , 82 , 85 , 87 , 89 , 92 , 94 , 97 , 99
Data 102 , 104 , 107 , 109 , 112 , 115 , 117 , 120 , 123 , 126 , 128 , 131 , 134 , 137 , 140 , 143
Data 146 , 149 , 152 , 155 , 158 , 161 , 165 , 168 , 171 , 174 , 178 , 181 , 184 , 188 , 191 , 195
Data 198 , 202 , 205 , 209 , 213 , 216 , 220 , 224 , 227 , 231 , 235 , 239 , 243 , 247 , 251 , 255


TAB_VOLUME:
Data 126 , 249 , 180 , 173 , 108 , 199 , 164 , 150 , 143 , 219 , 125 , 99 , 253 , 179 , 174 , 149
Data 235 , 115 , 178 , 130 , 229 , 236 , 94 , 104 , 103
Data 135 , 220 , 151 , 130 , 116 , 197 , 132 , 85 , 187 , 154 , 167 , 133 , 146 , 191 , 132 , 211
Data 251 , 134 , 181 , 123 , 153 , 148 , 105 , 130 , 147

TAB_LED:
Data 3 , 5 , 2 , 7 , 5 , 1 , 3 , 6 , 0 , 1 , 5 , 2 , 6 , 3 , 6 , 6
Data 1 , 0 , 1 , 6 , 5 , 0 , 6 , 4 , 2
Data 3 ,5 , 2 , 0 , 5 , 6 , 6 , 7 , 0 , 0 , 7 , 7 , 4 , 4 , 5 , 3
Data 3 , 0 , 5 , 2 , 1 , 6 , 3 , 3 , 4


TAB_COLOR:
Data 2 ,1 , 2 , 2 , 1 , 3 , 2 , 3 , 2 , 3 , 1 , 3 , 3 , 2 , 3 , 1 , 2 , 3 , 3 , 1 , 2 , 3 , 1 , 3 , 1
Data 3 , 1 , 1 , 3 , 1 , 1 , 1 , 3 , 3 , 1 , 1 , 3 , 3  ,1 , 3 , 3 , 1 , 1 , 2 , 1 , 2 , 1 , 1 , 3 , 3

Таблица PWM нужна для плавной смены цвета (логарифмическая шкала) в подпрограмме Raindow, а вот дальше больше - таблица Volume это случайно сгенерированные уровни яркости, таблица LED - случайно сгенерированные диоды, а таблица COLOR - случайно же сгенерированный цвет. правда, у меня это задумано не как плавное переливание, а как случайные вспышки случайным цветом случайных пар диодов. подпрограмма Migalka
вот еще момент - светики крайне чувствительны к качеству контакта. если он хоть чуть дребезжит - будет вам горе для ума.

0

22

sva-don
а с вазой вижу одну проблему - рэйнбоу позволяет всего 8 каналов. хотя если вам 8=ми хватит - в дальнейшем проблем не вижу. рандомом для каждого канала выбираете цвет и делаете плавное жыжыгание

0

23

IDok написал(а):

рэйнбоу позволяет всего 8 каналов

Достаточно одного канала. Куски ленты последовательно соединяем.

0

24

Пётр
там еще проще - это не ленты по вазе идут, это световоды. а в подставке кольцо с диодами. иногда все же стоит досматривать видео хотя б до середины (это я про себя)

0

25

IDok написал(а):

полный код моей поделки выглядит так: Скрытый текст (от гостей)

Нарушенная кодировка в #21 тоже "от гостей" ? ;)

Config PINb.2 = Input ': Set Portb.2                                            'íàñòðàèâàåì ïîðò êíîïêè íà âõîä è âêëþ÷àåì ïîäòÿæêó

0

26

Nord
для конспигации!  :glasses:
из баскома так кириллица вставляется  :dontknow:

0

27

IDok написал(а):

а как случайные вспышки случайным цветом

Вспышки это просто, а вот каждый плавно зажигать и без этих таблиц. Ладно, сделаю, выложу.
Сейчас бьюсь над П/п перевода HSV в RGB.
У меня есть, но что-то не очень нравится.

0

28

IDok написал(а):

из баскома так кириллица вставляется

При копировании нужно просто включить русскую раскладку на клаве.

0

29

sva-don написал(а):

а вот каждый плавно зажигать и без этих таблиц.

с WS-ками просто циклом от 1 до 255 с нужным шагом, без проблем. таблица нужна для пущей плавности

0

30

Наконец то дошли руки доделать плавный переход случайных цветов на WS2812.
Кому интересно вот этот шедевр.  Снимать не стал, а то опять буду жаловаться, что цвета не те. :crazyfun:

Код:
'*******************************************************************************
'                Плавное, случайное изменение цвета светодиодов WS2812                                    
'   V1.0
'   Для генерации цвета используется стандартный алгоритм HSV > RGB                                 
'   Из библиотеки Rainbow используется только передача                                                          
'   Размер кода 3300 байта                                                                                                              
'   30 мая 2022 г.                                                                                                                                
'*******************************************************************************
$regfile = "m328pbdef.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 16
$swstack = 8
$framesize = 32
'Настройка
'Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Submode = new
CONFIG BASE = 0                                             'Массив с нуля
'Настройка параметров для библиотеки WS2812b
Config RAINBOW = 1 , RB0_LEN = 16 , RB0_PORT = PORTB , rb0_pin = 0
RB_SelectChannel 0                                          'Выбираем первый канал
' Переменные для подпрограммы HVS/RGB
Dim H As Word , S as Single , V as Single
Dim Ra As Single , Ga As Single , Ba As Single
Dim R As Byte , G As Byte , B As Byte
Dim m as Single , q as Single , C as Single
Dim X as Single , Y as Single
'Переменные
Dim Raz1 , Raz2 , Raz3 as Integer                           'Разность между предыдущим и последующим цветами
Dim Col(47) as Byte                                         'Массив цветов по пикселям
 'Вспомогательные переменные
Dim Tmp , i , j as Byte
Dim __rseed , Delay_ as Word
'Константы
Const NumLed = 16                                           'Количество светодиодов
Const NumPix = NumLed * 3                                   'Количество пикселей
__rseed = 63175
' ----------------------------------------------  Генерим цвет ----------------------------------------------
Sub GenColor
   H = RND(360)                                             'Случайный цвет от 0 до 359 гр.
   S = 1                                                    'Насыщенность на максимум
   Tmp = RND(101)                                           'Случайная яркость
   If Tmp = 0 Then Tmp = 3                                  'Чтобы диод не погас совсем
   V = Tmp / 100
'Вычисление координат
   C = V * S : m = V - C : X = H / 60
   q = X mod 2 : q = q - 1
   Y = Abs(q) : X = 1 - Y : X = C * X
'Формирование цвета по кругу
   If H >= 0 And H < 60 Then
      Ra = C + m : Ga = X + m : Ba = m
   End If
   If H >= 60 And H < 120 Then
      Ra = X + m : Ga = C + m : Ba = m
   End If
   If H >= 120 And H < 180 Then
      Ra = m : Ga = C + m : Ba = X + m
   End If
   If H >= 180 And H < 240 Then
      Ra = m : Ga = X + m : Ba = C + m
   End If
   If H >= 240 And H < 300 Then
      Ra = X + m : Ga = m : Ba = C + m
   End If
   If H >= 300 And H < 360 Then
      Ra = C + m : Ga = m : Ba = X + m
   End If
   R = Ra * 255 : G = Ga * 255 : B = Ba * 255               'Приводим полученные цвета к байту
End Sub
'------------------------------------------------------------ Основная программа -------------------------------------------------------
'Начальная генеация цвета для первоначального заполнения массива
For i = 0 to NumPix -1 Step 3
'Генерация цвета
   Call GenColor
'Присвоение цвета массиву цветов
   Col(i) = R : Col(i + 1) = G : Col(i + 2) = B
'Заполнение цветом массива Rainbow
   Rainbow0_(i) = Col(i) : Rainbow0_(i + 1) = Col(i + 1) : Rainbow0_(i + 2) = Col(i + 2)
Next i
RB_Send                                                  'Выдача в ленту
'Основной цикл
Do
'Генерация нового цвета
   For i = 0 to NumPix -1 Step 3
      Call GenColor
      Col(i) = R : Col(i + 1) = G : Col(i + 2) = B
   Next i
'Начинаем плавно менять цвет.
   For j = 1 to 255
   'Пробегаем по всему массиву и в зависимости от разности
   'предыдущего и сгенерированного цветов инкрементируем или
   'декрементируем значение в памяти. Если достигли нужного
   'оттенка (разность =  0), то пропускаем шаг.
      For i = 0 to NumPix -1 step 3
         Raz1 = Col(i) - Rainbow0_(i)
         Raz2 = Col(i + 1) - Rainbow0_(i + 1)
         Raz3 = Col(i + 2) - Rainbow0_(i + 2)
'Пиксел R
         If Raz1 = 0 Then GoTo M1
         If Raz1 > 0 Then Incr Rainbow0_(i)
         If Raz2 < 0 Then Decr Rainbow0_(i)
         M1:
'Пиксел G
            If Raz2 = 0 Then GoTo M2
            If Raz2 > 0 Then Incr Rainbow0_(i + 1)
            If Raz2 < 0 Then Decr Rainbow0_(i + 1)
         M2:
'Пиксел B
            If Raz3 = 0 Then GoTo M3
            If Raz3 > 0 Then Incr Rainbow0_(i + 2)
            If Raz3 < 0 Then Decr Rainbow0_(i + 2)
         M3:
      Next i
      RB_Send                                               'Выдадим в ленту
      waitus Delay_                                         'Немного задержимся
   Next j
 'Случайная задержка даёт более интересную картину
   Delay_ = RND(5000)
Loop
End

Отредактировано sva-don (2022-05-30 15:28:45)

+3


Вы здесь » Программирование ATMEL в BASCOM. » Световые эффекты » Ох уж эта RAINBOW О_О