Вопрос по массивам и кнопкам

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
91
8
Здравствуйте, подскажите пожалуйста, дошел до массивов, но что-то не получается отслеживать нажатие кнопки, что интересно не так?
Суть в том, что бы записывать в массив состояние 4 кнопок, адреса кнопок тоже из масива

C++:
int PINBUTTON[4] = {4, 3, 5, 6};
int buttonState[4] = {0, 0, 0, 0};           
 unsigned long index45 = 0;   
int countButton = sizeof(PINBUTTON) / sizeof(int *); ////2

void setup()
{
  Serial.begin(9600);
}
void loop() {

  for (long i = 0; i < (countButton); i++)
  {
 
    int work = digitalRead(PINBUTTON[i]);
    if (work == 1) {
      buttonState[i] = work;
      work = 0;
      
    }
       Serial.print("buttonState     ") ;
      Serial.print(buttonState[0]) ;
Serial.print("     ") ;
      Serial.print(buttonState[1]) ;
Serial.print("     ") ;
      Serial.print(buttonState[2]) ;
    Serial.print("     ") ;
      Serial.println(buttonState[3]) ;

  }
}
Выводит только статус первой кнопки которую нажму (без разницы какую) и потом так на все записывает, что все включены, а думал что будет записивать только ту которую включил и потом если она выключится то и припишет ей 0.
 

poty

★★★★★★✩
19 Фев 2020
3,261
948
Уберите звёздочку из
sizeof(int *);
Замените long i на int i.
Замените
int work = digitalRead(PINBUTTON);
if (work == 1) {
buttonState[ i ] = work;
work = 0;

}
на
buttonState[ i ] = digitalRead(PINBUTTON[ i ]);
 
Изменено:
  • Лойс +1
Реакции: Sem553

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
91
8
@poty, поменял код на:
C++:
int PINBUTTON[4] = {4, 3, 5, 6};
int buttonState[4] = {0, 0, 0, 0};          
int index45 = 0;  
int countButton = sizeof(PINBUTTON) / sizeof(int); ////2

void setup()
{
  Serial.begin(9600);
}
void loop() {

  for (int i = 0; i < (countButton); i++)
  {
buttonState[i] = digitalRead(PINBUTTON);
 
       Serial.print("buttonState     ") ;
      Serial.print(buttonState[0]) ;
Serial.print("     ") ;
      Serial.print(buttonState[1]) ;
Serial.print("     ") ;
      Serial.print(buttonState[2]) ;
    Serial.print("     ") ;
      Serial.println(buttonState[3]) ;

  }
}
Дает ошибку:

In function 'void loop()': 14:40: error: invalid conversion from 'int*' to 'uint8_t {aka unsigned char}' [-fpermissive]
1:0:
136:5: note: initializing argument 1 of 'int digitalRead(uint8_t)'
exit status 1

Не могу понять почему.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
PINBUTTON - это массив, к нему надо по индексу обращаться. т.е.
PINBUTTON кажется
И вообще рекомендую не писать int , long , лучше использовать uint8_t , int32_t и т.д.
 
  • Лойс +1
Реакции: Sem553

poty

★★★★★★✩
19 Фев 2020
3,261
948
Это сайт съедает квадратные скобки. Естественно к массиву нужно обращаться с индексом. Исправил по тексту.
 

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
91
8
@Старик Похабыч,
массив то да, изменил на buttonState = digitalRead(PINBUTTON); и зашел, вот получилось так:

C++:
uint8_t PINBUTTON[4] = {4, 3, 5, 6};
uint8_t buttonState[4] = {0, 0, 0, 0};           
uint8_t index45 = 0;   
uint8_t countButton = sizeof(PINBUTTON) / sizeof(uint8_t); ////2

void setup()
{
  Serial.begin(9600);
}
void loop() {

  for (uint8_t i = 0; i < (countButton); i++)
  {
 buttonState[i] = digitalRead(PINBUTTON[i]);
  
       Serial.print("buttonState     ") ;
      Serial.print(buttonState[0]) ;
Serial.print("     ") ;
      Serial.print(buttonState[1]) ;
Serial.print("     ") ;
      Serial.print(buttonState[2]) ;
    Serial.print("     ") ;
      Serial.println(buttonState[3]) ;

  }
}
Но так же по очереди все заполняет:
buttonState 0 1 0 0
buttonState 0 1 1 0
buttonState 0 1 1 1
buttonState 1 1 1 1

я думаю что оно обновляет и добавляет к следующему значению то что digital получил от первого.
buttonState 0 0 0 1
buttonState 1 0 0 1
buttonState 1 1 0 1
buttonState 1 1 1 1
получается которую он первую кнопку прочел то и состояние запомнил
 

poty

★★★★★★✩
19 Фев 2020
3,261
948
Как подключены кнопки? Такое впечатление, что они такое состояние и имеют.
 
  • Лойс +1
Реакции: Sem553

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
91
8
Как подключены кнопки? Такое впечатление, что они такое состояние и имеют.
Да, может быть я что-то нахимичил с подключением кнопок, но уже все работает!

Вот код:
C++:
uint8_t PINBUTTON[4] = {4, 3, 5, 6};
uint8_t buttonState[4] = {0, 0, 0, 0};           
uint8_t index45 = 0;   
uint8_t countButton = sizeof(PINBUTTON) / sizeof(uint8_t); ////2

void setup()
{
  Serial.begin(9600);
}
void loop() {

  for (uint8_t i = 0; i < (countButton); i++)
  {
 buttonState[i] = digitalRead(PINBUTTON[i]);
 
       Serial.print("buttonState MS     ") ;
      Serial.print(buttonState[0]) ;
Serial.print("     ") ;
      Serial.print(buttonState[1]) ;
Serial.print("     ") ;
      Serial.print(buttonState[2]) ;
    Serial.print("     ") ;
      Serial.println(buttonState[3]) ;

           Serial.print("buttonState DR     ") ;
      Serial.print(digitalRead(PINBUTTON[0])) ;
Serial.print("     ") ;
      Serial.print(digitalRead(PINBUTTON[1])) ;
Serial.print("     ") ;
      Serial.print(digitalRead(PINBUTTON[2])) ;
    Serial.print("     ") ;
      Serial.println(digitalRead(PINBUTTON[3])) ;
    
  }
}
111.jpg

Всем большое спасибо!!!
 

bort707

★★★★★★✩
21 Сен 2020
3,067
915
это не схема, а невероятная хрень.
У вас в каждой кнопке только по одной паре контактов, нафига вы столько проводов накрутили?
Провод который идет от пина "5в" на Уно и потом зигзагом обходит все кнопки - это просто огонь.... ардуина не сгорела еще?
 
Изменено:

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
91
8
@bort707, нет, работает)), а как надо было?

И ещё вопрос: лучше использовать одномерные массивы и несколько штук или лучше двомерный массив ?
 

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
91
8
@bort707, Спасибо ))
И ещё вопрос: лучше использовать одномерные массивы и несколько штук или лучше двомерный массив ?
 

poty

★★★★★★✩
19 Фев 2020
3,261
948
@Sem553, лучше с какой точки зрения?
С точки зрения выделения памяти эти варианты эквивалентны (не берём случай строк разной длины).
С точки зрения логики - зависит от того, означают ли эти значения одно и то же или разные свойства, для программы это без разницы, для человека, который её пишет/читает лучше наличие мнемоники (то есть массивы, соответствующие свойствам данных, возможно и не одномерные).
С точки зрения скорости доступа одномерные массивы часто выигрывают, поскольку требуют вычисления адреса в памяти только из одного индекса.
 
  • Лойс +1
Реакции: Sem553

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
91
8
@Sem553, лучше с какой точки зрения?
С точки зрения скорости доступа одномерные массивы часто выигрывают, поскольку требуют вычисления адреса в памяти только из одного индекса.
Вот думал как лучше сделать двумерный масив 15х30 или 15 одномерных, согласен с вами что будет думаю быстрее работать так как искать в одной плоскости.