Массивы
- Войдите на сайт для отправки комментариев
Пнд, 01/10/2018 - 14:05
Здравствуйте.
Помогите любителю упростить код.
Использую вот такой программный антидребезг:
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 сказала, что я вкорне не прав.
Буду благадарен за помощь в любой форме, в т.ч. и полезные ссылки для ликбеза, а то запутался что-то.
Первая строка
Ну, почитайте какую-нибудь книжку по языку. Ну, хоть Брайана Эванса - проще уж некуда. Там всё написано как массивы объявлять - https://drive.google.com/open?id=0B9r7cRXQ4DU4dTBtRFpub0tfV00
меня оттакой антидребезг пока не подводил
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
у вас все смешано в кучу.
Во-первых, компилятор скорее всего в первую очередь ругается на описание массивов. типа
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); } }Всем большое спасибо. Много нового.
Особенно благодарен за :
Чтобы проиннициализировать все 7 пинов, надо воспользоваться циклом for
void setup() { for (int i = 0; i<7; i++) { pinMode(button[i], INPUT); } }Решил выложить результат, т.к. кому-то может пригодиться.
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; } } }Да и еще: блокнот, который предложил ЕвгенийП, оказался реально крутой выручалкой для начинающих. Спасибо всем еще раз.
VOS - критика интересует?
вообще говоря, этот код не является кодом антидребезга для семи кнопок
Конечно интересует.
Вообще все работает. Доволен я именно тем, что разобрался как сделать то, что придумал. даже если я придумал какую-то дичь. ))
Вообще все работает. Доволен я именно тем, что разобрался как сделать то, что придумал
ну я поэтому и спросил, нужна ли критика, так как многие новички, добившись первого результата, не желают далее слушать никаких замечаний, которые считают придирками.
Относитесь как хотите - можете игнорировать. Но в Вашем коде серьезная промашка в логике. Поскольку у вас одна переменная Previousmillis, то в ней хранится время нажатия кнопки, нажатой последней - а это вовсе не обязательно именно та кнопка i, антидребезг которой вы обрабатываете
Поэтому я и написал, что в Вашем коде нет ( независимого ) антидребезга семи кнопок. Хотя если нажимать кнопки относительно редко и по одной - этот баг не проявится и все будет работать.
нет ( независимого ) антидребезга семи кнопок.
Спасибо. Уже понял о чем Вы.