Новичок, прошу помощи с кодом.

Grizli60rus
Grizli60rus аватар
Offline
Зарегистрирован: 21.03.2017

Здравствуйте! Arduino начал осваивать недавно, простые уроки попробовал. Захотел сделать часы на DS1302, с управлением временем кнопками (SET, UP и DOWN), аналогично уроку 18 (http://lesson.iarduino.ru/page/urok-17-podklyuchenie-rtc-chasy-realnogo-...), с отличием в том, что все три кнопки подключаются к аналоговуму пину 7.

По "железу" собрано всё правильно, при нажатии на кнопки в мониторе порта отображаются различные значения, если не нажато ничего, то 1023.

Вопрос: если в уроке указан номер вывода ардуино к которому подключена кнопка, например:

const uint8_t PIN_button_SET  = 2;
void setup() {
pinMode(PIN_button_SET,  INPUT);
}

ит.п.

То каким образом лучше прописать переход от интервалов с аналогового пина (в который попадает нажатая кнопка, например от 0 до 300, от 300 до 500 и.т.п ), до собственно определения, что нажата именно эта кнопка (например SET), дабы уже с помощью этого работал код из примера выше (урок 18) ?

Прошу прощения за путанность объяснения, и наверняка ОЧЕНЬ глупый вопрос. Если можно, то подскажите куда копать, или просто небольшой пример...... Заранее спасибо! )

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

В подавляющем большинстве случаев это абсолютно некритично - пишите, как Вам больше нравится.

Logik
Offline
Зарегистрирован: 05.08.2014

andriano пишет:

В подавляющем большинстве случаев это абсолютно некритично - пишите, как Вам больше нравится.

Но лучше сразу привыкать к правильному.

typedef struct {
 int Amin; 
 int Amax;
 void (*pFn)(void);
} Btn;

void PressKey1(void){  }
void PressKey2(void){  }
void PressKey3(void){  }

const Btn btn[]={
{100,200, &PressKey1},
{400,600, &PressKey2},
{700,900, &PressKey3}
};

bool ReadKey(const byte A)
{
  int k=analogRead(A);
  for(byte i=0;i<3;i++)
  {
    if((k>btn[i].Amin) && (k<btn[i].Amax))
    {
      btn[i].pFn(); 
      return true;
    } 
  }
  return false;
}


void loop()
{
....
  ReadKey(A1);

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Logik пишет:

Но лучше сразу привыкать к правильному.

Что бы потом не было вопросов : как совместить "работу" двух или более "работающих" скетчей, и потом забивать форум темами "помогите новичку". Говнокод он потому и говнокод, что не дает развивать программу. А если все же надо , то надо лезьть в логику самой программы - "измазаться в дерьме".

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нихуясе правильному))) и вот этому сразу должен учится новичок? да может ему и ни разу в жизни такое не понадобится

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

Ну, единственно правильного варианта не может быть в принципе. Предложенный вариант, например, обладает явно повышенной ресурсоемкостью как с точки зрения объема, занимаемого в программной памяти, так и с точки зрения объема вычисления и, следовательно, времени выполнения.

Кроме того, если измеренное напряжение окажется в районе, скажем, 300, то данный код выдаст вердикт, что ни одна из кнопок не была нажата, что совсем не очевидно. Если уж мы жертвуем ресурсоемкостью ради правильности, сделать проверку на "нажато что-то непонятное" нужно было в любом случае.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

jeka_tm пишет:

нихуясе правильному))) и вот этому сразу должен учится новичок? да может ему и ни разу в жизни такое не понадобится

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

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

qwone пишет:

Вы на календарь смотрите. Так напомню сейчас 2017 год. А значит...

точно. оглянутся не успеешь, как 5.11.2017 наступит - нужно закупать оружие, патроны и тушёнку.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

сложности работ? то есть писать код, который сложнее в понимании, но работает абсолютно также как без структур, это то что отличает крутого программиста от ардуинщика?

Grizli60rus
Grizli60rus аватар
Offline
Зарегистрирован: 21.03.2017

Logik пишет:

Но лучше сразу привыкать к правильному.

Большое спасибо! Это верно!

Сейчас же нашёл ещё на одном ресурсе такое исполнение (тоже со структурой):

#define A_PINS_BASE 100 // номер с которого начинается нумерация наших "псевдо-кнопок".
  
 
#define PIN_RIGHT 100
#define PIN_UP 101
#define PIN_DOWN 102
#define PIN_LEFT 103
#define PIN_SELECT 104
 
struct A_PIN_DESC{ // определяем  структуру которой будем описывать какое значение мы ожидаем для каждого псевдо-пина
   byte pinNo; // номер пина
   int expectedValue;// ожидаемое значение
};
 
A_PIN_DESC expected_values[]={ // ожидаемые значения для псевдо-кнопок
   { PIN_RIGHT,0},
   { PIN_UP,98},
   { PIN_DOWN,253},
   { PIN_LEFT,405},
   { PIN_SELECT,635}
};
 
#define A_PINS_COUNT sizeof(expected_values)/sizeof(A_PIN_DESC) // вычисляем сколько у нас всего "псевдо-кнопок" заданно.
#define A_POSSIBLE_ABERRATION 50 // допустимое отклонение analogRead от ожидаемого значения, при котором псевдо кнопка считается нажатой
 
 
 
 
bool digitalReadA(byte pinNo){
  if(pinNo<A_PINS_BASE)return digitalRead(pinNo); // если номер пина маленький - значит это настоящий пин. читаем его "по обычному", через digitalRead()
   
  for(byte i=0;i<A_PINS_COUNT;i++){ // ищем описание нашего всевдо-пина
     A_PIN_DESC pinDesc=expected_values[i];// берем очередное описание
     if(pinDesc.pinNo==pinNo){ // нашли описание пина?
        int value=analogRead(A0); // производим чтетине аналогово входа
         
        return (abs(value-pinDesc.expectedValue)<A_POSSIBLE_ABERRATION); // возвращаем HIGH если отклонение от ожидаемого не больше чем на A_POSSIBLE_ABERRATION
     }
  }
   
  return LOW; // если не нашли описания - считаем что пин у нас LOW
   
}

Попробовал его, адаптировав на свои значения, всё работает! Но сейчас попробую и как вы подсазали! Ещё раз спасибо!

qwone пишет:

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

И тут согласен! ) Сложностей не боюсь, на оборот интресно разобраться, как и почему оно работает!