Matrix 8x8

decibel
Offline
Зарегистрирован: 05.01.2017

Добрый день.

Хочу сделать бегущую стрелку на одной матрице 8x8, чтоб одна ещё не закончилась а вторая уже начиналась с инервалом в 2 пикселя. Пока только одна стрелка бежит, а дальше не соображу. Прдскажите пожалуста.

#include "LedControlMS.h"

LedControl lc=LedControl(12,11,10,1);
unsigned long delaytime=300;
byte star[8]={B00010000,B00010000,B01010100,B00111000,B00010000};

void setup() {
  lc.shutdown(0,false);
  lc.setIntensity(0,10);
  lc.clearDisplay(0);
}

 void scrollRight(byte arr[]){
  
  for (int scroll =-4; scroll<8; scroll++) {
     for (int i=0; i<6;i++) {
        if (scroll+i<8) lc.setColumn(0, scroll+i, arr[i]);
   }
           delay(200);
         lc.clearDisplay(0);
          }
     }
            
  void loop() {
 
 scrollRight(star);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Длина стрелки? Видимо, шесть пикселей? Так сделайте одну стрелку, а матрицу "сверните" в тор. Как раз так и будет - нос стрелки заехал за край матрицы и тут же появился с другой стороны (она же тор!)  с интервалом в два пискеля.

decibel
Offline
Зарегистрирован: 05.01.2017

Евгений, как понять "сверните в тор"?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, Вы знаете что такое тор? Это такая штука типа бублика.

Давайте начнём с более простого.

Итак - у Вас бумага, рабитая на ячейки. Номера ячеек с 0 по 7. На бумаге горизонтально расположен червяк длиной 6 ячеек. Его хвост в ячейке 0, а голова - в ячейке 5. За один шаг он проползает одну ячейку.

После первого шага: хвост в ячейке 1, голова - в ячейке 6

После второго шага: хвост в ячейке 2, голова - в ячейке 7

После третьего шага: хвост в ячейке 3, голова -сползла с листа, т.к. ячейка 7 была последней

Теперь, возьмём этот лист и склеим его трубкой так, чтобы после ячеёки 7 снова шла ячейка 0. Червяк у нас ползёт поперёк трубки, а не вдоль, конечно. Что теперь с червяком?

После первого шага: хвост в ячейке 1, голова - в ячейке 6

После второго шага: хвост в ячейке 2, голова - в ячейке 7

После третьего шага: хвост в ячейке 3, голова в ячейке 0

После четвёртого шага: хвост в ячейке 4, голова в ячейке 1

После пятого шага: хвост в ячейке 5, голова в ячейке 2

После шестого шага: хвост в ячейке 6, голова в ячейке 3

Ну и так далее ... он будет бесконечно ползать.
 
Реализовать это просто. Каждый раз, когда Вы вычисляете новую позицию какой-то части тела червяка, надо не просто прибавлять 1 к текущей, а ещё и брать остаток от деления на длины листа. Т.о. после 7 будет 0 (остаток от деления 8%8).
 
Выглядеть это будет как два червяка - один уползает за правый край, а другой появляется с левого в двух пикселях от хвоста перового.
Еу, а если пойти дальше и склеить вместе концы трубки (чтобы тор получился), то червяк имеет право ползать хоть горизонтально, хоть вертикально, хоть наискосок - всё равно он не будет исчезать, а как только достигнет края, будет появляться с другой стороны.

Понятно? Если нет, продолжим завтра, мне убегать надо.

decibel
Offline
Зарегистрирован: 05.01.2017

Блок схема как бы понятна, но как закодить? Я думал так, когда переменая Scroll==6, начять рисовать с ячейки  0. Но как зто "Заторить"?Надо ещё подсказку ))).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, есть 100500 способов, например, ну, не знаю.

Давайте пока считать что ползает только горизонтально справа налевоо. Изначально червяка Вы нарисовать сумеете? Вот нарисовали. Запомнили в двух переменных координаты головы и хвоста. пусть изначально Xg = 5, а Xh = 0.

На каждом шаге нужно определеить новую координату головы и хвоста. Вот, смотрите.

Xg = (Xg + 1) % 8; // Вычисляем новую координату головы
НарисоватьТочку(Xg); // Рисуем голову
Стереть(Xh); // стираем хвост
Xh = (Xh + 1) % 8; // Вычисляем новую координату хвоста
Делай(100):

Собственно, всё. Вот это хозяйство пихаете в loop, а в setupe рисуете начального червя и задаёте начальные значения переменным.

decibel
Offline
Зарегистрирован: 05.01.2017

Спасибо, вот так заработало.

#include "LedControlMS.h"

LedControl lc=LedControl(12,11,10,1);
unsigned long delaytime=300;
byte star[8]={B00010000,B00010000,B01010100,B00111000,B00010000};

void setup() {
  Serial.begin(9600);
  lc.shutdown(0,false);
  lc.setIntensity(0,10);
  lc.clearDisplay(0);
}

 void scrollRight(byte arr[]){
  
  for (int scroll =0; scroll<8; scroll++) {
     for (int i=0; i<5;i++) {
        lc.setColumn(0, (scroll+i)%8, arr[i]);
        }
           delay(250);
         lc.clearDisplay(0);
          }
          }
            
  void loop() {
 
               scrollRight(star);
              }

 

decibel
Offline
Зарегистрирован: 05.01.2017

Головоломка продолжается. Хочу эффект "змейка по спирали", в конце первой строки ещё хвост, а голова начинается в второй строке. Пока только так. Дайте пожалуста совет.

#include "LedControlMS.h"
//unsigned int left_shift;
LedControl lc=LedControl(12,11,10,1);
unsigned long delaytime=500;
unsigned int per= 300;
 byte line = 0b00001111;

void setup() { 
  Serial.begin(9600);
  lc.shutdown(0,false);
  lc.setIntensity(0,8);
  lc.clearDisplay(0);     
} 

 void loop() {
   
        line=left_shift(line,1);
        if(line==0b11110000)p++;
          p=p%8;
        lc.setRow(0,p, line);
        delay(300);
       lc.clearAll();
}
char left_shift(char n,char k) { 
 char bit=0;
 for (char i=0; i<k; i++) {
  bit=n&0x8000?1:0;
  n<<=1;
  n|=bit;
 }
  return n;
 }