"Hello World", динамическая индикация.

Fire
Offline
Зарегистрирован: 26.10.2018

Здравствуйте, arduino  появилась в моей жизни где то в августе и захватила мой мозг, до этого совсем чуть чуть дружил с пояльником, с прогрмированием практически не имел дела..

В целях обучения и постижения основ сваял вот это:

Так как жалко было кучу портов задействовать под один единственный индикатор воспользовался сдвиговыми регистрами 74hc595, схема наверное стандартная, подсмотрел в сети

То что получилось можно увидеть на видео https://youtu.be/oTOUlNb5dws

Если смешно, смейтесь на здоровье, прошу сильно не пинать и вобще любить и жаловать, ето творение назвал Crony

#define SCLK_C 4 // пины ардуино для подключения Cronee
#define RCLK_C 3
#define DIO_C  2


unsigned long timer0; //Переменная для работы таймера
unsigned long timer1; //Переменная для работы таймера
unsigned long TiMer; //Переменная для работы таймера

int NUMBER = 0;  //Счетчик для определения номера ячейки в столбце массива symbol[][]
int NUMBER1 = 0; //Переменная для хранения значения 1го разряда
int NUMBER2 = 0; //Переменная для хранения значения 2го разряда
int NUMBER3 = 0; //Переменная для хранения значения 3го разряда

int column = 20; //Количество столбцов массива
int line = 0;    //Переменная для выбора строки из массива

int funct = 0;   //Выбор функции (режима работы)
int del = 1000;  //Интервалл переключения индикатора
byte other = 0b00000000; //Дополнительный байт, позволяет
                        //модифицировать байт отправляемый
                       //на порт DIO и сдвиговый регистр

// маска для 7 сигментного индикатора
const byte symbol[5][20] = { // Перфокарта o_O
  {
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b01110110, // H
    0b01111001, // E
    0b00111000, // L
    0b00111000, // L
    0b00111111, // O
    0b00000000, //
    0b00000100, // i
    0b01010100, // n +
    0b01010100, // n = m %)
    0b00000000, //
    0b00111001, // C
    0b01010000, // r
    0b01011100, // o
    0b01010100, // n
    0b01111011, // e
    0b01111011, // e
  }, {
    0b00111111, // 0
    0b00000110, // 1
    0b01011011, // 2
    0b01001111, // 3
    0b01100110, // 4
    0b01101101, // 5
    0b01111101, // 6
    0b00000111, // 7
    0b01111111, // 8
    0b01101111, // 9
    0b00000000, // пробел
    0b00000001, // a //каждый сегмент в отдельности
    0b00000010, // b
    0b00000100, // c
    0b00001000, // d_
    0b00010000, // e
    0b00100000, // f
    0b01000000, // g-
    0b10000000, // h.
  }, {
    //Cronee
    0b01100011, //"o_o"
    0b01000001, //"=_="
    0b01000000, //"-_-"
    0b01000011, //">_>"
    0b01100001, //"<_<"
    0b00000001, //"-high -"
    0b00001000, //"_"_
    0b01001000, //"="_
    0b01011100, //"o"_
    0b01000000, //"-"_
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
  }, {
    //"animaciya"
    0b00000000, // пробел
    0b00000001, // a
    0b00000010, // b
    0b00000100, // c
    0b00001000, // d_
    0b00010000, // e
    0b00100000, // f
    0b01000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
    0b00000000, //
  }, {
    // arduino
    0b00000000, //
    0b00000000, // пробел
    0b01000000, //
    0b01100011, //
    0b01011100, //
    0b01100100, //
    0b01010010, //
    0b01101101, //
    0b01111111, //
    0b00000000, //
    0b00000000, //
    0b01110111, //
    0b01010000, //
    0b01011110, //
    0b00011100, //
    0b00000100, //
    0b01010100, //
    0b01011100, //
    0b00000000, //
    0b00000000, //
  }
};
const byte chr[3] = { // маска для разряда 0, 1, 2
  0b00000110, //100
  0b00000101, //010
  0b00000011, //001
  //0b00000000, //111
  //0b00000111, //000
};
//********************
boolean lock = 0;
int valueT = 418;
int valueTt = 1;

void setup() {
  // put your setup code here, to run once:
  pinMode(RCLK_C, OUTPUT);
  pinMode(SCLK_C, OUTPUT);
  pinMode(DIO_C, OUTPUT);

  //Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (valueTt == 155) { // Пеореодическое включение приветствия
    lock = 0;
    valueTt = 1;
  }
  if (lock == 0) {
    //TimeMachine();
    if (millis() - timer1 > 100) {
      TiMer = TiMer + 1;
      if (TiMer == 578) TiMer = 1;
      timer1 = millis();
    }
  }
  if (lock == 1) {
    //TimeMachine();
    if (millis() - timer1 > 100) {
      valueT++;
      TiMer = valueT;
      if (TiMer == 578) valueT = 418;
      timer1 = millis();
    }
  }

  //Выделятор интервалов времени
  if (TiMer >= 3 && TiMer <= 40) funct = 0;
  if (TiMer == 41) NUMBER = 0;
  if (TiMer >= 42 && TiMer <= 224) funct = 1;
  if (TiMer == 225) NUMBER = 0;
  if (TiMer >= 225 && TiMer <= 417) funct = 2;
  if (TiMer == 418) lock = 1;  // Отключение приветствия
  if (TiMer >= 418 && TiMer <= 444) funct = 3;
  if (TiMer >= 445 && TiMer <= 555) funct = 4;
  if (TiMer >= 556 && TiMer <= 577) funct = 5;
  if (TiMer == 577) valueTt++;

  //Serial.println(valueTt);

  if (millis() - timer0 >= del) {  // Таймер
    timer0 = millis();
    if (funct == 0) {            //Переключатель
      randomCatcher();
    }
    if (funct == 1) {
      arduino();
    }
    if (funct == 2) {
      HelloWorld();
    }
    if (funct == 3) {
      Anymation();
    }
    if (funct == 4) {
      Cronee();
    }
    if (funct == 5) {
      Anymation();
    }
  }


  int NUMBERS[3] = { // Массив масок каждого разряда
    NUMBER1,
    NUMBER2,
    NUMBER3,
  };

  int i;
  for (i = 0; i <= 2; i++) {
    digitalWrite(RCLK_C, LOW); // открываем защелку
    shiftOut(DIO_C, SCLK_C, MSBFIRST,  chr[i]);  // включаем разряд
    shiftOut(DIO_C, SCLK_C, MSBFIRST, symbol[line][NUMBERS[i]] + other); //Отправляем байт-маску на вход регистра
    digitalWrite(RCLK_C, HIGH); // защелкиваем регистры
    delay(1);
  }

 

}

void Cronee() {
  line = 2;
  del = random(700, 3000); //Случайное время изменения индикации
  other = symbol[4][0]; //Включаем "-" на всех разрядах
  int EYES = random(0, 5);  //Случайная маска 0-5 столбец
  int MOUTH = random (6, 9);//Случайная маска 6-9 столбец
  NUMBER1 = EYES;
  NUMBER2 = MOUTH;
  NUMBER3 = EYES;

}


void randomCatcher() {
  // Счетчик
  del = 100;
  other = symbol[4][0]; //Включаем "-" на всех разрядах
  line = 1; //Выбор линии из массива с символами
  NUMBER1 = random(20);
  NUMBER3 = random(20);
  NUMBER2 = random(20);
}

void HelloWorld() {
  //Эффект бегущей строки, N >> N1 >> N2 >> N3
  del = 1000;
  line = 0; //Выбор линии из массива с символами
  other = symbol[4][0]; //Включаем "-" на всех разрядах
  NUMBER = NUMBER + 1;
  // Получаем маски для каждого разряда
  // смещающиеся справа налево
  // (визуально, на индикаторе :)
  if (NUMBER >= column) NUMBER = 0;
  NUMBER1 = NUMBER;
  NUMBER2 = NUMBER1 + 1;
  if (NUMBER2 == column) NUMBER2 = 0;
  NUMBER3 = NUMBER2 + 1;
  if (NUMBER3 == column) NUMBER3 = 0;
}

void arduino() {
  //Эффект бегущей строки, N >> N1 >> N2 >> N3
  del = 1000;
  line = 4; //Выбор линии из массива с символами
  other = symbol[4][0]; //Включаем "-" на всех разрядах
  NUMBER = NUMBER + 1;
  // Получаем маски для каждого разряда
  // смещающиеся справа налево
  // (визуально, на индикаторе :)
  if (NUMBER >= column) NUMBER = 0;
  NUMBER1 = NUMBER;
  NUMBER2 = NUMBER1 + 1;
  if (NUMBER2 == column) NUMBER2 = 0;
  NUMBER3 = NUMBER2 + 1;
  if (NUMBER3 == column) NUMBER3 = 0;
}



void Anymation() {
  //Анимация, 6 сегментов загораются и гаснут по очереди,
  //создавая эффект движения по кругу
  line = 3;
  del = 78;
  other = symbol[1][17]; //Включаем "-" на всех разрядах
  NUMBER = NUMBER + 1;
  if (NUMBER >= 7) NUMBER = 1;
  //На все разряды выводим одинаковую маску
  NUMBER1 = NUMBER;
  NUMBER2 = NUMBER;
  NUMBER3 = NUMBER;
}



 

Вопрос в том, как сделать перебор выполняемых функций аппаратными средствами с назначением каждой функции своего времени и очереди выполнения, у меня это делает счетчик (строки 162-178) и дальше распределяется время, такое ощущение что сделал велосипед в велосипеде, за такую возможность спасибо Дэвиду Мелису, но хочется пользоваться всеми возможностясми микроконтроллера, 

Хотел этот пост ещё в воскресение написать, но открыл закрепленную тему в песочнице, а там столько всего полезного, за это спасибо всем кто участвовал в наполнении.

Гриша
Offline
Зарегистрирован: 27.04.2014

Fire пишет:

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

ничего не понял :( ... как подключить пару кнопок и ими устанавливать таймеры и очередь выполнения?

Так и сделать - подключить нужное кол-во кнопок, каждой кнопке задать свое назначение в каждом пункте меню. Соответственно в момент работы с кнопками менять переменные, которые и будут всем рулить в программе. Для начала написать примитивный код в котором кнопки будут рулить миганием светодиодов т.е. временем мерцания светодиодов или яркостью.