Новичок, прошу помощи с кодом.
- Войдите на сайт для отправки комментариев
Здравствуйте! 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) ?
Прошу прощения за путанность объяснения, и наверняка ОЧЕНЬ глупый вопрос. Если можно, то подскажите куда копать, или просто небольшой пример...... Заранее спасибо! )
В подавляющем большинстве случаев это абсолютно некритично - пишите, как Вам больше нравится.
В подавляющем большинстве случаев это абсолютно некритично - пишите, как Вам больше нравится.
Но лучше сразу привыкать к правильному.
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);Но лучше сразу привыкать к правильному.
Что бы потом не было вопросов : как совместить "работу" двух или более "работающих" скетчей, и потом забивать форум темами "помогите новичку". Говнокод он потому и говнокод, что не дает развивать программу. А если все же надо , то надо лезьть в логику самой программы - "измазаться в дерьме".
нихуясе правильному))) и вот этому сразу должен учится новичок? да может ему и ни разу в жизни такое не понадобится
Ну, единственно правильного варианта не может быть в принципе. Предложенный вариант, например, обладает явно повышенной ресурсоемкостью как с точки зрения объема, занимаемого в программной памяти, так и с точки зрения объема вычисления и, следовательно, времени выполнения.
Кроме того, если измеренное напряжение окажется в районе, скажем, 300, то данный код выдаст вердикт, что ни одна из кнопок не была нажата, что совсем не очевидно. Если уж мы жертвуем ресурсоемкостью ради правильности, сделать проверку на "нажато что-то непонятное" нужно было в любом случае.
нихуясе правильному))) и вот этому сразу должен учится новичок? да может ему и ни разу в жизни такое не понадобится
Вы на календарь смотрите. Так напомню сейчас 2017 год. А значит...
точно. оглянутся не успеешь, как 5.11.2017 наступит - нужно закупать оружие, патроны и тушёнку.
сложности работ? то есть писать код, который сложнее в понимании, но работает абсолютно также как без структур, это то что отличает крутого программиста от ардуинщика?
Но лучше сразу привыкать к правильному.
Большое спасибо! Это верно!
Сейчас же нашёл ещё на одном ресурсе такое исполнение (тоже со структурой):
#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 }Попробовал его, адаптировав на свои значения, всё работает! Но сейчас попробую и как вы подсазали! Ещё раз спасибо!
А значит технологии развиваются, и требования к сложности работ возрастают. И новички должны привыкнуть, что все вокруг, а не только в Ардуино, сложно и ответственно. А то дошло до того ,что гвоздь в доску забил и уже столяр лампу на потолке закрутил уже радиоинженер, кирпичи в стену сложил - "окуительный" строитель и т.д.
И тут согласен! ) Сложностей не боюсь, на оборот интресно разобраться, как и почему оно работает!