Массивы

VOS
Offline
Зарегистрирован: 07.08.2015

Здравствуйте.

Помогите любителю упростить код.

Использую вот такой программный антидребезг:

int  button1 = 3;
int flag1 = 0;
int val1 = 0;
unsigned long previousMillis = 0;

void setup() {
  pinMode(button1, INPUT);
}

void loop() {
 if ((digitalRead(button1) == HIGH) )
  {

    if (millis() - previousMillis > 30)
    {
      previousMillis = millis();
      val1++;
    }
  }
  else
  {
    val1 = 0;
  }

  if (val1 >= 5)
  
  {
    flag1 = 1;
    val1 = 0;
  }
}

Ну и flag1 == 1 уже означает срабатывание кнопки.

Так вот: таких кнопок 7 штук. Я горожу копипастом сотню строк со всеми button2, flag2, val2, button3, flag3, val3 и т.д., а это не красиво.

Подскажите, как создать какой-то массив с нумерацией.

Попробовал интуитивно:



byte i = [7];

int  button[i] = {2,3,4,5,6,7,8};
int flag[i] = {0,0,0,0,0,0,0};
int val[i] = {0,0,0,0,0,0,0};
unsigned long previousMillis = 0;

void setup() {
  pinMode(button[i], INPUT);
}

void loop() {
 if ((digitalRead(button[i]) == HIGH) )
  {

    if (millis() - previousMillis > 30)
    {
      previousMillis = millis();
      val[i]++;
    }
  }
  else
  {
    val[i] = 0;
  }

  if (val[i] >= 5)
  
  {
    flag[i] = 1;
    val[i] = 0;
  }
}

но IDE сказала, что я вкорне не прав.

Буду благадарен за помощь в любой форме, в т.ч. и полезные ссылки для ликбеза, а то запутался что-то.

VOS
Offline
Зарегистрирован: 07.08.2015

Первая строка

byte i[7];

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, почитайте какую-нибудь книжку по языку. Ну, хоть Брайана Эванса - проще уж некуда. Там всё написано как массивы объявлять - https://drive.google.com/open?id=0B9r7cRXQ4DU4dTBtRFpub0tfV00

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

меня оттакой антидребезг пока не подводил


	uint8_t cnt = 0;
	for (uint8_t i = 0; i < READCICLES; i++) {
		cnt += digitalRead(fpin);
		delayMicroseconds(10);
	}

	bool res = (cnt>(READCICLES>>1)) ^ finverse;
        return res;

READCICLES = 8 или 16.  чего больше прочиталось, 0 или 1 то и отдасца.  finverse говорит, куда подтянута кнопка, к 0 или к Vcc

b707
Offline
Зарегистрирован: 26.05.2017

у вас все смешано в кучу.

Во-первых, компилятор скорее всего в первую очередь ругается на описание массивов. типа

int  button[i] = {2,3,4,5,6,7,8};

здесь i должна быть числовой константой, у вас - константой, задающей число кнопок, а не переменной и, тем более, не массивом.

Во-вторых, мало положить переменные в массивы - надо в коде по этим массивам последовательно проходить, сама ардуина это делать не будет. Например, ваш код setup()

void setup() {
  pinMode(button[i], INPUT);
}

иннициализирует только один пин - пин с номером i (если отбросить, что у вас i описано как массив)

Чтобы проиннициализировать все 7 пинов, надо воспользоваться циклом for

void setup() {
  for (int i = 0; i<7; i++) {
    pinMode(button[i], INPUT);
}
}

 

VOS
Offline
Зарегистрирован: 07.08.2015

Всем большое спасибо. Много нового.

Особенно благодарен за :

b707 пишет:

Чтобы проиннициализировать все 7 пинов, надо воспользоваться циклом for

void setup() {
  for (int i = 0; i<7; i++) {
    pinMode(button[i], INPUT);
}
}

VOS
Offline
Зарегистрирован: 07.08.2015

Решил выложить результат, т.к. кому-то может пригодиться.

int  button[] = {2,3,4,5,6,7,11};
byte flag[] = {0,0,0,0,0,0,0};
byte val[] = {0,0,0,0,0,0,0};
unsigned long previousMillis = 0;

void setup() {
   Serial.begin(9600);
   for (int i = 0; i<7; i++) {
    pinMode(button[i], INPUT);
    }
    Serial.println ("Test ");
}

void loop() {  
   for (int i = 0; i<7; i++) {
    if ((digitalRead(button[i]) == HIGH))  {
      if (millis() - previousMillis > 50)    {
        previousMillis = millis();
        val[i]++;
        }
        }
  else  {
    val[i] = 0;
    }
  if (val[i] >= 5)  {
    flag[i] = 1;
    val[i] = 0;
    }
    }
    for (int k = 0; k<7; k++) {
      if (flag[k] == 1)    {
        Serial.println (k);
        flag[k] = 0; 
        }
     }
}

Да и еще: блокнот, который предложил ЕвгенийП, оказался  реально крутой выручалкой для начинающих. Спасибо всем еще раз.

b707
Offline
Зарегистрирован: 26.05.2017

VOS - критика интересует?

вообще говоря, этот код не является кодом антидребезга для семи кнопок

VOS
Offline
Зарегистрирован: 07.08.2015

Конечно интересует.

Вообще все работает. Доволен я именно тем, что разобрался как сделать то, что придумал. даже если я придумал какую-то дичь. ))

b707
Offline
Зарегистрирован: 26.05.2017

VOS пишет:

Вообще все работает. Доволен я именно тем, что разобрался как сделать то, что придумал

ну я поэтому и спросил, нужна ли критика, так как многие новички, добившись первого результата, не желают далее слушать никаких замечаний, которые считают придирками.

Относитесь как хотите - можете игнорировать. Но в Вашем коде серьезная промашка в логике. Поскольку у вас одна переменная Previousmillis, то в ней хранится время нажатия кнопки, нажатой последней - а это вовсе не обязательно именно та кнопка i, антидребезг которой вы обрабатываете

Поэтому я и написал, что в Вашем коде нет ( независимого ) антидребезга семи кнопок. Хотя если нажимать кнопки относительно редко и по одной - этот баг не проявится и все будет работать.

VOS
Offline
Зарегистрирован: 07.08.2015

b707 пишет:

нет ( независимого ) антидребезга семи кнопок. 

Спасибо. Уже понял о чем Вы.