TP223 + LED

Acuma
Offline
Зарегистрирован: 08.02.2022

Здравствуйте. Подключено 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 -> Тренировка началась

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Строки 32 36 41 и наверное 70 - почему везде счет идет до 10 хотя сами массивы короче ?

Acuma
Offline
Зарегистрирован: 08.02.2022

32,36,41 - сейчас исправлю. Спасибо.

А вот 70 - это 10 комбинаций. 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Есть отличная функция sizeOf()...

Acuma
Offline
Зарегистрирован: 08.02.2022

А что можете сказать относительно функции начиная с 72 строки? Почему при запуске режима Work у меня в мониторинг автоматически выводится "Нажал", хотя кнопку ни кто не трогает...

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Acuma пишет:

Почему при запуске режима Work у меня в мониторинг автоматически выводится "Нажал", хотя кнопку ни кто не трогает...

Схема какая? Может у тебя кнопка "сажает" пин на GND, а по коду должна на +5В...

Acuma
Offline
Зарегистрирован: 08.02.2022

Схема простая: 

gnd-gnd

5v-5v

i/o - 3

Перемычку на TTP для вывода низкого уровня при нажатии не ставил.

Acuma
Offline
Зарегистрирован: 08.02.2022
14:50:11.610 -> Start:
14:50:11.610 -> Отключаем диоды
14:50:12.214 -> Диод 3=Выключен
14:50:12.214 -> Диод 4=Выключен
14:50:12.261 -> Диод 5=Выключен
14:50:12.261 -> Диод 6=Выключен
14:50:12.307 -> Диод 7=Выключен
14:50:12.354 -> Диод 8=Выключен
14:50:12.354 -> Выбрана комбинация №1
14:50:12.446 -> Если хотите изменить комбинацию - нажмите кнопку Mode
14:50:12.584 -> Если комбинация выбрана - приступайте к тренеровке нажав кнопку Work
14:50:17.147 -> Нажал
14:50:17.147 -> Тренировка началасьНажал
14:50:19.379 -> Тренировка началасьВыбрана комбинация №1
14:50:21.293 -> Нажал
14:50:21.293 -> Тренировка началась

Ничего по прежнему не работает.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Без схемы говорить не о чем.

Acuma
Offline
Зарегистрирован: 08.02.2022

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

71 72 74 та же хрень с x>5 - вы разберитесь где у вас какая размерность !!!

Учитесь отладке кода - вставьте вывод значения x в working и наблюдайте ...

Acuma
Offline
Зарегистрирован: 08.02.2022
   Serial.println(digitalRead(3));
   Serial.println(digitalRead(4));
   Serial.println(digitalRead(5));
   Serial.println(digitalRead(6));
   Serial.println(digitalRead(7));
   Serial.println(digitalRead(8));
   delay(1000);

Добавил это, чтобы посмотреть момент нажатия - нули везде.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

72    if (digitalRead(sensmas[combination[y][x]] == HIGH))

при x>5 откуда читает ???

Acuma
Offline
Зарегистрирован: 08.02.2022

Подправил код.

#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 < 6; i++) {
 pinMode(ledmas[i], OUTPUT);
 delay(50);
}
  for (int i = 0; i < 6; i++) {
 pinMode(sensmas[i], INPUT);
 delay(50);
}

  for (int i = 0; i < 6; 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() {
Serial.println(x);
delay(100);
  if (btnmode.click()) {
    y += 1;
    Serial.print("Выбрана комбинация №");
    Serial.println(y);
  }
  if (btnwork.click()) {
    work = 1;
    
    if (work == 1 && x<6){
    digitalWrite (ledmas[combination[y][x]], HIGH);
    if (digitalRead(sensmas[combination[y][x]] == HIGH)){
    Serial.println("Нажал");
    x += 1;
  }
  }
  else if (x >=6){
    work = 0;
    x = 0;
  }


    Serial.print("Тренировка началась");
  }
}
  void working(){

  }

При каждом нажатии work x возрастает на +1.
При этом выводится надпись нажатия.

Чета ни че не понял=(((

Acuma
Offline
Зарегистрирован: 08.02.2022

Komandir пишет:

72    if (digitalRead(sensmas[combination[y][x]] == HIGH))

при x>5 откуда читает ???

Я как понимаю он выводит число из массива combination. y - вертикаль. x - горизонталь.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

В первом коде у вас x изменялся от 0 до 10 !!!

После 

Serial.println("Нажал");

Надо вставить 

Serial.print("y=");

Serial.println(y);

Serial.print("x=");

Serial.println(x);

Serial.println(sensmas[combination[y][x]]);

Acuma
Offline
Зарегистрирован: 08.02.2022

Komandir пишет:

В первом коде у вас x изменялся от 0 до 10 !!!

После 

Serial.println("Нажал");

Надо вставить 

Serial.print("y=");

Serial.println(y);

Serial.print("x=");

Serial.println(x);

Serial.println(sensmas[combination[y][x]]);

 

Упс. Увидел косяк. А как быть?=(((

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Может и нам покажите ???

Ваш вывод Нажал очень малоинформативен ! Если что то идет не так - выводите все от чего что то зависит !!!

Обнуление y я что то не замечаю ...

P.S. В Arduino IDE есть комбинация клавиш Ctrl+T для автоматического выравнивания кода !!!

Acuma
Offline
Зарегистрирован: 08.02.2022

При запуске выводится это:
 

16:44:01.445 -> Отключаем диоды
16:44:02.046 -> Диод 3=Выключен
16:44:02.046 -> Диод 4=Выключен
16:44:02.091 -> Диод 5=Выключен
16:44:02.091 -> Диод 6=Выключен
16:44:02.137 -> Диод 7=Выключен
16:44:02.183 -> Диод 8=Выключен
16:44:02.229 -> Выбрана комбинация №1
16:44:02.323 -> Если хотите изменить комбинацию - нажмите кнопку Mode
16:44:02.414 -> Если комбинация выбрана - приступайте к тренеровке нажав кнопку Work

Нажимаю выбор режима:

17:01:36.023 -> Выбрана комбинация №1

Нажимаю режим работы:
 

17:02:11.423 -> Нажал
17:02:11.423 -> y=1
17:02:11.423 -> x=0
17:02:11.423 -> 15
17:02:11.423 -> Тренировка началась

При этом загорелся светодиод на пине 4, который в массиве находится под номером вторым по порядку.

 

Вот выровнял код:

 

#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 < 6; i++) {
    pinMode(ledmas[i], OUTPUT);
    delay(50);
  }
  for (int i = 0; i < 6; i++) {
    pinMode(sensmas[i], INPUT);
    delay(50);
  }

  for (int i = 0; i < 6; 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;

    if (work == 1 && x < 6) {
      digitalWrite (ledmas[combination[y][x]], HIGH);
      if (digitalRead(sensmas[combination[y][x]] == HIGH)) {
        Serial.println("Нажал");
        Serial.print("y=");

        Serial.println(y);

        Serial.print("x=");

        Serial.println(x);

        Serial.println(sensmas[combination[y][x]]);

        x += 1;
      }
    }
    else if (x >= 6) {
      work = 0;
      x = 0;
    }


    Serial.print("Тренировка началась");
  }
}
void working() {

}

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018
byte ledmas[] = {3,   4,  5,  6,  7,  8,};
byte sensmas[] = {A0, A1, A2, A3, A4, A5,};

A1 это пин номер 15 - вы нажимали кнопку, подключенную к этому пину ???

Acuma
Offline
Зарегистрирован: 08.02.2022

Почему А1 - это 15? 
Кнопка подключена к пину А1.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Такая нумерация пинов у ардуино !

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);

 

Acuma
Offline
Зарегистрирован: 08.02.2022

Кнопки подключены к пинам А0 - А5

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Acuma пишет:

Кнопки подключены к пинам А0 - А5

Пин А0 одновременно является пином 14, пин А1 - пином 15 и т.д. вплоть до пина А5 == 19

Acuma
Offline
Зарегистрирован: 08.02.2022

v258 пишет:

Acuma пишет:

Кнопки подключены к пинам А0 - А5

Пин А0 одновременно является пином 14, пин А1 - пином 15 и т.д. вплоть до пина А5 == 19

 

Ой... Простите за глупость.

Видимо нужно как то по другому делать инициализацию пинов.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018


при y=1 и x=0 получаем 1 из таблицы cobination

Эта единица даёт 4 и A1 из других таблиц - вроде все как надо !

 

Acuma
Offline
Зарегистрирован: 08.02.2022

Да. Вот только нет считывания кнопки. И перехода на след светодиод, увеличением x.

Acuma
Offline
Зарегистрирован: 08.02.2022

Добавил этот код :
 

 if (digitalRead(A0 == LOW)) {
        Serial.println("Нажал123");}

В порт выводит постоянно. При чем менял на HIGH тоже самое.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018
63    if (btnwork.click()) {
64      work = 1;
надо написать в одну строку через ИЛИ
 
63    if (btnwork.click()||(work == 1)) {
 
 
в if (digitalRead(A0 == LOW)) {
 
и в 68 скобка не там !!! Так надо !!! if (digitalRead(A0) == LOW) {
 
68      if (digitalRead(sensmas[combination[y][x]]) == HIGH) {
 
Код в три строки, а ошибок ...
 
59    y += 1; Поменять на y=random(10);

 

Acuma
Offline
Зарегистрирован: 08.02.2022

#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 < 6; i++) {
    pinMode(ledmas[i], OUTPUT);
    delay(50);
  }
  for (int i = 0; i < 6; i++) {
    pinMode(sensmas[i], INPUT);
    delay(50);
  }

  for (int i = 0; i < 6; 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 = random(10);
    Serial.print("Выбрана комбинация №");
    Serial.println(y);
  }
  if (btnwork.click() || (work == 1))  {
    if (x < 6) {
      digitalWrite (ledmas[combination[y][x]], HIGH);
      if (digitalRead(sensmas[combination[y][x]]) == HIGH) {
        Serial.println("Нажал");
        Serial.print("y=");

        Serial.println(y);

        Serial.print("x=");

        Serial.println(x);

        Serial.println(sensmas[combination[y][x]]);
        Serial.println(ledmas[combination[y][x]]);
        x += 1;
      }
    }
    else if (x >= 6) {
      work = 0;
      x = 0;
    }


    Serial.print("Тренировка началась");
  }
}

Исправил код. Но включение следующих светодиодов (первый загорается) и реакции на нажатие нет =(

 

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

work=1; между 64 и 65 всё-таки нужен (больше пока ничего не меняем)

Acuma
Offline
Зарегистрирован: 08.02.2022
18:18:05.659 -> Выбрана комбинация №7
18:18:07.807 -> Тренировка началасьТренировка началасьТренировка началасьТренировка началасьТренировка началасьТренировка началасьТренировка началасьТренировка началасьТренировка началасьТренировка началасьТренировка началасьТренировка началасьТренировка началасьТренировка началасьТренировка началасьТренир

Спамит начало тренировки при выборе режима и нажатии work.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Но нажатия то должны отрабатываться !!!

Acuma
Offline
Зарегистрирован: 08.02.2022

Да!!!!! Спасибо.....

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

work=1; между 64 и 65 всё-таки нужен (больше пока ничего не меняем)

меняем на

if (work==0) {

 work=1;

 Serial.println("Тренировка началась");

}

А внизу Serial.println("Тренировка началась"); удаляем...

Acuma
Offline
Зарегистрирован: 08.02.2022

Так и сделал. Спасибо - все заработало.

Acuma
Offline
Зарегистрирован: 08.02.2022

Еще скажите. 
А в массиве combination[][6] получается счет начинается с 1 а не с 0?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Все массивы в C/C++ с 0.

random(10) - от 0 до (10-1)=9