Это цикл для отправки 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;
}
здравствуйте. большое вам спасибо за помощь . мне хватит. здесь огромное поле для творчества. и чтобы все изучить. я очень рада.
а еще один маленький вопрос? я правильно поняла что скорость перемещения диодов по кольцу, зависит от скорости вращения конструкции. то есть от прерывания LS.
@olga549 да, в режимах 4 и 5 сейчас диоды переключаются после полного оборота, но это можно изменить в случае необходимости. Я так просто для наглядности сделал.
здравствуйте. большое вам спасибо за помощь . мне хватит. здесь огромное поле для творчества. и чтобы все изучить. я очень рада.
Хорошо, если что - обращайтесь! 🙂
здравствуйте. поняла. спасибо за помощь. пока менять ничего не требуется. и так все интересно сделано. может в будущем если появятся какие желания с хотелками. тогда да. красиво получилось!! ОГОНЬ!!!!!!
здравствуйте. прошу прощения за свои вопросы. появились вопросы . я вот сразу не проверила добавленный 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;
}
здравствуйте. я вот подумала и вот что поняла. для простоты и удобства нужно перебирания цветов в бегущем цикле, просто разделить их циклы. в результате получиться должно так 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;
led_index - индекс светодиода, в данном случае от 0 до 19, увеличивается так же на каждый оборот.
Добрый день, это для 4-го режима, для 5-го там индекс от 19 до 0, то есть в обратном направлении, остальная логика та же.
здравствуйте, а вот почему если я записываю
int led_index = test_counter % 20 + 20 + 20;
как вы поясняли что бы добавить перебор цвета RGB , то горит в место зеленого только синий и смены цвета по кругу в 4 цикле не происходит???? раньше бегал зеленый по кругу , а теперь только синий, цвета не сменяется по очереди на красный и потом зеленый. порядок неважен...
здравствуйте проверила я 10 скетч и вот что получилось. если вот так написано,
int led_index = test_counter % 20;
то работают правильно все пять режимов зелёным цветом.4 с верху в низ, а 5 снизу в верх. если как вы говорили для перебора RGB добавить вот так
int led_index = test_counter % 20 + 20 + 20;
, то цвет меняется на синий, а 5 режим прекращает работать, вместо него пустой пропуск. диоды не светятся в 5 режиме. режим включается, а диоды не светятся.... а как добавить перебор 3х цветов????
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;
}
здравствуйте. проверила, все работает!!!!! высший класс!!!!!, но вот какое появилось не удобство. которое я поняла и если можно его поправить. а получилось так:-при прохождении 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 минуты. но разделять каждую на собственное время , этого не надо. пусть будет что бы все картинки были привязаны к одинаковому времени. вот какие просьбы появились. будьте добры!!! пожалуйста!!!!