Библиотека UG8LIB, особенности обращения к дисплею

Artist666
Offline
Зарегистрирован: 26.02.2022

Это можно без ардуино запустить, типа виртуально? Мне просто лень, разбирать коробочку с ней.
Я примерно знаю что должно выводиться, рандомные числа, т.к. статик при определении не затирается на 0.
Ну или ардуино взорвётся. DD

Artist666
Offline
Зарегистрирован: 26.02.2022

b707 пишет:
void loop() {

static uit32_t timer = millis();
Serial.println(timer);
}
Код не рабочий, мой вердикт - ты болван. DDD
'uit32_t' does not name a type; did you mean 'uint32_t'?
C:\Users\A26A~1\AppData\Local\Temp\ccdKmYgf.ltrans0.ltrans.o: In function `main':
 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Artist666 пишет:
Это можно без ардуино запустить, типа виртуально?

Можно. Без Ардуино, какой не был кривой код, то все работают. А вот если код залить в Ардуино, то Ардуино почему-то тупит не падетски.  Так что Вы пользуйтесь своим кодом, но в плату не заливайте. И все будет хорошо работать.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

код из #19 при:

static uint32_t timer = millis();

выводит только 0

#define timer millis()

выводит увеличивающуюся последовательность

Artist666
Offline
Зарегистрирован: 26.02.2022

Я уже нашел онлайн симулятор, ну 000 выводило, и что это доказывает?
Что я неправильно написал? Ппц. Пойман с поличным.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Это доказывает что сертификат ты точно заслужил !

Artist666
Offline
Зарегистрирован: 26.02.2022

Спасибо, но я пожалуй откажусь от столь щедрого предложения. ))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Надо так 

static uint32_t timer;
 timer = millis();

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Artist666 пишет:

Код не рабочий, мой вердикт - ты болван. DDD

'uit32_t' does not name a type; did you mean 'uint32_t'?

C:\Users\A26A~1\AppData\Local\Temp\ccdKmYgf.ltrans0.ltrans.o: In function `main':

Кто сертификаты раздаёт? Этому кадру точно парочка нужна! Еще и наехал, блин!

ЗЫ: b707 - надо же сразу рабочий код давать, ты чего "халтуришь то"? (не видел как он ножкой топнул и показал себя?). )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

qwone пишет:

Надо так 

static uint32_t timer;
 timer = millis();

 

static тут нах не упал

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Мля, так и не смог найти - когда static в коде появился (кроме сообщений с кусками)?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

DetSimen пишет:

static тут нах не упал

Если там две строчки, то да. Но так уже меняются показания в Сериал

Artist666
Offline
Зарегистрирован: 26.02.2022

BOOM пишет:
Еще и наехал, блин!

b707 пишет:
Слушайте, вы, мой недалекий друг!
Эта "мелочная ошибка" делает ваш код ПОЛНОСТЬЮ НЕРАБОЧИМ.

Ну как-то так.

AKOTb
Offline
Зарегистрирован: 24.01.2017

Сколько боли и разочарования в каждом сообщени.

Artist666
Offline
Зарегистрирован: 26.02.2022

Я тоже в шоке, неадекватные люди какие-то теперь пошли.

b707
Offline
Зарегистрирован: 26.05.2017

BOOM пишет:

так и не смог найти - когда static в коде появился?

с самого первого сообщения. Итого считаем - в ветке как минимум три человека не знают, как пользоваться статик - ТС, квон и конечно, артист.

b707
Offline
Зарегистрирован: 26.05.2017

Artist666 пишет:

Я уже нашел онлайн симулятор, ну 000 выводило, и что это доказывает?
Что я неправильно написал? Ппц. Пойман с поличным.


это доказывает, что ты тупой упрямый придурок
Даже когда тебе указали на ошибку - ты все равно будешь полдня спорить, вместо того чтоб прям с того же телефона, с которого ты лошишь в инете - зайти в гугль и найти ответ.
Ты там на прошлой странице рассуждаешь о том, что у гайвера в коде лишнее сложение и код его первый раз сработает с задержкой - а того, что твой код НЕ СРАБОТАЕТ НИ РАЗУ- в упор не видишь. Тебе кажется это " мелкой ошибкой", да?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AKOTb пишет:
Сколько боли и разочарования в каждом сообщени.
Ужость!

b707
Offline
Зарегистрирован: 26.05.2017

AKOTb пишет:
Сколько боли и разочарования в каждом сообщени.

это точно.

Исправили в своем коде ошибку? Я вам в сообщении #2 совершенно серьезно отвечал, это уж потом концерт с заезжими артистами начался :)

AKOTb
Offline
Зарегистрирован: 24.01.2017

Да, разобрался, спасибо Вам.

Видимо писать код на ночь не очень хорошо. С утра почитав Ваш комментарий всё поправил, разобрался с 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 это породит?

Был бы благодарен за консультацию.

b707
Offline
Зарегистрирован: 26.05.2017

AKOTb пишет:

С утра почитав Ваш комментарий всё поправил, разобрался с static, что в loop'е он не актуален. Ну и вынес инициализацию переменной за пределы loop.

что-то вы как-то сомнительно "разобрались", выводы неверные. Static вполне себе "актуален" в loop и выносить переменную таймера в глобальные было совсем необязательно. Наоборот, локальная статик переменная в данном случае более правильное решение. Главное, чего у вас не хватало в исходном коде - это строка 21 (по предыдущему сообщению), все остальное и трогать не надо было.

 

Что касается остальных вопросов - вы слишком глубоко копаете. На вашем нынешнем уровне разница между If и switch непринципиальна, что яснее понимаете - то и используете. За "эффективность кода" вам на данном этапе думать рано, важнее ошибок не насажать. Вот сделаете пяток подобных проектов - сами поймете, когда применять одно, а когда другое.

Но это мое личное мнение и я его не навязываю.

 

AKOTb
Offline
Зарегистрирован: 24.01.2017

Ок, понял. Вернул статик на место.

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

Я пришёл к тому, что перестаю видеть свой код как целую картинку. Мешанина из переменных и ифов. Целиком выкладывать не стал, т.к. тапками закидают ведь. Вот и задумался а как взрослые дяди пишут большие проекты, на больших контроллерах? Наверное есть какая-то концепция наведения порядка. Пробовал собрать все экраны в воиды, и оказалось что вместе с экранами собрал обработку кнопок туда. Сейчас кнопки из воидов вытаскиваю и прописываю условия для каждой кнопки на отдельном экране, чтобы поместить это всё в loop.

b707
Offline
Зарегистрирован: 26.05.2017

AKOTb пишет:

Я пришёл к тому, что перестаю видеть свой код как целую картинку. Мешанина из переменных и ифов.

очень знакомо :) не расстраивайтесь, через это проходят все.

 

Цитата:
Вот и задумался а как взрослые дяди пишут большие проекты

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

Есть такое правило - если процедура перестает помещаться на один экран монитора - значит она слишком длинная и пора ее делить на более мелкие. Хотя, конечно. бывает по разному.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

AKOTb пишет:
Просто говорят что  надо сразу учиться правильно, чтобы потом не переучиваться.

Не получится. Как бы Вы правильно не учились, настанет момент, что надо снова переучиваться. Так что программирование это сплошное переучивание.

Программа не должна быть одним куском в одном файле. Скорее программа состоит из сшивки файлов, которые подключается include . Это и чужие библиотеки и свои.

Громоздить кучу сода в loop и setup не стоит. Лучше по одной функции от каждого девайса. Тогда их легко отключить из программы просто закоментив.

ПС: Не скажу что это эталон, но как вариант можно использовать  #252