Массивы
- Войдите на сайт для отправки комментариев
Пнд, 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
меня оттакой антидребезг пока не подводил
READCICLES = 8 или 16. чего больше прочиталось, 0 или 1 то и отдасца. finverse говорит, куда подтянута кнопка, к 0 или к Vcc
у вас все смешано в кучу.
Во-первых, компилятор скорее всего в первую очередь ругается на описание массивов. типа
здесь i должна быть числовой константой, у вас - константой, задающей число кнопок, а не переменной и, тем более, не массивом.
Во-вторых, мало положить переменные в массивы - надо в коде по этим массивам последовательно проходить, сама ардуина это делать не будет. Например, ваш код setup()
иннициализирует только один пин - пин с номером i (если отбросить, что у вас i описано как массив)
Чтобы проиннициализировать все 7 пинов, надо воспользоваться циклом for
Всем большое спасибо. Много нового.
Особенно благодарен за :
Чтобы проиннициализировать все 7 пинов, надо воспользоваться циклом for
Решил выложить результат, т.к. кому-то может пригодиться.
Да и еще: блокнот, который предложил ЕвгенийП, оказался реально крутой выручалкой для начинающих. Спасибо всем еще раз.
VOS - критика интересует?
вообще говоря, этот код не является кодом антидребезга для семи кнопок
Конечно интересует.
Вообще все работает. Доволен я именно тем, что разобрался как сделать то, что придумал. даже если я придумал какую-то дичь. ))
Вообще все работает. Доволен я именно тем, что разобрался как сделать то, что придумал
ну я поэтому и спросил, нужна ли критика, так как многие новички, добившись первого результата, не желают далее слушать никаких замечаний, которые считают придирками.
Относитесь как хотите - можете игнорировать. Но в Вашем коде серьезная промашка в логике. Поскольку у вас одна переменная Previousmillis, то в ней хранится время нажатия кнопки, нажатой последней - а это вовсе не обязательно именно та кнопка i, антидребезг которой вы обрабатываете
Поэтому я и написал, что в Вашем коде нет ( независимого ) антидребезга семи кнопок. Хотя если нажимать кнопки относительно редко и по одной - этот баг не проявится и все будет работать.
нет ( независимого ) антидребезга семи кнопок.
Спасибо. Уже понял о чем Вы.