Создание "меню" на arduino
- Войдите на сайт для отправки комментариев
Сб, 02/07/2011 - 13:51
Добрый день.
собрал "градусник" "часы" и " регулятор нагрушки через ШИМ" но требуется изменять некоторые значения мин и макс температуры срабатывания "регулятора нагрузки". но в интернете нет примеров создания "меню" для arduino. может кто имеет опыт создания меню для arduino? как оно делается? :-)
и еще один вопрос часы странно работаю. собраны на ds1307 как включаешь только тогда часы и начинают идти. хотя если установить дату он запоминает! убираешь батарейку он скидывает дату до 1970. значит часы работают, но почему то не идут когда нет питания.
Для ds1307 по любому должна быть батарейкана на 3В.
Примеры с меню есть, если найду выложу ссылку. А на чем идёт вывод информации?
вывод идет LCD 16x2, батарейку уже новую поставил cr2025 3v все равно такая байда :-(
меню откопал но что то разобраться не могу, он написан на с. но что то не вкурил.
http://electronix.ru/forum/index.php?showtopic=14289&st=30
оригинал находится тут.
по поводу батарейки, может у вас схема собрано криво. Давайте фото схемы и как вы это собрали
1,2 нога кварц
3 +3 батарейки
4 масса
5 sda
6 scl
7 ----
8 +5v
вот так подключенно
на 4 ноге еще минус батарейки висит
Подобная проблема была когда нагрузка индуктивная включалась. Часы останавливались. Проблемарешилась конденсатором на ножки питаня ds1307. Меню сделал с помощью ротари энкодера
А можно поподробнее, про меню с помощью ротари энкодера ?
sla/sda к чему притянуты? библиотека на эти часики не одна, и на них есть команда start/stop работы таймера. вот и смотрите кто и как отдаёт команду стоп.
а на счёт энкодета.. спорно довольно. для вашего меню достаточно 3х кнопок. либо энкодер и кнопка, но логика работы с энкодером требует или отдельной библы или самому писать, что не в пользу минимизации скетча.
Ребята, а где можно почитать про работу с меню, энкодером с кнопкой ?
Я брал энкодер с функцией нажатия. Пользовался готовой библиотекой для ардуины - нашел просто в инете. Меню делал простенькое одного уровня без вложений. Вроде все симпотно получилось - энкодером выставляю время полива для автомата или включаю ручной полив. Скетч есть но он без коментариев - кому нужно - поделюсь
Было бы не плохо. А схему не покажите, чтобы легче было понимать скетч ?
на счёт менюхи, неплохо бы соорудить библиотеку соответствующую (или может кто то знает где взять?) хотя бы для простого древовидного меню. Недавно пытался в скетче городить такую штуку, не очень то оно просто. И при этом переехать на другой тип экрана не реально (например с LCD на одно-двухстрочный цифробуквенный), по крайней мере на моём варианте...
пока ищу файлики - подскажите как выложить их сюда
на счёт менюхи, неплохо бы соорудить библиотеку соответствующую (или может кто то знает где взять?)
Ну в гугле или arduino.cc поискать :).
К. Прутков-инженер. «Советы начинающему гению»
Например вот http://arduino.cc/playground/Code/Menu
Вот пример использование с LCD, а не Serial http://www.coagula.org/content/pages/tutorial-manage-menu-and-lcd-displa...
Вот другая библиотека
https://github.com/jonblack/menusystem
Лично мне она более симпатична. Не нужно делать общую портянку switch, можно привесить "функцию-обработчик" к каждому пункту
http://jonblack.org/2012/05/14/arduino-library-for-creating-a-menu-system/
leshak, спасибо большое за линки но, там с кнопками, а мне бы энкодер с кнопкой... Знаете что- нибудь такое ?
pistoletov, здесь Форумы- Программирование- Вставка программного кода в тему/комментарий показано, как вставлять код в сообщение
leshak, спасибо большое за линки но, там с кнопками, а мне бы энкодер с кнопкой... Знаете что- нибудь такое ?
Я вообще не вам отвечал. Вы - в моем личном игноре. Так что задавать вопросы персонально мне - можете не трудится.
Хорошо, не буду. Всё равно отвечаете не по делу.
pistoletov, ну что там, нашлись файлы ? Ждать ? Или не стОит ?
Скетч нашел. Выложу сегодня вечером. Схему класть не буду - так как все понятно из скетча - 3 провода на энкодер и 6 проводов на экранчик. Остальные 3 провода - управление исполнительными устройствами полива(клапана и насос).
Спасибо большое. Ждём.
для Serial интерфейса,при реализации своего таймера написал простенькое вертикальное меню, до горизонтального не дошло ,хотя планировал
нужны 2 инклуда - Один распространенный везде Ansiterm.h, но я чегото в нем модифицировал, поэтому прикладываю ( помойму поменял местами row и column.
второй Slot.h - там две структуры, одна для ввода и редактирования каких либо данных, вторая собственно меню , ну и какието утилиты типа обработки кнопок типа стрелок содержащих ESC посследовательности
Кому редактирование не нужно , можно выкинуть все что связано со структурой Slot
перетащил щас это на Arduino 1.0 работате но с кучей варнингов.
меню с разными бордюрами(псевдографика, которая даже вроде лежит в PROGMEM но проверять не умею) , количеством Items , размер меню можно задать равным от 1 до 23 полагаю( кол-во строк на экране)
единственно следить за расположением, сам код тупо прибавляет к координатам экрана элементы меню.
по двум ESQ выход из меню с return 0, по одному не получилост так как обрабатываются ESC последовательности типа стрелок на IBM клавиатуре.
в Гипертерминале необходимо включить режим эмуляции ANSI ну и скорость поставить 115 кбод ( не так заметно прорисовки экрана)
полагаю что легко переделывается на lcd заменой Screen-xy на lcd позиционирование и Serial.write на lcd.вывод
Btw работает на PS клавиатуре подключенной к ардуине, но требует замены метода Serial.read, выкинул за ненадобностью.
код примера
как вложить файлы, ума не приложу, попробую следующим постом
Распространненный в сети Ansiterm слегка подправленый, инклуд родной от разработчика
собственно используется от него только позиционирование и инверсия выбранного itema
ну и собственно Slot.h Slot.cpp в котором есть класс menu все что касается Slot можно выкинуть, но мне это нужно.
Ну и Slot.h
все слегка или даже не слегка недоделано, скажем хочу вызывать функции Before и After перехода к Itemу меню, ну и была мысль привязать класс AnsiTerm к элементам графики
будут вопросы - пишите-)))))))))
Дык, с порога орёт 'RotaryEncoder' does not name a type
на 110 строку min_cur = RTC.get(DS1307_HR,true)*60 + RTC.get(DS1307_MIN,false);
ругается 'RTC' was not declared in this scope
Библиотеку RotaryEncoder.h нашёл и положил в папку libraries.
#include <WProgram.h>
исправил на
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
а вот что делать с последним сообщением, я не знаю...
скетч для 0022 версии написан. RTC это библиотека часов ds1307. библиотеку часов подключите или уберите тогда все функции работы с часами. В моем скетче все на часах завязано.
Что делаете если не секрет - подскажу как бы я сделал.
Я сейчас обдумываю вариант для токарного станка. Суть, убрать гитару и поставить электродвигатели на винты подач. У каждого двигателя свой контроллер. Вместо ручек и рычагов выбора подач, думаю поставить энкодер. Arduino должен вывести на LCD информацию, какую подачу или шаг резьбы выставили и соответственно, подать на контроллер двигателя управляющий сигнал. По информации с энкодера на шпинделе и двигателе подач, Arduino должен корректировать сигнал управления для контроллера, чтобы обеспечить нарезание нужной резьбы или подачи. Вот, в общих чертах мой план. Можно реализовать такую идею на Arduino ?
Сейчас скачал и положил другую библиотеку DS1307.h теперь выдаёт, ошибка при компилляции:
C:\arduino-1.0.1\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -IC:\arduino-1.0.1\hardware\arduino\cores\arduino -IC:\arduino-1.0.1\hardware\arduino\variants\standard -IC:\arduino-1.0.1\libraries\LiquidCrystal -IC:\arduino-1.0.1\libraries\EEPROM -IC:\arduino-1.0.1\libraries\RotaryEncoder -IC:\arduino-1.0.1\libraries\Wire -IC:\arduino-1.0.1\libraries\DS1307 C:\DOCUME~1\PAPARI~1\LOCALS~1\Temp\build2078228489559218613.tmp\sketch_men__na_encodere_nerabotaet.cpp -o C:\DOCUME~1\PAPARI~1\LOCALS~1\Temp\build2078228489559218613.tmp\sketch_men__na_encodere_nerabotaet.cpp.o
sketch_men__na_encodere_nerabotaet.cpp:12:20: warning: extra tokens at end of #include directive
In file included from C:\arduino-1.0.1\libraries\DS1307/WConstants.h:1,
from C:\arduino-1.0.1\libraries\DS1307/DS1307.h:10,
from sketch_men__na_encodere_nerabotaet.cpp:12:
C:\arduino-1.0.1\libraries\DS1307/wiring.h:88:1: warning: "clockCyclesToMicroseconds" redefined
In file included from sketch_men__na_encodere_nerabotaet.cpp:6:
C:\arduino-1.0.1\hardware\arduino\cores\arduino/Arduino.h:77:1: warning: this is the location of the previous definition
In file included from C:\arduino-1.0.1\libraries\DS1307/WConstants.h:1,
from C:\arduino-1.0.1\libraries\DS1307/DS1307.h:10,
from sketch_men__na_encodere_nerabotaet.cpp:12:
C:\arduino-1.0.1\libraries\DS1307/wiring.h:89:1: warning: "microsecondsToClockCycles" redefined
In file included from sketch_men__na_encodere_nerabotaet.cpp:6:
C:\arduino-1.0.1\hardware\arduino\cores\arduino/Arduino.h:78:1: warning: this is the location of the previous definition
sketch_men__na_encodere_nerabotaet.cpp: In function 'int pause()':
sketch_men__na_encodere_nerabotaet.cpp:281: warning: unused variable 'pause'
sketch_men__na_encodere_nerabotaet.cpp: In function 'void pdelay(int)':
sketch_men__na_encodere_nerabotaet.cpp:352: warning: unused variable 'data'
C:\arduino-1.0.1\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -IC:\arduino-1.0.1\hardware\arduino\cores\arduino -IC:\arduino-1.0.1\hardware\arduino\variants\standard -IC:\arduino-1.0.1\libraries\LiquidCrystal -IC:\arduino-1.0.1\libraries\EEPROM -IC:\arduino-1.0.1\libraries\RotaryEncoder -IC:\arduino-1.0.1\libraries\Wire -IC:\arduino-1.0.1\libraries\DS1307 -IC:\arduino-1.0.1\libraries\LiquidCrystal\utility C:\arduino-1.0.1\libraries\LiquidCrystal\LiquidCrystal.cpp -o C:\DOCUME~1\PAPARI~1\LOCALS~1\Temp\build2078228489559218613.tmp\LiquidCrystal\LiquidCrystal.cpp.o
C:\arduino-1.0.1\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -IC:\arduino-1.0.1\hardware\arduino\cores\arduino -IC:\arduino-1.0.1\hardware\arduino\variants\standard -IC:\arduino-1.0.1\libraries\LiquidCrystal -IC:\arduino-1.0.1\libraries\EEPROM -IC:\arduino-1.0.1\libraries\RotaryEncoder -IC:\arduino-1.0.1\libraries\Wire -IC:\arduino-1.0.1\libraries\DS1307 -IC:\arduino-1.0.1\libraries\EEPROM\utility C:\arduino-1.0.1\libraries\EEPROM\EEPROM.cpp -o C:\DOCUME~1\PAPARI~1\LOCALS~1\Temp\build2078228489559218613.tmp\EEPROM\EEPROM.cpp.o
C:\arduino-1.0.1\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -IC:\arduino-1.0.1\hardware\arduino\cores\arduino -IC:\arduino-1.0.1\hardware\arduino\variants\standard -IC:\arduino-1.0.1\libraries\LiquidCrystal -IC:\arduino-1.0.1\libraries\EEPROM -IC:\arduino-1.0.1\libraries\RotaryEncoder -IC:\arduino-1.0.1\libraries\Wire -IC:\arduino-1.0.1\libraries\DS1307 -IC:\arduino-1.0.1\libraries\RotaryEncoder\utility C:\arduino-1.0.1\libraries\RotaryEncoder\RotaryEncoder.cpp -o C:\DOCUME~1\PAPARI~1\LOCALS~1\Temp\build2078228489559218613.tmp\RotaryEncoder\RotaryEncoder.cpp.o
C:\arduino-1.0.1\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -IC:\arduino-1.0.1\hardware\arduino\cores\arduino -IC:\arduino-1.0.1\hardware\arduino\variants\standard -IC:\arduino-1.0.1\libraries\LiquidCrystal -IC:\arduino-1.0.1\libraries\EEPROM -IC:\arduino-1.0.1\libraries\RotaryEncoder -IC:\arduino-1.0.1\libraries\Wire -IC:\arduino-1.0.1\libraries\DS1307 -IC:\arduino-1.0.1\libraries\Wire\utility C:\arduino-1.0.1\libraries\Wire\Wire.cpp -o C:\DOCUME~1\PAPARI~1\LOCALS~1\Temp\build2078228489559218613.tmp\Wire\Wire.cpp.o
C:\arduino-1.0.1\hardware\tools\avr\bin\avr-gcc -c -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -IC:\arduino-1.0.1\hardware\arduino\cores\arduino -IC:\arduino-1.0.1\hardware\arduino\variants\standard -IC:\arduino-1.0.1\libraries\LiquidCrystal -IC:\arduino-1.0.1\libraries\EEPROM -IC:\arduino-1.0.1\libraries\RotaryEncoder -IC:\arduino-1.0.1\libraries\Wire -IC:\arduino-1.0.1\libraries\DS1307 -IC:\arduino-1.0.1\libraries\Wire\utility C:\arduino-1.0.1\libraries\Wire\utility\twi.c -o C:\DOCUME~1\PAPARI~1\LOCALS~1\Temp\build2078228489559218613.tmp\Wire\utility\twi.c.o
C:\arduino-1.0.1\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -IC:\arduino-1.0.1\hardware\arduino\cores\arduino -IC:\arduino-1.0.1\hardware\arduino\variants\standard -IC:\arduino-1.0.1\libraries\LiquidCrystal -IC:\arduino-1.0.1\libraries\EEPROM -IC:\arduino-1.0.1\libraries\RotaryEncoder -IC:\arduino-1.0.1\libraries\Wire -IC:\arduino-1.0.1\libraries\DS1307 -IC:\arduino-1.0.1\libraries\DS1307\utility C:\arduino-1.0.1\libraries\DS1307\DS1307.cpp -o C:\DOCUME~1\PAPARI~1\LOCALS~1\Temp\build2078228489559218613.tmp\DS1307\DS1307.cpp.o
In file included from C:\arduino-1.0.1\hardware\arduino\cores\arduino/Print.h:26,
from C:\arduino-1.0.1\hardware\arduino\cores\arduino/Stream.h:26,
from C:\arduino-1.0.1\libraries\LiquidCrystal/../Wire/Wire.h:26,
from C:\arduino-1.0.1\libraries\DS1307\DS1307.cpp:2:
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:116: error: declaration of C function 'StringSumHelper& operator+(const StringSumHelper&, const char*)' conflicts with
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:115: error: previous declaration 'StringSumHelper& operator+(const StringSumHelper&, const String&)' here
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:116: warning: 'StringSumHelper& operator+(const StringSumHelper&, const char*)' is already a friend of class 'String'
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:117: error: declaration of C function 'StringSumHelper& operator+(const StringSumHelper&, char)' conflicts with
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:116: error: previous declaration 'StringSumHelper& operator+(const StringSumHelper&, const char*)' here
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:117: warning: 'StringSumHelper& operator+(const StringSumHelper&, char)' is already a friend of class 'String'
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:118: error: declaration of C function 'StringSumHelper& operator+(const StringSumHelper&, unsigned char)' conflicts with
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:117: error: previous declaration 'StringSumHelper& operator+(const StringSumHelper&, char)' here
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:118: warning: 'StringSumHelper& operator+(const StringSumHelper&, unsigned char)' is already a friend of class 'String'
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:119: error: declaration of C function 'StringSumHelper& operator+(const StringSumHelper&, int)' conflicts with
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:118: error: previous declaration 'StringSumHelper& operator+(const StringSumHelper&, unsigned char)' here
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:119: warning: 'StringSumHelper& operator+(const StringSumHelper&, int)' is already a friend of class 'String'
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:120: error: declaration of C function 'StringSumHelper& operator+(const StringSumHelper&, unsigned int)' conflicts with
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:119: error: previous declaration 'StringSumHelper& operator+(const StringSumHelper&, int)' here
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:120: warning: 'StringSumHelper& operator+(const StringSumHelper&, unsigned int)' is already a friend of class 'String'
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:121: error: declaration of C function 'StringSumHelper& operator+(const StringSumHelper&, long int)' conflicts with
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:120: error: previous declaration 'StringSumHelper& operator+(const StringSumHelper&, unsigned int)' here
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:121: warning: 'StringSumHelper& operator+(const StringSumHelper&, long int)' is already a friend of class 'String'
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:122: error: declaration of C function 'StringSumHelper& operator+(const StringSumHelper&, long unsigned int)' conflicts with
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:121: error: previous declaration 'StringSumHelper& operator+(const StringSumHelper&, long int)' here
C:\arduino-1.0.1\hardware\arduino\cores\arduino/WString.h:122: warning: 'StringSumHelper& operator+(const StringSumHelper&, long unsigned int)' is already a friend of class 'String'
C:\arduino-1.0.1\libraries\DS1307\DS1307.cpp: In member function 'void DS1307::read()':
C:\arduino-1.0.1\libraries\DS1307\DS1307.cpp:22: error: 'class TwoWire' has no member named 'send'
C:\arduino-1.0.1\libraries\DS1307\DS1307.cpp:30: error: 'class TwoWire' has no member named 'receive'
C:\arduino-1.0.1\libraries\DS1307\DS1307.cpp: In member function 'void DS1307::save()':
C:\arduino-1.0.1\libraries\DS1307\DS1307.cpp:38: error: 'class TwoWire' has no member named 'send'
C:\arduino-1.0.1\libraries\DS1307\DS1307.cpp:41: error: 'class TwoWire' has no member named 'send'
C:\arduino-1.0.1\libraries\DS1307\DS1307.cpp: In member function 'void DS1307::set(int, int)':
C:\arduino-1.0.1\libraries\DS1307\DS1307.cpp:104: warning: suggest parentheses around arithmetic in operand of |
мне самому, в этом не разобраться...
конечно можно такое реализовать я думаю вам проще всего будет взять библиотеку энкодера и поиграться просто с ней без моего "лишнего кода" и поиграться с библиотекой шагового двигателя. ПРоблема думаю что именно мой софт написан для 0022 версии. ПО свободе попробую его компильнуть в 1.0
Нет, двигатель будет серво. Играться можно, когда понимаешь, а я не программист... Я пробовал Ваш скетч и в 0022 и в последней, одинаково. У меня проблема была в два этапа, сначала не находила WConstants.h, положил, потом не находила wiring.h, положил, а теперь я не понимаю, что там...
Покажите пожалуйста, как убрать или отключить, часы в Вашем скетче.
серво? хм - насколько я знаю сервы осуществляют поворот на определенный угол, даже полного оборота не делают - я же понимаю что вам нужно давать вращение винту...мой скетч как образец не совсем то, что вам нужно. В библиотеке енкодера есть примеры его работы - file-examples-rotary encoder там посмотрите скетч работы энкодера.
Есть серво для промышленных целей, там крутит так, как нам нужно. Это коллекторный ( у меня ) двигатель и на валу у него закреплён энкодер. По энкодеру контроллер определяет положение вала и управляет им.
Да, конечно, я понимаю что этот скетч не то, что мне нужно но, мне хотя бы понять, как программировать. А то, в инете нашёл разные статьи но, там ошибки и в схеме, и в программе... В итоге, ни что не работает и ни чему не научишься. Вот и решил, здесь попросить помощи. Пока не отказывают и на том спасибо.
Подниму тему, не создавая новую, так как она актуальна для меня сейчас,
толи старею, толи много пива иногда бывает, понадобился пример простейшего меню с энкодером для регулировки температуры
хочу сделать термопечь для пайки плат с управлением на ардуино нано, нужен пример видел както, найти не могу, а сам чтото туго соображаю.
нужно иметь следующее в скетче иметь возможность прописать температуру минимум-максимум, также прописать шаг изменения..
энкодером выставлять нужное значение и нажатием фиксировать его....
Индикация не важна будь то лсд или сегментная матрица.. датчики и силовая часть уже не трудно...
Если кто знает готовое решение , ответьте плз..
Помгите с меню. ничего не могу разобрать не очень шарю в английском собрал часы с измереением влажности и температуры, хочу сделать меню что бы параметры были регулируемыми и еще включалась нагрузка одна по времени, а две других в зависимости от влажности и температуры
буду рад советам
Мне поравилась вот эта http://easyelectronics.ru/organizaciya-drevovidnogo-menyu.html статья.
В библиотеке енкодера есть примеры его работы - file-examples-rotary encoder там посмотрите скетч работы энкодера.
подскажите, а какую модель энкодера с кнопкой вы использовали в своем примере?
Я для себя первый раз так делал
Версия кода с автовозвратом к основному скрину через 3 секунды
yul-i-an ,
Спасиб..
Чудненько, .... будет чем занятся на выходных.
Может и на 3.2 TFT дисплей есть пример, с энкодером ?
;)
Радует что комуто полезно оказалось. С энкодером попробую на днях.
С энкодером нужно работать c внешними прерываниями.
Например выход энкодера А вешаем на INT0. Когда происходит событие этого прерывания проверяем состояние В выхода энкодера, если на А и В 1 то значит крутиться в одну сторону, а если на А 1, а на В 0 то в другую. Кнопочку энкодера можно повесить на прерывание INT1 чтоб всё четко отрабатывало.
Например выход энкодера А вешаем на INT0. Когда происходит событие этого прерывания проверяем состояние В выхода энкодера, если на А и В 1 то значит крутиться в одну сторону, а если на А 1, а на В 0 то в другую. Кнопочку энкодера можно повесить на прерывание INT1 чтоб всё четко отрабатывало.
В теории все просто, на практике - попил крови :) Нюанс есть еще в том что ловить Front или Back сигнала. В теории - без разницы, на практике - энкодер шумит и разница есть.
Вот эта ветка может пригодится http://arduino.ru/forum/apparatnye-voprosy/ispolzuem-enkoder?page=1
Там таки и основательно мы ему кости перемыли ;)
А вы не могли бы посоветовать, что надо сделать, чтобы экран не мерцал? Я так понимаю дело в том, что он слишком часто перерисовывается, вопрос в том, нужно ли это и так часто.
В остальном - хочу сказать огромное спасибо, за приятную и простую менюшку, как раз то, что искал.
Чтобы немерцал экран я думаю надо отчищать его не перед выбором выводимого экрана, а после того как выбран экран для вывода на дисплей. В начале каждого "экрана" после команды if нужно добавить строку lcd.clear(), и убрать её от туда где она сейчас стоит.
Сам непроверял но возможно поможет. Или можно отчищать экран только при изменении выводимой информации и позиции в меню.
Например если переменная m прошлая не равна m прошлой то отчистить экран, а если нет то идти дальше.
Тоже самое и с параметрами, если их значения изменились, то отчистить экран, а лучше не отчищать а по верх выводить.
Спасибо yul-i-an за его вариант меню. очень понравилось. доступно и просто.
собрал схему, залил скеч и попробовал. меню работает, но захотелось кое-что исправить:
1. экраны меню и параметры р1, р2 и р3 циклически менялись до тех пор, пока не отпустишь кнопку. частенько параметры перескакивали на 2-3 единицы за одно нажатие, это же применио и к смене экранов меню.
2. при увеличении\уменьшении параметров происходило мерцание (перерисовка) всего экрана.
3. при задании параметров р1 и р2 величной 10 не умещается значение 1 или 0 параметра LED, но тут уже ограничения по символам самого дисплея.
посидел вчера-сегодня и подправил под свои нужды, результатом доволен как слон. теперь переход между экранами меню и смена параметров происходит по отпусканию кнопки и параметр меняется строго на единицу; мерцания экрана при задании параметра не происходит.
для тех кто будет использовать в своих целях прошу обратить внимание - дисплей подключен по I2C .
Незачто. Я сам на железе не проверял (до создания устройства дело не дошло), тестировал в протеусе. Рад что моя концепция оказалась простой и понятной.
Можно обработку нажатия кнопок и вывод меню оформить в виде функций (вызывать функцию обработки нажатий по прерыванию от кнопок), в вызваной функции после нажатия кнопки и изменения параметра вызывать функцию вывода экрана меню, а после вывода вернуться в основной цикл, это должно несколько ускорить работу этого кода и ускорить основной цикл.
Или каждый экран меню оформить в виде функции и вызывать только нужный экран, а не перебирать все. И код станет более удобным для добавления новых окон.