Урок 21. Часы

Обсуждение и вопросы по урокам Ардуино
Alza
Сообщения: 6
Зарегистрирован: 03 янв 2018, 17:25

Урок 21. Часы

Сообщение Alza » 03 янв 2018, 17:45

Добрый день Эдуард.
Как положено после мигания светодиодом, решил собрать часы :D
Наткнулся на Ваши уроки, очень полезно для начинающих. С выводом времени с DS1307 на индикатор все ОК. Но когда пытаюсь получить коды кнопок (у меня 4 кнопки), одновременно с выводом на дисплей, в мониторе тишина. Понимаю, что надо как-то разделить по времени опрос кнопок и вывод на индикатор, но не знаю КАК :(
Привожу пример. В мониторе определяются коды 1-й, 3-й и 4-й кнопки. На второй (или любые) разряд вывожу цифру 6.

Код: Выделить всё

#include <MsTimer2.h>
#include <LedDigitsKeys.h>

// тип индикатора 1; выводы разрядов 4, 14, 13, 10; выводы сегментов 11, 15, 6, 8, 9, 12, 5, 7
// вертикальные линии  матрицы кнопок: 4, 14, 13, 10
// горизонтальные линии матрицы кнопок: 3; число подтверждений 6
LedDigitsKeys disp(1, 4, 14, 13, 10, 11, 15, 6, 8, 9, 12, 5, 7, 3, 255, 255, 255, 6);

// массив кодов кнопок
const byte codKeys[4] = {1, 2, 3, 4};

void setup() {
  Serial.begin(9600);
  MsTimer2::set(2, timerInterrupt); // прерывание по таймеру 2 мс
  MsTimer2::start();               // разрешение прерывания
}

void loop() {
  // вычисление кода нажатой кнопки
  // перебор столбцов первой строки
  for (int i = 0; i < 4; i++) {
    if (disp.flagClick[i][0] == true) {
      disp.flagClick[i][0] = 0;
      Serial.println(codKeys[i]);
    }
  }
  // вывод на индикатор
  // в реальности вывожу часы и минуты
  // для простоты - вывести цифру 6 во втором разряде
  disp.tetradToSegCod(2, 6);
}

// обработчик прерывания 2 мс
void  timerInterrupt() {
  disp.regen(); // регенерация индикатора
}


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Урок 21. Часы

Сообщение Эдуард » 03 янв 2018, 19:21

Здравствуйте!
Опрос кнопок и вывод на индикатор идет параллельно. Вы используете ресурсы управления индикаторами и кнопками когда это необходимо.
Я подзабыл соответствие кодов disp.flagClick[][] и линий матрицы кнопок. Проверьте сначала, что у вас срабатывают признаки disp.flagClick. Например:

Код: Выделить всё

  if (disp.flagClick[0][0] == true) {
    disp.flagClick[0][0]= false;
    Serial.println("CLICK");
  }

И так для каждой кнопки. Может быть вы не те признаки проверяете.

Alza
Сообщения: 6
Зарегистрирован: 03 янв 2018, 17:25

Re: Урок 21. Часы

Сообщение Alza » 03 янв 2018, 19:46

Я проверял, вывод кодов кнопок происходит. Но как только я пытаюсь вывести что либо на индикатор с помощью disp.tetradToSegCod(byte dig, byte tetrad), код кнопки, подключенной к тому-же разряду dig? перестает определятся. Если вывести символы во все разряды, то кнопки не определяются вообще. Я не думаю, что зависимость от Arduino, у меня Pro Mini 3.3V 8 MHz, резистор от кнопки на массу - 5.6k. Индикатор распространенный 8 сегментов и двоеточие для секунд

Alza
Сообщения: 6
Зарегистрирован: 03 янв 2018, 17:25

Re: Урок 21. Часы

Сообщение Alza » 03 янв 2018, 19:58

Сейчас проверил пример из урока. Работает, но как то не уверенно. Периодически перестает реагировать на кнопки

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Урок 21. Часы

Сообщение Эдуард » 03 янв 2018, 21:24

Может у вас аппаратная ошибка? Резисторы не подключены, замыкает что-либо. Такое часто бывает.

Alza
Сообщения: 6
Зарегистрирован: 03 янв 2018, 17:25

Re: Урок 21. Часы

Сообщение Alza » 03 янв 2018, 21:34

Да уже все перепроверил 5 раз. Отдельно работает вывод на индикатор. Отдельно работает определение кода кнопок (вывод в Serial). При совмещении - в сериал ничего не вижу.
Ладно, спасибо огромное за внимание и библиотеки. Подключу кнопки через весовые резисторы на аналоговый вход для экономии ног (в инете много примеров).

Alza
Сообщения: 6
Зарегистрирован: 03 янв 2018, 17:25

Re: Урок 21. Часы

Сообщение Alza » 03 янв 2018, 21:37

P.S. Было-бы интересно прикрутить к библиотеке регулировку яркости индикатора.

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Урок 21. Часы

Сообщение Эдуард » 03 янв 2018, 22:08

Все тщательно проверено. Все работало. А пример из урока не хотите попробовать?

Alza
Сообщения: 6
Зарегистрирован: 03 янв 2018, 17:25

Re: Урок 21. Часы

Сообщение Alza » 03 янв 2018, 22:48

Я пробовал (см. выше). Правда у меня матрица из одного ряда кнопок, но сути не меняет. Работает, но как то не внятно. Нажимаю последовательно 1-ю кн. - ОК, индикатор заполняется единичками. С 4-й кн. - тоже ОК. 2-я доходит до второго разряда и не реагирует, 3-я до третьего. 1234 выводится нормально,4321 - только выводит 43, а на 1 и 2 не реагирует (но на 3 и 4 реагирует).

Пример с выводом в сериал - все работает отлично.

Может завтра на свежую голову разберусь...


Вернуться в «Уроки Ардуино»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя