TP223 + LED
- Войдите на сайт для отправки комментариев
Втр, 12/04/2022 - 08:14
Здравствуйте. Подключено 6 TP223 и 6 светодиодов.
В массиве combination разместил комбинации нажатия.
Иными словами какой светодиод загорелся, такую кнопку и нужно нажать. Режим work включается, но светодиод нужной комбинации не выбирается.
А еще при иницилизации выходов какой то рандом приходит в мониторинг порта. Вот код, ниже мониторинг:
#include "button.h" byte ledmas[] = {3, 4, 5, 6, 7, 8,}; byte sensmas[] = {A0, A1, A2, A3, A4, A5,}; byte combination[][6] = { {1, 1, 0, 4, 3, 2,}, {1, 0, 2, 5, 0, 4,}, {4, 1, 1, 0, 1, 4,}, {0, 2, 1, 2, 3, 0,}, {5, 5, 5, 2, 2, 2,}, {3, 3, 3, 0, 0, 0,}, {1, 1, 1, 1, 1, 1,}, {2, 3, 1, 0, 5, 0,}, {1, 1, 0, 1, 1, 0,}, {0, 1, 2, 3, 4, 5,}, }; int x = 0; int y = 0; button btnmode(9); button btnwork(10); float filtVal = 0; bool work = 0; void setup() { Serial.begin(9600); Serial.println("Start:"); Serial.println("Отключаем диоды"); for (int i = 0; i < 10; i++) { pinMode(ledmas[i], OUTPUT); delay(50); } for (int i = 0; i < 10; i++) { pinMode(sensmas[i], INPUT); delay(50); } for (int i = 0; i < 10; i++) { digitalWrite(ledmas[i], LOW); Serial.print("Диод "); Serial.print(ledmas[i]); Serial.println("=Выключен"); } Serial.println("Выбрана комбинация №1"); delay(100); Serial.println("Если хотите изменить комбинацию - нажмите кнопку Mode"); delay(100); Serial.println("Если комбинация выбрана - приступайте к тренеровке нажав кнопку Work"); delay(100); } void loop() { if (btnmode.click()) { y += 1; Serial.print("Выбрана комбинация №"); Serial.println(y); } if (btnwork.click()) { work = 1; working(); Serial.print("Тренировка началась"); } } void working(){ if (work == 1 && x<=10){ digitalWrite (ledmas[combination[y][x]], HIGH); if (digitalRead(sensmas[combination[y][x]] == HIGH)){ Serial.println("Нажал"); digitalWrite (ledmas[combination[y][x]], LOW); x += 1; } } else if (x >10){ work = 0; } }
11:14:21.060 -> Start: 11:14:21.060 -> Отключаем диоды 11:14:22.044 -> Диод 3=Выключен 11:14:22.044 -> Диод 4=Выключен 11:14:22.091 -> Диод 5=Выключен 11:14:22.138 -> Диод 6=Выключен 11:14:22.138 -> Диод 7=Выключен 11:14:22.185 -> Диод 8=Выключен 11:14:22.232 -> Диод 1=Выключен 11:14:22.279 -> Диод 1=Выключен 11:14:22.279 -> Диод 0=Выключен 11:14:22.326 -> Диод 4=Выключен 11:14:22.373 -> Выбрана комбинация №1 11:14:22.419 -> Если хотите изменить комбинацию - нажмите кнопку Mode 11:14:22.560 -> Если комбинация выбрана - приступайте к тренеровке нажав кнопку Work 11:14:25.598 -> Выбрана комбинация №1 11:14:26.294 -> Выбрана комбинация №2 11:14:28.490 -> 7 11:14:28.490 -> Нажал 11:14:28.490 -> Тренировка началась
Строки 32 36 41 и наверное 70 - почему везде счет идет до 10 хотя сами массивы короче ?
32,36,41 - сейчас исправлю. Спасибо.
А вот 70 - это 10 комбинаций.
Есть отличная функция sizeOf()...
А что можете сказать относительно функции начиная с 72 строки? Почему при запуске режима Work у меня в мониторинг автоматически выводится "Нажал", хотя кнопку ни кто не трогает...
Почему при запуске режима Work у меня в мониторинг автоматически выводится "Нажал", хотя кнопку ни кто не трогает...
Схема какая? Может у тебя кнопка "сажает" пин на GND, а по коду должна на +5В...
Схема простая:
gnd-gnd
5v-5v
i/o - 3
Перемычку на TTP для вывода низкого уровня при нажатии не ставил.
Ничего по прежнему не работает.
Без схемы говорить не о чем.
71 72 74 та же хрень с x>5 - вы разберитесь где у вас какая размерность !!!
Учитесь отладке кода - вставьте вывод значения x в working и наблюдайте ...
Добавил это, чтобы посмотреть момент нажатия - нули везде.
72
if
(digitalRead(sensmas[combination[y][x]] == HIGH))
при x>5 откуда читает ???
Подправил код.
При каждом нажатии work x возрастает на +1.
При этом выводится надпись нажатия.
Чета ни че не понял=(((
72
if
(digitalRead(sensmas[combination[y][x]] == HIGH))
при x>5 откуда читает ???
Я как понимаю он выводит число из массива combination. y - вертикаль. x - горизонталь.
В первом коде у вас x изменялся от 0 до 10 !!!
После
Serial.println("Нажал");
Надо вставить
Serial.print("y=");
Serial.println(y);
Serial.print("x=");
Serial.println(x);
Serial.println(sensmas[combination[y][x]]);
В первом коде у вас x изменялся от 0 до 10 !!!
После
Serial.println("Нажал");
Надо вставить
Serial.print("y=");
Serial.println(y);
Serial.print("x=");
Serial.println(x);
Serial.println(sensmas[combination[y][x]]);
Упс. Увидел косяк. А как быть?=(((
Может и нам покажите ???
Ваш вывод Нажал очень малоинформативен ! Если что то идет не так - выводите все от чего что то зависит !!!
Обнуление y я что то не замечаю ...
P.S. В Arduino IDE есть комбинация клавиш Ctrl+T для автоматического выравнивания кода !!!
При запуске выводится это:
Нажимаю выбор режима:
Нажимаю режим работы:
При этом загорелся светодиод на пине 4, который в массиве находится под номером вторым по порядку.
Вот выровнял код:
A1 это пин номер 15 - вы нажимали кнопку, подключенную к этому пину ???
Почему А1 - это 15?
Кнопка подключена к пину А1.
Такая нумерация пинов у ардуино !
Serial.print("A0="); Serial.println(A0);
Serial.print("A1="); Serial.println(A1);
Serial.print("A2="); Serial.println(A2);
Serial.print("A3="); Serial.println(A3);
Serial.print("A4="); Serial.println(A4);
Serial.print("A5="); Serial.println(A5);
Кнопки подключены к пинам А0 - А5
Кнопки подключены к пинам А0 - А5
Пин А0 одновременно является пином 14, пин А1 - пином 15 и т.д. вплоть до пина А5 == 19
Кнопки подключены к пинам А0 - А5
Пин А0 одновременно является пином 14, пин А1 - пином 15 и т.д. вплоть до пина А5 == 19
Ой... Простите за глупость.
Видимо нужно как то по другому делать инициализацию пинов.
при y=1 и x=0 получаем 1 из таблицы cobination
Эта единица даёт 4 и A1 из других таблиц - вроде все как надо !
Да. Вот только нет считывания кнопки. И перехода на след светодиод, увеличением x.
Добавил этот код :
В порт выводит постоянно. При чем менял на HIGH тоже самое.
Исправил код. Но включение следующих светодиодов (первый загорается) и реакции на нажатие нет =(
work=1; между 64 и 65 всё-таки нужен (больше пока ничего не меняем)
Спамит начало тренировки при выборе режима и нажатии work.
Но нажатия то должны отрабатываться !!!
Да!!!!! Спасибо.....
work=1; между 64 и 65 всё-таки нужен (больше пока ничего не меняем)
меняем на
if (work==0) {
work=1;
Serial.println("Тренировка началась");
}
А внизу Serial.println("Тренировка началась"); удаляем...
Так и сделал. Спасибо - все заработало.
Еще скажите.
А в массиве combination[][6] получается счет начинается с 1 а не с 0?
Все массивы в C/C++ с 0.
random(10) - от 0 до (10-1)=9