оптимизация симуляции набора на матричной клаве
- Войдите на сайт для отправки комментариев
Вс, 15/12/2019 - 16:28
принцип думаю не сложный. берем 12 оптопар размещаем сеткой входы-земли вместе плюсы на ардуину. выходы-копируем сетку реальной клавы. выходы расставляем как контыкы кнопок в сетке. получаем копию сетки и 7 контактов соедняем их с реальной клавой. это отдельный гальванически развязаный блок переходник с ардуины на матричную клаву. и вот этим говнокодом набираем 5 цифр на клаве. набор 5 цифр 255 строк. надо это исправить. мозги есть но программирования самостоятельного изучения ъорошо если 100 часов чистого.
unsigned long currentpass = 00000; //текущая попытка. можно делать подбор не с начала int inputdelay = 100; //задержка нажатий кнопок byte pushdelay = 50; //время нажатия кнопки unsigned int errdelay = 10000; //время задержки после 3 попыток и вылета из меню byte attempts = 3; //число попыток набора. при старте 3 для первого входа в меню. boolean success = false; byte button1pin = 2; //перепиновка byte button2pin = 3; byte button3pin = 4; byte button4pin = 5; byte button5pin = 6; byte button6pin = 7; byte button7pin = 8; byte button8pin = 9; byte button9pin = 10; byte button0pin = 11; byte buttonBpin = 12; byte op = 13; byte num1 = 0; //хранение 5 значного числа отдельными цифрами byte num2 = 0; byte num3 = 0; byte num4 = 0; byte num5 = 0; void setup() { Serial.begin(9600); pinMode(button1pin, OUTPUT); pinMode(button2pin, OUTPUT); pinMode(button3pin, OUTPUT); pinMode(button4pin, OUTPUT); pinMode(button5pin, OUTPUT); pinMode(button6pin, OUTPUT); pinMode(button7pin, OUTPUT); pinMode(button8pin, OUTPUT); pinMode(button9pin, OUTPUT); pinMode(button0pin, OUTPUT); pinMode(buttonBpin, OUTPUT); pinMode(op, INPUT_PULLUP); } void loop() { if (success == true) { Serial.println("END"); Serial.println(currentpass); delay(100000); } else { for (unsigned long currentpass = 00000; currentpass < 99999; currentpass++); //код следующей попытки Serial.println(currentpass); byte num1 = (currentpass / 10000); byte num2 = (currentpass / 1000 % 10); //разложение 5 значного числа на цифры. костыль? byte num3 = (currentpass / 100 % 10); byte num4 = (currentpass / 10 % 10); byte num5 = (currentpass % 10 % 10); if (attempts == 3) { delay(errdelay); //если попыток 3 то ждем //write 12321B (и входим в настройки еще раз) digitalWrite(button1pin, HIGH); delay(pushdelay); digitalWrite(button1pin, LOW); delay(inputdelay); digitalWrite(button2pin, HIGH); delay(pushdelay); digitalWrite(button2pin, LOW); delay(inputdelay); digitalWrite(button3pin, HIGH); delay(pushdelay); digitalWrite(button3pin, LOW); delay(inputdelay); digitalWrite(button4pin, HIGH); delay(pushdelay); digitalWrite(button4pin, LOW); delay(inputdelay); digitalWrite(buttonBpin, HIGH); delay(pushdelay); digitalWrite(buttonBpin, LOW); delay(inputdelay); byte attempts = 0; //сбрасываем попытки } else { /*ахтунг!!! очень много говнокода!!! следующие 50 строк нужны для дергания пином ардуины соответствующему числу нум1. 50!!! а еще есть нум 2 3 4 5. 255 строк!!! что делаю не так?? это всего лишь набор 5 цифр методом дергания 5 пинов */ switch (num1) { case 1: digitalWrite(button1pin, HIGH); delay(pushdelay); digitalWrite(button1pin, LOW); delay(inputdelay); break; case 2: digitalWrite(button2pin, HIGH); delay(pushdelay); digitalWrite(button2pin, LOW); delay(inputdelay); case 3: digitalWrite(button3pin, HIGH); delay(pushdelay); digitalWrite(button3pin, LOW); delay(inputdelay); case 4: digitalWrite(button4pin, HIGH); delay(pushdelay); digitalWrite(button4pin, LOW); delay(inputdelay); case 5: digitalWrite(button5pin, HIGH); delay(pushdelay); digitalWrite(button5pin, LOW); delay(inputdelay); case 6: digitalWrite(button6pin, HIGH); delay(pushdelay); digitalWrite(button6pin, LOW); delay(inputdelay); case 7: digitalWrite(button7pin, HIGH); delay(pushdelay); digitalWrite(button7pin, LOW); delay(inputdelay); case 8: digitalWrite(button8pin, HIGH); delay(pushdelay); digitalWrite(button8pin, LOW); delay(inputdelay); case 9: digitalWrite(button9pin, HIGH); delay(pushdelay); digitalWrite(button9pin, LOW); delay(inputdelay); case 0: digitalWrite(button0pin, HIGH); delay(pushdelay); digitalWrite(button0pin, LOW); delay(inputdelay); } switch (num2) { case 1: digitalWrite(button1pin, HIGH); delay(pushdelay); digitalWrite(button1pin, LOW); delay(inputdelay); break; case 2: digitalWrite(button2pin, HIGH); delay(pushdelay); digitalWrite(button2pin, LOW); delay(inputdelay); case 3: digitalWrite(button3pin, HIGH); delay(pushdelay); digitalWrite(button3pin, LOW); delay(inputdelay); case 4: digitalWrite(button4pin, HIGH); delay(pushdelay); digitalWrite(button4pin, LOW); delay(inputdelay); case 5: digitalWrite(button5pin, HIGH); delay(pushdelay); digitalWrite(button5pin, LOW); delay(inputdelay); case 6: digitalWrite(button6pin, HIGH); delay(pushdelay); digitalWrite(button6pin, LOW); delay(inputdelay); case 7: digitalWrite(button7pin, HIGH); delay(pushdelay); digitalWrite(button7pin, LOW); delay(inputdelay); case 8: digitalWrite(button8pin, HIGH); delay(pushdelay); digitalWrite(button8pin, LOW); delay(inputdelay); case 9: digitalWrite(button9pin, HIGH); delay(pushdelay); digitalWrite(button9pin, LOW); delay(inputdelay); case 0: digitalWrite(button0pin, HIGH); delay(pushdelay); digitalWrite(button0pin, LOW); delay(inputdelay); } switch (num3) { case 1: digitalWrite(button1pin, HIGH); delay(pushdelay); digitalWrite(button1pin, LOW); delay(inputdelay); break; case 2: digitalWrite(button2pin, HIGH); delay(pushdelay); digitalWrite(button2pin, LOW); delay(inputdelay); case 3: digitalWrite(button3pin, HIGH); delay(pushdelay); digitalWrite(button3pin, LOW); delay(inputdelay); case 4: digitalWrite(button4pin, HIGH); delay(pushdelay); digitalWrite(button4pin, LOW); delay(inputdelay); case 5: digitalWrite(button5pin, HIGH); delay(pushdelay); digitalWrite(button5pin, LOW); delay(inputdelay); case 6: digitalWrite(button6pin, HIGH); delay(pushdelay); digitalWrite(button6pin, LOW); delay(inputdelay); case 7: digitalWrite(button7pin, HIGH); delay(pushdelay); digitalWrite(button7pin, LOW); delay(inputdelay); case 8: digitalWrite(button8pin, HIGH); delay(pushdelay); digitalWrite(button8pin, LOW); delay(inputdelay); case 9: digitalWrite(button9pin, HIGH); delay(pushdelay); digitalWrite(button9pin, LOW); delay(inputdelay); case 0: digitalWrite(button0pin, HIGH); delay(pushdelay); digitalWrite(button0pin, LOW); delay(inputdelay); } switch (num4) { case 1: digitalWrite(button1pin, HIGH); delay(pushdelay); digitalWrite(button1pin, LOW); delay(inputdelay); break; case 2: digitalWrite(button2pin, HIGH); delay(pushdelay); digitalWrite(button2pin, LOW); delay(inputdelay); case 3: digitalWrite(button3pin, HIGH); delay(pushdelay); digitalWrite(button3pin, LOW); delay(inputdelay); case 4: digitalWrite(button4pin, HIGH); delay(pushdelay); digitalWrite(button4pin, LOW); delay(inputdelay); case 5: digitalWrite(button5pin, HIGH); delay(pushdelay); digitalWrite(button5pin, LOW); delay(inputdelay); case 6: digitalWrite(button6pin, HIGH); delay(pushdelay); digitalWrite(button6pin, LOW); delay(inputdelay); case 7: digitalWrite(button7pin, HIGH); delay(pushdelay); digitalWrite(button7pin, LOW); delay(inputdelay); case 8: digitalWrite(button8pin, HIGH); delay(pushdelay); digitalWrite(button8pin, LOW); delay(inputdelay); case 9: digitalWrite(button9pin, HIGH); delay(pushdelay); digitalWrite(button9pin, LOW); delay(inputdelay); case 0: digitalWrite(button0pin, HIGH); delay(pushdelay); digitalWrite(button0pin, LOW); delay(inputdelay); } switch (num5) { case 1: digitalWrite(button1pin, HIGH); delay(pushdelay); digitalWrite(button1pin, LOW); delay(inputdelay); break; case 2: digitalWrite(button2pin, HIGH); delay(pushdelay); digitalWrite(button2pin, LOW); delay(inputdelay); case 3: digitalWrite(button3pin, HIGH); delay(pushdelay); digitalWrite(button3pin, LOW); delay(inputdelay); case 4: digitalWrite(button4pin, HIGH); delay(pushdelay); digitalWrite(button4pin, LOW); delay(inputdelay); case 5: digitalWrite(button5pin, HIGH); delay(pushdelay); digitalWrite(button5pin, LOW); delay(inputdelay); case 6: digitalWrite(button6pin, HIGH); delay(pushdelay); digitalWrite(button6pin, LOW); delay(inputdelay); case 7: digitalWrite(button7pin, HIGH); delay(pushdelay); digitalWrite(button7pin, LOW); delay(inputdelay); case 8: digitalWrite(button8pin, HIGH); delay(pushdelay); digitalWrite(button8pin, LOW); delay(inputdelay); case 9: digitalWrite(button9pin, HIGH); delay(pushdelay); digitalWrite(button9pin, LOW); delay(inputdelay); case 0: digitalWrite(button0pin, HIGH); delay(pushdelay); digitalWrite(button0pin, LOW); delay(inputdelay); } digitalWrite(buttonBpin, HIGH); //после набора 5 цифр этим громадным куском кода жмем наконец то в. delay(pushdelay); digitalWrite(buttonBpin, LOW); delay(inputdelay); attempts = attempts++; if (digitalRead(op) == HIGH) { //maybe low boolean success = true; } } } }
надо это исправить
Не понял, что "это", но если надо, так исправляй.
От нас-то чего хочешь? Благословения?
а это приблуда для подбора пароля к одной аппаратной херне. а мне надо совет как уменьшить этот говнокод в 4-10 раз
Что бы компактнее и лучше написать код вам не один месяц учится надо,не то что писать, но и читать. А без умения чтения оптимизированного кода даже подареный код бесполезен. Пользуйтесь говнокодом. По меньшей мере вы его умеете читать.
Уменьшить с какой целью?
верно. но я стремлюсь к лучшему. машинное мышление подтянул четкую структуру устного алгоритма в виде тз со всеми тонкостями и исключениями могу написать но вот реализовать красиво не могу. могу только вот такую портянку накатать от руки самостоятельно оно работает но мне даже смотреть на это неприятно.
помню стояла задача сделать похожий скрипт для подбора пароля от шлакбаума. 12 бит 4096 комбинаций передача с определенными таймингами. я написал портянку в которой сделал 4096 одинаковых блоков с разными значениями. при компиляции получилось 12 000 000 машинных слов. 12 метров говнокода ни в какую ардуину не влезло потому покрамсал скрипт на 2 части взял 2 есп8266 припаял 8мб памяти и залил две части на 2 железки.
потом один хороший человек подсказал способ избавиться от 4096 блоков той функцией которой я увеличиваю currentpass после чего весь код уместился в 12000 машинных слов и записался в атмегу 168.
другой хороший человек подсказал разложение числа на биты функцией bitread и портянка из 48 строк и 12 ячеек превратилась в это
for (int i = 12; i > 0; i--) {
boolean bit_code = bitRead(send_code, i - 1);
итог: я понимаю как это работает могу мысленно прогнать весь цикл передачи одного кода что занимает у меня примерно 10 минут а весь скрипт уместился в 2200 машинных слов при компиляции ардуиновским клиентом.
я по даташиту на атмел делал блинк альтернативным способом хотя тоже с компиляцией родным клиентом и утрамбовал его меньше чем в 200 машинных слов против 1050 на ардуине и потребление оперативки сократил с 9 слов до 0. скорость выполнения увеличилась в 6 раз. а на ассемблере можно вообще за 4 такта блинк выполнить.
для начала понять что в этой портянке жрет оперативку и флешь. попытаться сократить блоки нум1-нум5 с 255 до 50 строк чтобы это было визуально меньше один код не дублировался 5 раз и проще в одном месте редактировался и как ближайшая цель упихать в 2047 полных машинных слов.
Столько умных слов написали, что я сразу представил себе специалиста, который знает 20 языков на уровне выше университетского.
Про массивы и функции добрые люди ещё не подсказывали?
для начала понять что в этой портянке жрет оперативку и флешь.
Ещё нет. Вы желаете стать первым? Буду признателен
Эта портянк написана самостоятельно работает и помещается в атмегу 328/168? Прекрасно. Для меня это уже огромное достижение. Впрочем я смог упихать это в атмегу 48 даже
для начала понять что в этой портянке жрет оперативку и флешь.
при общей стоимости устройства меньше 200р можно просто взять атмегу 48 зв 25р вместо 328 за 75 и собирать. конечное устройство вообще будет на 328 потому что она есть. думается мне в 128 оперативки и 2048 флеши мы это все равно не упихаем даже не задумываясь о цели экономии на камне.
При общей стоимости единократно изготавливаемого устройства в 200р никакая оптимизация данного произведения искусства не окупится.
нетрудно догадаться что в программировании я полный ноль. умения нельзя выразить отрицательным числом а оно будет если вспомнить сколько аппаратных костылей я делал чтобы не изучать программные кишки. язык высокого уровня я изучаю всего 120 часов. итог: смог написать портянку которая работает влезает с запасом в любую ардуину и укладывается в нулевые требования по скорости работы.
но зато я разбираюсь в смежных областях. скуд слаботочка большинства видов или бытовая электрика... перепайка процессоров по трафарету оперативки программный ремонт расслоение бутербродов стирание локбитов на пиках методом напилинга...
короче яжпрограммист-полная противоположность программисту. помню изобретал аппаратный костыль из 6000 радиодеталей чтобы не писать 10-15 строк кода. с чтением и пониманием ардуиновского кода не содержащего библиотек никаких проблем но вот с написанием... вешалка. самое сложное это ковырял внутренности библиотеки в блокноте для работы с проприетарной железкой. нашел ошибку исправил
да оно не для экономии. ужать настолько чтобы влезло в камень меньше 48 атмеги все равно не сможем. а вот взять холтек за 2.5 рубля содержащий 2/16 памяти почти как 328 мега это можно. тут скорее спортивный интерес и желание сделать не через жопу. все равно работать будет на 328 меге
да оно не для экономии. ужать настолько чтобы влезло в камень меньше 48 атмеги все равно не сможем
не совсем понял, что тут нужно делать, но если просто перебирать числа на клаве - по обьему кода тут справится и тинька13, жаль что у нее столько лапок (выходов) нет...
Так-то спортивный интерес - это когда сам бегаешь-тренируешься, а не других просишь побегать за тебя.
Того, что я посоветовал, хватит на оптимизацию.
да где уж тут :) Мне кажется, что идея скопировать блок кода 4096 раз - не придет в голову даже самому галимому новичку. И ведь каким неленивым надо быть - ведь надо не просто скопировать, а еще в каждом блоке свое число поставить :) За то время пока это делаешь - наверно можно было половину учебника по Си проштудировать. На какие только жертвы не идут люди, лишь бы не учиться...
По-моему тут без шансов. Все, что ТС применяет в коде - ему кто-то дал готовое. Сам ТС после 100 часов занятий программированием не дошел даже до циклов. Оператор for() ему тоже кто-то готовый подсказал - он его просто копипастит из программы в программу и называет "той функцией которой я увеличиваю currentpass"
ну когда копировал 4096 раз (благо в 4 стадии автоматизировал этот процесс) у меня была срочная задача не было интернета но было несколько есп и прочих железок и был в условиях мастерской хороший фен и куча доноров 25й серии флеши большого обьема одна от биоса вторая от роутера. я знал что делаю хрень но надо было чтобы это заработало до утра. я не ленивый это точно. список действий был такой. на инфракрасном столе распаять крышку есп снять память выкинуть взять с донора прошить бин программатором запаять сделать понижайку 3.3 из драйвера дисплея... сбегать 3 километра вскрыть шлакбаум вытащить кишки проводить отладку с реальным контролером до утра. остается в 5 утра сбегать воткнуть кишки обратно разобраться как подключать нарастить провода (изначально возвращать не планировалось) и пойти наконец спать. задача выполнена. и пофиг что имеем 2 есп8266 управляемые третьей /facepalm главное что к утру работает. про себя могу сказать не в меру усердный но очень тупой в плане программирования. чего стоит один костыль из 6000 элементов "процессор собственной разработки" программируемый перемычками...
интересную фичу с увеличением на единицу передрал цельной строкой остальной говнокод рукописный синтаксис из примеров. почитал вчера как это работает нашел логический косяк. при достижении заданного верха сбрасывается и начинается сначала. надо думать какой костыль ограничитель воткнуть. не особо понимаю как это работает но хоть вспомнил про это и не делал 100 000 одинаковых блоков=)
один блок примерно 2000 слов занимает никаких есп не хватит=)
во всем коде нравится строчка for (unsigned long currentpass = 00000; currentpass < 99999; currentpass++); а все остальное говно потому что сам накидал. смотреть противно. но интересно как можно было улучшить это. для начала не копировать блок нум 5 раз но как увеличивать название переменной я не знаю это имя а не значение. ++ естественно работать не будет. второе это избавиться от switch-case. это уже лучше чем if-else if но недостаточно хотя разница в пожирании машинных ресурсов думаю небольшая. время выполнения одинаковое почти.
А мне эта строчка не нравится, например.
Вот задача минимум: написать функцию "нажатия" определенной кнопки с аргументом "цифра" - передали в функцию цифру 4, эмулируется нажатие кнопки "4".
Пока делать это не начнёте, все ваши многотомные описания приключений навряд ли кого-то расстрогают.
нетрудно догадаться что в программировании я полный ноль.
ок. теперь нас на этом форуме - два.
так и не понял, что за нах у тебя проблема - тебе нужно в политику идти с таким талантом говорить много и непоянтно, поэтому - вот тебе пример калькулятора на матрице: там и числа в цифры преобразуются и всё такоэ. https://github.com/Klapautsiy/Ti-Calculator
к текущему моменту имеем 5 переменных нум с цифрами. метод деления числа на цифры устраивает выполняется аппаратно память не жрет. как задать соответствие пина цифре в переменной? в голову приходит мысль вместо byte button1pin = 2; итд ниже воткнуть массив 2 на 11 в одну строку вырианты переменной 1234567890 в другой соответствие пина. если массив может начинаться с 0 будет 1 строка и вызов по порядковому номеру в массиве нужного пина. так думаю избавиться от switch case. это хорошая мысль? или есть методы эффективнее массива?
Вот и начинайте изучать: могут ли массивы начинаться с 0.
Не надо форум использовать как справочник по элементарным вещам.
воткнуть массив 2 на 11 в одну строку вырианты переменной 1234567890 в другой соответствие пина. если массив может начинаться с 0 будет 1 строка и вызов по порядковому номеру в массиве нужного пина. так думаю избавиться от switch case
а если "варианты переменной" расположить в массиве не "1234567890", а "0123456789" - то можно будет обойтись одномерным массивом
"эффективнее" тут и не нужно. Пользуясь только этим подходом, уже можно сократить ваш код в 10 раз как минимум
Кстати, вот деление и вычисление остатка - самые неэффективные операции во всей этой истории.
остатки эффективности сдать под расписку на общественный склад - пусть детские дома и престарелых пользуют ресурсы вашего контроллера.
прошу переводчика с русского на человеческий - шо оно хочет?
Хочет таки сделать себе красиво чужими руками.
к текущему моменту я сам допер до массива и применил. позже увидел сообщение qwone. буду анализировать. текущая версия уменьшилась с 400 строк до 140 читабельность заметно улучшилась однако потребление флеши увеличилось на полных 40 слов. кто нибудь обьяснит почему оптимизация не удалась?
Хочет таки сделать себе красиво чужими руками.
дык! в моём доме на первом этаже есть салон красоты - пусть обратится, я ему скидку организую.
эй! потерпевший, вам скинуть телепон Эмануели? - она вам сделает красиво ногами.
...теперь нас два.
а, ещё я придумал иголку с ушком впереди и рецепт динамита - САМ!
hackerman - обратите внимание, что строчки 64-67 у вас в программе повторяются 11 раз, меняется только номер пина. Это ровно то же самое, как код шлагбаума 4096 раз передавать.
Оберните эти 4 строки в процедуру с параметром "номер пина" - выиграете еще строк 50. Сделаете - подскажу что еще улучшить.
ЗЫ И перестаньте измерять потребление памяти в "словах" - вы явно не понимаете, что значит этот термин и потому ваш жаргон режет глаз. В вашем случае речь тдет не о словах, а о байтах - слова в компьютеры значат совсем иное.
так это ты? А я думал, что Зингер...
так это ты? А я думал, что Зингер...
тогда я про Зингера ничего не знал, поэтому пришлось самому. О_о
к текущему моменту имеем 5 переменных нум с цифрами. метод деления числа на цифры устраивает выполняется аппаратно память не жрет. как задать соответствие пина цифре в переменной? в голову приходит мысль вместо byte button1pin = 2; итд ниже воткнуть массив 2 на 11 в одну строку вырианты переменной 1234567890 в другой соответствие пина. если массив может начинаться с 0 будет 1 строка и вызов по порядковому номеру в массиве нужного пина. так думаю избавиться от switch case. это хорошая мысль? или есть методы эффективнее массива?
вот как правильно, учись!!!
так это ты? А я думал, что Зингер...
тогда я про Зингера ничего не знал, поэтому пришлось самому. О_о
Это просто Зингер ничего не знал про Клапауций. Вот Зингер пришлось напрягаться.
набор кода входа в настройки и набор кода упихал в цикл.
измерение в словах-да тут неточность. несколько лет настраивал чипы разной программируемой логики и всегда минимальная адресация была блок 8 ячеек который хранит одно слово конфигурации портов скорости защиты итд или одно 8 битное слово-команду обычно арифметическую. с тех пор все виды памяти измеряю в словах и а занятую часть мысленно оцениваю по времени заполнения ручками этого обьема.
по коду выражаю благодарность b707 и винни пуху. получилось так
Зачем тут нужен массив numerals ?
И что делает
byte
attempts = 0;
?А так же для чего тыщи раз вводить "012345" - чтобы девайс затрахать?
hackerman - простите, но похвалить не могу, код абсолютно неверный.
Вы так и не научились пользоваться циклами. Например, в строке 22 вы, вместо того что настроить пины от 0 по 10 - 11 раз настраиваете какой-то 12-й пин, которого нет!
Строчки с 51 по 68 не начинают новый цикл, а делают какую-то чепуху.
А самый апофеоз - ввода цифр для подбора пароля в коде НЕТ ВОВСЕ!
не получилось =(
надо на трезвую голову прочитать эту портянку еще раз может осенит. пока имею всего один прошиваемый контроллер элементарно залить и натыкать кучу сериал принт посмотреть как выполняется не могу пока. единственная железка трудится сейчас с прошитой портянкой из шапки темы. критерий правильного скрипта был возможность компиляции. как оно будет в реале работать еще не разбирался.
Зачем тут нужен массив numerals ?
И что делает
byte
attempts = 0;
?А так же для чего тыщи раз вводить "012345" - чтобы девайс затрахать?
не уверен но вроде нумералс хранит 5 циферный код по цифрам.
атемптс это число попыток. после 3 попыток подбора целевое устройство делает одну мелкую пакость которая и утяжеляет код в 2 раза. вроде набор 12321 а первый0 я думал цикл после первого прохождения начинается с 1а не с 0. вот и воткнул 0 чтобы не терялся этот знак. вроде 12321 набирается только один раз после чего девайс сбрасывает число попыток и переходит к набору кода...
Вы там, выше писали, что способны "прокрутить код в голове". Вот, пожалуй, это тот самый момент, когда нужно сделать подобный фокус. Строки 62-68, к примеру, "покрутить".
62-68: digitalwrite лезет в массив пинс с индексом от массива нумералс. а должна лезть в массив нумералс брать оттуда число и лезть с ним в массив пинс.
digitalWrite(pins[numerals[currentnum]], HIGH); возможно так.
я это уже нашел перечитал полученную портянку и отмотал до третьей контрольной точки до версии где switch case уже нет размер уменьшился с 400 до 140 но ужее есть массив пинс с соответстием пинов цифрам и есть массив нумералс где тупо 5 блоков ссылающиеся на 5 элементов этого массива. читабельно я понимаю как это раюботает пригодно для допиливания но есть что улучшать.
улучшить можно назначение пинов выходами сократить в 5 раз блок который набирает 12321 и который набирает код. однако я сломал все 3 блока при попытке улучшения.
сейчас релиз ветка висит с кодом из шапки а перспективная для допиливания выглядит так
я сломал все 3 блока при допиливании создал 2 новые переменные уменьшил обьем во флеши но увеличил жор оперативки. если последний скрипт будет работать на железе он и станет релизом вместо портянки из шапки. как улучшить эти 3 блока чтобы работало не представляю.
Откуда в людях столько тупости ?
При этом он абсолютно уверен, что делает всё правильно.
Ему 50раз уже сказали про цикл for, но он точно так же пихает свою портянку.
так уже улучшали, можно как в примерах или как делали
Откуда в людях столько тупости ?
При этом он абсолютно уверен, что делает всё правильно.
Ему 50раз уже сказали про цикл for, но он точно так же пихает свою портянку.
а разве не так:
зато быстро бегает и чипы перепаивает, кто на что как гриться...
unsigned long currentpass = 00000; //текущая попытка. можно делать подбор не с начала
int inputdelay = 100; //задержка нажатий кнопок
byte pushdelay = 50; //время нажатия кнопки
unsigned int errdelay = 10000; //время задержки после 3 попыток и вылета из меню
byte attempts = 3; //число попыток набора. при старте 3 для первого входа в меню.
boolean success = false;
int pins[11] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,}; //botones con números 0 1 2 3 4 5 6 7 8 9 B
byte op = 13;
byte num[] = {0, 0, 0, 0, 0,};
void setup() {
Serial.begin(9600);
for (uint8_t i = 0; i < 11; i++) {
pinMode(pins[i], OUTPUT);
}
pinMode(op, INPUT_PULLUP);
}
/*
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(op, INPUT_PULLUP);
}
*/
void loop() {
if (success == true) {
Serial.println("END");
Serial.println(currentpass);
delay(100000);
}
else {
for (unsigned long currentpass = 00000; currentpass < 99999; currentpass++); //код следующей попытки
Serial.println(currentpass);
num[0] = (currentpass / 10000);
num[1] = (currentpass / 1000 % 10); //разложение 5 значного числа на цифры. костыль?
num[2] = (currentpass / 100 % 10);
num[3] = (currentpass / 10 % 10);
num[4] = (currentpass % 10 % 10);
if (attempts == 3) {
delay(errdelay); //если попыток 3 то ждем
//write 12321B (и входим в настройки еще раз)
digitalWrite(pins[1], HIGH);
delay(pushdelay);
digitalWrite(pins[1], LOW);
delay(inputdelay);
digitalWrite(pins[2], HIGH);
delay(pushdelay);
digitalWrite(pins[2], LOW);
delay(inputdelay);
digitalWrite(pins[3], HIGH);
delay(pushdelay);
digitalWrite(pins[3], LOW);
delay(inputdelay);
digitalWrite(pins[2], HIGH);
delay(pushdelay);
digitalWrite(pins[2], LOW);
delay(inputdelay);
digitalWrite(pins[1], HIGH);
delay(pushdelay);
digitalWrite(pins[1], LOW);
delay(inputdelay);
digitalWrite(pins[10], HIGH);
delay(pushdelay);
digitalWrite(pins[10], LOW);
delay(inputdelay);
byte attempts = 0; //сбрасываем попытки
}
else {
for (uint8_t i = 0; i < 5; i++){ //посмотреть значение и
digitalWrite(pins[num[i]], HIGH);
delay(pushdelay);
digitalWrite(pins[num[i]], LOW);
delay(inputdelay);
}
digitalWrite(pins[10], HIGH); //после набора 5 цифр этим вроде не говеным куском кода жмем в.
delay(pushdelay);
digitalWrite(pins[10], LOW);
delay(inputdelay);
attempts = attempts++;
//++attempts; ???
if (digitalRead(op) == HIGH) { //maybe low
boolean success = true;
}
}
}
}
я упихал одну часть портянки и если со значением и ничего не напутано то вроде должно работать. как упихать в цикл другую часть портянки ума не приложу. вместо 5 блоков создать массив и ссылаться на него увеличивая порядковый номер каждый раз на 1? пристрелите меня. попытки сделать выше описанное даже не компилируются. попытка запихать инициализацию пинов в цикл заканчивается жопой тоже
попытка запихать инициализацию пинов в цикл заканчивается жопой тоже
а какую ошибку пишет на попытку запихать инициализацию пинов в цикл ?
нет там ошибки, проверял, всё компилируется, если закавычить функции правильно )))