Работа с EEPROM

peit
Offline
Зарегистрирован: 07.10.2018

Всем здравствуйте.

Просьба, резко не реагировать, если было.

Сталкнулся с проблемой...

Имеется аналоговый вход, к нему подключены резистивные кнопки, с 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 -светодиод на мгновение вспыхивает.

Не как не могу сообразить, как победить...

sadman41
Offline
Зарегистрирован: 19.10.2016

Строку #6 поместите перед циклом.

peit
Offline
Зарегистрирован: 07.10.2018

sadman41 пишет:

Строку #6 поместите перед циклом.

К сожалению, не помогает....

sadman41
Offline
Зарегистрирован: 19.10.2016

Не помогает чему? Вы ее переместили?

peit
Offline
Зарегистрирован: 07.10.2018

sadman41 пишет:

Не помогает чему? Вы ее переместили?

Да, переместил и убрал else

Не помогает тому, что если сидеть инажимать другую кнопку, (не та что записана) то проскакивает вспышка, не всегда конечно, но из 10 нажатий, 3-4 точно.

Или, это не было решением?))

sadman41
Offline
Зарегистрирован: 19.10.2016

Это было решением для того фрагмента, который вы привели. Если у вас ниже еще что-то гасит светодиод, то конечно будут вспышки.

peit
Offline
Зарегистрирован: 07.10.2018

Вот весь код:

#include <EEPROM.h>

int val = 0;
int a;
// the setup routine runs once when you press reset:
void setup() {
  pinMode(LED_BUILTIN,OUTPUT); 
  //EEPROM.write(1, 14);
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  int sensorValue = analogRead(A0) /4 ;
  int voltage = sensorValue;
 
digitalWrite(LED_BUILTIN, LOW);
  for(val=0; val<5; val++) {
    a = EEPROM.read(val);
    if(voltage >= a-3 && voltage <= a+3 ) {
      digitalWrite(LED_BUILTIN, HIGH);
    }
  }
 
}

Как защитить от проскакиваания значения, не знаю....

sadman41
Offline
Зарегистрирован: 19.10.2016

Я и идеи-то не знаю. Зачем вам гасить-зажигать? Ну, уберите #17 вообще и будет он у вас только зажигаться. 

Подозреваю, что у вас в голове еще не сформировалось понимание того, что нужно получить на выходе.

peit
Offline
Зарегистрирован: 07.10.2018

sadman41 пишет:

Я и идеи-то не знаю. Зачем вам гасить-зажигать? Ну, уберите #17 вообще и будет он у вас только зажигаться. 

Подозреваю, что у вас в голове еще не сформировалось понимание того, что нужно получить на выходе.

Цель такая, когда определённая резистивная кнопка нажата, на определённом выходе получать лог 1, когда отпущена, лог 0.

А если я уберу 17 строку, то появляется лог 1 и так и висит.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Выведите voltage в Serial - может оно у вас из границ тупо вылетает.

peit
Offline
Зарегистрирован: 07.10.2018

Там всё ок.

Поставил паузу, на 16 строку, что бы переходные данные не летели, вроде помогло.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Пауза, конечно, сделает обнаруженный Вами дефект менее заметным, но не уберет совсем.

Лучше переключать только в случае повторения одного и того же значения (разумеется, диапазона, соответствующего одной кнопке) подряд два раза.

peit
Offline
Зарегистрирован: 07.10.2018

andriano пишет:

Пауза, конечно, сделает обнаруженный Вами дефект менее заметным, но не уберет совсем.

Лучше переключать только в случае повторения одного и того же значения (разумеется, диапазона, соответствующего одной кнопке) подряд два раза.

Вы правы, на 100% не убрал....

Если не поленится и сидеть тыкать и тыкать на другие кнопки, то всё равно проскакивает....

Т.е два раза использовать цилкл for ?

peit
Offline
Зарегистрирован: 07.10.2018

Весь день просидел, и так и сяк и всё равно проскакивает.

Может кто пинка в нужную сторону дать?

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

peit пишет:

Весь день просидел, и так и сяк и всё равно проскакивает.

Может кто пинка в нужную сторону дать?

да вам правильно посоветовали - зажигайте, только если одно и то же значение 2 (а лучше 5) раз подряд. Заведите для каждой кнопки счетчик. Если значение попадает в диапазон - прибавляйте к счетчику единицу, если не попадает - обнуляйте. Если счетчик дошел до пяти - зажигайте.

На будущее - тщательнее продумывайте название темы. Ваши проблемы не имеют ничего общего с ЕЕПРОМ...

peit
Offline
Зарегистрирован: 07.10.2018

b707 пишет:

peit пишет:

Весь день просидел, и так и сяк и всё равно проскакивает.

Может кто пинка в нужную сторону дать?

да вам правильно посоветовали - зажигайте, только если одно и то же значение 2 (а лучше 5) раз подряд. Заведите для каждой кнопки счетчик. Если значение попадает в диапазон - прибавляйте к счетчику единицу, если не попадает - обнуляйте. Если счетчик дошел до пяти - зажигайте.

Так я, это, не то что сомниваюсь в сказаном, я видимо реализую не так...

я сделал два одинаковых for, но мне это не помогает....

peit
Offline
Зарегистрирован: 07.10.2018

b707 пишет:

peit пишет:

Весь день просидел, и так и сяк и всё равно проскакивает.

Может кто пинка в нужную сторону дать?

На будущее - тщательнее продумывайте название темы. Ваши проблемы не имеют ничего общего с ЕЕПРОМ...

Я просто думал, что я не верно считываю данные...

я начинающий...

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

peit пишет:

Так я, это, не то что сомниваюсь в сказаном, я видимо реализую не так...

я сделал два одинаковых for, но мне это не помогает....

вы совсем не в ту сторону пошли. Читать два раза - не значит, что надо второй цикл скопировать :) А если пять раз?

Я вам выше описал, попробуйте.

sadman41
Offline
Зарегистрирован: 19.10.2016

А ежели две кнопки нажаты - сопротивление уже совершенное иное будет. Как вы собрались обрабатывать эту ситуацию?

peit
Offline
Зарегистрирован: 07.10.2018

b707 пишет:

....

peit пишет:

Извините, не совсем понимаю, как для каждой кнопки сделать счетчик, если у мнея скажем 5 кнопок, на одном входе.

Я за ранее записал, результат нажатия скажем 2 кнопки, в ЕЕПРОМ, в 1 ячейку, со значениме 210 -к примеру.

Затем циклом for я перебираю 0 - 6 ячеек (больше не требуется) и если при нажатии кноки значение 210 совпадает со значениме 210 из ЕЕПРОМ-а, включаю светодиод, на будущее, я буду так искать номер ячейки, в которую записано значение 210, для дальнейших манипуляций,например шевелить разными выходами.

Сейчас же у мнея при нажатии соседних кнопок, иногда происходит вспыхивание светодиода, хотя в оставшиейся ячейки, я записал другие числа 255, а диапазон кнопок начинается с 175 и ниже..

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

Либо это происходит из за дребезга контактов.

 

peit
Offline
Зарегистрирован: 07.10.2018

sadman41 пишет:

А ежели две кнопки нажаты - сопротивление уже совершенное иное будет. Как вы собрались обрабатывать эту ситуацию?

Смотря на какие, если нажать среднюю, и затем правую от неё, то будет значение правой, а левую, значение левой.

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

peit - я уже написал, что к ЕЕПРОМ все это отношения не имеет... и скорее только вас запутывает. У вас, фактически, используется массив из шести значений - и было бы лучше, если б вы пока ЕЕПРОМ из скетча вовсе выкинули, а работали просто с массивом.

Точно так же, как у вас для шести кнопок шесть  значений сопротивления лежат в массиве - так же создайте массив из шести счетчиков.

peit
Offline
Зарегистрирован: 07.10.2018

b707 пишет:

peit - я уже написал, что к ЕЕПРОМ все это отношения не имеет... и скорее только вас запутывает. У вас, фактически, используется массив из шести значений - и было бы лучше, если б вы пока ЕЕПРОМ из скетча вовсе выкинули, а работали просто с массивом.

Точно так же, как у вас для шести кнопок шесть  значений сопротивления лежат в массиве - так же создайте массив из шести счетчиков.

Наверное вы правы, я попробую без ЕЕПРОМ.

Сделаю как вы говорите.

sadman41
Offline
Зарегистрирован: 19.10.2016

peit пишет:

sadman41 пишет:

А ежели две кнопки нажаты - сопротивление уже совершенное иное будет. Как вы собрались обрабатывать эту ситуацию?

Смотря на какие, если нажать среднюю, и затем правую от неё, то будет значение правой, а левую, значение левой.

Ну... фактически средняя  будет нажата, а по вашему скетчу - нет. Фигня выходит, как я понимаю.

bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

Ну... фактически средняя  будет нажата, а по вашему скетчу - нет. Фигня выходит, как я понимаю.

У ТС, походу схема из линейки резисторов, можно только одну кнопу зафиксировать (которая ближе к точке подключения аналогрида).
От тока нахрена тут епром, не понимаю, чем пять ифов не угодили? Если чё, вопрос к ТС.

peit
Offline
Зарегистрирован: 07.10.2018

bwn пишет:

sadman41 пишет:

Ну... фактически средняя  будет нажата, а по вашему скетчу - нет. Фигня выходит, как я понимаю.

У ТС, походу схема из линейки резисторов, можно только одну кнопу зафиксировать (которая ближе к точке подключения аналогрида).
От тока нахрена тут епром, не понимаю, чем пять ифов не угодили? Если чё, вопрос к ТС.

Если вы о том, что название темы не верное, то я уже понял, сделал массив, продублировав чтение ЕЕПРОМ  проблема осталась.

А если вы про -зачем вообще ЕЕПРОМ, то для записи туда данных.

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

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

Новый день, буду ломать голову, как сделать имено так, как рекомендовали выше.

Потому как, если сделать просто if, то получилось сделать счетчик, а если if находится в цикле for, то не получается.

Но это от не знания, я просто делаю что то не так.

sadman41
Offline
Зарегистрирован: 19.10.2016

Для того, чтобы не страдать до двух ночи, вам нужно понять: сможете ли вы фиксировать два раздельных события - нажатие на определенную кнопку и отпускание ее. Как только решить данную задачу для резистивной линейки - ваша задача на 50% решена. И еще совет - не смотрите на светодиод, смотрите на Serial.print(); Светодиод вам не покажет быстро повторяющиеся события. Вернее - вы их не увидите.

peit
Offline
Зарегистрирован: 07.10.2018

sadman41 пишет:

Для того, чтобы не страдать до двух ночи, вам нужно понять: сможете ли вы фиксировать два раздельных события - нажатие на определенную кнопку и отпускание ее. Как только решить данную задачу для резистивной линейки - ваша задача на 50% решена. И еще совет - не смотрите на светодиод, смотрите на Serial.print(); Светодиод вам не покажет быстро повторяющиеся события. Вернее - вы их не увидите.

Вот в этом и загвозка)

Для обычнной кнопки я уже решил, просидев 3 дня, правда там реализовал короткое нажатие и длинное.

А вот для резестивного -пока тупик)

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, промоделируйте на бумажке, поскладывайте номиналы резисторов. Сумеете  математический метод определения найти - вы в дамках. Может ваша задача и вовсе не имеет решения, как знать...  А вы тут ардуину, еепром приплетаете.

peit
Offline
Зарегистрирован: 07.10.2018

ПОлучилсоь сделать вот так..

int masiv[] = {255, 150, 255, 49, 255, 14, 255};
int val;
int a;
int b;
int c;
void setup() {
    pinMode(LED_BUILTIN,OUTPUT);
    pinMode(9, INPUT_PULLUP);
    Serial.begin(9600);

}

void loop() {
int sensorValue = analogRead(A0) /2;
  int voltage = sensorValue;

    a = masiv[3];
    if(voltage >= a-3 && voltage <= a+3) {
      c++;
      b=1;
      Serial.println(c);
if(c >= 10 && b==1) {digitalWrite(LED_BUILTIN, HIGH);}
    }else{
      c = 0;
      digitalWrite(LED_BUILTIN, LOW);
    }

}

Но тут нужно отдельно такие блоки делать для остальных кнопок.

С for никак не получается сделать...

Может кто помочь с более грамотным решением ?

bwn
Offline
Зарегистрирован: 25.08.2014

peit пишет:

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

peit
Offline
Зарегистрирован: 07.10.2018

bwn пишет:

peit пишет:

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

Так резисторы не причем, совершенно.

Проблема не в них.

Мне посоветовали сделать счетчик и я кое как сделал (по моему мнению) и помогает.

Но я предполагаю, код можно более правильнее написать.

Если кому не тяжело, буду признателен.

Это даст мне больше знаний и опыта.

bwn
Offline
Зарегистрирован: 25.08.2014

Так код от подключения зависит. Возможно совместное нажатие или нет и т.д. Пока из ваших ответов я понять не смог.

peit
Offline
Зарегистрирован: 07.10.2018

bwn пишет:

Так код от подключения зависит. Возможно совместное нажатие или нет и т.д. Пока из ваших ответов я понять не смог.

Совместное нажатие не планируется.

Только по одной, не одновременно.

Какие бы кнопки не были, подключение к одному каналу, всё равно полученное значение будет одно, хоть и разное, от 0 до 1023.

хоть 10 кнопок нажимая по одной, хоть 3 комбинируя.

но у меня будут нажатие по одной.

bwn
Offline
Зарегистрирован: 25.08.2014

Мы с вами на разных языках говорим: Есть два варианта подключения:
№1 и №2. Номер первый допускает возможность получения промежуточных значений, независимо от вашего желания или нежелания. Номер второй допускает одну единственную трактовку, так который у вас?

peit
Offline
Зарегистрирован: 07.10.2018

bwn пишет:

Мы с вами на разных языках говорим: Есть два варианта подключения:
№1 и №2. Номер первый допускает возможность получения промежуточных значений, независимо от вашего желания или нежелания. Номер второй допускает одну единственную трактовку, так который у вас?

Возможно...

У меня получается, второй вариант.

bwn
Offline
Зарегистрирован: 25.08.2014

Попробуйте упорядочить массив от меньшего к большему и применяйте одно условие: < или <= и все должно наладиться.

Там, кстати, у Максима это и сделано.

peit
Offline
Зарегистрирован: 07.10.2018

bwn пишет:

Попробуйте упорядочить массив от меньшего к большему и применяйте одно условие: < или <= и все должно наладиться.

Там, кстати, у Максима это и сделано.

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

bwn
Offline
Зарегистрирован: 25.08.2014

Это как? Вы резисторы прямо на ходу перепаивать будете? 

peit
Offline
Зарегистрирован: 07.10.2018

bwn пишет:

Это как? Вы резисторы прямо на ходу перепаивать будете? 

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

bwn
Offline
Зарегистрирован: 25.08.2014

Ну и фак на них, промерить выходное значение один раз для каждой модели. Программу-то, все равно, для разных авто придется править. Или я не прав?

peit
Offline
Зарегистрирован: 07.10.2018

bwn пишет:

Ну и фак на них, промерить выходное значение один раз для каждой модели. Программу-то, все равно, для разных авто придется править. Или я не прав?

Планирую делать меню и обучение, с записью в ЕЕПРОМ...

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

так что они могут лежать в любых значениях, 20, 85, 15, 22 и т.д

bwn
Offline
Зарегистрирован: 25.08.2014

Ну, не знаю, с мобилями дела не имел (во внутрях). Если собираетесь сами ставить, то проще программу подправлять, если на сторону блочком продавать, то да, огород городить.

peit
Offline
Зарегистрирован: 07.10.2018

Было бы всё так просто)