#1 Re: Программирование Arduino » Прочитать-записать данные батареи ноутбука » 2021-01-15 01:38:07

Не все так просто как кажется. Оригинальные батареи имеют несколько видов защит. Защита от перезаряда, переразряда, высокой температуры, превышения какого-то количества циклов зарядки. Если у вас оригинальная батарея, то при отключении банок она с большой долей вероятности заблокируется. Более того, если она не раборает, то уже может быть заблокирована, а для надежности пережигается управляемый предохранитель. Разблокировать контроллер можно зная пароль и умея его вводить. Каждый вендор пытается защитить свой продукт от подделки. Поэтому в различных батареях присутствуют свои секреты.
Пример:
Введи часть пароля в ячейку 77, прочти из ячейки 78 число, потом от 1000 отними это число, введи в ячейку 79, затем введи оставшийся пароль в ячейку 77.
Если у вас китайская батарея, то можно с ней экспериментировать. Чипы в большинстве своем без сюрпризов, можно отключать/подключать банки. Но соблюдайте последовательность: отключаем от плюса к минусу, подключаем от минуса к плюсу

#2 Re: Программирование Arduino » Прочитать-записать данные батареи ноутбука » 2021-01-11 15:57:53

Ха! Я нашел! Если мы читаем word из 0x3c и получаем чушь, то нужно прочесть block оттуда же. И если в этом block мы видим значение LENOVO, то значения напряжений в каждого элемента нужно читать из ManufacturerData, то есть из ячейки 0x23.
И там мы видим примерно следующее:

42 01 01 01 00 00 A7 0D D4 0D C1 0D 05 80

, где:

VCELL4: 0000 mV - 00 00
VCELL3: 3495 mV - A7 0D
VCELL2: 3540 mV - D4 0D
VCELL1: 3521 mV - C1 0D

А так как используется little-endian, то правильно буде записать так:

VCELL4: 0000 mV - 00 00
VCELL3: 3495 mV - 0D A7
VCELL2: 3540 mV - 0D D4
VCELL1: 3521 mV - 0D C1

Ююхуу!  lol

#3 Re: Программирование Arduino » слетела библиотека » 2021-01-08 02:34:23

Kaka пише:
Igor1954 пише:

2.Почему не могу скопировать диагностику, которую выдал IDE?

Да, хрен же тебя знает, почему ты не можешь. Вариантов тут много: руки не из того места, мозгов нету, не хотел и не копировал, ну и ещё бывают всякие причины.

Не обращай внимания. Этот троль просто постит ответы ради ответов. Он просто бог программирования и на форум заходит, чтобы потешить себя и поорать с других. Ни одного полезного совета. Какие его цели? Думаю он и сам не знает.

1. Посмотри по пути, на который указывает ошибка. Лежит ли там вообще тот библиотечный файл? Обрати внимание, что
#include <filename>
не то же самое, что
#include "filename"

2. Конкретно одну строку с ошибкой скопировать нельзя, да. Но можно скопировать всё и потом вставить в какой нить блокнот и рассмотреть подробнее. Удачи!

#4 Re: Программирование Arduino » Помогите доделать простой скетч за денежку » 2020-12-23 00:14:10

martinways пише:

Дорогой друг Honey, я понимаю, что Вы подсказываете загадками

Мне кажется он вам пытается сказать, что

клавиша = прочитать_клавишу();

у вас выполняется только один раз. Все остальное время вы висите в for (;;)
И все что внутри for (;;) не знает о том, что нажималась другая клавиша

#5 Программирование Arduino » Прочитать-записать данные батареи ноутбука » 2020-12-22 23:00:53

luminofor
відповідей: 4

Продаю много батарей. И чтобы не терять лицо перед клиентами, проверяю их перед продажей. Смастерил себе зарядно-разрядную станцию на ардуине. Все как бы прекрасно, но некоторые батареи читаются не так как должны.
Собственно вопрос. Батареи у которых два контроллера - bq29330+bq8030 не правильно показывают напряжение на банках.
По даташитам информация берется из ячеек 3c, 3d, 3e, 3f.
При чтении оттуда получаю какую то ерунду.
Использую библиотеку SoftI2CMaster-master от товарища felias-fogg, кому интересно, можете взглянуть.
Честно содрал из других похожих проектов функцию чтения слова из двух байт:

int fetchWord(byte func)
{
  i2c_start(deviceAddress << 1 | I2C_WRITE);
  i2c_write(func);
  i2c_rep_start(deviceAddress << 1 | I2C_READ);
  byte b1 = i2c_read(false);
  byte b2 = i2c_read(true);
  i2c_stop();
  return (int)b1 | ((( int)b2) << 8);

Из любых других чипов читается корректно.
Есть еще один способ прочитать данные - преобразователь интерфейса i2c-USB от Silicon Lab на микросхеме CP2112.
И есть прога be2works, она платная, но есть бесплатная демка, которая корректно в автомате показывает инфу из вышеупомянутых ячеек. Но! В ней есть возможность прочитать данные вручную. И при попытке прочитать эти ячейки, получаю ту же самую ерунду.
Задал вопрос у них на форуме, но там видать слишком гордые ребята, чтобы даром делиться информацией. Даже тему мою не пропустили.
Так вот, первый вопрос. Может кто нибудь знает как правильно прочитать эти ячейки?

Попутно задам второй вопрос. Но сначала расскажу к чему он.
Чип в батареях может быть seal, unseal и full access. Очень много батарей приходят с полным доступом. Это значит, что можно менять в них некоторые параметры (количество циклов, паспортную емкость, дату выпуска и т.д.)
Некоторые чипы без проблем принимают команду записи слова:

void write_word(uint8_t reg)
{
    i2c_start((deviceAddress << 1) | I2C_WRITE);
    i2c_write(reg);
    i2c_rep_start((deviceAddress << 1) | I2C_WRITE);
    i2c_write(b1 & 0xFF);
    i2c_write(b2 & 0xFF);
    i2c_stop();
}

На чипах bq4050 это работает. Но другие не позволяют запись слова. Записать возможно только один байт, через функцию записи байта. При этом второй байт автоматически принимает значение 0x16. То есть мне допустим нужно записать в ячейку значение 0x0201. Не получается. Зато получается записать 0x02. Тогда в ячейке получим значение 0x0216
Программа be2works записывает в ячейки правильно на любых чипах.

И второй вопрос. Может кто нибудь знает как правильно записать ячейки?

Я уж думаю, если нигде не найду инфу, придется делать i2c снифер, чтобы подсмотреть как они это делают

#6 Re: Аппаратные вопросы » Нужна помощь в подборе запчастей. Реле или MOSFET? » 2020-12-02 09:45:27

Примерно вот так должно получиться.

stm32

Картинка на дисплеях пока что тестовая, просто подбирал шрифт. И картинка на всех одинаковая - коммутатор i2c еще не приехал. Черные полосы на дисплеях - из за частоты обновления дисплеев, в живую их не видно

#7 Re: Аппаратные вопросы » Нужна помощь в подборе запчастей. Реле или MOSFET? » 2020-12-02 08:25:27

Sergio пише:

А на  mega 2560 что, мало ног будет для этого всего?  STM32 - это слишком круто для такой задачи  cool

Не, нормас. big_smile
STM32F103C8T6 - 87грн
Arduino Mega 2560 R3 - 236грн

#8 Re: Аппаратные вопросы » Нужна помощь в подборе запчастей. Реле или MOSFET? » 2020-12-01 20:27:52

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

#9 Re: Аппаратные вопросы » Нужна помощь в подборе запчастей. Реле или MOSFET? » 2020-12-01 16:00:02

гоость пише:
luminofor пише:

они все коммутируют "минус". Плюс общий.

Это кто такую дурь сказал?

Ну вообще хотя бы тут:
тыц

Или тут:
тыц

Или тут:
тыц

Или тут:
тыц

Или тут:
тыц

Может я плохо ищу, но попадаются только с общим плюсом

гоость пише:
luminofor пише:

Надо на STM-ке делать.

лучше сразу на i7

Ну не знаю, как то тяжко программировать под i7-й, man-ы тяжело искать big_smile
Что плохого в STM?
В stm32f103c8t6 более чем подходящее количество ног

#10 Re: Аппаратные вопросы » Нужна помощь в подборе запчастей. Реле или MOSFET? » 2020-12-01 13:34:27

Блииин, я тут еще подумал. Pro Mini не хватит. Мало ног.
4 - меряют напряжение
4 - меряют ток
4 - включают заряд
4 - включают разряд
4 - кнопки управления
2- I2C
Надо на STM-ке делать

#11 Аппаратные вопросы » Нужна помощь в подборе запчастей. Реле или MOSFET? » 2020-12-01 12:33:11

luminofor
відповідей: 9

Всем привет. Возникла потребность измерять емкость элементов 18650.
Был куплен приборчик Liitokala Lii-500, но он слабоват. При установке сразу 4х элементов, ток заряда/разряда не превышает 500мА.
Для тех, кто не знает что это, небольшой гайд.
Прибор заряжает элемент, потом разряжает, измеряя при этом емкость на разряд, потом снова заряжает. На это все уходит часов 8-12, в зависимости от первоначального состояния элемента.
Захотелось ускорить этот процесс раза в два.
Купил
- четыре I2C 0,96" Oled дисплейчика
- модуль коммутатор I2C на TCA9548A для подключения 4х дисплеев с одним адресом к ардуинке
- ардуинку Pro Mini
- четыре модуля измерителя тока на ACS712
- четыре платки для павербанков (чтобы не изобретать алгоритм для зарядки/разрядки банок)

Теперь собственно проблема: как скоммутировать банку, чтобы не городить много элементов?
Можно взять допустим реле и решить проблему в лоб. Будет два положения - "заряд" или "разряд". Но я хочу третье положение "Стоп"
Для этого нужно два реле. Одно клацает на "заряд", другое на "разряд".
Тогда для четырех банок нужно 8 реле! Будет большая и шумная клацалка big_smile
Или использовать 8 мосфет ключей. Но тут проблема, они все коммутируют "минус". Плюс общий. Не пойму теперь как будет измеряться напряжение? Нужно ведь чтобы минус банки был все время соединет с ардуиной, иначе никакой analogRead() не измеряет напряжение на ней.
Короче башка уже устала, error...

Если что, вот схема подключения платы павербанка
схемка
и схема из даташита
еще схемка

#12 Re: Проекты » Посоветуйте как реализовать задумку » 2020-05-26 01:18:29

Нужно вашему начальству посоветовать приобрести КНС (контроль несения службы). Смысл такой: Коробочка с таймером (таймер программируется хозяином охраняемого объекта, датчики с физическими хотя и пластиковыми ключами, расставлены по объекту. Охранник должен за время таймера обойти все датчики и провернуть ключ в замках. Обошел все замки - молодец, службу несешь. 15 минут перекур и по новой. Если за время таймера охранник этого не сделал, то либо его замочили по дороге, либо он спит. Итог - новенький свежий охранник при любом раскладе.

#13 Re: Аппаратные вопросы » можно ли параллельно заряжаемому акуму +(EM4056) подключить плеер ? » 2020-05-17 23:27:16

Привет. Думаю плеер начнет играть как только напряжение на батарее станет таким, как нужно для его старта. И будет играть до тех пор пока напряжение не станет ниже этого значения. Какое номинальное значение напряжения для вашего mp3 плеера?
Если 5вольт, то лучше использовать что то типа такого:
такого
Картинка не фонтан, но принцип понятен

#14 Re: Программирование Arduino » touch screen » 2020-05-14 00:13:15

У тачей обычно есть стандартная библиотека. Работает так: ловится прерывание по тачу. Если было нажатиие, то выдается координата нажатия. Что дальше делать с этой координатой - вам решать. Можно самому написать или использовать стандартные функции проверки - входит ли координата в зону реагирования. Не сушествует стандартных функций под вашу хотелку. Можно проверять как идет изменение координаты X и Y и от этого строить логику

#15 Re: Программирование Arduino » Запись и чтение из eeprom массивов символов » 2020-05-09 16:58:33

Я как то заморочился подобной проблемой. Было около 50-ти строк по 20-24 символа в каждой
Решил проблему так. Первые 100 адресов EEPROM выделяю под хранение указателей, в которых храниться длина каждой строки.
В остальные записываю текст из массива посимвольно.

#include <EEPROM.h>
#define START_POINTER_ADDRESS 0		// Начальный адрес указателей, исправить при необходимости
#define START_STRING_ADDRESS 100	// Начальный адрес текста, исправить при необходимости
#define HOW_MANY_STRING_TO_SHOW 20	// Сколько строк показывать в Serial
int ptr_addr;	
int strng_addr;

char* text_array [] = 			// Длина каждой строки не должна превышать 255 символов
{
	"Текст кирилицей 0",		//0
	"Текст кирилицей 1",		//1
	"Текст кирилицей 2",		//2
	"Текст кирилицей 3",		//3
	"Текст кирилицей 4",		//4
	"Текст кирилицей 5",		//5
	"Текст кирилицей 6",		//6
	"Текст кирилицей 7",		//7
	"Текст кирилицей 8",		//8
	"Текст кирилицей 9",		//9
	"English Text 0",			//10
	"English Text 1",			//11
	"English Text 2",			//12
	"English Text 3",			//13
	"English Text 4",			//14
	"English Text 5",			//15
	"English Text 6",			//16
	"English Text 7",			//17
	"English Text 8",			//18
	"English Text 9",			//19
};

void setup()
{	
	Serial.begin(9600);
	while ( ! Serial )
	{ // Ждать пока включится сериал, можно удалить

	}
	
	ptr_addr = START_POINTER_ADDRESS;
	strng_addr = START_STRING_ADDRESS;
	
	for (int n=ptr_addr; n<sizeof(text_array)/sizeof(text_array[0]); n++)	// Выражение sizeof(text_array)/sizeof(text_array[0]
	{														// определяет количество символов в строке массива строк 
		String text = text_array[n];						// Выдернуть из массива строк одну строчку
		EEPROM.put(n, text.length()); 						// Записать в EEPROM по адресу n длину строки
		for (int i = 0; i < text.length(); i++)
		{
			EEPROM.write(strng_addr + i, text[i]);				// Записать строчку в EEPROM по одному символу, начиная с начального адреса
		}
		strng_addr += text.length()+1;						// Увеличить начальный адрес на длину предыдущей строки +1
	}														// +1 нужен, чтобы не затереть последний символ предыдущей строки

	strng_addr = START_STRING_ADDRESS;
	
	Serial.println("poiter---length---Text message---");	// Вывод в сериал того, что получилось
	for (int n=0; n<HOW_MANY_STRING_TO_SHOW; n++)			// Перебрать указатели
	{
		Serial.print(n);									// Вывод адрес указателя
		Serial.print("\t");
		Serial.print(strng_addr+EEPROM.read(n));			// Адрес начала строки = адрес старта + длина всех предыдущих строк
		Serial.print("\t");
		for (int i=0; i<EEPROM.read(n); i++)		 		// Вывод символов (количество читается из ячейки n)
		{
			char text[1];									// Объявить массив char с одним символом
			Serial.print(EEPROM.get(i+strng_addr,text));	// Вывести один символ
		}
		Serial.println("");
		strng_addr += (1+EEPROM.read(n));					// Начало следующей строки = длина предыдущей строки +1
	}														// +1 по той же причине, что и выше

}

void loop()
{

}

Вот видос того, что получается

#16 Re: Аппаратные вопросы » Помогите подключить Амперметр » 2020-04-16 11:50:29

Lic Control пише:

Вариант 2.
Для питания Arduino используйте отдельный блок питания или DC-DC преобразователь с гальванической развязкой, например вот такой B0505S-1W
http://www.kosmodrom.com.ua/pic/SIP4(stand).jpg

Отличная идея! Спасибо!

#17 Re: Программирование Arduino » Вызов функции по номеру (указатель на функцию) » 2020-04-16 11:49:21

Lic Control пише:

Боюсь вас огорчить, но по моему мнению за такое никто не заплатит.
Почему вы не хотите использовать WEB-интерфейс. Например ESP32 + WiFi.

Я разрабатываю не массовое устройство. Так что да, заплатят только те, кому это очень нужно. Я промониторил рынок, есть только два похожих прибора в ценовой категории до 250$. Мой девайс обойдется дешевле, при почти тех же возможностях.
Веб интерфейс мне не нужен, это настольный прибор. Допустим как осцилограф. Хотя наличие вебморды было бы интересным решением, но только в связке с соответтствующим ПО для смартфона и возможностью мониторинга удаленно, а не только в домашней сети. За такую опцию точно никто не заплатит))
Рассматриваю кстати использование вместо ESP32 вместо Arduino. Будет и быстрее и даже немного дешевле.
Попутно столкнулся с другими проблемами. Не все комплектующие работают так как задумывалось, приходится импровизировать на ходу. Корпусно-крепежные проблемы.

#18 Аппаратные вопросы » Помогите подключить Амперметр » 2020-04-14 11:41:17

luminofor
відповідей: 3

Не могу придумать как решить на первый взгляд простую проблему. Есть китайский измеритель тока, напряжения, мощности, вот такой.
Измеритель напряжения, тока, мощности
Появилось желание добавить его в проект.
В готовом проекте показания напряжения были правильные, а вот показания тока были занижены раза в три. Я уж думал обижаться на китайцев и попутно начал искать другие подобные измерители, и обнаружил, что проходящий ток измеряется по минусовой шине. То есть плюс у них общий, и шунт стоит по минусу.
Блок схема
Если не использовать шину I2C, то показания тока будут правильные.
Теперь собственно вопрос: как подключить GND, SDA, SDL так, чтобы и шина работала и амперметр правильно мерял?

#19 Re: Программирование Arduino » Вызов функции по номеру (указатель на функцию) » 2020-04-04 23:30:12

Забыл сказать. Плата не питается от USB, у нее отдельное питание. По USB только передается инфа в Serial. Так что, если даже компу сказать, чтобы он не отрубал питание с USB, не факт, что плата не зависнет.
И потом, расчитывая на все случаи жизни, лучше заранее предусмотреть защиту от такого поведения.

#20 Re: Программирование Arduino » Вызов функции по номеру (указатель на функцию) » 2020-04-04 20:00:28

Есть еще одна проблема. Если плата подключена к компу по USB и комп выключить, то плата виснет. Помогает только передергивание кабеля. Не критично, но раздражает. Думаю как то сторожевого пса приделать, чтоб следил за Serial. Но пока не курил эту тему

#21 Re: Программирование Arduino » Вызов функции по номеру (указатель на функцию) » 2020-04-04 19:48:18

Watchdog пише:

Подскажу:

void bar(void) {
// ... 
}

void (*foo)[n](void) = {bar, ...};

for (int i = 0; i < n; i++) foo[i]();

Ваша конструкция не заработала, не знаю почему. Я не силен тонкостях программирования. Подсмотрел здесь
решение, не все понял, но результат устраивает. То, чего я добивался, получилось. Вот результат:

volatile boolean intFlag = false;   // Флаг прерывания
int key = false;				// Флаг нажатия кнопки
int newscreen = false;		// Флаг нового экрана
pinMode(7, INPUT_PULLUP);	// Кнопка на седьмой пин где будет ловиться прерывание №4

char *text1[]={				// Массив текстовых сообщений 1
	"Сообщение 0:",
	....
	"Сообщение 9:",
};

void function_0 (void);		// Объявление функций, сами функции расписаны в конце
....
void function_9 (void);

void (*a0)(void) = &function_0;  	// Создание указателей на адреса функций,
....						      // которые получают данные с устройства
void (*a9)(void) = &function_9;

typedef void (* FuncPtr1) ();	// Создание типа с названием FuncPtr1
						// который представляет собой указатель на функцию

FuncPtr1 param1[10] = {a0, .... , a9};   // Складывание указателей в массив

// То же самое для второго экрана

char *text1[]={				// Массив текстовых сообщений 2
	"Сообщение 10:",
	....
	"Сообщение 19:",
};

void function_10 (void);		// Объявление функций, сами функции расписаны ниже
....
void function_19 (void);

void (*b0)(void) = &function_10;   // Создание указателей на адреса функций
....						   // которые получают данные с устройства
void (*b9)(void) = &function_19;

typedef void (* FuncPtr1) ();	// Создание типа с названием FuncPtr2
						// который представляет собой указатель на функцию
FuncPtr1 param2[10] = {b0, .... , b9};   // Складывание указателей в массив

void setup()
{

	//	Тут всякие нужные действия
}

void loop()
{
switch (intFlag) {				// Обработчик нажатия кнопки
	case true:
		intFlag = false;			// Сброс флага прерывания		
		key = !key;			// Нажатие на кнопку зафиксировано
		newscreen = !newscreen;	// Новый экран - Да
		LCD_Clear(0x0000);		// Очистка всего экрана
		break;
	}
	
	
	switch (key) {				// Реакция на кнопку выбора экрана
	case false:					// Первый экран
		switch (newscreen) {		// Новый экран?
		case false:				// Да, новый екран
			for (int i = 0; i < 10; i++){														
				Paint_DrawString_EN(x, y(i), text1[i], шрифт, фон, цвет);	// Выводить текст 1 с просчетом координаты Y
				switch (device_ready()) {										// Подключено ли устройство:
				case false:														// Нет - ничего не выводить
					break;
				default:														// Да - выводить данные 1
					param1[i]();
				}
			}
			newscreen = !newscreen;												// Сбрасываем флаг "Новый экран"
			break;
		case true:																// Экран уже был, выводить только данные
			for (int i = 0; i < 10; i++){
				switch (device_ready()) {										// Подключено ли устройство:
				case false:														// Нет - затереть пробелами предыдущие значения
					Paint_DrawString_EN(x, y(i), "     ", шрифт, фон, цвет);	// с просчетом координаты Y
					break;
				default:														// Да - выводить данные 1
					param1[i]();
				}
			}
			break;
		}			
		
		attachInterrupt(4, buttonTick, LOW);									// Реакция на кнопку разрешена
		break;
		
		
	case true:																	// Второй экран
		switch (newscreen) {													// Новый экран?
		case false:																// Да, новый экран
			for (int i = 0; i < 10; i++){
				Paint_DrawString_EN(x, y(i), text2[i], шрифт, фон, цвет);		// Выводить текст 2
				(device_ready()) {												// Подключено ли устройство:
				case false:														// Нет - ничего не выводить
					break;
				default:														// Да - выводить данные 2
					param2[i]();
				}
			}
			newscreen = !newscreen;												// Сбрасываем флаг "Новый экран"
			break;
		case true:																// Экран уже был, выводить только данные
			for (int i = 0; i < 10; i++){																
				switch (device_ready()) {										// Подключено ли устройство:
				case false:														// Нет - затереть пробелами предыдущие значения
					Paint_DrawString_EN(x, y(i), "     ", шрифт, фон, цвет);	// с просчетом координаты Y
					break;
				default:														// Да - выводить данные 2
					param2[i]();
				}
			}
			break;
		}		
		
		attachInterrupt(4, buttonTick, LOW);									// Реакция на кнопку разрешена
		break;
		
	}
	// Далее вывод в сериал
}

// Куча полезных функций

void function_0(){}		// Функции объявленные в самом начале
....					
void function_19(){}

void buttonTick() {									// Хитрая реакция на прерывание, подсмотрел на одном форуме
	detachInterrupt(digitalPinToInterrupt(7));		// Запрещаем прерывания по пину 7
	intFlag = true;									// Установка флага прерывания
}

Всем спасибо за идеи, конструктивная критика и новые идеи приветствуются  smile

#22 Re: Программирование Arduino » Вызов функции по номеру (указатель на функцию) » 2020-03-24 01:25:11

Kaka пише:

но надо задачу понимать.

Задача почти допилена, можно в принципе и так бросить, но я пока жду комплектуху из Китая, поэтому допиливаю по мере просветления мозгов.
По I2C подключен некий прибор, который может выдавать тучу параметров. Не хочу трепаться что именно, вдруг выгорит и стану миллионером lol
По SPI подключен IPS TFT дисплей 320х240.
Стандартная библиотека дисплея умеет выводить 'символы' по коду, "строку из букв", числа ну и рисовать всякие отрезки треугольники и прочие прямоугольники. Я пробовал другие библиотеки под чип ST7789, они не завелись. (почему то не работала треть экрана как я его не вращал, хотя в библиотеках была поддержка дисплея 320х240). Это сейчас не важно, использую, то, что работает.
Так вот. Заполнение 11 строк описательным текстом 16м шрифтом занимает 10 секунд, потом отображаются получаемые данные. Данные бывают либо текст, либо цифры. Это еще 2 секунды.
По нажатию кнопки дисплей стирается и отображаются еще 12 строк с тектом и параметрами.
Были некоторые трудности с приведением этого месива в красивый вид, чтобы не моргало лишний раз, об этом я писал в другом посте про оптимизацию вывода на дисплей. Сейчас все красиво и волшебно, но захотелось уплотнить код (сейчас используется 87% ROM и 55% RAM) так как в будущем хочу добавить пару хотелок, или не хочу. Пока не уверен.
После дисплея инфа выводится в сериал. (это я еще допиливаю, раскрашиваю в цвет и делаю таблицу).
Так вот, по поводу оптимизации. Хочу избавится от бесконечных if и goto. Не знаю почему, но опытных программеров они раздражают. Начал делать. И тут пришла идея вообще нафик все переделать. Чтобы было строка_описательного_текста_1 + данные_1, строка_описательного_текста_2 + данные_2 и так далее. Покурил указатели на функции, вроде бы то, что нужно. Ведь все уже набрано, осталось грубо говоря пронумеровать куски и выдавать их потом в любой последовательности.
Пока не могу вкурить как выдать на дисплей String

String formatted_date = "";
formatted_date += year;
formatted_date += "-";
formatted_date += month;
formatted_date += "-";
formatted_date += day;
Serial.println(formatted_date);

Вот так выдать в сериал можно, на дисплей нет

#23 Re: Программирование Arduino » Алгоритмы оптимизации вывода на дисплей » 2020-03-24 00:28:44

г0сть пише:
Kaka пише:

Бред какой-то.

Согласен

Kaka предложил толковую идею, про которую я не знал, а вы могли бы предложить свою или воздержаться.
Покурил я printf - интересная вещица, ща сбацаю все хотелки  lol

#24 Re: Программирование Arduino » Вызов функции по номеру (указатель на функцию) » 2020-03-23 13:50:29

Watchdog пише:

А я догадываюсь. Человек GUI валяет. big_smile А учить мову не желает.

Правильно, ваяю GUI big_smile
Это мой первый проект и сразу такой масштабный. Второй месяц ковыряю, почти идеально уже, но нет предела совершенству cool
Желаю, поэтому и консультируюсь. В интернетах нарыл, что, то, что я хочу сделать называется указатель на функцию. Пересмотрел видосы и гайды, есть представление, но нет пока четкого понимания. Много сложной воды и мало примеров.
Однажды я услышал фразу: не нужно зубрить матчасть, нужно сразу брать и пробовать. На удачах и ошибках быстрее научишься.
За подсказку спасибо, примерно это я и имел ввиду.

#25 Re: Программирование Arduino » Вызов функции по номеру (указатель на функцию) » 2020-03-23 02:24:27

Вообще логика такая:
Отображается один раз 11 строк текста и затем и соответственно 11 строк данных по циклу
Проверяется кнопка, если было нажатие, то следующие 12 строк текста один раз и 12 строк данных по циклу.

Ваш подход мне нравится, надо попробовать. А как будет правильнее, объявить все эти функции в setup() или можно в loop()?

Підвал форуму