Это можно без ардуино запустить, типа виртуально? Мне просто лень, разбирать коробочку с ней.
Я примерно знаю что должно выводиться, рандомные числа, т.к. статик при определении не затирается на 0.
Ну или ардуино взорвётся. DD
Можно. Без Ардуино, какой не был кривой код, то все работают. А вот если код залить в Ардуино, то Ардуино почему-то тупит не падетски. Так что Вы пользуйтесь своим кодом, но в плату не заливайте. И все будет хорошо работать.
Я уже нашел онлайн симулятор, ну 000 выводило, и что это доказывает?
Что я неправильно написал? Ппц. Пойман с поличным.
это доказывает, что ты тупой упрямый придурок
Даже когда тебе указали на ошибку - ты все равно будешь полдня спорить, вместо того чтоб прям с того же телефона, с которого ты лошишь в инете - зайти в гугль и найти ответ.
Ты там на прошлой странице рассуждаешь о том, что у гайвера в коде лишнее сложение и код его первый раз сработает с задержкой - а того, что твой код НЕ СРАБОТАЕТ НИ РАЗУ- в упор не видишь. Тебе кажется это " мелкой ошибкой", да?
Видимо писать код на ночь не очень хорошо. С утра почитав Ваш комментарий всё поправил, разобрался с static, что в loop'е он не актуален. Ну и вынес инициализацию переменной за пределы loop.
#include "GyverButton.h"
#include <U8glib.h> // Подключаем библиотеку U8glib
U8GLIB_ST7920_128X64_1X u8g(10); // Создаём объект u8g для работы с дисплеем, указывая номер вывода CS для аппаратной шины SPI
int FPS = 3; // частота обновления экрана
long drawTimer = millis();
GButton myButt1; //у меня подключено на один аналоговый вывод A1 5 кнопок, через резисторы, в данном примере привожу только одну для упрощения восприятия кода
void setup() {
myButt1.setType(LOW_PULL);
}
void loop() {
int analog = analogRead(1);
myButt1.tick(analog < 200 && analog > 190); // диапазон значений для гарантированного срабатывания кнопки
if(millis() - drawTimer >= (1000 / FPS)) { // все рисования разместим в этом Ифе
drawTimer = millis();
u8g.firstPage();
do {
u8g.setColorIndex(1); // делаем курсор белого цвета
u8g.setFont(rus5x8);
u8g.setPrintPos(90, 20);
u8g.print(F("ВРЕМЯ"));
if (myButt1.state()) {u8g.setPrintPos(90, 20); u8g.print(F("КНОПКА"));
}
Теперь всё отрабатывает корректно, в плане вызова рисования экрана, вызывает его ровно столько раз в секунду, сколько указано в переменной FPS (проверял принтом в сериал), однако в целом для картинки это не изменилось никак. То есть отрисовка происходит мгновенно, без задержек. Я так понимаю, что это связано с особенностью работы самой библиотеки UG8LIB. Она отрисовывает всю картинку за одно обращение, и далее уже просто обновляет снова всю картинку целиком. В любом случае это должно помочь высвободить мощности под расчёты.
Мне очень хотелось бы уточнить у экспертов, как правильнее всего вести разработку устройства, у которого есть дисплей, кнопки, датчики и необходимость управлять мотором. У мне сейчас не хватает той теории, которую наверное преподают студентам ивт.
Нужно ли создавать отдельные VOID для каждого изображения на экране, или правильнее всё держать в одном loop?
Нужно ли заменить все if...then на switch...case? И если да, то почему? Эта функция быстрее? Меньше ест памяти? Более читаема?
Какой из кэйсов предпочтительнее для разработки на ардуино: создать больше переменных, но уменьшить количество условий if..then к минимуму или создать как можно меньше переменных, вне зависимости от того как много дополнительных условий if..thhen это породит?
С утра почитав Ваш комментарий всё поправил, разобрался с static, что в loop'е он не актуален. Ну и вынес инициализацию переменной за пределы loop.
что-то вы как-то сомнительно "разобрались", выводы неверные. Static вполне себе "актуален" в loop и выносить переменную таймера в глобальные было совсем необязательно. Наоборот, локальная статик переменная в данном случае более правильное решение. Главное, чего у вас не хватало в исходном коде - это строка 21 (по предыдущему сообщению), все остальное и трогать не надо было.
Что касается остальных вопросов - вы слишком глубоко копаете. На вашем нынешнем уровне разница между If и switch непринципиальна, что яснее понимаете - то и используете. За "эффективность кода" вам на данном этапе думать рано, важнее ошибок не насажать. Вот сделаете пяток подобных проектов - сами поймете, когда применять одно, а когда другое.
Просто говорят что надо сразу учиться правильно, чтобы потом не переучиваться.
Я пришёл к тому, что перестаю видеть свой код как целую картинку. Мешанина из переменных и ифов. Целиком выкладывать не стал, т.к. тапками закидают ведь. Вот и задумался а как взрослые дяди пишут большие проекты, на больших контроллерах? Наверное есть какая-то концепция наведения порядка. Пробовал собрать все экраны в воиды, и оказалось что вместе с экранами собрал обработку кнопок туда. Сейчас кнопки из воидов вытаскиваю и прописываю условия для каждой кнопки на отдельном экране, чтобы поместить это всё в loop.
Я пришёл к тому, что перестаю видеть свой код как целую картинку. Мешанина из переменных и ифов.
очень знакомо :) не расстраивайтесь, через это проходят все.
Цитата:
Вот и задумался а как взрослые дяди пишут большие проекты
есть несколько подходов. Ключевая идея - разбить код на некие законченные блоки, каждый из которых вы сможете "видеть целиком". Например, инициализация экрана - одна процедура, вывод на экран - другая, очистка экрана - третья. Или чтение датчика температуры...
Есть такое правило - если процедура перестает помещаться на один экран монитора - значит она слишком длинная и пора ее делить на более мелкие. Хотя, конечно. бывает по разному.
Просто говорят что надо сразу учиться правильно, чтобы потом не переучиваться.
Не получится. Как бы Вы правильно не учились, настанет момент, что надо снова переучиваться. Так что программирование это сплошное переучивание.
Программа не должна быть одним куском в одном файле. Скорее программа состоит из сшивки файлов, которые подключается include . Это и чужие библиотеки и свои.
Громоздить кучу сода в loop и setup не стоит. Лучше по одной функции от каждого девайса. Тогда их легко отключить из программы просто закоментив.
ПС: Не скажу что это эталон, но как вариант можно использовать #252
Это можно без ардуино запустить, типа виртуально? Мне просто лень, разбирать коробочку с ней.
Я примерно знаю что должно выводиться, рандомные числа, т.к. статик при определении не затирается на 0.
Ну или ардуино взорвётся. DD
Можно. Без Ардуино, какой не был кривой код, то все работают. А вот если код залить в Ардуино, то Ардуино почему-то тупит не падетски. Так что Вы пользуйтесь своим кодом, но в плату не заливайте. И все будет хорошо работать.
код из #19 при:
static uint32_t timer = millis();
выводит только 0
#define timer millis()
выводит увеличивающуюся последовательность
Я уже нашел онлайн симулятор, ну 000 выводило, и что это доказывает?
Что я неправильно написал? Ппц. Пойман с поличным.
Это доказывает что сертификат ты точно заслужил !
Спасибо, но я пожалуй откажусь от столь щедрого предложения. ))
Надо так
Код не рабочий, мой вердикт - ты болван. DDD
'uit32_t' does not name a type; did you mean 'uint32_t'?
Кто сертификаты раздаёт? Этому кадру точно парочка нужна! Еще и наехал, блин!
ЗЫ: b707 - надо же сразу рабочий код давать, ты чего "халтуришь то"? (не видел как он ножкой топнул и показал себя?). )))
Надо так
static тут нах не упал
Мля, так и не смог найти - когда static в коде появился (кроме сообщений с кусками)?
static тут нах не упал
Эта "мелочная ошибка" делает ваш код ПОЛНОСТЬЮ НЕРАБОЧИМ.
Ну как-то так.
Сколько боли и разочарования в каждом сообщени.
Я тоже в шоке, неадекватные люди какие-то теперь пошли.
так и не смог найти - когда static в коде появился?
Я уже нашел онлайн симулятор, ну 000 выводило, и что это доказывает?
Что я неправильно написал? Ппц. Пойман с поличным.
это доказывает, что ты тупой упрямый придурок
Даже когда тебе указали на ошибку - ты все равно будешь полдня спорить, вместо того чтоб прям с того же телефона, с которого ты лошишь в инете - зайти в гугль и найти ответ.
Ты там на прошлой странице рассуждаешь о том, что у гайвера в коде лишнее сложение и код его первый раз сработает с задержкой - а того, что твой код НЕ СРАБОТАЕТ НИ РАЗУ- в упор не видишь. Тебе кажется это " мелкой ошибкой", да?
это точно.
Исправили в своем коде ошибку? Я вам в сообщении #2 совершенно серьезно отвечал, это уж потом концерт с заезжими артистами начался :)
Да, разобрался, спасибо Вам.
Видимо писать код на ночь не очень хорошо. С утра почитав Ваш комментарий всё поправил, разобрался с static, что в loop'е он не актуален. Ну и вынес инициализацию переменной за пределы loop.
Теперь всё отрабатывает корректно, в плане вызова рисования экрана, вызывает его ровно столько раз в секунду, сколько указано в переменной FPS (проверял принтом в сериал), однако в целом для картинки это не изменилось никак. То есть отрисовка происходит мгновенно, без задержек. Я так понимаю, что это связано с особенностью работы самой библиотеки UG8LIB. Она отрисовывает всю картинку за одно обращение, и далее уже просто обновляет снова всю картинку целиком. В любом случае это должно помочь высвободить мощности под расчёты.
Мне очень хотелось бы уточнить у экспертов, как правильнее всего вести разработку устройства, у которого есть дисплей, кнопки, датчики и необходимость управлять мотором. У мне сейчас не хватает той теории, которую наверное преподают студентам ивт.
Нужно ли создавать отдельные VOID для каждого изображения на экране, или правильнее всё держать в одном loop?
Нужно ли заменить все if...then на switch...case? И если да, то почему? Эта функция быстрее? Меньше ест памяти? Более читаема?
Какой из кэйсов предпочтительнее для разработки на ардуино: создать больше переменных, но уменьшить количество условий if..then к минимуму или создать как можно меньше переменных, вне зависимости от того как много дополнительных условий if..thhen это породит?
Был бы благодарен за консультацию.
С утра почитав Ваш комментарий всё поправил, разобрался с static, что в loop'е он не актуален. Ну и вынес инициализацию переменной за пределы loop.
что-то вы как-то сомнительно "разобрались", выводы неверные. Static вполне себе "актуален" в loop и выносить переменную таймера в глобальные было совсем необязательно. Наоборот, локальная статик переменная в данном случае более правильное решение. Главное, чего у вас не хватало в исходном коде - это строка 21 (по предыдущему сообщению), все остальное и трогать не надо было.
Что касается остальных вопросов - вы слишком глубоко копаете. На вашем нынешнем уровне разница между If и switch непринципиальна, что яснее понимаете - то и используете. За "эффективность кода" вам на данном этапе думать рано, важнее ошибок не насажать. Вот сделаете пяток подобных проектов - сами поймете, когда применять одно, а когда другое.
Но это мое личное мнение и я его не навязываю.
Ок, понял. Вернул статик на место.
Просто говорят что надо сразу учиться правильно, чтобы потом не переучиваться.
Я пришёл к тому, что перестаю видеть свой код как целую картинку. Мешанина из переменных и ифов. Целиком выкладывать не стал, т.к. тапками закидают ведь. Вот и задумался а как взрослые дяди пишут большие проекты, на больших контроллерах? Наверное есть какая-то концепция наведения порядка. Пробовал собрать все экраны в воиды, и оказалось что вместе с экранами собрал обработку кнопок туда. Сейчас кнопки из воидов вытаскиваю и прописываю условия для каждой кнопки на отдельном экране, чтобы поместить это всё в loop.
Я пришёл к тому, что перестаю видеть свой код как целую картинку. Мешанина из переменных и ифов.
очень знакомо :) не расстраивайтесь, через это проходят все.
есть несколько подходов. Ключевая идея - разбить код на некие законченные блоки, каждый из которых вы сможете "видеть целиком". Например, инициализация экрана - одна процедура, вывод на экран - другая, очистка экрана - третья. Или чтение датчика температуры...
Есть такое правило - если процедура перестает помещаться на один экран монитора - значит она слишком длинная и пора ее делить на более мелкие. Хотя, конечно. бывает по разному.
Не получится. Как бы Вы правильно не учились, настанет момент, что надо снова переучиваться. Так что программирование это сплошное переучивание.
Программа не должна быть одним куском в одном файле. Скорее программа состоит из сшивки файлов, которые подключается include . Это и чужие библиотеки и свои.
Громоздить кучу сода в loop и setup не стоит. Лучше по одной функции от каждого девайса. Тогда их легко отключить из программы просто закоментив.
ПС: Не скажу что это эталон, но как вариант можно использовать #252