Вопрос к комрадам!!! AnalogRead и левые показания

Signalsus
Offline
Зарегистрирован: 04.11.2018

делаю так

word ValBTN = analogRead(pinBUTTONS);

 

pinBUTTONS притянут через резисторы по 4,5k и на корпус 22к
ValBTN чета периодически проскакивают разные данные на пине, хз как побороть
BOOM
BOOM аватар
Онлайн
Зарегистрирован: 14.11.2018

Рисуйте схему. По описанию у вас какой-то делитель напряжения?

Ну и тип word не подходит под analogread - там минимум 2 байта нужно, int к примеру. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

word это unsigned int, он подходит

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

BOOM пишет:

Рисуйте схему. По описанию у вас какой-то делитель напряжения?

Да и код целиком неплохо было опубликовать.

BOOM
BOOM аватар
Онлайн
Зарегистрирован: 14.11.2018

DetSimen пишет:

word это unsigned int, он подходит

Дед, истину глаголишь, что-то тупанул... Прошу прощения. 

Signalsus
Offline
Зарегистрирован: 04.11.2018

собственно ничего сложного (на номиналы резисторов тут не смотреть), да и код ардуины не нужен, собственно сам

analogRead(PinButtons) возвращает иногда не то, что нужно, я думал, что проблемы в наводках и т.п., подключив осцилограф к выходу кнопок, я заметил такую штуку, что бывает возвращает, напряжение, намного меньше, чем оно должно быть, перепробовал кучу кнопок, как новых так и выпаивал с разной техники и на всех такое проскакивает, если со старыми еще понятно, может контакты подокислены и сама кнопка становится резистором из-за плохого контакта, в итоге выдает левое значение, причем одна кнопка может пересекаться по значением с другой кнопкой. Вот думаю как победить

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Signalsus пишет:

 (на номиналы резисторов тут не смотреть), да и код ардуины не нужен,

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

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

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

а вот вторая вовсе не 4в, как кажется по схеме, а всего 3.55в

третья - чуть более 2.5в вместо точных 3в...

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

asam пишет:

Если не смотреть на номиналы, код и полную схему...

то непонятно, зачем вообще ТС написал на форум

Signalsus
Offline
Зарегистрирован: 04.11.2018

asam пишет:

Signalsus пишет:

 (на номиналы резисторов тут не смотреть), да и код ардуины не нужен,

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

 

да какая разница, в номиналах? только условия срабатывания на нажатие кнопок.

тот, что на схеме 50К у меня 22к, те, что 10К у меня 4,7К это как-то сильно помогло? а код, там он по обработки кнопок уже столько хламом оброс, что тут люди будут только в нем разбирацо.

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

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

ну код скину

struct TimersWork {
           word PERIOD_;       //--------------Время периода срабатывания-----------
           word PERIOD_LAST;   //--------------Последние время измерения------------
           boolean STATE;      //--------------Если сработало-----------------------
           int VAL;
                  } type ;


struct TimersWork KEYBOARD = {500,10000,LOW, 0};


struct TimersWork KEYBRDGyver(word AnalogValue, unsigned long currentMillis, struct TimersWork DATA) {
    
  if (AnalogValue>20) {
//Serial.println(analog);
//word arrayBTNReads[] = { 0,0,0,0,0,0,0}; //=====7 элементов для
//byte numCurElement = 0;
     if (numCurElement<7) {
      arrayBTNReads[numCurElement] = AnalogValue;
     //unsigned long currentMillisClickBTN = millis(); 
    //int RaznClickElem = currentMillis - currentMillisClickBTN;    
    //Serial.println("time="+String(RaznClickElem));
      
      numCurElement = numCurElement+1;
      //DATA.VAL=0;
  } else {numCurElement = 0;

  
      quickSort(arrayBTNReads, 0, 6);
      //Serial.println("MAX="+String(arrayBTNReads[6]));

      int retZN = arrayBTNReads[6];
      int SrZnach = 0;
      for (int i = 0; i<7; i++) {
        //Serial.print(String(arrayBTNReads[i])+",");
        SrZnach+=arrayBTNReads[i];
        
        arrayBTNReads[i] = 0;
     }
     SrZnach = SrZnach / 7;
     if (numCurSRElement<7) {
      arrayBTNLineSR[numCurSRElement]=SrZnach;
      numCurSRElement+=1;
      
     //Serial.print("SR KEY= "+String(SrZnach)+",");
     //Serial.println("");     
     
     } else {
     
   word RaznZN = currentMillis - DATA.PERIOD_LAST;
  if (RaznZN >= DATA.PERIOD_) { // таймер на millis()
    DATA.PERIOD_LAST = currentMillis; 
      numCurSRElement = 0;
      //========Набрали 7 средних значений
      //========Сортируем массив средних значений
      quickSort(arrayBTNLineSR, 0, 6);
      int MAXSR_ZN = arrayBTNLineSR[6];
      for (int i = 0; i<7; i++) {
        //Serial.print(String(arrayBTNLineSR[i])+",");
        arrayBTNLineSR[i] = 0;
     }
      
      //Serial.println("");
      //Serial.print("MAX ZN= "+String(MAXSR_ZN)+",");

    
    DATA.VAL=MAXSR_ZN;    
    isButtonClicked = false;
    //Serial.println("MAX="+String(MAXSR_ZN));
     } else {
      for (int i = 0; i<7; i++) {
        //Serial.print(String(arrayBTNLineSR[i])+",");
        arrayBTNLineSR[i] = 0;
        arrayBTNReads[i] = 0;
      
        
     }
      numCurSRElement = 0;
      numCurElement = 0;
    DATA.VAL=0;
    isButtonClicked = true;
  }
   if (!isButtonClicked) {
    Serial.println("KeyVal="+String(DATA.VAL));
if (DATA.VAL <= 1023 && DATA.VAL >= 950) { //ok

    ProcessButtonMenu(1);
    return DATA;
  } else 
  if (DATA.VAL <= 750 && DATA.VAL >= 700) { //ok
    ProcessButtonMenu(2);
    return DATA;
  } else 
  if (DATA.VAL <= 520 && DATA.VAL>= 490) {
    ProcessButtonMenu(3);
    return DATA;
  }
   }
  }
  }
  }
  return DATA;
}

 

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

вот по этому куску кода

if (DATA.VAL <= 1023 && DATA.VAL >= 950) { //ok

    ProcessButtonMenu(1);
    return DATA;
  } else 
  if (DATA.VAL <= 750 && DATA.VAL >= 700) { //ok
    ProcessButtonMenu(2);
    return DATA;
  } else 
  if (DATA.VAL <= 520 && DATA.VAL>= 490) {
    ProcessButtonMenu(3);
    return DATA;
  }

видно, что вы ожидаете первую кнопку на 1000, вторую на 750, третью на 500... и все. а где остальные? 

сколько кнопок у вас всего?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Signalsus пишет:

 

ну код скину


 

Ой спасибо, снизошли! Век буду благдарен!

Но позвольте? А где ж в коде обещанный analogRead()?

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

asam пишет:

Но позвольте? А где ж в коде обещанный analogRead()?

да вот тут вот, вот в этой ветке секретный код ТС

http://arduino.ru/forum/programmirovanie/vopros-s-oprosami-pinov-ili-vypolnenie-koda-po-taimeru-millis

там, кстати, обсуждение кончилось тем, что ТС весь форум на юх послал...

Но из той ветки можно сделать важное открытие - кнопок у ТС всего три, из чего следует, что ТС просто не умеет считать

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Signalsus пишет:

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

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

Во время замыкания или размыкания происходит дребезг и, естественно, показания analogRead() в этот момент будут "не соответствущие текущей кнопки". И не по причине бракованности, а по их механической природе.

Поэтому важно смотреть как именно и за какое время "делал выборку и из них считал среднее"

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

b707 пишет:

да вот тут вот, вот в этой ветке секретный код ТС

http://arduino.ru/forum/programmirovanie/vopros-s-oprosami-pinov-ili-vypolnenie-koda-po-taimeru-millis

там, кстати, обсуждение кончилось тем, что ТС весь форум на юх послал...

О как! Да, зря я время на этого перца тратил. Пусть  дальше самоудовлетворяется.

Signalsus
Offline
Зарегистрирован: 04.11.2018

люди, ну как вас не посылать, среди вас есть и нормальные люди, но я же писал

подключив осцилограф к выходу кнопок, я заметил такую штуку, что бывает возвращает, напряжение, намного меньше, чем оно должно быть

причем, дребезг видно, только кнопку держишь, она должна 4.1 вольта давать, а по факту 3.7

ах да, там еще

b707 пишет:

вот по этому куску кода

if (DATA.VAL <= 1023 && DATA.VAL >= 950) { //ok

    ProcessButtonMenu(1);
    return DATA;
  } else
  if (DATA.VAL <= 750 && DATA.VAL >= 700) { //ok
    ProcessButtonMenu(2);
    return DATA;
  } else
  if (DATA.VAL <= 520 && DATA.VAL>= 490) {
    ProcessButtonMenu(3);
    return DATA;
  }

видно, что вы ожидаете первую кнопку на 1000, вторую на 750, третью на 500... и все. а где остальные?

сколько кнопок у вас всего?

 

какая разница, сколько их я же писал, что глюки, нафига делать обработку для большего числа кнопок?

 

на буржуйских форумах воду никто не льет или молчат или пишут по существу

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

если вы хотите реализовать кнопки на аналоговых пинах где-то здесь на форуме я приводил и схему и код, как это надо делать, тема была про устройство согласования LC

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

Signalsus пишет:

кнопку держишь, она должна 4.1 вольта давать, а по факту 3.7

какая разница, сколько их я же писал, что глюки, нафига делать обработку для большего числа кнопок?

послушайте, Signalsus, по приведенному коду видно, что вы не разбираетесь в схемах и не умеете считать. Поэтому не ваше дело, зачем мне знать число кнопок. Я знаю, где у вас ошибка. Если хотите, чтобы я дал вам решение - четко отвечайте на вопросы.  А нет - идите сами куда подальше, спрашивайте на форумах. где с вами будут возиться как с маленьким

Signalsus
Offline
Зарегистрирован: 04.11.2018

b707 пишет:

Signalsus пишет:

кнопку держишь, она должна 4.1 вольта давать, а по факту 3.7

какая разница, сколько их я же писал, что глюки, нафига делать обработку для большего числа кнопок?

послушайте, Signalsus, по приведенному коду видно, что вы не разбираетесь в схемах и не умеете считать. Поэтому не ваше дело, зачем мне знать число кнопок. Я знаю, где у вас ошибка. Если хотите, чтобы я дал вам решение - четко отвечайте на вопросы.  А нет - идите сами куда подальше, спрашивайте на форумах. где с вами будут возиться как с маленьким

я уже все зделал, ответ нормальный?

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

Signalsus пишет:

я уже все зделал, ответ нормальный?

ну и замечательно, тем более что проблема была ерундовой. Поняли, в чем была ошибка-то, или просто методом тыка цифры подобрали?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
BOOM
BOOM аватар
Онлайн
Зарегистрирован: 14.11.2018

А если быть ещё наглее (и знать в совершенстве англицкий), то на буржуйских форумах можешь ЗАСТАВИТЬ написать код за тебя и силой мысли поправить схему (при необходимости). 
А так то, я ничего против не имею. Если знаешь где найти грибы (или ягоды) зачем лесника пытать?!