Arduino. Сага о кнопках

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Доброго всем времени суток!

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

Работа занимает 44 страницы, и публиковать ее здесь он-лайн я не стал. Работу можно скачать целиком в формате pdf по ссылке
https://yadi.sk/i/VjfxWUTWjPQfW

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

      Оно тебе надо?                                  3

      Ну что ты в этой Дуне нашёл?            4
Быстрый старт                                          4
Разнообразность решаемых задач           4
Распространенность                                 5
Возможность дальнейшего роста            5
Шкурные интересы                                   5

       Учите матчасть!                                 6
Механические                                          7
Сенсорные                                               7
Квазисенсорные                                       8
Дискретные                                              11
Аналоговые                                             11
Кодовые                                                  11
Интерфейсные                                         11
Подключение дискретных кнопок           11
Подключение аналоговых кнопок          16
Подключение кодовых кнопок               19
 

      Песнь кнопки сладкоголосой            22
Ой! На меня надавили                             22
Предъявите квитанцию                           22
Аварийный "гудок"                                 23
И чё делать?                                           24

       Бесчеловечные кнопки                    26
В тебе нет ничего человеческого!          26
Особенности стиля "техно"                     27
Из жизни неживого                                28
Общие рекомендации                             29

        От слов к делу                                31
Постановка задачи                                 31
Выбор конструктива кнопок                   31
Выбор схемотехники клавиатуры           32
Без духа плоть мертва                           34
Постановка задачи                                34
Постановка отладочного эксперимента    35
Структура ПО и данных                         36

Ссылки:                                                 39
Приложение А                                       40
Приложение Б                                       41

Если корифеи найдут в тексте явные промахи,
"и на старуху бывает проруха", то при ответственной аргументации готов
сделать в тексте соответствующие исправления.
 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Duino A.R., Критика принимается? :) Самое главное - это по-моему черезчур много букв и лирики, а полезной информации, картинок, схем и программ относительно мало. Например схему типичных матричных кнопок вы как пример привели, а схемы аналоговых кнопок нет. АЦП почему то рассматривается на примере динозавров типа 572ПА1А, по моему лучше подробнее рассказать про конкретный АЦП меги, раз пишите для ардуинщиков. И ещё выражения типа: "Подтягивающие резисторы лучше всегда включать между входом и линией питания." несколько некорректны, т.к. подтягивающие резисторы никак иначе включить нельзя, для обратного включения есть отдельный термин -стягивающие резисторы "Pull-Down", о котором вы видимо позабыли.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

dimax пишет:

Duino A.R., Критика принимается? :) Самое главное - это по-моему черезчур много букв и лирики, а полезной информации, картинок, схем и программ относительно мало. Например схему типичных матричных кнопок вы как пример привели, а схемы аналоговых кнопок нет. АЦП почему то рассматривается на примере динозавров типа 572ПА1А, по моему лучше подробнее рассказать про конкретный АЦП меги, раз пишите для ардуинщиков. И ещё выражения типа: "Подтягивающие резисторы лучше всегда включать между входом и линией питания." несколько некорректны, т.к. подтягивающие резисторы никак иначе включить нельзя, для обратного включения есть отдельный термин -стягивающие резисторы "Pull-Down", о котором вы видимо позабыли.


1. Конструктивная критика принимается . Я об этом написал сразу.
2. У меня нет задачи научить конкретным проводам. Я ставил задачу показать, как следует включать мозги. Из того, что я вижу на форуме, в 90% случаев осмысленная постановка технической задачи отсутствует. Люди что-то замысливают, замысел по жизни "не лезет", и они трбуют от форумчан "не учить жить", а показать пару "правильных" пинов и скетч впридачу, чтобы их замысел "стал лезть". Я пропагандирую другой подход. Поэтому у меня много букв. :)
3. Кокнкретных АЦП может быть много разных. Я показал на конкретном примере, куда в первую очередь, следует смотреть при их выборе и использовании.
4. Я описал 3 своих резона, почему лучше "подтягивающие" резисторы. О "стягивающих" тоже упомянул, хотя термин "pull-down" не использовал.
5. Для неотличимых внешне шилдов с экраном и аналоговыми кнопками я встречал несколько разных схем. Поэтому и не стал их приводить. Если считаете, что это нужно, можно включить их в "следующее издание". :)
6. Если Вы чувствуете в себе желание и силы, можете подготовить собственный дополнительный материал с большим количеством схем и программ для 2-го издания "переработанного и дополненного". :)

Araris
Offline
Зарегистрирован: 09.11.2012

Очень серьёзный и качественный текст, спасибо Вам за труд. Легкость стиля вызывает добрую зависть.

Есть еще одна тема, вызывающая большие трудности у новичков - работа с millis() vs delay(). Много по ней написано, но и она, на мой взгляд, была бы достойна Вашего пера.

vvadim
Offline
Зарегистрирован: 23.05.2012

и мне понравилось

единственное замечание - повествованию не хватает картинок и кусочков кода по ходу изложения

за труд СПАСИБО!

Гриша
Offline
Зарегистрирован: 27.04.2014

жаль, нет времени почитать... Возможно, не хватает в заголовке "Закон Ома" – почему-то все валятся на элементарных вещах...

скачал, обещаю почитать... :)

ЗЫ на титуле поставьте версию документа :)

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Araris пишет:

Очень серьёзный и качественный текст, спасибо Вам за труд. Легкость стиля вызывает добрую зависть.

Есть еще одна тема, вызывающая большие трудности у новичков - работа с millis() vs delay(). Много по ней написано, но и она, на мой взгляд, была бы достойна Вашего пера.

1. Рад, что Вам понравилось. Спасибо за добрые слова.

2. В примере (Приложение Б) при работе с клавиатурой ни одного delay() нет. Специально разбирать для учебной задачи вариант delay() против millis() мне было не с руки. Я delay() нигде по жизни не использую. :) Мне трудно привести не выдуманные, а реальные и наиболее частые промахи и варианты их исправления.

Гриша
Offline
Зарегистрирован: 27.04.2014

Duino A.R. пишет:

2. В примере (Приложение Б) при работе с клавиатурой ни одного delay() нет. Специально разбирать для учебной задачи вариант delay() против millis() мне было не с руки. Я delay() нигде по жизни не использую. :) Мне трудно привести не выдуманные, а реальные и наиболее частые промахи и варианты их исправления.

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}
/* Blink without Delay
 
 Turns on and off a light emitting diode(LED) connected to a digital  
 pin, without using the delay() function.  This means that other code
 can run at the same time without being interrupted by the LED code.
 
 The circuit:
 * LED attached from pin 13 to ground.
 * Note: on most Arduinos, there is already an LED on the board
 that's attached to pin 13, so no hardware is needed for this example.
 
 
 created 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 
 This example code is in the public domain.

 
 http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
 */

// constants won't change. Used here to 
// set pin numbers:
const int ledPin =  13;      // the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the 
  // difference between the current time and last time you blinked 
  // the LED is bigger than the interval at which you want to 
  // blink the LED.
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}

любой пример работы устройства с кнопками - выход по нажатию кнопки...

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

vvadim пишет:

единственное замечание - повествованию не хватает картинок и кусочков кода по ходу изложения

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

Вполне можете сами поучавствовать в проекте, добавив необходимое (желаемое) в "новое издание" с указанием авторства. :)

Гриша
Offline
Зарегистрирован: 27.04.2014

Duino A.R. пишет:

Вполне можете сами поучавствовать в проекте, добавив необходимое (желаемое) в "новое издание" ...

как прочитаю, поучаствую... 

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Гриша пишет:
почему-то все валятся на элементарных вещах...

Об этом и речь. Всё начинается с того, что люди не знают, чего хотят. Или не умеют сначала сформулировать, а потом формализовать свои желания (в части техники).

Гриша пишет:
ЗЫ на титуле поставьте версию документа :)

Будет новая версия документа, появится она и на титуле. :)

Гриша пишет:

Возможно, не хватает в заголовке "Закон Ома"

Упростим себе задачу. Будем для начала работать с теми, кто отличает "Закон Ома" от "Закона ОМОНа". :)

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

всё это хорошо, но за обзывание кнопочного джойстика "аналоговыми кнопками" и смешиваю халабуды в одну кучу с тактовыми кнопками на цифровых входах - повбывавбы.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Клапауций 070 пишет:

всё это хорошо

Ото ж, разбудили дитятку... Кышь, уси, кышь. Нихай трохе ще поспыть.

Клапауций 070 пишет:
за обзывание кнопочного джойстика "аналоговыми кнопками"

Ипал я такие "джойстики". Недоразумение. Хорошо купил не много. Кнопками назвать - польстить.

Клапауций 070 пишет:
смешиваю халабуды

Ну не мальчик ведь уже халабуды смешивать. То в эвропах халабуда - коктейль, а тут - всегда ёрш получается.

Клапауций 070 пишет:
в одну кучу с тактовыми кнопками на цифровых входах

Кучки разные! Со смешиванием халабуды надо завязывать. Нарыбачился, видать...

Клапауций 070 пишет:

повбывавбы.

"В очередь, Клапауции, в очередь!" :)

vvadim
Offline
Зарегистрирован: 23.05.2012

070, чего к человеку прицепился....

работа нормальная и автор молодец...

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

vvadim пишет:

070, чего к человеку прицепился....

работа нормальная и автор молодец...

это я прицепился? я написал, что нельзя называть аналоговыми кнопками аналоговый кнопочный джойстик.

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

vvadim
Offline
Зарегистрирован: 23.05.2012

ну ладно ладно, не кипятись

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Доброго всем времени суток!

По результатам обсуждения вышла 2-я версия "Саги о кнопках" (переработанная и дополненная). В материал были внесены следующие изменения:

  • приведена принципиальная схема шилда Arduino с двух строчным дисплеем и аналоговой клавиатурой;
  • для шилда Arduino с двух строчным дисплеем и аналоговой клавиатурой приведен проверочный скетч;
  • приведена принципиальная схема аналоговой клавиатуры («кнопочного джойстика»);
  • частично переработан текст раздела «Подключение аналоговых кнопок»;
  • в разделе «Подключение цифровых кнопок» в явном виде указан термин «стягивающие» резисторы («pull-down») и рассмотрены отличия таких резисторов от «подтягивающих» («pull-up»);
  • добавлена Интернет-ссылка на самодельную аналоговую клавиатуру с R-2R матрицей;
  • добавлен раздел «Что новенького?»;
  • добавлен подраздел «Delay() must die!».

Версию 2.0 можно скачать одним файлом в формате pdf по ссылке

https://yadi.sk/d/nXvEorbUjf3oX

 

Joiner
Offline
Зарегистрирован: 04.09.2014

Duino A.R. пишет:

Доброго всем времени суток!

.............................................

Версию 2.0 можно скачать одним файлом в формате pdf по ссылке

https://yadi.sk/d/nXvEorbUjf3oX

Хотел почитать, но

Что это такое?

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

Joiner пишет:

Что это такое?

ничего - скачай и проверь файл здесь https://www.virustotal.com/

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

Прочитал.

Понравилось.

Правда, хотя лично я прочитал все с неослабевающим интересом, не уверен, что таким же образом поступит и некий усредненный читатель: согласен с уже не раз высказанным мнением, что в статье не хватает иллюстраций. Если в техническом отчете наиболее естественным является размещение принципиальной схемы в приложении, то для публикации было бы лучше раздраконить схему на кусочки и размещать эти кусочки по мере описания. А там, где на протяжении 1-2 страниц никакие илюстрации не предусмотрены, разместить хотя бы юмористические рисунки или забавные картинки в тему.

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

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

Цитата:
По условиям задачи самым простым аппаратным решением было бы повесить 7 кнопок на 7 цифровых входов Arduino и программно их обрабатывать каким угодно способом. Минусы такого подхода тоже очевидны: нужного количества цифровых входов обычно просто нет, другой минус – в рамках разработки нужно найти более универсальное и
перспективное решение.

В конкретном проекте не бывает "обычно" - либо 7 свободных контактов есть, либо - нет. Если же мы хотим сделать не конкретное, а именно универсальное решение, никакого другого минуса нет - мы дважды говорим об одном и том же.

 

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

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

Прочитал.

Понравилось.

Спасибо. "Доброе слово и кошке" приятно, а уж автору - тем более.

andriano пишет:

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

1. Рискну предположить, что "некий усредненный читатель" любому чтению вообще может с легкостью предпочесть попкорн, пиво или сериал (или все вкупе). Попадать в такого читателя... Весьма сложная задача.

2. Да, иллюстраций мало. Согласен. Если бы Ардуино была для меня полем постоянной деятельности, я бы знал откуда можно быстро понадергать подходящих схем, картинок, скетчей. Для меня Ардуино "не место имения, а предлог". Поэтому с иллюстративным материалом тяжело. На что в первой версии явно показали пальцем, там добавил. Причем для аналогового джойстика схему пришлось рисовать самому по имеющемуся образцу, поскольку качество схем, найденных в инете, оказалось неудовлетворительным.

andriano пишет:

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

Я это понимаю. Мне неоднократно приходилось писать статьи для детей. Там иллюстрации делали профессиональные художники. :) Это трудоемко. При отсутствии явного официального или социального заказа выкладываться по полной в самому себе придуманной задаче для "научения" других, заранее неизвестных тебе и разных людей... Можно одновременно и промахнуться, и выдохнуться. Поэтому текста больше (идет легче), картинок меньше (силы экономит).

andriano пишет:

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

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

Душа сначала развернулась, потом свернулась, потом снова развернулась, но не так широко. :) Если строго следовать озвученной задачяе, то 3/4 работы нужно было бы опустить, подробно разжевав шаги решения на конкретном примере.  Самому захотелось сазать больше, больше и сказал. На этом фоне "официальная постановка задачи" несколько потерялась. Ну да и ладно. Если честно... Не учебник. Саморекомендованное пособие. :)

andriano пишет:

В конкретном проекте не бывает "обычно" - либо 7 свободных контактов есть, либо - нет. Если же мы хотим сделать не конкретное, а именно универсальное решение, никакого другого минуса нет - мы дважды говорим об одном и том же.

Согласен. Конкретный пример был притянут за уши с такой силой, что они чуть было не оторвались. :) По мере описания он перетек в более универсальный вариант. Текст неоднократно правился, но шероховатости остались.

andriano пишет:

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

Также как экзамен  - это не попытка унизить ученика, а последняя возможность его научить, так и обоснованные и корректные замечания читателя - признак его заинтересованности в материале. :) Насчет "еще". Задач нет, которые бы меня за душу трогали. А без этого...

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

Duino A.R. пишет:

Если строго следовать озвученной задачяе, то 3/4 работы нужно было бы опустить, подробно разжевав шаги решения на конкретном примере.  Самому захотелось сазать больше, больше и сказал. На этом фоне "официальная постановка задачи" несколько потерялась. Ну да и ладно. Если честно... Не учебник. Саморекомендованное пособие. :)

Нет, не так. Совсем не так!

В статье просто блестяще проиллюстрирована мысль, что такой простой объект как кнопка... на самом деле совсем не так прост.

И уже только этого достаточно, чтобы сказать, что статья замечательная.

Цитата:

Также как экзамен  - это не попытка унизить ученика, а последняя возможность его научить, так и обоснованные и корректные замечания читателя - признак его заинтересованности в материале. :) Насчет "еще". Задач нет, которые бы меня за душу трогали. А без этого...

Так появятся.

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

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

Так появятся.

Хочется надеятся. Пока по жизни, как Фридрих Иероним, сам себя за волосы из болота. :)

andriano пишет:

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

Да никакого сомнения в необходимости большего (и просто большого) количества картинок нет. Трудоемкость очень высока. Либо сейчас и минимум картинок, либо... вплоть до никогда. Только поэтому.

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

andriano, поддержу автора. Все таки форум здесь достаточно технический и рисовать комиксы для дебилов есть неблагодарное занятие. Любой дееспособный человек в состоянии осилить 40 страниц текста без привлекушек внимания, а если нет, то это ему и не надо. Да и слог написания весьма легкий для прочтения. Автору благодарность.

GroverSuper
Offline
Зарегистрирован: 13.10.2015

Респект и уважуха! Автор пиши ещё :)

Хорошо написано.

Вот еще тема: Моторы и сервы.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

GroverSuper пишет:

Респект и уважуха! Автор пиши ещё :)

Благодарствуйте! (всяко лучше, чем АМ КГ :))

GroverSuper пишет:
Хорошо написано.

Я старался. :)

GroverSuper пишет:
Вот еще тема: Моторы и сервы.

Легко! Только если сразу... то там Ардуины не будет. Совсем. :)) А это не политкорректно по отношению к интернет-ресурсу. :)

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

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

Duino A.R. пишет:

то там Ардуины не будет. Совсем. :)) А это не политкорректно по отношению к интернет-ресурсу. :)

Отнюдь.

Неполиткорректно - это что-нибудь про Мак ПиСи или, на худой конец, "малину".

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

Гриша
Offline
Зарегистрирован: 27.04.2014

огромное спасибо за труд!!!

Каюсь, еще не осилил 1й вариант до конца – не было времени прочитать его вдумчиво (есть у меня сложности с восприятием печатной информации, как-то картинки, графики и схемы для меня более информативны). Это к слову об отсутствии картинок!!!

Я обещал помочь, помогу, но не так быстро как мне этого хотелось бы – это первое, к автору.

Второе – очень сожалею, что до сих пор никто не может реализовать правку автором (ТС) первого поста, в который можно выкладывать квинтэссенцию всего топика. 

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Гриша пишет:

огромное спасибо за труд!!!

Огромное пожалуйста! :)

Гриша пишет:

(есть у меня сложности с восприятием печатной информации, как-то картинки, графики и схемы для меня более информативны). Это к слову об отсутствии картинок!!!

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

Гриша пишет:

Я обещал помочь, помогу, но не так быстро как мне этого хотелось бы – это первое, к автору.

Жизнь проста для того, кто ее не пробовал. :)

Гриша пишет:

Второе – очень сожалею, что до сих пор никто не может реализовать правку автором (ТС) первого поста, в который можно выкладывать квинтэссенцию всего топика. 

Да, это реальный "минус" форума. Если буду открывать новую тему, в первом посте поставлю только "ДВС!". Думаю, что скачивание Версии 2.0 затруднено тем, что люди банально не могут в потоке сообщений быстро найти перечень изменений и новую ссылку.

melnibo
Offline
Зарегистрирован: 28.11.2015

Duino A.R.

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

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

melnibo пишет:

Duino A.R.

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

melnibo, ну, я же тебе ответил #484 , что невозможно произвести удержание без нажатия, невозможно непорочное зачатие - нет бога... как тебе ещё аргументировать?

melnibo
Offline
Зарегистрирован: 28.11.2015

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

melnibo
Offline
Зарегистрирован: 28.11.2015

первая кнопка будет не совсем кнопкой, а энкодером

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

melnibo пишет:

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

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

melnibo
Offline
Зарегистрирован: 28.11.2015

Клапауций 777... в гугл то схожу, вопрос только в том будет или не будет работать, подробности примеры не нужны, возможно или нет...если возможно то тогда преисполненный уверенностью пойду в гугл, если нет, то буду думать как все организовать по другому

melnibo
Offline
Зарегистрирован: 28.11.2015

про одну кнопку ты убедил что работать не будет, теперь 2 кнопки

 

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

melnibo пишет:

про одну кнопку ты убедил что работать не будет, теперь 2 кнопки

теперь умножь моё(своё) убеждение на два.

std
Offline
Зарегистрирован: 05.01.2012

Можно взять такую вещь, 74HC165 называется. Подключается на 3 провода и даёт возможность поставить 8 кнопок. А ещё можно их поставить много, допустим 5, и подключить уже 40 кнопок. На те же 3 провода.

melnibo
Offline
Зарегистрирован: 28.11.2015

а время удержания кнопки сравнивать можно? держишь кнопку 1 сек один алгоритм или программу, держишь 2секунды(1000<t<2000) то выполняется другой алгоритм?

melnibo
Offline
Зарегистрирован: 28.11.2015

std  вопрос то не про увеличения количества кнопок, а какой будет минимум для определеннной задачи

melnibo
Offline
Зарегистрирован: 28.11.2015

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

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

melnibo, используя дискретную кнопку, Вы можете кодировать информацию тремя параметрами: длительностью нажатия, интервалом между нажатиями, количеством нажатий. Допускаются комбинации параметров. Например, два одиночных нажатия не равно одному двойному. Еще пример, короткие нажатия вызывают переход (по кругу) по пунктам меню. Длинное нажатие - вход в подпункт меню, а очень длинное нажатие - возврат на уровень вверх. Есть масса устройств, где одной кнопкой умудряются выделывать всякие коленца. Предельно неудобно. Во-первых, совершенно неочевидно, какая именно "морзянка" что будет означать. Об интуитивном использовании придется забыть. Во-вторых, длительность ввода команд. При любом использовании параметров, указанных выше, увеличение количества команд будет приводить к затратам времени на их ввод. Поскольку речь идет о человеке, то временнЫе интервалы он должен надежно отличать, а это кратно полусекундам в лучшем случае. Теперь представьте, что Вы ввели ошибочную команду или данные. Сколько времени и сил займет исправление.

ИТОГО: ищите приемлемый компромисс между минимизацией количества кнопок и удобством пользования. Как для себя найдете, так и делайте.

P.S. Собственно одной кнопкой можно сделать практически все. Манипуляция 0-1, на которой держаться все последовательные интерфейсы, это и есть работа одной кнопкой. По последовательному каналу сейчас вон кина гоняют. И самому можно кинцо перекинуть, только займет это сотню-другую лет, несколько рабочих династий "кнопочников" и несколько (или более) ЖД составов с кнопками с учетом их естественного износа. А в принципе... можно.

Гриша
Offline
Зарегистрирован: 27.04.2014

melnibo пишет:

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

у меня меню для часов с одной кнопки, алгоритм:

1) удержание 3 сек - вход в редим програмирования

2) установка первого символа по кругу, через 5 сек после последнего нажатия прога переходит в установку второго символа

3) когда установлен последний символ, через 5 сек после последнего нажатия прога ждет команды на запись в часы

 у меня очень просто, НО!!! можно еще реализовать длинное нажатие (как в 1) -ваыход в подменю и двойное нажатие - возврат. тут есть чего почитать, главное алгоритм придумать, а не заморочку...

 

melnibo
Offline
Зарегистрирован: 28.11.2015

Гриша ..ну вот на вашем прмере с часам можно же реализовать, чтоб одна кнопка управляла и одноцветного светодиода и RGB.. а можно глянуть ваш код часов?

Гриша
Offline
Зарегистрирован: 27.04.2014

melnibo пишет:

Гриша ..ну вот на вашем прмере с часам можно же реализовать, чтоб одна кнопка управляла и одноцветного светодиода и RGB.. а можно глянуть ваш код часов?

можно, но код очень кривой я еще только учусь (это не последний вариант, его не могу найти, но это 100% работает)

//   Типа мой первый проек :) для сэбэ
//   часы с градусником для 8MHz (ATmega8L)
//   в железе:
//   DS1307, saa1064, DS18B20, контроллер с  ARDUINO
//   связь по: IIC (ака I2C, Wire) и OneWire
//   одна кнопка для установки часиков
//   огромное спасибо:
//   http://robocraft.ru/blog/arduino/136.html
//   http://www.hackmeister.dk/2011/01/new-bootloader-file-for-atmega8l/
/*
 Example 39.1 - NXP SAA1064 I2C LED Driver IC Demo I
 Demonstrating display of digits
 http://tronixstuff.com/tutorials > chapter 39
 */
//http://devicter.ru/goods/modul-rtc
//
//

#include <Wire.h>            // enable I2C bus
#include "DS1307.h"
#include <OneWire.h>
OneWire  ds(5);  // OneWire  ds(2); - Линия 1-Wire будет на pin 2
DS1307 clock;//define a object of DS1307 class
// глобальные переменные
  byte saa1064 = 0x70 >> 1; // define the I2C bus address for our SAA1064 (pin 1 to GND)
  int digits[16]={63, 6, 91, 79, 102, 109, 125,7, 127, 111, 119, 124, 57, 94, 121, 113};
  // these are the byte representations of pins required to display each digit 0~9 then A~F
  int k; // знак температуры
  // ниже куча переменных, возможно, можно и меньше сделать
  int x, y, y2;  
  int HD, HS, MD, MS;  // переменные для каждого знака часов и минут
  int HDs, HSs, MDs, MSs; // тоже нужно
  int inpin1=6;// define digital interface #6 for set time - типа кнопка тут

void delay1000 ()  // попробуем заменить все задержки в 1 сек
{ delay (1000); }   // !!!!!!!!!!!!for delay = 1s do not modify !!!!!!
void initDisplay()
// turns on dynamic mode and adjusts segment current to 12mA
{
 Wire.beginTransmission(saa1064);
 Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
 Wire.write(B01000111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current (B01000111), 
                        // 6mA segment current (B00100111), 03mA segment current (B00010111),
 Wire.endTransmission();
 delay1000 ();
}
void setup()
{
//      Serial.begin(9600);   // использовал на стадии дебага - ниже удалил все следы
      Wire.begin(); // start up I2C bus
      delay1000 ();
      initDisplay(); // смотри выше, все написано
      delay1000 ();
      clock.begin();  // угадай, зачем
      delay1000 ();
}
void get2time ()  // вытаскиваем часы посимвольно из RTC 
{
       clock.getTime();
       HD=(clock.hour)/10%10;
       HS=(clock.hour)%10;
       MD=(clock.minute)/10%10;
       MS=(clock.minute)%10;
       HDs=HD;   //десятки часа
       HSs=HS;   // единицы часа
       MDs=MD;   //десятки минут
       MSs=MS;   // единицы минут       
}
//---------------displayDigits   get2time-----------------------------------------------------

void displayDigits1()
 {
  get2time (); 
 Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(digits[(HS)]+128);   //d2
 Wire.write(digits[(MD)]); //d3
 Wire.write(digits[(MS)]); //d4
 Wire.write(digits[(HD)]); //d1
 Wire.endTransmission(); 
 delay1000 ();
 Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(digits[(HS)]);   //d2
 Wire.write(digits[(MD)]); //d3
 Wire.write(digits[(MS)]); //d4
 Wire.write(digits[(HD)]); //d1
 Wire.endTransmission(); 
 delay1000 ();
 }
 
//---------------displayDigits   set2Time-------------------------------------------

            // 1

void displayDigits1s()  // типа символы програмирования часов
 {
 Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(88+128);   //d2
 Wire.write(88); //d3
 Wire.write(88); //d4
 Wire.write(88); //d1
 Wire.endTransmission();
 delay1000 (); 
 }
void displayDigits2s()  // смотреть чего установим в часики
 {
 Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(digits[(HSs)]);   //d2
 Wire.write(digits[(MDs)]); //d3
 Wire.write(digits[(MSs)]); //d4 единицы минут
 Wire.write(digits[(HDs)]); //d1 десятки часов
 Wire.endTransmission(); 
 delay1000 ();
 } 
//----------------------------------------------------------------------------------
void set2Time()
{    //+1        
  
  if(digitalRead(inpin1)==LOW) //test if the button 1 been pushed for set time process:
  {     //+2
     for(x=0; x<=2; x++)                  //test 3-5 times for begin set time process  --- for 1 begin
     {      ///+3
         delay (500);
         
         if(digitalRead(inpin1)==LOW)  // можно заменить на != и все станет проще, но уже мне не важно
         {
           
         }
         else 
         {
         goto stopset;  //не удержал по времни - не вошел в програмирование
         }  
     }        ////-3                        ////  for 1 and
 
        get2time ();
        displayDigits1s(); // указатель входа в програмирование часов
   
        for(x=0; x<=6; x++)             //ready for set  HD     for 2 begin
        {    //+4
          
          
          displayDigits2s(); // готовы програмировать Д1 

              if(digitalRead(inpin1)==LOW)
              {  //+5
              delay1000 ();
              x=0;
           
                   if (HDs<3) 
                    { 
                     y=HDs++ ; 
                    }
                    if (HDs>=3) 
                    { 
                     y=0;
                     HDs=y;
                    }
              y=HDs;
              }   //-5
       
     }    //-4                              // and for 2   
     
       // закончили програмировать Д1
              displayDigits1s(); 

     
     for(x=0; x<=6; x++)             //ready for set  HS     for 3 begin
        {    //+4
          
          displayDigits2s(); // готовы програмировать Д2

              if(digitalRead(inpin1)==LOW)
              {  //+5

              x=0;   // обнулим for чтоб не тупила установка с кнопок
              
              // проверяем, десятки часа 
                  
                   if (HDs==2) 
                    { 
                       if (HSs<4)
                        {
                        y2=HSs++ ; 
                        y2=HSs;   
                       }
                       
                       if (y2>=4) 
                       { 
                        y2=0;
                        HSs=y2;
                       }
                    }
                    if (HDs<2) 
                    { 
                       if (HSs<10)
                        {
                        y2=HSs++ ; 
                        y2=HSs;
                       }
                       if (HSs>=10) 
                       { 
                        y2=0;
                        HSs=y2;
                       }
                    }

              }   //-5
       
     }    //-4                              // and for 3   
     
              displayDigits1s();  //  "SET_D2_and_ "
              
     
     for(x=0; x<=6; x++)             //ready for set  MD     for 4 begin
        {    //+4

            displayDigits2s();

              if(digitalRead(inpin1)==LOW)
              {  //+5
              delay (800);   // можно удалить, наверное 
              x=0;
 //---------------------------------------------------------------------------                 

                        if (MDs<6) //минут < 60
                        {
                        y2=MDs++ ; 
                        y2=MDs;
                       }
                       if (MDs>=6) 
                       { 
                        y2=0;
                        MDs=y2;
                       }
//----------------------------------------------------------------------                  

              }   //-5
       
     }    //-4                         set  MD   and  of for 4    
   
              displayDigits1s();
    
          for(x=0; x<=6; x++)             //ready for set  MS     for 5 begin
        {    //+4

            displayDigits2s();  // готовы програмировать Д4
          
              if(digitalRead(inpin1)==LOW)
              {  //+5

              x=0;
 //---------------------------------------------------------------------------                 

                        if (MSs<10)
                        {
                        y2=MSs++ ; 
                        y2=MSs;
                       }
                       if (MSs>=10) 
                       { 
                        y2=0;
                        MSs=y2;
                       }
//----------------------------------------------------------------------                  

              }   //-5
       
     }    //-4                         set  MS ,  and of for 5       

 
             displayDigits1s();   // готово   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
              
//---------------------write to DS1307
            HD=(HDs*10+HSs);
            if (HD>=24) //защита от кривых рук :)
            { HD=0; }
            MD=(MDs*10+MSs);
            if (MD>=60) //защита от кривых рук :)
            { MD=0; }

            clock.fillByHMS(HD,MD,30);
            clock.setTime();

//------------------------------------------------

  }  //-2
 stopset: ;   // точка выхода, если кнопка не нажата 3 сек
}   //-1

//-------------типа получаем температуру, дебаги отключены (Serial.print)------------


void Temperature()
{
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  
  if (!ds.search(addr)) 
  {
      ds.reset_search();
      return;
  }
  
  if (OneWire::crc8( addr, 7) != addr[7]) 
  {
//      Serial.print("CRC is not valid!\n");
      return;
  }
  
//  if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID)
  if (addr[0] != 0x28)
  {
//      Serial.print("Device is not a DS18x20 family device.\n");
      return;
  }
  
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);    // Запускаем конвертацию
  delay1000 ();   // Подождем...
  
  present = ds.reset();
  ds.select(addr); 
  ds.write(0xBE);    // Считываем ОЗУ датчика  

   // Обрабатываем 9 байт
  for ( i = 0; i < 9; i++) 
  {
    data[i] = ds.read();
  }
  
  // Высчитываем температуру :)
  int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract;
  LowByte = data[0];
  HighByte = data[1];

   TReading = (HighByte << 8) + LowByte;
   SignBit = TReading & 0x8000; // Проверяем дубак там или нет
   
   if (SignBit)      // Если на улице дубак :)
   { 
       TReading = (TReading ^ 0xffff) + 1; 
   }
   Tc_100 = (6 * TReading) + TReading / 4;    // Умножаем на (100 * 0.0625) или 6.25

   // Отделяем целые от дробных чисел
   Whole = Tc_100 / 100;
   Fract = Tc_100 % 100;

if (SignBit) 
   { 
     k=64;
   }
   else
   {
     k=88;
   } 
{   
Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(digits[(Whole)/10]);   //d2   (digits[(clock.hour)%10]+128);   //d2
 Wire.write(digits[(Whole)%10]+128); //d3
 Wire.write(digits[(Fract)/10]); //d4
 Wire.write(k); //d1     // знак  температуры "с" если +, "-" если <0 
 Wire.endTransmission();    
 delay(6000);
}   
} 

   
void loop()
{
  Temperature();
 delay1000 ();
 set2Time();
 
 for (int l=0; l<=3; l++)
 {
  displayDigits1();
 }

}

UPD. нормальный код для кнопки описан в статье "класс титановый велосипед для тактовой кнопки" но и там идут обсуждения :) слишком много НО.

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

Гриша пишет:

UPD. нормальный код для кнопки описан в статье "класс титановый велосипед для тактовой кнопки" но и там идут обсуждения :) слишком много НО.

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

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

Гриша
Offline
Зарегистрирован: 27.04.2014

Клапауций 777 пишет:

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

Тут больше половины пользователей вообще не понимают элементарного :) чтобы что-то написать нужно ТЗ, а его составлять некому, вот и обсуждаем миражи (кому-то померещелось не разобравшись).

Может через год... код переварится и обкатается - тогда и будт предложения, а пока, лично мне, добавить нечего... а топики друг-друга неплохо дополняют ИМХО

ВладимирТ
Offline
Зарегистрирован: 15.12.2020

Начал читать - пока интересно и поучительно. Единственное - бросилось в глаза обилие орфографических ошибок с "Ь" ("что делать", "что делает").  Тема очень популярная, но легко устраняемая. Если автору лень, могу сделать коррекцию. Негоже серьёзный труд портить детскими ошибками.

GarryC
Offline
Зарегистрирован: 08.08.2016

Относительно примера 2 приложения Г.
Как неоднократно было указано на этом ресурсе, конструкция

if ((currentTime - loopTime) >= 1000)

навсегда снимает вопрос о переполнении таймера

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

ВладимирТ, за предложение спасибо, только данной работе уже более 5 лет, на мой взгляд, делать корректуру имеет смысл только при подготовке новой версии, а таковой не планируется. По замечаниям и предложениям форумчан была выпущена версия 2.0 (ссылка на скачивание есть в теме). Там есть дополнения, исправления и новые неточности. :)) Но за это время все они были неоднократно обсуждены, поэтому в выпуске новой версии я смысла не вижу.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

GarryC пишет:

Относительно примера 2 приложения Г.
Как неоднократно было указано на этом ресурсе, конструкция

if ((currentTime - loopTime) >= 1000)

навсегда снимает вопрос о переполнении таймера

В первом абзаце параграфа "Delay() must die!" я честно признаюсь, что примеры из приложения "Г" я взял "как есть" с ресурса "Arduino UNO урок 3 - Тайминг http://cxem.net/arduino/arduino5.php" (N 14 в списке литературы). Мне так было удобней. Быстро проиллюстрировать сам подход. В последствии это вызвало некоторые нарекания со стороны старожилов форума. Соглашусь, но корректировать текст сейчас смысла не вижу. Вопрос, действительно, решён давным давно.