Помогите допилить скетч MARKER&STOP&TURN_LIGHTS для велосипеда на матрицах MAX7219 4в1
- Войдите на сайт для отправки комментариев
Вообщем история такая, появилась идея смастерить на велик габарит с функцией стоп сигнала и указателей поворотов на матрицах MAX7219 8*8 четыре на одной плате (изначально планировалось сделать на одно матрице, но поигравшись с 4мя на одной плате понял что это будет выглядеть весьма красивее несложными в реализации анимациями). Перелопатив нэт, ни каких дельных проектов на эту тему не нашел (кроме одного незаконченого на youtube), и взяв за основу демо скетч из youtub-овского проекта стал перекраивать его под себя. Демку собрал получилась грамоздкая, но как дошло до привязки кнопок на включение того или иного действия тут начались проблемы, потому и пришел к вам умельцам с поклоном за хэлпом =) Возникли следующие вопросы: 1. Как собственно задать приоритет включения (нужно в такой последовательности СТОП=>ПОВОРОТНИКИ=>ГАБАРИТ) 2. Как правильно эти кнопки прописать (ниже выложу свою попытку, оно вроде работает, но с большими задержками) 3. Как завершить цикл не дожидаясь его окончания (например я включил поворотник и выключил, а он выключается по окончанию цикла) 4. Можно ли как упростить то что я наваял =) а то уж больно громоздко как то получилось (может из-за этого и задержки такие)
#include "LedControl.h"//подключаем библиотеку LedControl.h //==================================================================================================== LedControl lc = LedControl(10, 8, 9, 4);//к D10 подключаем DIN, к D8 подключаем CLK, к D9 подключаем CS //==================================================================================================== unsigned long delaytime = 1000;//временные переменные delay unsigned long delaytime2 = 30; unsigned long delaytime3 = 100; //==================================================================================================== void setup() { //задаём параметры дисплеев lc.shutdown(0, false);//первого lc.setIntensity(0, 1); lc.clearDisplay(0); lc.shutdown(1, false);//второго lc.setIntensity(1, 1); lc.clearDisplay(1); lc.shutdown(2, false);//третьего lc.setIntensity(2, 1); lc.clearDisplay(2); lc.shutdown(3, false);//четвертого lc.setIntensity(3, 1); lc.clearDisplay(3); } //==================================================================================================== //пишем значения для каждой фигуры или символа byte kvadrat[8] = {B11111111,B00000000,B11111111,B00000000,B00000000,B11111111,B00000000,B11111111};//центральные матрицы габарита byte kvadrat2[8] = {B11111111,B10000000,B10111111,B10100000,B10100000,B10111111,B10000000,B11111111};//левая матрица габарита byte kvadrat3[8] = {B11111111,B00000001,B11111101,B00000101,B00000101,B11111101,B00000001,B11111111};//правая матрица габарита //==================================================================================================== byte pravo[8] = {B00001000,B00001100,B01111110,B01111111,B01111111,B01111110,B00001100,B00001000};//правый поворот //==================================================================================================== byte levo[8] = {B00010000,B00110000,B01111110,B11111110,B11111110,B01111110,B00110000,B00010000};//левый поворот //==================================================================================================== byte S[8] = {B00000000,B00111100,B01100110,B01100000,B01100000,B01100110,B00111100,B00000000};//стоп простой byte T[8] = {B00000000,B01111110,B00011000,B00011000,B00011000,B00011000,B00011000,B00000000}; byte O[8] = {B00000000,B00111100,B01100110,B01100110,B01100110,B01100110,B00111100,B00000000}; byte P[8] = {B00000000,B01111110,B01100110,B01100110,B01100110,B01100110,B01100110,B00000000}; //==================================================================================================== byte Si[8] = {B11111111,B11000011,B10011001,B10011111,B10011111,B10011001,B11000011,B11111111};//стоп с инверсией byte Ti[8] = {B11111111,B10000001,B11100111,B11100111,B11100111,B11100111,B11100111,B11111111}; byte Oi[8] = {B11111111,B11000011,B10011001,B10011001,B10011001,B10011001,B11000011,B11111111}; byte Pi[8] = {B11111111,B10000001,B10011001,B10011001,B10011001,B10011001,B10011001,B11111111}; //==================================================================================================== void draw_stop() {//задаём параметры для стопа for(byte i=0;i<4;i++){ lc.setRow(0, 0, Pi[0]); lc.setRow(0, 1, Pi[1]); lc.setRow(0, 2, Pi[2]); lc.setRow(0, 3, Pi[3]); lc.setRow(0, 4, Pi[4]); lc.setRow(0, 5, Pi[5]); lc.setRow(0, 6, Pi[6]); lc.setRow(0, 7, Pi[7]); lc.setRow(1, 0, Oi[0]); lc.setRow(1, 1, Oi[1]); lc.setRow(1, 2, Oi[2]); lc.setRow(1, 3, Oi[3]); lc.setRow(1, 4, Oi[4]); lc.setRow(1, 5, Oi[5]); lc.setRow(1, 6, Oi[6]); lc.setRow(1, 7, Oi[7]); lc.setRow(2, 0, Ti[0]); lc.setRow(2, 1, Ti[1]); lc.setRow(2, 2, Ti[2]); lc.setRow(2, 3, Ti[3]); lc.setRow(2, 4, Ti[4]); lc.setRow(2, 5, Ti[5]); lc.setRow(2, 6, Ti[6]); lc.setRow(2, 7, Ti[7]); lc.setRow(3, 0, Si[0]); lc.setRow(3, 1, Si[1]); lc.setRow(3, 2, Si[2]); lc.setRow(3, 3, Si[3]); lc.setRow(3, 4, Si[4]); lc.setRow(3, 5, Si[5]); lc.setRow(3, 6, Si[6]); lc.setRow(3, 7, Si[7]); delay(delaytime2); lc.setRow(0, 0, P[0]); lc.setRow(0, 1, P[1]); lc.setRow(0, 2, P[2]); lc.setRow(0, 3, P[3]); lc.setRow(0, 4, P[4]); lc.setRow(0, 5, P[5]); lc.setRow(0, 6, P[6]); lc.setRow(0, 7, P[7]); lc.setRow(1, 0, O[0]); lc.setRow(1, 1, O[1]); lc.setRow(1, 2, O[2]); lc.setRow(1, 3, O[3]); lc.setRow(1, 4, O[4]); lc.setRow(1, 5, O[5]); lc.setRow(1, 6, O[6]); lc.setRow(1, 7, O[7]); lc.setRow(2, 0, T[0]); lc.setRow(2, 1, T[1]); lc.setRow(2, 2, T[2]); lc.setRow(2, 3, T[3]); lc.setRow(2, 4, T[4]); lc.setRow(2, 5, T[5]); lc.setRow(2, 6, T[6]); lc.setRow(2, 7, T[7]); lc.setRow(3, 0, S[0]); lc.setRow(3, 1, S[1]); lc.setRow(3, 2, S[2]); lc.setRow(3, 3, S[3]); lc.setRow(3, 4, S[4]); lc.setRow(3, 5, S[5]); lc.setRow(3, 6, S[6]); lc.setRow(3, 7, S[7]); delay(delaytime2); lc.clearDisplay(0); lc.clearDisplay(1); lc.clearDisplay(2); lc.clearDisplay(3); lc.setRow(0, 0, Pi[0]); lc.setRow(0, 1, Pi[1]); lc.setRow(0, 2, Pi[2]); lc.setRow(0, 3, Pi[3]); lc.setRow(0, 4, Pi[4]); lc.setRow(0, 5, Pi[5]); lc.setRow(0, 6, Pi[6]); lc.setRow(0, 7, Pi[7]); lc.setRow(1, 0, Oi[0]); lc.setRow(1, 1, Oi[1]); lc.setRow(1, 2, Oi[2]); lc.setRow(1, 3, Oi[3]); lc.setRow(1, 4, Oi[4]); lc.setRow(1, 5, Oi[5]); lc.setRow(1, 6, Oi[6]); lc.setRow(1, 7, Oi[7]); lc.setRow(2, 0, Ti[0]); lc.setRow(2, 1, Ti[1]); lc.setRow(2, 2, Ti[2]); lc.setRow(2, 3, Ti[3]); lc.setRow(2, 4, Ti[4]); lc.setRow(2, 5, Ti[5]); lc.setRow(2, 6, Ti[6]); lc.setRow(2, 7, Ti[7]); lc.setRow(3, 0, Si[0]); lc.setRow(3, 1, Si[1]); lc.setRow(3, 2, Si[2]); lc.setRow(3, 3, Si[3]); lc.setRow(3, 4, Si[4]); lc.setRow(3, 5, Si[5]); lc.setRow(3, 6, Si[6]); lc.setRow(3, 7, Si[7]); } delay(delaytime); lc.clearDisplay(0); lc.clearDisplay(1); lc.clearDisplay(2); lc.clearDisplay(3); } //==================================================================================================== void draw_kvadrat() {//задаём параметры для габарита for(byte i=0;i<4;i++){ lc.setRow(0, 0, kvadrat3[0]); lc.setRow(0, 1, kvadrat3[1]); lc.setRow(0, 2, kvadrat3[2]); lc.setRow(0, 3, kvadrat3[3]); lc.setRow(0, 4, kvadrat3[4]); lc.setRow(0, 5, kvadrat3[5]); lc.setRow(0, 6, kvadrat3[6]); lc.setRow(0, 7, kvadrat3[7]); lc.setRow(1, 0, kvadrat[0]); lc.setRow(1, 1, kvadrat[1]); lc.setRow(1, 2, kvadrat[2]); lc.setRow(1, 3, kvadrat[3]); lc.setRow(1, 4, kvadrat[4]); lc.setRow(1, 5, kvadrat[5]); lc.setRow(1, 6, kvadrat[6]); lc.setRow(1, 7, kvadrat[7]); lc.setRow(2, 0, kvadrat[0]); lc.setRow(2, 1, kvadrat[1]); lc.setRow(2, 2, kvadrat[2]); lc.setRow(2, 3, kvadrat[3]); lc.setRow(2, 4, kvadrat[4]); lc.setRow(2, 5, kvadrat[5]); lc.setRow(2, 6, kvadrat[6]); lc.setRow(2, 7, kvadrat[7]); lc.setRow(3, 0, kvadrat2[0]); lc.setRow(3, 1, kvadrat2[1]); lc.setRow(3, 2, kvadrat2[2]); lc.setRow(3, 3, kvadrat2[3]); lc.setRow(3, 4, kvadrat2[4]); lc.setRow(3, 5, kvadrat2[5]); lc.setRow(3, 6, kvadrat2[6]); lc.setRow(3, 7, kvadrat2[7]); } delay(delaytime); lc.clearDisplay(0); lc.clearDisplay(1); lc.clearDisplay(2); lc.clearDisplay(3); } //==================================================================================================== void draw_pravo() {//задаём параметры для поворота в право for (byte i = 0; i < 4; i++) { lc.setRow(3, 0, pravo[0]); lc.setRow(3, 1, pravo[1]); lc.setRow(3, 2, pravo[2]); lc.setRow(3, 3, pravo[3]); lc.setRow(3, 4, pravo[4]); lc.setRow(3, 5, pravo[5]); lc.setRow(3, 6, pravo[6]); lc.setRow(3, 7, pravo[7]); delay(delaytime3); lc.setRow(2, 0, pravo[0]); lc.setRow(2, 1, pravo[1]); lc.setRow(2, 2, pravo[2]); lc.setRow(2, 3, pravo[3]); lc.setRow(2, 4, pravo[4]); lc.setRow(2, 5, pravo[5]); lc.setRow(2, 6, pravo[6]); lc.setRow(2, 7, pravo[7]); delay(delaytime3); lc.setRow(1, 0, pravo[0]); lc.setRow(1, 1, pravo[1]); lc.setRow(1, 2, pravo[2]); lc.setRow(1, 3, pravo[3]); lc.setRow(1, 4, pravo[4]); lc.setRow(1, 5, pravo[5]); lc.setRow(1, 6, pravo[6]); lc.setRow(1, 7, pravo[7]); delay(delaytime3); lc.setRow(0, 0, pravo[0]); lc.setRow(0, 1, pravo[1]); lc.setRow(0, 2, pravo[2]); lc.setRow(0, 3, pravo[3]); lc.setRow(0, 4, pravo[4]); lc.setRow(0, 5, pravo[5]); lc.setRow(0, 6, pravo[6]); lc.setRow(0, 7, pravo[7]); delay(delaytime3); lc.clearDisplay(3); delay(delaytime3); lc.clearDisplay(2); delay(delaytime3); lc.clearDisplay(1); delay(delaytime3); lc.clearDisplay(0); delay(delaytime2); } delay(delaytime); } //==================================================================================================== void draw_levo() {//задаём параметры для поворота в лево for (byte i = 0; i < 4; i++) { lc.setRow(0, 0, levo[0]); lc.setRow(0, 1, levo[1]); lc.setRow(0, 2, levo[2]); lc.setRow(0, 3, levo[3]); lc.setRow(0, 4, levo[4]); lc.setRow(0, 5, levo[5]); lc.setRow(0, 6, levo[6]); lc.setRow(0, 7, levo[7]); delay(delaytime3); lc.setRow(1, 0, levo[0]); lc.setRow(1, 1, levo[1]); lc.setRow(1, 2, levo[2]); lc.setRow(1, 3, levo[3]); lc.setRow(1, 4, levo[4]); lc.setRow(1, 5, levo[5]); lc.setRow(1, 6, levo[6]); lc.setRow(1, 7, levo[7]); delay(delaytime3); lc.setRow(2, 0, levo[0]); lc.setRow(2, 1, levo[1]); lc.setRow(2, 2, levo[2]); lc.setRow(2, 3, levo[3]); lc.setRow(2, 4, levo[4]); lc.setRow(2, 5, levo[5]); lc.setRow(2, 6, levo[6]); lc.setRow(2, 7, levo[7]); delay(delaytime3); lc.setRow(3, 0, levo[0]); lc.setRow(3, 1, levo[1]); lc.setRow(3, 2, levo[2]); lc.setRow(3, 3, levo[3]); lc.setRow(3, 4, levo[4]); lc.setRow(3, 5, levo[5]); lc.setRow(3, 6, levo[6]); lc.setRow(3, 7, levo[7]); delay(delaytime3); lc.clearDisplay(0); delay(delaytime3); lc.clearDisplay(1); delay(delaytime3); lc.clearDisplay(2); delay(delaytime3); lc.clearDisplay(3); delay(delaytime2); } delay(delaytime); } //==================================================================================================== void loop() { draw_kvadrat();//включаем габарит draw_stop();//мигаем стопом (простой + с инверсией) //Включаем поворотники draw_pravo();//мигаем вправо draw_levo();//мигаем влево }
а вот моя попытка прикрутить кнопки
матрица вот такая https://ru.aliexpress.com/item/1Pcs-MAX7219-Dot-Matrix-Module-For-arduino-Microcontroller-4-In-One-Display-with-5P-Line/32623732034.html?spm=2114.10010208.1000016.1.6dqspe&isOrigTitle=true моск arduino nano, кнопки срабатывают при замыкании на GND