Arduino. Сага о кнопках
- Войдите на сайт для отправки комментариев
Доброго всем времени суток!
Чтение и участие в форуме подвигло меня написать работу под названием "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
Если корифеи найдут в тексте явные промахи,
"и на старуху бывает проруха", то при ответственной аргументации готов
сделать в тексте соответствующие исправления.
Duino A.R., Критика принимается? :) Самое главное - это по-моему черезчур много букв и лирики, а полезной информации, картинок, схем и программ относительно мало. Например схему типичных матричных кнопок вы как пример привели, а схемы аналоговых кнопок нет. АЦП почему то рассматривается на примере динозавров типа 572ПА1А, по моему лучше подробнее рассказать про конкретный АЦП меги, раз пишите для ардуинщиков. И ещё выражения типа: "Подтягивающие резисторы лучше всегда включать между входом и линией питания." несколько некорректны, т.к. подтягивающие резисторы никак иначе включить нельзя, для обратного включения есть отдельный термин -стягивающие резисторы "Pull-Down", о котором вы видимо позабыли.
Duino A.R., Критика принимается? :) Самое главное - это по-моему черезчур много букв и лирики, а полезной информации, картинок, схем и программ относительно мало. Например схему типичных матричных кнопок вы как пример привели, а схемы аналоговых кнопок нет. АЦП почему то рассматривается на примере динозавров типа 572ПА1А, по моему лучше подробнее рассказать про конкретный АЦП меги, раз пишите для ардуинщиков. И ещё выражения типа: "Подтягивающие резисторы лучше всегда включать между входом и линией питания." несколько некорректны, т.к. подтягивающие резисторы никак иначе включить нельзя, для обратного включения есть отдельный термин -стягивающие резисторы "Pull-Down", о котором вы видимо позабыли.
1. Конструктивная критика принимается . Я об этом написал сразу.
2. У меня нет задачи научить конкретным проводам. Я ставил задачу показать, как следует включать мозги. Из того, что я вижу на форуме, в 90% случаев осмысленная постановка технической задачи отсутствует. Люди что-то замысливают, замысел по жизни "не лезет", и они трбуют от форумчан "не учить жить", а показать пару "правильных" пинов и скетч впридачу, чтобы их замысел "стал лезть". Я пропагандирую другой подход. Поэтому у меня много букв. :)
3. Кокнкретных АЦП может быть много разных. Я показал на конкретном примере, куда в первую очередь, следует смотреть при их выборе и использовании.
4. Я описал 3 своих резона, почему лучше "подтягивающие" резисторы. О "стягивающих" тоже упомянул, хотя термин "pull-down" не использовал.
5. Для неотличимых внешне шилдов с экраном и аналоговыми кнопками я встречал несколько разных схем. Поэтому и не стал их приводить. Если считаете, что это нужно, можно включить их в "следующее издание". :)
6. Если Вы чувствуете в себе желание и силы, можете подготовить собственный дополнительный материал с большим количеством схем и программ для 2-го издания "переработанного и дополненного". :)
Очень серьёзный и качественный текст, спасибо Вам за труд. Легкость стиля вызывает добрую зависть.
Есть еще одна тема, вызывающая большие трудности у новичков - работа с millis() vs delay(). Много по ней написано, но и она, на мой взгляд, была бы достойна Вашего пера.
и мне понравилось
единственное замечание - повествованию не хватает картинок и кусочков кода по ходу изложения
за труд СПАСИБО!
жаль, нет времени почитать... Возможно, не хватает в заголовке "Закон Ома" – почему-то все валятся на элементарных вещах...
скачал, обещаю почитать... :)
ЗЫ на титуле поставьте версию документа :)
Очень серьёзный и качественный текст, спасибо Вам за труд. Легкость стиля вызывает добрую зависть.
Есть еще одна тема, вызывающая большие трудности у новичков - работа с millis() vs delay(). Много по ней написано, но и она, на мой взгляд, была бы достойна Вашего пера.
1. Рад, что Вам понравилось. Спасибо за добрые слова.
2. В примере (Приложение Б) при работе с клавиатурой ни одного delay() нет. Специально разбирать для учебной задачи вариант delay() против millis() мне было не с руки. Я delay() нигде по жизни не использую. :) Мне трудно привести не выдуманные, а реальные и наиболее частые промахи и варианты их исправления.
2. В примере (Приложение Б) при работе с клавиатурой ни одного delay() нет. Специально разбирать для учебной задачи вариант delay() против millis() мне было не с руки. Я delay() нигде по жизни не использую. :) Мне трудно привести не выдуманные, а реальные и наиболее частые промахи и варианты их исправления.
01
/*
02
Blink
03
Turns on an LED on for one second, then off for one second, repeatedly.
04
05
This example code is in the public domain.
06
*/
07
08
// Pin 13 has an LED connected on most Arduino boards.
09
// give it a name:
10
int
led = 13;
11
12
// the setup routine runs once when you press reset:
13
void
setup
() {
14
// initialize the digital pin as an output.
15
pinMode(led, OUTPUT);
16
}
17
18
// the loop routine runs over and over again forever:
19
void
loop
() {
20
digitalWrite(led, HIGH);
// turn the LED on (HIGH is the voltage level)
21
delay(1000);
// wait for a second
22
digitalWrite(led, LOW);
// turn the LED off by making the voltage LOW
23
delay(1000);
// wait for a second
24
}
01
/* Blink without Delay
02
03
Turns on and off a light emitting diode(LED) connected to a digital
04
pin, without using the delay() function. This means that other code
05
can run at the same time without being interrupted by the LED code.
06
07
The circuit:
08
* LED attached from pin 13 to ground.
09
* Note: on most Arduinos, there is already an LED on the board
10
that's attached to pin 13, so no hardware is needed for this example.
11
12
13
created 2005
14
by David A. Mellis
15
modified 8 Feb 2010
16
by Paul Stoffregen
17
18
This example code is in the public domain.
19
20
21
<a href="http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay" title="http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay" rel="nofollow">http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay</a>
22
*/
23
24
// constants won't change. Used here to
25
// set pin numbers:
26
const
int
ledPin = 13;
// the number of the LED pin
27
28
// Variables will change:
29
int
ledState = LOW;
// ledState used to set the LED
30
long
previousMillis = 0;
// will store last time LED was updated
31
32
// the follow variables is a long because the time, measured in miliseconds,
33
// will quickly become a bigger number than can be stored in an int.
34
long
interval = 1000;
// interval at which to blink (milliseconds)
35
36
void
setup
() {
37
// set the digital pin as output:
38
pinMode(ledPin, OUTPUT);
39
}
40
41
void
loop
()
42
{
43
// here is where you'd put code that needs to be running all the time.
44
45
// check to see if it's time to blink the LED; that is, if the
46
// difference between the current time and last time you blinked
47
// the LED is bigger than the interval at which you want to
48
// blink the LED.
49
unsigned
long
currentMillis = millis();
50
51
if
(currentMillis - previousMillis > interval) {
52
// save the last time you blinked the LED
53
previousMillis = currentMillis;
54
55
// if the LED is off turn it on and vice-versa:
56
if
(ledState == LOW)
57
ledState = HIGH;
58
else
59
ledState = LOW;
60
61
// set the LED with the ledState of the variable:
62
digitalWrite(ledPin, ledState);
63
}
64
}
любой пример работы устройства с кнопками - выход по нажатию кнопки...
единственное замечание - повествованию не хватает картинок и кусочков кода по ходу изложения
Это можно поправить, но тогда мне точно нужно знать, каких именно картинок и какого кода не хватает. Картинки и код для Ардуино - для меня отдельная трудоемкая задача. Абсолютное большинство практического опыта набрано на совсем другом железе и в других программных средах. Многих уже и в помине нет. Да и прыткость уже того... Стал свой пример от лишнего чистить - пропотел...
Вполне можете сами поучавствовать в проекте, добавив необходимое (желаемое) в "новое издание" с указанием авторства. :)
Вполне можете сами поучавствовать в проекте, добавив необходимое (желаемое) в "новое издание" ...
как прочитаю, поучаствую...
Об этом и речь. Всё начинается с того, что люди не знают, чего хотят. Или не умеют сначала сформулировать, а потом формализовать свои желания (в части техники).
Будет новая версия документа, появится она и на титуле. :)
Возможно, не хватает в заголовке "Закон Ома"
Упростим себе задачу. Будем для начала работать с теми, кто отличает "Закон Ома" от "Закона ОМОНа". :)
всё это хорошо, но за обзывание кнопочного джойстика "аналоговыми кнопками" и смешиваю халабуды в одну кучу с тактовыми кнопками на цифровых входах - повбывавбы.
всё это хорошо
Ото ж, разбудили дитятку... Кышь, уси, кышь. Нихай трохе ще поспыть.
Ипал я такие "джойстики". Недоразумение. Хорошо купил не много. Кнопками назвать - польстить.
Ну не мальчик ведь уже халабуды смешивать. То в эвропах халабуда - коктейль, а тут - всегда ёрш получается.
Кучки разные! Со смешиванием халабуды надо завязывать. Нарыбачился, видать...
повбывавбы.
"В очередь, Клапауции, в очередь!" :)
070, чего к человеку прицепился....
работа нормальная и автор молодец...
070, чего к человеку прицепился....
работа нормальная и автор молодец...
это я прицепился? я написал, что нельзя называть аналоговыми кнопками аналоговый кнопочный джойстик.
всё. при чём тут автор, вообще - Лешак аналогичной ересью страдал, при всём моём ега уважении, как программиста, но сам он признавал, что дерево в железе.
ну ладно ладно, не кипятись
Доброго всем времени суток!
По результатам обсуждения вышла 2-я версия "Саги о кнопках" (переработанная и дополненная). В материал были внесены следующие изменения:
Версию 2.0 можно скачать одним файлом в формате pdf по ссылке
https://yadi.sk/d/nXvEorbUjf3oX
Доброго всем времени суток!
.............................................
Версию 2.0 можно скачать одним файлом в формате pdf по ссылке
https://yadi.sk/d/nXvEorbUjf3oX
Хотел почитать, но
Что это такое?
Что это такое?
ничего - скачай и проверь файл здесь https://www.virustotal.com/
Прочитал.
Понравилось.
Правда, хотя лично я прочитал все с неослабевающим интересом, не уверен, что таким же образом поступит и некий усредненный читатель: согласен с уже не раз высказанным мнением, что в статье не хватает иллюстраций. Если в техническом отчете наиболее естественным является размещение принципиальной схемы в приложении, то для публикации было бы лучше раздраконить схему на кусочки и размещать эти кусочки по мере описания. А там, где на протяжении 1-2 страниц никакие илюстрации не предусмотрены, разместить хотя бы юмористические рисунки или забавные картинки в тему.
Немного разочаровало, что обещание "показать, каким образом ставиться техническая задача и как она решается" не получило вразумительного воплощения.
Цепочка от постановки до решения занимает менее четверти от всего объема статьи, на этом отрезке повторяется дважды и оба раза не очень убедительно.
перспективное решение.
В конкретном проекте не бывает "обычно" - либо 7 свободных контактов есть, либо - нет. Если же мы хотим сделать не конкретное, а именно универсальное решение, никакого другого минуса нет - мы дважды говорим об одном и том же.
Но в целом - побольше бы таких статей. А замечания - лишь с целью улучшить, если не эту статью, то, хотя бы, следующие, которые, я надеюсь, Вы еще напишете.
Прочитал.
Понравилось.
Спасибо. "Доброе слово и кошке" приятно, а уж автору - тем более.
Правда, хотя лично я прочитал все с неослабевающим интересом, не уверен, что таким же образом поступит и некий усредненный читатель: согласен с уже не раз высказанным мнением, что в статье не хватает иллюстраций.
1. Рискну предположить, что "некий усредненный читатель" любому чтению вообще может с легкостью предпочесть попкорн, пиво или сериал (или все вкупе). Попадать в такого читателя... Весьма сложная задача.
2. Да, иллюстраций мало. Согласен. Если бы Ардуино была для меня полем постоянной деятельности, я бы знал откуда можно быстро понадергать подходящих схем, картинок, скетчей. Для меня Ардуино "не место имения, а предлог". Поэтому с иллюстративным материалом тяжело. На что в первой версии явно показали пальцем, там добавил. Причем для аналогового джойстика схему пришлось рисовать самому по имеющемуся образцу, поскольку качество схем, найденных в инете, оказалось неудовлетворительным.
А там, где на протяжении 1-2 страниц никакие илюстрации не предусмотрены, разместить хотя бы юмористические рисунки или забавные картинки в тему.
Я это понимаю. Мне неоднократно приходилось писать статьи для детей. Там иллюстрации делали профессиональные художники. :) Это трудоемко. При отсутствии явного официального или социального заказа выкладываться по полной в самому себе придуманной задаче для "научения" других, заранее неизвестных тебе и разных людей... Можно одновременно и промахнуться, и выдохнуться. Поэтому текста больше (идет легче), картинок меньше (силы экономит).
Немного разочаровало, что обещание "показать, каким образом ставиться техническая задача и как она решается" не получило вразумительного воплощения.
Цепочка от постановки до решения занимает менее четверти от всего объема статьи, на этом отрезке повторяется дважды и оба раза не очень убедительно.
Душа сначала развернулась, потом свернулась, потом снова развернулась, но не так широко. :) Если строго следовать озвученной задачяе, то 3/4 работы нужно было бы опустить, подробно разжевав шаги решения на конкретном примере. Самому захотелось сазать больше, больше и сказал. На этом фоне "официальная постановка задачи" несколько потерялась. Ну да и ладно. Если честно... Не учебник. Саморекомендованное пособие. :)
В конкретном проекте не бывает "обычно" - либо 7 свободных контактов есть, либо - нет. Если же мы хотим сделать не конкретное, а именно универсальное решение, никакого другого минуса нет - мы дважды говорим об одном и том же.
Согласен. Конкретный пример был притянут за уши с такой силой, что они чуть было не оторвались. :) По мере описания он перетек в более универсальный вариант. Текст неоднократно правился, но шероховатости остались.
Но в целом - побольше бы таких статей. А замечания - лишь с целью улучшить, если не эту статью, то, хотя бы, следующие, которые, я надеюсь, Вы еще напишете.
Также как экзамен - это не попытка унизить ученика, а последняя возможность его научить, так и обоснованные и корректные замечания читателя - признак его заинтересованности в материале. :) Насчет "еще". Задач нет, которые бы меня за душу трогали. А без этого...
Если строго следовать озвученной задачяе, то 3/4 работы нужно было бы опустить, подробно разжевав шаги решения на конкретном примере. Самому захотелось сазать больше, больше и сказал. На этом фоне "официальная постановка задачи" несколько потерялась. Ну да и ладно. Если честно... Не учебник. Саморекомендованное пособие. :)
Нет, не так. Совсем не так!
В статье просто блестяще проиллюстрирована мысль, что такой простой объект как кнопка... на самом деле совсем не так прост.
И уже только этого достаточно, чтобы сказать, что статья замечательная.
Также как экзамен - это не попытка унизить ученика, а последняя возможность его научить, так и обоснованные и корректные замечания читателя - признак его заинтересованности в материале. :) Насчет "еще". Задач нет, которые бы меня за душу трогали. А без этого...
Так появятся.
А по поводу "нужно больше картинок", до этого я отнюдь не сам дошел. Наверное, мог бы и сам, но "старшие товарищи" не дали - объяснили все доступно в самом начале моей журналистской деятельности. Иак что это опыт людей безусловно профессиональных.
Так появятся.
Хочется надеятся. Пока по жизни, как Фридрих Иероним, сам себя за волосы из болота. :)
А по поводу "нужно больше картинок", до этого я отнюдь не сам дошел. Наверное, мог бы и сам, но "старшие товарищи" не дали - объяснили все доступно в самом начале моей журналистской деятельности. Иак что это опыт людей безусловно профессиональных.
Да никакого сомнения в необходимости большего (и просто большого) количества картинок нет. Трудоемкость очень высока. Либо сейчас и минимум картинок, либо... вплоть до никогда. Только поэтому.
andriano, поддержу автора. Все таки форум здесь достаточно технический и рисовать комиксы для дебилов есть неблагодарное занятие. Любой дееспособный человек в состоянии осилить 40 страниц текста без привлекушек внимания, а если нет, то это ему и не надо. Да и слог написания весьма легкий для прочтения. Автору благодарность.
Респект и уважуха! Автор пиши ещё :)
Хорошо написано.
Вот еще тема: Моторы и сервы.
Респект и уважуха! Автор пиши ещё :)
Благодарствуйте! (всяко лучше, чем АМ КГ :))
Я старался. :)
Легко! Только если сразу... то там Ардуины не будет. Совсем. :)) А это не политкорректно по отношению к интернет-ресурсу. :)
Мотивация, которая бы сподвигла меня теперь уже вместе с Дуней очередной раз пройти собственноручно по электромеханическим приводам, на сегодня отсутствует. Появится ли, не знаю.
то там Ардуины не будет. Совсем. :)) А это не политкорректно по отношению к интернет-ресурсу. :)
Отнюдь.
Неполиткорректно - это что-нибудь про Мак ПиСи или, на худой конец, "малину".
А всякая электромеханика, для упревления которой, собственно, и используется Ардуино, - вполне в тему.
огромное спасибо за труд!!!
Каюсь, еще не осилил 1й вариант до конца – не было времени прочитать его вдумчиво (есть у меня сложности с восприятием печатной информации, как-то картинки, графики и схемы для меня более информативны). Это к слову об отсутствии картинок!!!
Я обещал помочь, помогу, но не так быстро как мне этого хотелось бы – это первое, к автору.
Второе – очень сожалею, что до сих пор никто не может реализовать правку автором (ТС) первого поста, в который можно выкладывать квинтэссенцию всего топика.
огромное спасибо за труд!!!
Огромное пожалуйста! :)
(есть у меня сложности с восприятием печатной информации, как-то картинки, графики и схемы для меня более информативны). Это к слову об отсутствии картинок!!!
Телевидение вполне закономерно практически вытеснило радио. У меня картинок мало из-за большой трудоемкости. Я "отвечаю за базар". Очевидные иллюстрации из инета надергать можно, и "их есть у меня". А вот схемы, скетчи. Их и найти тяжелей, и проверять надо. Поэтому - минимум.
Я обещал помочь, помогу, но не так быстро как мне этого хотелось бы – это первое, к автору.
Жизнь проста для того, кто ее не пробовал. :)
Второе – очень сожалею, что до сих пор никто не может реализовать правку автором (ТС) первого поста, в который можно выкладывать квинтэссенцию всего топика.
Да, это реальный "минус" форума. Если буду открывать новую тему, в первом посте поставлю только "ДВС!". Думаю, что скачивание Версии 2.0 затруднено тем, что люди банально не могут в потоке сообщений быстро найти перечень изменений и новую ссылку.
Duino A.R.
а правда что нельзя организовать такой алгоритм, нажал кнопку загорелся светодиод, нажал повторно потух, удержание кнопки вызывает меню, одинарное нажатие выполнить первую программу, двойное вторую, тройное третью и тд?
Duino A.R.
а правда что нельзя организовать такой алгоритм, нажал кнопку загорелся светодиод, нажал повторно потух, удержание кнопки вызывает меню, одинарное нажатие выполнить первую программу, двойное вторую, тройное третью и тд?
melnibo, ну, я же тебе ответил #484 , что невозможно произвести удержание без нажатия, невозможно непорочное зачатие - нет бога... как тебе ещё аргументировать?
а если добавить вторую кнопку, которая будет вызывать меню, которое управляется первой кнопкой... задача обойтись минимумом кнопок
первая кнопка будет не совсем кнопкой, а энкодером
а если добавить вторую кнопку, которая будет вызывать меню, которое управляется первой кнопкой... задача обойтись минимумом кнопок
сходи в гугл по запросу [arduino однокнопочное меню] и не морочь людям голову - тема о кнопках, а не об алгоритмах работы с кнопками
Клапауций 777... в гугл то схожу, вопрос только в том будет или не будет работать, подробности примеры не нужны, возможно или нет...если возможно то тогда преисполненный уверенностью пойду в гугл, если нет, то буду думать как все организовать по другому
про одну кнопку ты убедил что работать не будет, теперь 2 кнопки
про одну кнопку ты убедил что работать не будет, теперь 2 кнопки
теперь умножь моё(своё) убеждение на два.
Можно взять такую вещь, 74HC165 называется. Подключается на 3 провода и даёт возможность поставить 8 кнопок. А ещё можно их поставить много, допустим 5, и подключить уже 40 кнопок. На те же 3 провода.
а время удержания кнопки сравнивать можно? держишь кнопку 1 сек один алгоритм или программу, держишь 2секунды(1000<t<2000) то выполняется другой алгоритм?
std вопрос то не про увеличения количества кнопок, а какой будет минимум для определеннной задачи
там помимо кнопок будет много других приблуд скорее всего...а место огранченно, заполнять его одними только кнопками неохото..
melnibo, используя дискретную кнопку, Вы можете кодировать информацию тремя параметрами: длительностью нажатия, интервалом между нажатиями, количеством нажатий. Допускаются комбинации параметров. Например, два одиночных нажатия не равно одному двойному. Еще пример, короткие нажатия вызывают переход (по кругу) по пунктам меню. Длинное нажатие - вход в подпункт меню, а очень длинное нажатие - возврат на уровень вверх. Есть масса устройств, где одной кнопкой умудряются выделывать всякие коленца. Предельно неудобно. Во-первых, совершенно неочевидно, какая именно "морзянка" что будет означать. Об интуитивном использовании придется забыть. Во-вторых, длительность ввода команд. При любом использовании параметров, указанных выше, увеличение количества команд будет приводить к затратам времени на их ввод. Поскольку речь идет о человеке, то временнЫе интервалы он должен надежно отличать, а это кратно полусекундам в лучшем случае. Теперь представьте, что Вы ввели ошибочную команду или данные. Сколько времени и сил займет исправление.
ИТОГО: ищите приемлемый компромисс между минимизацией количества кнопок и удобством пользования. Как для себя найдете, так и делайте.
P.S. Собственно одной кнопкой можно сделать практически все. Манипуляция 0-1, на которой держаться все последовательные интерфейсы, это и есть работа одной кнопкой. По последовательному каналу сейчас вон кина гоняют. И самому можно кинцо перекинуть, только займет это сотню-другую лет, несколько рабочих династий "кнопочников" и несколько (или более) ЖД составов с кнопками с учетом их естественного износа. А в принципе... можно.
там помимо кнопок будет много других приблуд скорее всего...а место огранченно, заполнять его одними только кнопками неохото..
у меня меню для часов с одной кнопки, алгоритм:
1) удержание 3 сек - вход в редим програмирования
2) установка первого символа по кругу, через 5 сек после последнего нажатия прога переходит в установку второго символа
3) когда установлен последний символ, через 5 сек после последнего нажатия прога ждет команды на запись в часы
у меня очень просто, НО!!! можно еще реализовать длинное нажатие (как в 1) -ваыход в подменю и двойное нажатие - возврат. тут есть чего почитать, главное алгоритм придумать, а не заморочку...
Гриша ..ну вот на вашем прмере с часам можно же реализовать, чтоб одна кнопка управляла и одноцветного светодиода и RGB.. а можно глянуть ваш код часов?
Гриша ..ну вот на вашем прмере с часам можно же реализовать, чтоб одна кнопка управляла и одноцветного светодиода и RGB.. а можно глянуть ваш код часов?
можно, но код очень кривой я еще только учусь (это не последний вариант, его не могу найти, но это 100% работает)
001
// Типа мой первый проек :) для сэбэ
002
// часы с градусником для 8MHz (ATmega8L)
003
// в железе:
004
// DS1307, saa1064, DS18B20, контроллер с ARDUINO
005
// связь по: IIC (ака I2C, Wire) и OneWire
006
// одна кнопка для установки часиков
007
// огромное спасибо:
008
// <a href="http://robocraft.ru/blog/arduino/136.html" rel="nofollow">http://robocraft.ru/blog/arduino/136.html</a>
009
// <a href="http://www.hackmeister.dk/2011/01/new-bootloader-file-for-atmega8l/" rel="nofollow">http://www.hackmeister.dk/2011/01/new-bootloader-file-for-atmega8l/</a>
010
/*
011
Example 39.1 - NXP SAA1064 I2C LED Driver IC Demo I
012
Demonstrating display of digits
013
<a href="http://tronixstuff.com/tutorials" rel="nofollow">http://tronixstuff.com/tutorials</a> > chapter 39
014
*/
015
//<a href="http://devicter.ru/goods/modul-rtc" rel="nofollow">http://devicter.ru/goods/modul-rtc</a>
016
//
017
//
018
019
#include <Wire.h> // enable I2C bus
020
#include "DS1307.h"
021
#include <OneWire.h>
022
OneWire ds(5);
// OneWire ds(2); - Линия 1-Wire будет на pin 2
023
DS1307 clock;
//define a object of DS1307 class
024
// глобальные переменные
025
byte
saa1064 = 0x70 >> 1;
// define the I2C bus address for our SAA1064 (pin 1 to GND)
026
int
digits[16]={63, 6, 91, 79, 102, 109, 125,7, 127, 111, 119, 124, 57, 94, 121, 113};
027
// these are the byte representations of pins required to display each digit 0~9 then A~F
028
int
k;
// знак температуры
029
// ниже куча переменных, возможно, можно и меньше сделать
030
int
x, y, y2;
031
int
HD, HS, MD, MS;
// переменные для каждого знака часов и минут
032
int
HDs, HSs, MDs, MSs;
// тоже нужно
033
int
inpin1=6;
// define digital interface #6 for set time - типа кнопка тут
034
035
void
delay1000 ()
// попробуем заменить все задержки в 1 сек
036
{ delay (1000); }
// !!!!!!!!!!!!for delay = 1s do not modify !!!!!!
037
void
initDisplay()
038
// turns on dynamic mode and adjusts segment current to 12mA
039
{
040
Wire.beginTransmission(saa1064);
041
Wire.write(B00000000);
// this is the instruction byte. Zero means the next byte is the control byte
042
Wire.write(B01000111);
// control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current (B01000111),
043
// 6mA segment current (B00100111), 03mA segment current (B00010111),
044
Wire.endTransmission();
045
delay1000 ();
046
}
047
void
setup
()
048
{
049
// Serial.begin(9600); // использовал на стадии дебага - ниже удалил все следы
050
Wire.begin();
// start up I2C bus
051
delay1000 ();
052
initDisplay();
// смотри выше, все написано
053
delay1000 ();
054
clock.begin();
// угадай, зачем
055
delay1000 ();
056
}
057
void
get2time ()
// вытаскиваем часы посимвольно из RTC
058
{
059
clock.getTime();
060
HD=(clock.hour)/10%10;
061
HS=(clock.hour)%10;
062
MD=(clock.minute)/10%10;
063
MS=(clock.minute)%10;
064
HDs=HD;
//десятки часа
065
HSs=HS;
// единицы часа
066
MDs=MD;
//десятки минут
067
MSs=MS;
// единицы минут
068
}
069
//---------------displayDigits get2time-----------------------------------------------------
070
071
void
displayDigits1()
072
{
073
get2time ();
074
Wire.beginTransmission(saa1064);
075
Wire.write(1);
// instruction byte - first digit to control is 1 (right hand side)
076
Wire.write(digits[(HS)]+128);
//d2
077
Wire.write(digits[(MD)]);
//d3
078
Wire.write(digits[(MS)]);
//d4
079
Wire.write(digits[(HD)]);
//d1
080
Wire.endTransmission();
081
delay1000 ();
082
Wire.beginTransmission(saa1064);
083
Wire.write(1);
// instruction byte - first digit to control is 1 (right hand side)
084
Wire.write(digits[(HS)]);
//d2
085
Wire.write(digits[(MD)]);
//d3
086
Wire.write(digits[(MS)]);
//d4
087
Wire.write(digits[(HD)]);
//d1
088
Wire.endTransmission();
089
delay1000 ();
090
}
091
092
//---------------displayDigits set2Time-------------------------------------------
093
094
// 1
095
096
void
displayDigits1s()
// типа символы програмирования часов
097
{
098
Wire.beginTransmission(saa1064);
099
Wire.write(1);
// instruction byte - first digit to control is 1 (right hand side)
100
Wire.write(88+128);
//d2
101
Wire.write(88);
//d3
102
Wire.write(88);
//d4
103
Wire.write(88);
//d1
104
Wire.endTransmission();
105
delay1000 ();
106
}
107
void
displayDigits2s()
// смотреть чего установим в часики
108
{
109
Wire.beginTransmission(saa1064);
110
Wire.write(1);
// instruction byte - first digit to control is 1 (right hand side)
111
Wire.write(digits[(HSs)]);
//d2
112
Wire.write(digits[(MDs)]);
//d3
113
Wire.write(digits[(MSs)]);
//d4 единицы минут
114
Wire.write(digits[(HDs)]);
//d1 десятки часов
115
Wire.endTransmission();
116
delay1000 ();
117
}
118
//----------------------------------------------------------------------------------
119
void
set2Time()
120
{
//+1
121
122
if
(digitalRead(inpin1)==LOW)
//test if the button 1 been pushed for set time process:
123
{
//+2
124
for
(x=0; x<=2; x++)
//test 3-5 times for begin set time process --- for 1 begin
125
{
///+3
126
delay (500);
127
128
if
(digitalRead(inpin1)==LOW)
// можно заменить на != и все станет проще, но уже мне не важно
129
{
130
131
}
132
else
133
{
134
goto
stopset;
//не удержал по времни - не вошел в програмирование
135
}
136
}
////-3 //// for 1 and
137
138
get2time ();
139
displayDigits1s();
// указатель входа в програмирование часов
140
141
for
(x=0; x<=6; x++)
//ready for set HD for 2 begin
142
{
//+4
143
144
145
displayDigits2s();
// готовы програмировать Д1
146
147
if
(digitalRead(inpin1)==LOW)
148
{
//+5
149
delay1000 ();
150
x=0;
151
152
if
(HDs<3)
153
{
154
y=HDs++ ;
155
}
156
if
(HDs>=3)
157
{
158
y=0;
159
HDs=y;
160
}
161
y=HDs;
162
}
//-5
163
164
}
//-4 // and for 2
165
166
// закончили програмировать Д1
167
displayDigits1s();
168
169
170
for
(x=0; x<=6; x++)
//ready for set HS for 3 begin
171
{
//+4
172
173
displayDigits2s();
// готовы програмировать Д2
174
175
if
(digitalRead(inpin1)==LOW)
176
{
//+5
177
178
x=0;
// обнулим for чтоб не тупила установка с кнопок
179
180
// проверяем, десятки часа
181
182
if
(HDs==2)
183
{
184
if
(HSs<4)
185
{
186
y2=HSs++ ;
187
y2=HSs;
188
}
189
190
if
(y2>=4)
191
{
192
y2=0;
193
HSs=y2;
194
}
195
}
196
if
(HDs<2)
197
{
198
if
(HSs<10)
199
{
200
y2=HSs++ ;
201
y2=HSs;
202
}
203
if
(HSs>=10)
204
{
205
y2=0;
206
HSs=y2;
207
}
208
}
209
210
}
//-5
211
212
}
//-4 // and for 3
213
214
displayDigits1s();
// "SET_D2_and_ "
215
216
217
for
(x=0; x<=6; x++)
//ready for set MD for 4 begin
218
{
//+4
219
220
displayDigits2s();
221
222
if
(digitalRead(inpin1)==LOW)
223
{
//+5
224
delay (800);
// можно удалить, наверное
225
x=0;
226
//---------------------------------------------------------------------------
227
228
if
(MDs<6)
//минут < 60
229
{
230
y2=MDs++ ;
231
y2=MDs;
232
}
233
if
(MDs>=6)
234
{
235
y2=0;
236
MDs=y2;
237
}
238
//----------------------------------------------------------------------
239
240
}
//-5
241
242
}
//-4 set MD and of for 4
243
244
displayDigits1s();
245
246
for
(x=0; x<=6; x++)
//ready for set MS for 5 begin
247
{
//+4
248
249
displayDigits2s();
// готовы програмировать Д4
250
251
if
(digitalRead(inpin1)==LOW)
252
{
//+5
253
254
x=0;
255
//---------------------------------------------------------------------------
256
257
if
(MSs<10)
258
{
259
y2=MSs++ ;
260
y2=MSs;
261
}
262
if
(MSs>=10)
263
{
264
y2=0;
265
MSs=y2;
266
}
267
//----------------------------------------------------------------------
268
269
}
//-5
270
271
}
//-4 set MS , and of for 5
272
273
274
displayDigits1s();
// готово !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
275
276
//---------------------write to DS1307
277
HD=(HDs*10+HSs);
278
if
(HD>=24)
//защита от кривых рук :)
279
{ HD=0; }
280
MD=(MDs*10+MSs);
281
if
(MD>=60)
//защита от кривых рук :)
282
{ MD=0; }
283
284
clock.fillByHMS(HD,MD,30);
285
clock.setTime();
286
287
//------------------------------------------------
288
289
}
//-2
290
stopset: ;
// точка выхода, если кнопка не нажата 3 сек
291
}
//-1
292
293
//-------------типа получаем температуру, дебаги отключены (Serial.print)------------
294
295
296
void
Temperature()
297
{
298
byte
i;
299
byte
present = 0;
300
byte
data[12];
301
byte
addr[8];
302
303
if
(!ds.search(addr))
304
{
305
ds.reset_search();
306
return
;
307
}
308
309
if
(OneWire::crc8( addr, 7) != addr[7])
310
{
311
// Serial.print("CRC is not valid!\n");
312
return
;
313
}
314
315
// if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID)
316
if
(addr[0] != 0x28)
317
{
318
// Serial.print("Device is not a DS18x20 family device.\n");
319
return
;
320
}
321
322
ds.reset();
323
ds.select(addr);
324
ds.write(0x44, 1);
// Запускаем конвертацию
325
delay1000 ();
// Подождем...
326
327
present = ds.reset();
328
ds.select(addr);
329
ds.write(0xBE);
// Считываем ОЗУ датчика
330
331
// Обрабатываем 9 байт
332
for
( i = 0; i < 9; i++)
333
{
334
data[i] = ds.read();
335
}
336
337
// Высчитываем температуру :)
338
int
HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract;
339
LowByte = data[0];
340
HighByte = data[1];
341
342
TReading = (HighByte << 8) + LowByte;
343
SignBit = TReading & 0x8000;
// Проверяем дубак там или нет
344
345
if
(SignBit)
// Если на улице дубак :)
346
{
347
TReading = (TReading ^ 0xffff) + 1;
348
}
349
Tc_100 = (6 * TReading) + TReading / 4;
// Умножаем на (100 * 0.0625) или 6.25
350
351
// Отделяем целые от дробных чисел
352
Whole = Tc_100 / 100;
353
Fract = Tc_100 % 100;
354
355
if
(SignBit)
356
{
357
k=64;
358
}
359
else
360
{
361
k=88;
362
}
363
{
364
Wire.beginTransmission(saa1064);
365
Wire.write(1);
// instruction byte - first digit to control is 1 (right hand side)
366
Wire.write(digits[(Whole)/10]);
//d2 (digits[(clock.hour)%10]+128); //d2
367
Wire.write(digits[(Whole)%10]+128);
//d3
368
Wire.write(digits[(Fract)/10]);
//d4
369
Wire.write(k);
//d1 // знак температуры "с" если +, "-" если <0
370
Wire.endTransmission();
371
delay(6000);
372
}
373
}
374
375
376
void
loop
()
377
{
378
Temperature();
379
delay1000 ();
380
set2Time();
381
382
for
(
int
l=0; l<=3; l++)
383
{
384
displayDigits1();
385
}
386
387
}
UPD. нормальный код для кнопки описан в статье "класс титановый велосипед для тактовой кнопки" но и там идут обсуждения :) слишком много НО.
UPD. нормальный код для кнопки описан в статье "класс титановый велосипед для тактовой кнопки" но и там идут обсуждения :) слишком много НО.
ну, да... только все НО почему-то разбиваются о банальный здравый смысл.
*ну, я же просил, давать идеи или найти логические ошибки в алгоритме работы кода класса - я их не вижу, укажите мне на них и я их исправлю. к чему эти голословные заявления?
*ну, я же просил, давать идеи или найти логические ошибки в алгоритме работы кода класса - я их не вижу, укажите мне на них и я их исправлю. к чему эти голословные заявления?
Тут больше половины пользователей вообще не понимают элементарного :) чтобы что-то написать нужно ТЗ, а его составлять некому, вот и обсуждаем миражи (кому-то померещелось не разобравшись).
Может через год... код переварится и обкатается - тогда и будт предложения, а пока, лично мне, добавить нечего... а топики друг-друга неплохо дополняют ИМХО
Начал читать - пока интересно и поучительно. Единственное - бросилось в глаза обилие орфографических ошибок с "Ь" ("что делать", "что делает"). Тема очень популярная, но легко устраняемая. Если автору лень, могу сделать коррекцию. Негоже серьёзный труд портить детскими ошибками.
Относительно примера 2 приложения Г.
Как неоднократно было указано на этом ресурсе, конструкция
1
if
((currentTime - loopTime) >= 1000)
навсегда снимает вопрос о переполнении таймера
ВладимирТ, за предложение спасибо, только данной работе уже более 5 лет, на мой взгляд, делать корректуру имеет смысл только при подготовке новой версии, а таковой не планируется. По замечаниям и предложениям форумчан была выпущена версия 2.0 (ссылка на скачивание есть в теме). Там есть дополнения, исправления и новые неточности. :)) Но за это время все они были неоднократно обсуждены, поэтому в выпуске новой версии я смысла не вижу.
Относительно примера 2 приложения Г.
Как неоднократно было указано на этом ресурсе, конструкция
1
if
((currentTime - loopTime) >= 1000)
навсегда снимает вопрос о переполнении таймера
В первом абзаце параграфа "Delay() must die!" я честно признаюсь, что примеры из приложения "Г" я взял "как есть" с ресурса "Arduino UNO урок 3 - Тайминг http://cxem.net/arduino/arduino5.php" (N 14 в списке литературы). Мне так было удобней. Быстро проиллюстрировать сам подход. В последствии это вызвало некоторые нарекания со стороны старожилов форума. Соглашусь, но корректировать текст сейчас смысла не вижу. Вопрос, действительно, решён давным давно.