Главная

Главная

Сообщество

Сообщество

Форум

Форум

STM32

STM32

Электроника

Электроника

Raspberry Pi

Raspberry Pi

Уведомления
Очистить все

[Решено] замена макетной платы Arduino328 на ESP32WROWER-1B

Страница 8 / 9
Aveal MT
(@aveal)
Top level Admin

Это цикл для отправки 15-ти байт, никакого отношения к светодиодам не имеет:

for (int l=0; l<15; l++)

SetBit(), ClearBit() - стандартные битовые операции. (0x80 >> bit_position) - это операция сдвиг вправо, упрощенно (0x80 >> 1) = В01000000.

5-й режим:

void loop()                     
{    
    LS = 0;
    
    if (flag == 0)
    {
      if (counter < (N_O_S)) {sector_time--;}
      if (counter > (N_O_S)) {sector_time++;}
    }
    
    if (counter == N_O_S) {flag = 1;}
    if ((counter < (N_O_S - TOL)) || (counter > (N_O_S + TOL))) {flag = 0;}
  
    if (end_time < millis())
    {
      end_time = millis() + (random(10,20) * 1000);
      flag=0;
      mode++;
      if (mode == 6) {mode = 1;}
    }
  
    counter = 0;
    if (offset > (N_O_S - 1)) {offset = 0;}
    
    EnableSPI();
 
    while (LS == 0) 
    {
        if (counter < N_O_S) {pointer = counter;} else {pointer = N_O_S - 1;}      
        pointer = pointer + offset;
        if (pointer > (N_O_S - 1)) {pointer = pointer - N_O_S;}
      
        int sector_index = pointer;
        if (sector_index == 0)
        {
            test_counter++;
        }
        
        int led_index = test_counter % 20;        
        if (mode == 5)
        {
            led_index = 19 - led_index;
        }
        
        pointer = pointer * 15;
        
        int cached_bit_1 = GetBit(&test_array[0], 2 * led_index);
        int cached_bit_2 = GetBit(&test_array[0], 2 * led_index + 1);
        
        SetBit(&test_array[0], 2 * led_index);
        SetBit(&test_array[0], 2 * led_index + 1);
    
        digitalWrite(latchPin, LOW);
        
        switch (mode)
        {
            case 1: 
                for (int l=0; l<15; l++){SendRecSPI(bild_01[pointer + l]);}
                break;
            case 2: 
                for (int l=0; l<15; l++){SendRecSPI(bild_02[pointer + l]);}
                break;
            case 3: 
                for (int l=0; l<15; l++){SendRecSPI(bild_03[pointer + l]);}
                break;
            case 4:
            case 5:            
                for (int l=0; l<15; l++){SendRecSPI(test_array[l]);}
                break;     
        }
        
        digitalWrite(latchPin, HIGH);
        
        if (cached_bit_1 == 0) ClearBit(&test_array[0], 2 * led_index);
        if (cached_bit_2 == 0) ClearBit(&test_array[0], 2 * led_index + 1);
        
        counter++;
                                                           
        unsigned long end_micros = micros() + sector_time;                                    
        while ((micros() < end_micros) && (LS == 0)) {}                         
    }  
    
    DisableSPI();
    
    offset = offset + v_offset;
}

ОтветитьЦитата
Размещено : 24.07.2026 11:58
(@olga549)
Level 3

здравствуйте. большое вам спасибо за помощь . мне хватит. здесь огромное поле для творчества. и чтобы все изучить.  я очень рада.


ОтветитьЦитата
Создатель темы Размещено : 26.07.2026 22:08
(@olga549)
Level 3

а еще один маленький вопрос? я правильно поняла что скорость перемещения диодов по кольцу, зависит от скорости вращения конструкции. то есть от прерывания LS.


ОтветитьЦитата
Создатель темы Размещено : 26.07.2026 22:12
Aveal MT
(@aveal)
Top level Admin

@olga549 да, в режимах 4 и 5 сейчас диоды переключаются после полного оборота, но это можно изменить в случае необходимости. Я так просто для наглядности сделал.


ОтветитьЦитата
Размещено : 27.07.2026 12:16
Aveal MT
(@aveal)
Top level Admin

Запись от: @olga549

здравствуйте. большое вам спасибо за помощь . мне хватит. здесь огромное поле для творчества. и чтобы все изучить.  я очень рада.

Хорошо, если что - обращайтесь! 🙂 

 


ОтветитьЦитата
Размещено : 27.07.2026 12:17
(@olga549)
Level 3

здравствуйте. поняла. спасибо за помощь. пока менять ничего не требуется. и так все интересно сделано. может в будущем если появятся какие желания с хотелками. тогда да. красиво получилось!! ОГОНЬ!!!!!!


ОтветитьЦитата
Создатель темы Размещено : 27.07.2026 21:37
Aveal MT
(@aveal)
Top level Admin

@olga549 👍


ОтветитьЦитата
Размещено : 28.07.2026 12:02
(@olga549)
Level 3

здравствуйте. прошу прощения за свои вопросы. появились вопросы . я вот сразу не проверила добавленный 5 режим, когда 4 двигается с верху в низ, а 5 режимом с низу вверх. добралась только вот сейчас. и вот что выяснилось. может я чего не правильно написала по последнему разъяснению,  можете проверить пожалуйста .то что я написала 5 режимом, диоды в 5 режиме вообще не светятся. то-есть 1, 2, 3, 4, работаю, а на 5 все гаснет и снова 1, 2, 3, 4, на 5 тухнет всё и снова по кругу. вот дописанный файл с 5 режимом как вы указали. наверное не правильно написано. но меня вот что смутило, а почему 4 и 5 режим одинаков.

 LS = 0;
    
    if (flag == 0)
    {
      if (counter < (N_O_S)) {sector_time--;}
      if (counter > (N_O_S)) {sector_time++;}
    }
    
    if (counter == N_O_S) {flag = 1;}
    if ((counter < (N_O_S - TOL)) || (counter > (N_O_S + TOL))) {flag = 0;}
  
    if (end_time < millis())
    {
      end_time = millis() + (random(10,20) * 1000);
      flag=0;
      mode++;
      if (mode == 6) {mode = 1;}  //вот здесь 5 режим указан.
    }
  
    counter = 0;
    if (offset > (N_O_S - 1)) {offset = 0;}
    
    EnableSPI();
 
    while (LS == 0) 
    {
        if (counter < N_O_S) {pointer = counter;} else {pointer = N_O_S - 1;}      
        pointer = pointer + offset;
        if (pointer > (N_O_S - 1)) {pointer = pointer - N_O_S;}
      
        int sector_index = pointer;
        if (sector_index == 0)
        {
            test_counter++;
        }
        
        int led_index = test_counter % 20 + 20 + 20;//если сделать вот так то горят только синие .
        if (mode == 5)   // а вот здесь на 6 надо менять????
        {
            led_index = 19 - led_index; // наверное вот здесь надо поставить не 19, а 119. 
        }
        pointer = pointer * 15;
        
        int cached_bit_1 = GetBit(&test_array[0], 2 * led_index);
        int cached_bit_2 = GetBit(&test_array[0], 2 * led_index + 1);
        
        SetBit(&test_array[0], 2 * led_index);
        SetBit(&test_array[0], 2 * led_index + 1);
    
        digitalWrite(latchPin, LOW);
        
        switch (mode)
        {
            case 1: for (int l=0; l<15; l++){SendRecSPI(bild_01[pointer + l]);}
                break;
            case 2: for (int l=0; l<15; l++){SendRecSPI(bild_02[pointer + l]);}
                break;
            case 3: for (int l=0; l<15; l++){SendRecSPI(bild_03[pointer + l]);}
                break;
            case 4: for (int l=0; l<15; l++){SendRecSPI(test_array[l]);}   //и вот здесь я так поняла заполнить....
                break; 
            case 5: for (int l=0; l<15; l++){SendRecSPI(test_array[l]);}
                break;     
        }

ОтветитьЦитата
Создатель темы Размещено : 28.08.2026 20:39
(@olga549)
Level 3

здравствуйте. я вот подумала и вот что поняла. для простоты и удобства нужно перебирания цветов в бегущем цикле, просто разделить их циклы. в результате получиться должно так 1 глобус, 2 точки, 3 полосы, 4 красные , 5 синие, 6 зеленые и снова по кругу. любой порядок. потому что как я понимаю на вывод картинки дается определенное время и для вывода всех цветов просто не хватает время. поэтому успевает загореться только синий , а далее картинка сменяется и все с начала.

unsigned long sector_time = 20;  // Sektorzeit in µs//время сектора в мл/сек 
unsigned int     counter = 0;    // zählt später wieviele Sektoren wärend einer Umdrehung "geschaft" wurden//колличество секторов за 1 оборот
unsigned int     pointer = 0;    // zeigt später auf die richtige Stelle im Programmspeicher//пожже указывает на правильную позицию в памяти программы
unsigned int      offset = 0;    // Offset zum Pointer, der für die Drehung des Bildes sorgt//смещение к указателю,который поворачивает изображение
volatile byte         LS = 0;    // Austauschvariable zwischen Main-Prozedur und Interrupt-Service-Routine (LS = Licht-Schranke)//переменная обмена между основной процедурой и процедурой обработки прерываний (LS=световой барьер)
byte                mode = 1;    // Modus//режим
unsigned long   end_time = 0;    // Endzeit eines Modus//время окончания режима. ВОТ ЗДЕСЬ ЕСЛИ ПОСТАВИТЬ 3, ТО ПРОГРАММЫ СМЕНЯЮТСЯ ОЧЕНЬ БЫСТРО. ЕСЛИ 0 , ТО ПОМЕДЛЕННЕЕ!!!!!!!!
byte            flag = 0;

ОтветитьЦитата
Создатель темы Размещено : 30.08.2026 10:11
Aveal MT
(@aveal)
Top level Admin

Запись от: @aveal

led_index - индекс светодиода, в данном случае от 0 до 19, увеличивается так же на каждый оборот.

Добрый день, это для 4-го режима, для 5-го там индекс от 19 до 0, то есть в обратном направлении, остальная логика та же.


ОтветитьЦитата
Размещено : 01.09.2026 11:49
Aveal MT
(@aveal)
Top level Admin

Вот полный файл для 5-го режима:


ОтветитьЦитата
Размещено : 01.09.2026 11:52
(@olga549)
Level 3

здравствуйте, а вот почему если я записываю

int led_index = test_counter % 20 + 20 + 20;

как вы поясняли что бы добавить перебор цвета RGB , то горит в место зеленого только синий и смены цвета по кругу в 4 цикле не происходит???? раньше бегал зеленый по кругу , а теперь только синий, цвета не сменяется по очереди на красный и потом зеленый. порядок неважен...


ОтветитьЦитата
Создатель темы Размещено : 01.09.2026 22:09
(@olga549)
Level 3

здравствуйте проверила я 10 скетч и вот что получилось. если вот так написано,

int led_index = test_counter % 20;

то работают правильно все пять режимов зелёным цветом.4 с верху в низ, а 5 снизу в верх. если как вы говорили для перебора RGB добавить вот так

int led_index = test_counter % 20 + 20 + 20;

, то цвет меняется на синий, а 5 режим прекращает работать, вместо него пустой пропуск. диоды не светятся в 5 режиме. режим включается, а диоды не светятся.... а как добавить перебор 3х цветов???? 


ОтветитьЦитата
Создатель темы Размещено : 02.09.2026 10:42
Aveal MT
(@aveal)
Top level Admin

@olga549 

void loop()                     
{    
    LS = 0;
    
    if (flag == 0)
    {
      if (counter < (N_O_S)) {sector_time--;}
      if (counter > (N_O_S)) {sector_time++;}
    }
    
    if (counter == N_O_S) {flag = 1;}
    if ((counter < (N_O_S - TOL)) || (counter > (N_O_S + TOL))) {flag = 0;}
  
    if (end_time < millis())
    {
      end_time = millis() + (random(10,20) * 1000);
      flag=0;
      mode++;
      if (mode == 6) {mode = 1;}
    }
  
    counter = 0;
    if (offset > (N_O_S - 1)) {offset = 0;}
    
    EnableSPI();
 
    while (LS == 0) 
    {
        if (counter < N_O_S) {pointer = counter;} else {pointer = N_O_S - 1;}      
        pointer = pointer + offset;
        if (pointer > (N_O_S - 1)) {pointer = pointer - N_O_S;}
      
        int sector_index = pointer;
        if (sector_index == 0)
        {
            test_counter++;
        }
        
        int led_index = test_counter % 20;        
        if (mode == 5)
        {
            led_index = 19 - led_index;
        }
        
        pointer = pointer * 15;
        
        int bit_index = 2 * led_index;
        int color_bit_offset = 40 * (test_counter % 3);
        
        int cached_bit_1 = GetBit(&test_array[0], bit_index + color_bit_offset);
        int cached_bit_2 = GetBit(&test_array[0], bit_index + 1 + color_bit_offset);
        
        SetBit(&test_array[0], bit_index + color_bit_offset);
        SetBit(&test_array[0], bit_index + 1 + color_bit_offset);
    
        digitalWrite(latchPin, LOW);
        
        switch (mode)
        {
            case 1: 
                for (int l=0; l<15; l++){SendRecSPI(bild_01[pointer + l]);}
                break;
            case 2: 
                for (int l=0; l<15; l++){SendRecSPI(bild_02[pointer + l]);}
                break;
            case 3: 
                for (int l=0; l<15; l++){SendRecSPI(bild_03[pointer + l]);}
                break;
            case 4:
            case 5:            
                for (int l=0; l<15; l++){SendRecSPI(test_array[l]);}
                break;     
        }
        
        digitalWrite(latchPin, HIGH);
        
        if (cached_bit_1 == 0) ClearBit(&test_array[0], bit_index + color_bit_offset);
        if (cached_bit_2 == 0) ClearBit(&test_array[0], bit_index + 1 + color_bit_offset);
        
        counter++;
                                                           
        unsigned long end_micros = micros() + sector_time;                                    
        while ((micros() < end_micros) && (LS == 0)) {}                         
    }  
    
    DisableSPI();
    
    offset = offset + v_offset;
}

ОтветитьЦитата
Размещено : 02.09.2026 11:46
(@olga549)
Level 3

здравствуйте. проверила, все работает!!!!! высший класс!!!!!, но вот какое появилось не удобство. которое я поняла и если можно его поправить. а получилось так:-при прохождении 4 цикла 3 цвета переключаются между собой так быстро что создаётся эффект что они все вместе горят и тоже самое происходит на 5 цикле. а можно все эти эффекты разделить на циклы самостоятельные. то-есть 4 цикл (R) в низ, 5 цикл (G) вниз, 6 цикл (B) вниз, 7 цикл (R) вверх, 8 цикл (G) вверх, 9 цикл (B) вверх и опять по кругу порядок цветов не важен

. и еще просьба, а сложно сделать чтобы увеличить время отображения цикла. то-есть что бы длительность отображения картинки можно было дольше отображать.  вот эта строка управляет временем отображения картинки,

unsigned long   end_time = 0;    // ВОТ ЗДЕСЬ ЕСЛИ ПОСТАВИТЬ 3, ТО ПРОГРАММЫ СМЕНЯЮТСЯ ОЧЕНЬ БЫСТРО. ЕСЛИ 0 , ТО ПОМЕДЛЕННЕЕ!!!!!!!!

но работает он своеобразно 0-(например 5 сек), а 3 -(например 0.5 сек)  и если дальше увеличивать ,то 25 кадр получается , а хотелось так что бы картинки стояли например минуту или 1.5 минуты. но разделять каждую на собственное время , этого не надо. пусть будет что бы все картинки были привязаны к одинаковому времени. вот какие просьбы появились. будьте добры!!! пожалуйста!!!!


ОтветитьЦитата
Создатель темы Размещено : 03.09.2026 12:13
Страница 8 / 9
Обзор конфиденциальности

На этом сайте используются файлы cookie, что позволяет нам обеспечить наилучшее качество обслуживания пользователей. Информация о файлах cookie хранится в вашем браузере и выполняет такие функции, как распознавание вас при возвращении на наш сайт и помощь нашей команде в понимании того, какие разделы сайта вы считаете наиболее интересными и полезными.