Работа с EEPROM
- Войдите на сайт для отправки комментариев
Всем здравствуйте.
Просьба, резко не реагировать, если было.
Сталкнулся с проблемой...
Имеется аналоговый вход, к нему подключены резистивные кнопки, с 1 по 5, для получения разного значения, а конкретно в моём случае, от большего к меньшему, т.е например 1 кнопка возвращает значение 300, вторая 250 и т.д
Записываю в ручном виде в память ЕЕПРОМ например в 1 адрес записываю кнопку 3, там значение 200
Теперь, мне нужно читать данные, и сравнивать текущее значение, при нажатой кнопке, со значением полученых из памяти и если сопадает, включать светодиод.
Пользуюсь таким кодом:
for(val=0; val<5; val++) { a = EEPROM.read(val); if(voltage >= a-3 && voltage <= a+3 ) { digitalWrite(13, HIGH); }else{ digitalWrite(13, LOW); } }
Всё бы хорошо, но есть одна проблема, когда я нажимаю на кнопку 4 или 5, то иногда проскакивает вспышка светодиода, т.е когда я нажимаю на кнопку 4, то результат бежит от 300 к 150 и видимо в момент прохождения значения 200 -светодиод на мгновение вспыхивает.
Не как не могу сообразить, как победить...
Строку #6 поместите перед циклом.
Строку #6 поместите перед циклом.
К сожалению, не помогает....
Не помогает чему? Вы ее переместили?
Не помогает чему? Вы ее переместили?
Да, переместил и убрал else
Не помогает тому, что если сидеть инажимать другую кнопку, (не та что записана) то проскакивает вспышка, не всегда конечно, но из 10 нажатий, 3-4 точно.
Или, это не было решением?))
Это было решением для того фрагмента, который вы привели. Если у вас ниже еще что-то гасит светодиод, то конечно будут вспышки.
Вот весь код:
Как защитить от проскакиваания значения, не знаю....
Я и идеи-то не знаю. Зачем вам гасить-зажигать? Ну, уберите #17 вообще и будет он у вас только зажигаться.
Подозреваю, что у вас в голове еще не сформировалось понимание того, что нужно получить на выходе.
Я и идеи-то не знаю. Зачем вам гасить-зажигать? Ну, уберите #17 вообще и будет он у вас только зажигаться.
Подозреваю, что у вас в голове еще не сформировалось понимание того, что нужно получить на выходе.
Цель такая, когда определённая резистивная кнопка нажата, на определённом выходе получать лог 1, когда отпущена, лог 0.
А если я уберу 17 строку, то появляется лог 1 и так и висит.
Выведите voltage в Serial - может оно у вас из границ тупо вылетает.
Там всё ок.
Поставил паузу, на 16 строку, что бы переходные данные не летели, вроде помогло.
Пауза, конечно, сделает обнаруженный Вами дефект менее заметным, но не уберет совсем.
Лучше переключать только в случае повторения одного и того же значения (разумеется, диапазона, соответствующего одной кнопке) подряд два раза.
Пауза, конечно, сделает обнаруженный Вами дефект менее заметным, но не уберет совсем.
Лучше переключать только в случае повторения одного и того же значения (разумеется, диапазона, соответствующего одной кнопке) подряд два раза.
Вы правы, на 100% не убрал....
Если не поленится и сидеть тыкать и тыкать на другие кнопки, то всё равно проскакивает....
Т.е два раза использовать цилкл for ?
Весь день просидел, и так и сяк и всё равно проскакивает.
Может кто пинка в нужную сторону дать?
Весь день просидел, и так и сяк и всё равно проскакивает.
Может кто пинка в нужную сторону дать?
да вам правильно посоветовали - зажигайте, только если одно и то же значение 2 (а лучше 5) раз подряд. Заведите для каждой кнопки счетчик. Если значение попадает в диапазон - прибавляйте к счетчику единицу, если не попадает - обнуляйте. Если счетчик дошел до пяти - зажигайте.
На будущее - тщательнее продумывайте название темы. Ваши проблемы не имеют ничего общего с ЕЕПРОМ...
Весь день просидел, и так и сяк и всё равно проскакивает.
Может кто пинка в нужную сторону дать?
да вам правильно посоветовали - зажигайте, только если одно и то же значение 2 (а лучше 5) раз подряд. Заведите для каждой кнопки счетчик. Если значение попадает в диапазон - прибавляйте к счетчику единицу, если не попадает - обнуляйте. Если счетчик дошел до пяти - зажигайте.
Так я, это, не то что сомниваюсь в сказаном, я видимо реализую не так...
я сделал два одинаковых for, но мне это не помогает....
Весь день просидел, и так и сяк и всё равно проскакивает.
Может кто пинка в нужную сторону дать?
На будущее - тщательнее продумывайте название темы. Ваши проблемы не имеют ничего общего с ЕЕПРОМ...
Я просто думал, что я не верно считываю данные...
я начинающий...
Так я, это, не то что сомниваюсь в сказаном, я видимо реализую не так...
я сделал два одинаковых for, но мне это не помогает....
вы совсем не в ту сторону пошли. Читать два раза - не значит, что надо второй цикл скопировать :) А если пять раз?
Я вам выше описал, попробуйте.
А ежели две кнопки нажаты - сопротивление уже совершенное иное будет. Как вы собрались обрабатывать эту ситуацию?
....
Извините, не совсем понимаю, как для каждой кнопки сделать счетчик, если у мнея скажем 5 кнопок, на одном входе.
Я за ранее записал, результат нажатия скажем 2 кнопки, в ЕЕПРОМ, в 1 ячейку, со значениме 210 -к примеру.
Затем циклом for я перебираю 0 - 6 ячеек (больше не требуется) и если при нажатии кноки значение 210 совпадает со значениме 210 из ЕЕПРОМ-а, включаю светодиод, на будущее, я буду так искать номер ячейки, в которую записано значение 210, для дальнейших манипуляций,например шевелить разными выходами.
Сейчас же у мнея при нажатии соседних кнопок, иногда происходит вспыхивание светодиода, хотя в оставшиейся ячейки, я записал другие числа 255, а диапазон кнопок начинается с 175 и ниже..
Я предполагаю, что при нажатии других кнопок, значение опускается не настоько быстро и код мимилётом видит значение 210....
Либо это происходит из за дребезга контактов.
А ежели две кнопки нажаты - сопротивление уже совершенное иное будет. Как вы собрались обрабатывать эту ситуацию?
Смотря на какие, если нажать среднюю, и затем правую от неё, то будет значение правой, а левую, значение левой.
peit - я уже написал, что к ЕЕПРОМ все это отношения не имеет... и скорее только вас запутывает. У вас, фактически, используется массив из шести значений - и было бы лучше, если б вы пока ЕЕПРОМ из скетча вовсе выкинули, а работали просто с массивом.
Точно так же, как у вас для шести кнопок шесть значений сопротивления лежат в массиве - так же создайте массив из шести счетчиков.
peit - я уже написал, что к ЕЕПРОМ все это отношения не имеет... и скорее только вас запутывает. У вас, фактически, используется массив из шести значений - и было бы лучше, если б вы пока ЕЕПРОМ из скетча вовсе выкинули, а работали просто с массивом.
Точно так же, как у вас для шести кнопок шесть значений сопротивления лежат в массиве - так же создайте массив из шести счетчиков.
Наверное вы правы, я попробую без ЕЕПРОМ.
Сделаю как вы говорите.
А ежели две кнопки нажаты - сопротивление уже совершенное иное будет. Как вы собрались обрабатывать эту ситуацию?
Смотря на какие, если нажать среднюю, и затем правую от неё, то будет значение правой, а левую, значение левой.
Ну... фактически средняя будет нажата, а по вашему скетчу - нет. Фигня выходит, как я понимаю.
Ну... фактически средняя будет нажата, а по вашему скетчу - нет. Фигня выходит, как я понимаю.
У ТС, походу схема из линейки резисторов, можно только одну кнопу зафиксировать (которая ближе к точке подключения аналогрида).
От тока нахрена тут епром, не понимаю, чем пять ифов не угодили? Если чё, вопрос к ТС.
Ну... фактически средняя будет нажата, а по вашему скетчу - нет. Фигня выходит, как я понимаю.
У ТС, походу схема из линейки резисторов, можно только одну кнопу зафиксировать (которая ближе к точке подключения аналогрида).
От тока нахрена тут епром, не понимаю, чем пять ифов не угодили? Если чё, вопрос к ТС.
Если вы о том, что название темы не верное, то я уже понял, сделал массив, продублировав чтение ЕЕПРОМ проблема осталась.
А если вы про -зачем вообще ЕЕПРОМ, то для записи туда данных.
Сейчас моя главная проблема, это реализовать этот самый счетчик и избавится от нехорошего дефекта.
Вроде к двум ночи получилсоь, но явно можно решить было по другому, а не такой колхоз делать, как я сделал.
Новый день, буду ломать голову, как сделать имено так, как рекомендовали выше.
Потому как, если сделать просто if, то получилось сделать счетчик, а если if находится в цикле for, то не получается.
Но это от не знания, я просто делаю что то не так.
Для того, чтобы не страдать до двух ночи, вам нужно понять: сможете ли вы фиксировать два раздельных события - нажатие на определенную кнопку и отпускание ее. Как только решить данную задачу для резистивной линейки - ваша задача на 50% решена. И еще совет - не смотрите на светодиод, смотрите на Serial.print(); Светодиод вам не покажет быстро повторяющиеся события. Вернее - вы их не увидите.
Для того, чтобы не страдать до двух ночи, вам нужно понять: сможете ли вы фиксировать два раздельных события - нажатие на определенную кнопку и отпускание ее. Как только решить данную задачу для резистивной линейки - ваша задача на 50% решена. И еще совет - не смотрите на светодиод, смотрите на Serial.print(); Светодиод вам не покажет быстро повторяющиеся события. Вернее - вы их не увидите.
Вот в этом и загвозка)
Для обычнной кнопки я уже решил, просидев 3 дня, правда там реализовал короткое нажатие и длинное.
А вот для резестивного -пока тупик)
Ну, промоделируйте на бумажке, поскладывайте номиналы резисторов. Сумеете математический метод определения найти - вы в дамках. Может ваша задача и вовсе не имеет решения, как знать... А вы тут ардуину, еепром приплетаете.
ПОлучилсоь сделать вот так..
Но тут нужно отдельно такие блоки делать для остальных кнопок.
С for никак не получается сделать...
Может кто помочь с более грамотным решением ?
Нарисуйте все-таки схему, как резисторы подключены. От прям свербит, что из пушки воробьев пуляем.
Нарисуйте все-таки схему, как резисторы подключены. От прям свербит, что из пушки воробьев пуляем.
Так резисторы не причем, совершенно.
Проблема не в них.
Мне посоветовали сделать счетчик и я кое как сделал (по моему мнению) и помогает.
Но я предполагаю, код можно более правильнее написать.
Если кому не тяжело, буду признателен.
Это даст мне больше знаний и опыта.
Так код от подключения зависит. Возможно совместное нажатие или нет и т.д. Пока из ваших ответов я понять не смог.
Так код от подключения зависит. Возможно совместное нажатие или нет и т.д. Пока из ваших ответов я понять не смог.
Совместное нажатие не планируется.
Только по одной, не одновременно.
Какие бы кнопки не были, подключение к одному каналу, всё равно полученное значение будет одно, хоть и разное, от 0 до 1023.
хоть 10 кнопок нажимая по одной, хоть 3 комбинируя.
но у меня будут нажатие по одной.
Мы с вами на разных языках говорим: Есть два варианта подключения:
№1 и №2. Номер первый допускает возможность получения промежуточных значений, независимо от вашего желания или нежелания. Номер второй допускает одну единственную трактовку, так который у вас?
Мы с вами на разных языках говорим: Есть два варианта подключения:
№1 и №2. Номер первый допускает возможность получения промежуточных значений, независимо от вашего желания или нежелания. Номер второй допускает одну единственную трактовку, так который у вас?
Возможно...
У меня получается, второй вариант.
Попробуйте упорядочить массив от меньшего к большему и применяйте одно условие: < или <= и все должно наладиться.
Там, кстати, у Максима это и сделано.
Попробуйте упорядочить массив от меньшего к большему и применяйте одно условие: < или <= и все должно наладиться.
Там, кстати, у Максима это и сделано.
Имеет в виду значение ?
В планах, они могут быть разлучные, в рзных ячейках разные значения и при нажатии любой кнопки, получим совершенно разное значение.
Это как? Вы резисторы прямо на ходу перепаивать будете?
Это как? Вы резисторы прямо на ходу перепаивать будете?
Нет, просто устройство планируется использовать а автомобилях, где резистивные кнопки, и резисторы могут быть совершенно разное, на разных авто.
Ну и фак на них, промерить выходное значение один раз для каждой модели. Программу-то, все равно, для разных авто придется править. Или я не прав?
Ну и фак на них, промерить выходное значение один раз для каждой модели. Программу-то, все равно, для разных авто придется править. Или я не прав?
Планирую делать меню и обучение, с записью в ЕЕПРОМ...
И любое значение, может быть записано в любую ячейку, в зависимости от выбора канала.
так что они могут лежать в любых значениях, 20, 85, 15, 22 и т.д
Ну, не знаю, с мобилями дела не имел (во внутрях). Если собираетесь сами ставить, то проще программу подправлять, если на сторону блочком продавать, то да, огород городить.
Было бы всё так просто)