Команда для мгновенного отключения матрицы max7219 при отпускании кнопки
- Войдите на сайт для отправки комментариев
Пт, 05/01/2018 - 23:20
Прошу помощи со скетчем:
Задача в том, что бы при отпускании кнопки подключённой к pin2, серия команд после if (button ==1){...} мгновенно прекращало своё выполнение, а если точнее просто МАХ7219 гас. Пытался я через attachInterrupt это реализовать, но никак не получается. Может попробовать через другие команды?
#include "LedControl.h"
LedControl LC = LedControl(12, 11, 10, 4);
int delayTime = 7000;
/*void sbros()
{
LC.clearDisplay(0);
LC.clearDisplay(1);
LC.clearDisplay(2);
LC.clearDisplay(3);
delay(50);
}*/
void setup()
{
LC.shutdown(0, false);
LC.shutdown(1, false);
LC.shutdown(2, false);
LC.shutdown(3, false);
LC.setIntensity(0, 8);
LC.setIntensity(1, 8);
LC.setIntensity(2, 8);
LC.setIntensity(3, 8);
LC.clearDisplay(0);
LC.clearDisplay(1);
LC.clearDisplay(2);
LC.clearDisplay(3);
pinMode(2, INPUT_PULLUP);
//attachInterrupt(0, sbros, RISING);
}
void loop()
{
boolean button = !digitalRead(2);
if (button ==1)
{
LC.setRow(0, 0, B11111110); //1
LC.setRow(0, 1, B11111110);
LC.setRow(0, 2, B11111110);
LC.setRow(0, 3, B11111110);
LC.setRow(0, 4, B11111110);
LC.setRow(0, 5, B11111110);
LC.setRow(0, 6, B11111110);
LC.setRow(0, 7, B11111110);
LC.setRow(1, 0, B11111111);
LC.setRow(1, 1, B11111111);
LC.setRow(1, 2, B11111111);
LC.setRow(1, 3, B11111111);
LC.setRow(1, 4, B11111111);
LC.setRow(1, 5, B11111111);
LC.setRow(1, 6, B11111111);
LC.setRow(1, 7, B11111111);
LC.setRow(2, 0, B11111111);
LC.setRow(2, 1, B11111111);
LC.setRow(2, 2, B11111111);
LC.setRow(2, 3, B11111111);
LC.setRow(2, 4, B11111111);
LC.setRow(2, 5, B11111111);
LC.setRow(2, 6, B11111111);
LC.setRow(2, 7, B11111111);
LC.setRow(3, 0, B01111111);
LC.setRow(3, 1, B01111111);
LC.setRow(3, 2, B01111111);
LC.setRow(3, 3, B01111111);
LC.setRow(3, 4, B01111111);
LC.setRow(3, 5, B01111111);
LC.setRow(3, 6, B01111111);
LC.setRow(3, 7, B01111111);
...........................................
LC.setRow(0, 0, B00100000); //33
LC.setRow(0, 1, B00100000);
LC.setRow(0, 2, B00100000);
LC.setRow(0, 3, B00100000);
LC.setRow(0, 4, B00100000);
LC.setRow(0, 5, B00100000);
LC.setRow(0, 6, B01000000);
LC.setRow(0, 7, B10000000);
LC.setRow(1, 0, B00000010);
LC.setRow(1, 1, B00000010);
LC.setRow(1, 2, B00000010);
LC.setRow(1, 3, B01110010);
LC.setRow(1, 4, B00000010);
LC.setRow(1, 5, B00000010);
LC.setRow(1, 6, B00000001);
LC.setRow(1, 7, B00000000);
LC.setRow(2, 0, B10011110);
LC.setRow(2, 1, B00010001);
LC.setRow(2, 2, B00010001);
LC.setRow(2, 3, B00010001);
LC.setRow(2, 4, B00011110);
LC.setRow(2, 5, B00010100);
LC.setRow(2, 6, B00010010);
LC.setRow(2, 7, B10010001);
LC.setRow(3, 0, B00000011);
LC.setRow(3, 1, B00000100);
LC.setRow(3, 2, B00000100);
LC.setRow(3, 3, B00000100);
LC.setRow(3, 4, B00000100);
LC.setRow(3, 5, B00000100);
LC.setRow(3, 6, B00000100);
LC.setRow(3, 7, B00000011);
delay(delayTime);
LC.clearDisplay(0);
LC.clearDisplay(1);
LC.clearDisplay(2);
LC.clearDisplay(3);
}
}
Для начала, избавьтесь от delay() - научитесь делать задержку через millis() (кстати, о задержках в прерываниях даже и не думайте). Потом почитайте тему Работа с кнопками. В помощь новичку. Изучите, как можно обрабатывать кнопку и назначать события при ее нажатии. Потренируйтесь сначала не на матрице, а на простом светодиоде - логика работы та же, но код не настолько загроможден и будет проще для понимания.
Для начала опубликуйте свой код в соответствии с правилами форума.
Вообщетто это обязанность модераторов прибивать такие топики!
vk007 "Для начала, избавьтесь от delay() - научитесь делать задержку через millis() (кстати, о задержках в прерываниях даже и не думайте). Потом почитайте тему Работа с кнопками. В помощь новичку. Изучите, как можно обрабатывать кнопку и назначать события при ее нажатии. Потренируйтесь сначала не на матрице, а на простом светодиоде - логика работы та же, но код не настолько загроможден и будет проще для понимания."
Почитав форумы и поработав с командами в скетче сделал вывод: что не возможно остановить. Единственное это пробовать при каждом пакете bytОВ в команде опрашивать pin и шагать на следующий пакет.
inspiritus *Для начала опубликуйте свой код в соответствии с правилами форума.
Вообщетто это обязанность модераторов прибивать такие топики*
Вообще_Т_то в первую очередь обязанность модераторов хотя бы ввести кнопку "редактирования", чтобы человек увидев свои ошибки мог их исправить.
Ворота *Попробуй!*
То чувство, как будто на сборище малолеток в ютубе нарвался...
Можете не отвечать, поищу на других сайтах, на которых большие дяди общаются.
Можете не отвечать, поищу на других сайтах, на которых большие дяди общаются.
На нет и суда нет. Но с таким подходом к выводу информации на матрицы вам и "на других сайтах, на которых большие дяди общаются" не помогут.
О массивах и циклах while слышали? Так вот, они сами сюда напрашиваются.
Примерная структура того, что должно получиться (пример только для понимания):
upd. Бонусом еще одна подсказка, что касается вычисления x и y в даном случае. Есть такой оператор %, подумайте, как его можно применить.
Читал я и изучал тему про кнопки, и вопрос там задал, но нет там ответа как прервать выполнение команды...
И не должгно быть.
Вы неправильно вопрос ставите: Вам нужна мгновенная реакция на нажатие кнопки а вмеато этого Вы ищете, как прервать выполнение команды.
И по поводу массивов/циклов - совершенно справедливое замечание:
1. Просто неприлично писать 1200 строк там, где достаточно 50.
2. Как только Вы перепишете программу с использованием массивов и циклов, Вы сразу поймете, как ее просто подправить для выполнения Ваших требований.
Оказалось всё намного проще:
используем команду прерывания attachInterrupt и очистку дисплея LC.clearDisplay на матрице, и туда закидываем "програмный сброс"
1
void
(* resetFunc) (
void
) = 0;
// Reset MC function
2
3
resetFunc();
//вызов
и вуаля при отпускании кнопки, матрица гаснет и выполнение команд прерывается, спасибо пользователю chervyachok
Оказалось всё намного проще:
это не "проще", это костыль. Условно говоря. вместо того, чтобы пульт починить, вы телевизор выключаете выдергиванием из розетки.
А код так и остался в 1200 тупых повторяющихся строк? Самому не противно? "Взрослые дяди" так не пишут.
Оказалось всё намного проще:
используем команду прерывания attachInterrupt и очистку дисплея LC.clearDisplay на матрице, и туда закидываем "програмный сброс"
У вас же там есть LC.shutdown(0, false);, сделайте LC.shutdown(0, true); в тот самый момент, когда...
b707 "А код так и остался в 1200 тупых повторяющихся строк? Самому не противно? "Взрослые дяди" так не пишут." нет не противно, я его 1 раз вшил в ардуино, и вообще забыл про него, пусть работает в заднем повторителе стоп сигнала, цель выполнена. Да и если нужно, я в любом месте могу зажечь пиксель поменяв 0 на 1, а не ломать голову на сколько мне надо павысить i.
ЗЫ будет время может и поковыряюсь, однако ИМХО ваши циклы я воспринимаю так:
для чего считать: 1+1=2, 2+1=3, 3+1=4 и т.д, когда можно тупо сказать 2, 3, 4...не тратя время и память ардуино на математические вычисления. Для чего шифровать информацию, при этом ломая свой мозг, для того, что бы потом ардуино всё это расшифровывал...бред. Повторюсь ИМХО.
sadman41 "У вас же там есть LC.shutdown(0, false);, сделайте LC.shutdown(0, true); в тот самый момент, когда..." спасибо, интересное решение...надо попробовать :-)