Библиотека iarduino_OLED_txt для работы с OLED дисплеями v.1.2.3 Компиляция на Arduino IDE 2.3.4 под esp32

Не получается скомпилировать ни один пример на esp32

Раньше всё прекрасно работало с более старыми версиями iArduino OLED txt на одной из первых IDE 2.0.x

Сейчас iArduino OLED txt v.1.1.0 нормально работает на IDE 1.8.19 под esp32. Но это не интересно.

Как заставить работать новые версии под esp32 ?

Раньше при возникновении аналогичных проблем c компиляцией под esp32 мне всегда помогали в конторе iArduino, просто писал им письмо, они вносили исправления в библиотеку. Сейчас уже два письма отправил – молчание. Наверное некому этим заниматься.

Текстовые файлы с ошибками IDE прикрепить не получилось.

Коротко, вот так:

collect2.exe: error: ld returned 1 exit status

Используем библиотеку Wire версии 3.1.3 из папки: C:\Users\Mikhail\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.1.3\libraries\Wire
Используем библиотеку iarduino_OLED_txt версии 1.2.3 из папки: C:\Arduino_221\mk\libraries\iarduino_OLED_txt
exit status 1

Compilation error: exit status 1

и на других файлах:

C:\Users\Mikhail\AppData\Local\Temp.arduinoIDE-unsaved2025219-7812-1bbvlvc.uqhn\ShowNumber\ShowNumber.ino:24:18: error: call of overloaded ‘print(int, int, int, int)’ is ambiguous
24 | myOLED.print( 123 , 0, 7, 12 ); // Выводим целое положительное число начиная с 0 столбца 7 строки, в 12-ричной системе счисления.
| ^~~~~~~~~~~~
c:\Arduino_221\mk\libraries\iarduino_OLED_txt\src/iarduino_OLED_txt.h:121:49: note: candidate: ‘void iarduino_OLED_txt::print(int8_t, int, int, int)’
121 | void print (int8_t , int=OLED_N, int=OLED_N, int=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления)
| ^~~~~
c:\Arduino_221\mk\libraries\iarduino_OLED_txt\src/iarduino_OLED_txt.h:122:49: note: candidate: ‘void iarduino_OLED_txt::print(uint8_t, int, int, int)’
122 | void print (uint8_t , int=OLED_N, int=OLED_N, int=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления)
| ^~~~~
c:\Arduino_221\mk\libraries\iarduino_OLED_txt\src/iarduino_OLED_txt.h:123:49: note: candidate: ‘void iarduino_OLED_txt::print(int16_t, int, int, int)’
123 | void print (int16_t , int=OLED_N, int=OLED_N, int=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления)
| ^~~~~
c:\Arduino_221\mk\libraries\iarduino_OLED_txt\src/iarduino_OLED_txt.h:124:49: note: candidate: ‘void iarduino_OLED_txt::print(uint16_t, int, int, int)’
124 | void print (uint16_t , int=OLED_N, int=OLED_N, int=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления)
| ^~~~~
c:\Arduino_221\mk\libraries\iarduino_OLED_txt\src/iarduino_OLED_txt.h:126:49: note: candidate: ‘void iarduino_OLED_txt::print(int32_t, int, int, int)’
126 | void print (int32_t , int=OLED_N, int=OLED_N, int=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления)
| ^~~~~
c:\Arduino_221\mk\libraries\iarduino_OLED_txt\src/iarduino_OLED_txt.h:127:49: note: candidate: ‘void iarduino_OLED_txt::print(uint32_t, int, int, int)’
127 | void print (uint32_t , int=OLED_N, int=OLED_N, int=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления)
| ^~~~~
c:\Arduino_221\mk\libraries\iarduino_OLED_txt\src/iarduino_OLED_txt.h:128:49: note: candidate: ‘void iarduino_OLED_txt::print(double, int, int, int)’
128 | void print (double , int=OLED_N, int=OLED_N, int=2 ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, количество знаков после запятой)
| ^~~~~

Используем библиотеку Wire версии 3.1.3 из папки: C:\Users\Mikhail\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.1.3\libraries\Wire
Используем библиотеку iarduino_OLED_txt версии 1.2.3 из папки: C:\Arduino_221\mk\libraries\iarduino_OLED_txt
exit status 1

Compilation error: call of overloaded ‘print(int, int, int)’ is ambiguous

iarduino перемудрил с функцией print, компилятор не понимает какую именно вызывать из всего множества…

Держу пари и тут на форуме некому исправлять косяки библиотеки. А точней, никому не нужно)

Сначала тоже так подумал. Но возможно что косяки библиотеки не такие сложные, тому кто сейчас занимается в этой теме, могут сразу броситься в глаза. И окажется, что всё просто. Попробую её прокрутить под Arduino UNO, 95% вероятности что всё будет работать.

Я кому отвечал? Стенке?

Выкинь лишние функции или при вызове print указывай явно используемые типы.
Например:

myOLED.print( (int8_t)123,  (int)0, (int)7, (int)12 );
myOLED.print( (double)1.23, (int)0, (int)7, (int)2  );

Вполне возможно, что достаточно только у первого аргумента тип указать:

myOLED.print( (int8_t)123,  0, 7, 12 );
myOLED.print( (double)1.23, 0, 7, 2  );

Читай что тебе компилятор пишет…

Уважаемый BOOM, спасибо за отклик! Всё я вижу. И попозже дойду до этого.
Но сейчас прокрутил всё под Arduino UNO - и всё хорошо ! Всё транслируется и загружается. Для одной платы всё работает , а для другой нет?

Если название библиотеки начинается с iarduino, её лучше сразу выбросить, чем пытаться исправлять.

4 лайка

В принципе, всё что начинается с “i” можно выбрасывать)))

Ну ты это пробовал?

Или нет? Каков результат?

Конечно, ты же “всё видишь”, а вопросы глупые задаешь!

#ifdef RENESAS_CORTEX_M4																								//
//		Вывод чисел:																									//	Возвращаемое значение: отсутствует.
void	iarduino_OLED_txt::print(int num, int col, int str, int sys){													//	Параметры: число, № колонки, № строки (страницы), система счисления.
			int8_t i=2; int32_t j=1;			while(num/j){j*=sys; i++;}												//	Определяем количество разрядов числа (i = количество разрядов + 2, j = множитель кратный основанию системы счисления)
			char k[i]; i--; k[i]=0; i--;		if(num>0) {k[i]=0; i--;}												//	Создаём строку k из i символов и добавляем символ(ы) конца строки.
			uint32_t n=num<0?num*-1:num;		while(i)  {k[i]=_ItoAa(n%sys); n/=sys; i--;}							//	Заполняем строку k.
												if(num>=0){k[i]=_ItoAa(n%sys);}else{k[i]='-';}							//	Добавляем первый символ (либо первая цифра, либо знак минус).
			print(k, col, str);																							//	Выводим строку k.
}																														//
																														//
//		Вывод чисел:																									//	Возвращаемое значение: отсутствует.
void	iarduino_OLED_txt::print(unsigned int num, int col, int str, int sys){											//	Параметры: число, № колонки, № строки (страницы), система счисления.
			int8_t i=1; uint32_t j=1;			while(num/j){j*=sys; i++;} if(num==0){i++;}								//	Определяем количество разрядов числа (i = количество разрядов + 1, j = множитель кратный основанию системы счисления)
			char k[i]; i--; k[i]=0;				while(i){k[i-1]=_ItoAa(num%sys); num/=sys; i--;}						//	Определяем строку k из i символов и заполняем её.
			print(k, col, str);																							//	Выводим строку k.
}																														//
																														//
//		Вывод чисел:																									//	Возвращаемое значение: отсутствует.
void	iarduino_OLED_txt::print(double num, int col, int str, int sum){												//	Параметры: число, № колонки, № строки (страницы), количество знаков после запятой
			unsigned int i=1, j=0, k=0;																					//	Определяем временные переменные.
			j=sum; while(j){i*=10; j--;} 																				//	i=10^sum.
			print(int(num), col, str);																					//	Выводим целую часть числа.
			if(sum){																									//	Если требуется вывести хоть один знак после запятой, то ...
				print(".");																								//	Выводим символ разделителя.
				j=num*i*(num<0?-1:1); j%=i; k=j;																		//	Получаем целое число, которое требуется вывести после запятой.
				if(j==0){while( sum  ){print("0"); sum--;}          }													//	Если полученное целое число = 0, то выводим sum раз символ 0.
				else    {while(j*10<i){print("0"); j*=10;} print(k);}													//	Иначе, если в полученном целом числе меньше разрядов чем требуется, то заполняем эти разряды выводя символ 0, после чего выводим само число.
			}																											//
}																														//
#else																													//
//		Вывод чисел:																									//	Возвращаемое значение: отсутствует.
void	iarduino_OLED_txt::print(int8_t num, int col, int str, int sys){												//	Параметры: число, № колонки, № строки (страницы), система счисления.
			print(int32_t(num), col, str, sys);																			//	Преобразуем int8_t в int32_t и вызываем функцию вывода числа print(int32_t).
}																														//
																														//
//		Вывод чисел:																									//	Возвращаемое значение: отсутствует.
void	iarduino_OLED_txt::print(uint8_t num, int col, int str, int sys){												//	Параметры: число, № колонки, № строки (страницы), система счисления.
			print(uint32_t(num), col, str, sys);																		//	Преобразуем uint8_t в uint32_t и вызываем функцию вывода числа print(uint32_t).
}																														//
																														//
//		Вывод чисел:																									//	Возвращаемое значение: отсутствует.
void	iarduino_OLED_txt::print(int16_t num, int col, int str, int sys){												//	Параметры: число, № колонки, № строки (страницы), система счисления.
			print(int32_t(num), col, str, sys);																			//	Преобразуем int16_t в int32_t и вызываем функцию вывода числа print(int32_t).
}																														//
																														//
//		Вывод чисел:																									//	Возвращаемое значение: отсутствует.
void	iarduino_OLED_txt::print(uint16_t num, int col, int str, int sys){												//	Параметры: число, № колонки, № строки (страницы), система счисления.
			print(uint32_t(num), col, str, sys);																		//	Преобразуем uint16_t в uint32_t и вызываем функцию вывода числа print(uint32_t).
}																														//
																														//
//		Вывод чисел:																									//	Возвращаемое значение: отсутствует.
void	iarduino_OLED_txt::print(double num, int col, int str, int sum){												//	Параметры: число, № колонки, № строки (страницы), количество знаков после запятой
			uint32_t i=1, j=0, k=0;																						//	Определяем временные переменные.
			j=sum; while(j){i*=10; j--;} 																				//	i=10^sum.
			print(int32_t(num), col, str);																				//	Выводим целую часть числа.
			if(sum){																									//	Если требуется вывести хоть один знак после запятой, то ...
				print(".");																								//	Выводим символ разделителя.
				j=num*i*(num<0?-1:1); j%=i; k=j;																		//	Получаем целое число, которое требуется вывести после запятой.
				if(j==0){while( sum  ){print("0"); sum--;}          }													//	Если полученное целое число = 0, то выводим sum раз символ 0.
				else    {while(j*10<i){print("0"); j*=10;} print(k);}													//	Иначе, если в полученном целом числе меньше разрядов чем требуется, то заполняем эти разряды выводя символ 0, после чего выводим само число.
			}																											//
}																														//
#endif																													//
																														//
//		Вывод чисел:																									//	Возвращаемое значение: отсутствует.
void	iarduino_OLED_txt::print(int32_t num, int col, int str, int sys){												//	Параметры: число, № колонки, № строки (страницы), система счисления.
			int8_t i=2;          int32_t j=1;	while(num/j){j*=sys; i++;}												//	Определяем количество разрядов числа (i = количество разрядов + 2, j = множитель кратный основанию системы счисления)
			char k[i]; i--; k[i]=0; i--;		if(num>0) {k[i]=0; i--;}												//	Создаём строку k из i символов и добавляем символ(ы) конца строки.
			uint32_t n=num<0?num*-1:num;		while(i)  {k[i]=_ItoAa(n%sys); n/=sys; i--;}							//	Заполняем строку k.
												if(num>=0){k[i]=_ItoAa(n%sys);}else{k[i]='-';}							//	Добавляем первый символ (либо первая цифра, либо знак минус).
			print(k, col, str);																							//	Выводим строку k.
}																														//
																														//
//		Вывод чисел:																									//	Возвращаемое значение: отсутствует.
void	iarduino_OLED_txt::print(uint32_t num, int col, int str, int sys){												//	Параметры: число, № колонки, № строки (страницы), система счисления.
			int8_t i=1;          uint32_t j=1;	while(num/j){j*=sys; i++;} if(num==0){i++;}								//	Определяем количество разрядов числа (i = количество разрядов + 1, j = множитель кратный основанию системы счисления)
			char k[i]; i--; k[i]=0;				while(i){k[i-1]=_ItoAa(num%sys); num/=sys; i--;}						//	Определяем строку k из i символов и заполняем её.
			print(k, col, str);																							//	Выводим строку k.
}																														//

Это реализация в библиотеке метода print. Ничего не замечаешь?

Вот так нагляднее:

#ifdef RENESAS_CORTEX_M4																					//
		void				print			(int            ,	int=OLED_N, int=OLED_N, int=DEC			);	//	Объявляем  функцию вывода чисел							(Параметры: число, № колонки, № строки, система счисления)
		void				print			(unsigned int   ,	int=OLED_N, int=OLED_N, int=DEC			);	//	Объявляем  функцию вывода чисел							(Параметры: число, № колонки, № строки, система счисления)
#else																										//
		void				print			(int8_t			,	int=OLED_N,	int=OLED_N, int=DEC			);	//	Объявляем  функцию вывода чисел							(Параметры: число, № колонки, № строки, система счисления)
		void				print			(uint8_t		,	int=OLED_N,	int=OLED_N, int=DEC			);	//	Объявляем  функцию вывода чисел							(Параметры: число, № колонки, № строки, система счисления)
		void				print			(int16_t		,	int=OLED_N,	int=OLED_N, int=DEC			);	//	Объявляем  функцию вывода чисел							(Параметры: число, № колонки, № строки, система счисления)
		void				print			(uint16_t		,	int=OLED_N,	int=OLED_N, int=DEC			);	//	Объявляем  функцию вывода чисел							(Параметры: число, № колонки, № строки, система счисления)
#endif																										//
		void				print			(int32_t		,	int=OLED_N,	int=OLED_N, int=DEC			);	//	Объявляем  функцию вывода чисел							(Параметры: число, № колонки, № строки, система счисления)
		void				print			(uint32_t		,	int=OLED_N,	int=OLED_N, int=DEC			);	//	Объявляем  функцию вывода чисел							(Параметры: число, № колонки, № строки, система счисления)
		void				print			(double			,	int=OLED_N,	int=OLED_N, int=2			);	//	Объявляем  функцию вывода чисел							(Параметры: число, № колонки, № строки, количество знаков после запятой)
		void				print			(char*			,	int=OLED_N,	int=OLED_N					);	//	Объявляем  функцию вывода текста						(Параметры: текст, № колонки, № строки)
		void				print			(const char*	,	int=OLED_N,	int=OLED_N					);	//	Объявляем  функцию вывода текста						(Параметры: текст, № колонки, № строки)
		void				print			(String			,	int=OLED_N,	int=OLED_N					);	//	Объявляем  функцию вывода текста						(Параметры: текст, № колонки, № строки)

Часть типов данных у меня проходят без ругани, это те которые после #endif.
#ifdef RENESAS_CORTEX_M4 F - А этот #ifdef получается только для stm32?

и что вас удивляет?

нет, это для Ардуино Уно R4

К сожалению, меня многие простые вещи удивляют. Слаб я в программировании железа :frowning_face:.
Выбрал плату Arduino UNO R4 Minima, всё скомпилировалось без ошибок.
Как поправить под esp32 - не знаю.

хмм, думал наоборот, типа фирменные )) А почему?

Потому что НЕ фирменные ))

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

Потому, что они написаны крайне небрежно.

Попробуйте прочитать вот эту тему начиная с поста №34 (можно и с начала, но с №34 обязательно) и разобраться что там за ошибка.

Или вот здесь, посмотрите мои спойлеры “Кстати” и “Ещё кстати”.

И, да, маленький штришок: полюбуйтесь на код из учебного материала для начинающих от фирмы iarduino. Надеюсь, после конструкции return loop();, у Вас не останется никаких сомнений в их высочайшем профессионализме.

1 лайк

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

А говорили “Ардуино это просто!”
А тут вона чё, Михалыч) Одни косяки и баги(фичи), хоть бедным студентам книжки в руки брать и писать своё. Обманули как всегда, эх…
А на Гите библиотечка объёмная, сходу не смог вникнуть, так, в закладки добавил.

Экспериментальным путём добился необходимой для себя работоспособности этой библиотеки iArduino.
Пришлось взять её старую версию 1.1.0 .
esp32 старую версию 2.0.17
Зато Arduino новая 2.3.4
В такой связке всё прекрасно работает :laughing:.
Благодарю все участвующих в теме!