Скетч с нано на мегу

При том, что состояние всех пинов хранится в единственной переменной побитно.

Да, я это предположил. А что мешает хранить в массиве bool-ов например? Скетч не смотрел.

Да, ничего не мешает. Просто данных в 8 раз больше будет. Если это не проблема, то в путь.

Если хранить именно как bool, то это в 8 раз больше памяти, а если как byte, то это еще надо уметь работать с битовым массивом.

Я тоже сам скетч не смотрел, но этот фрагмент уже цитировался в ответах.

Обычно, экономией занимается старая гвардия - у них это в крови, потому что детство трудное было.(
Я это относительно программирования сказал. Хотя, это и к обычным людям относится.

1 лайк

ТС не умеет, а остальным не нужно.

1 лайк

И не умеет, и не хочет, мне так кажется.(

кадата сохранил пример от Деда

//  обьявление

#pragma pack(push,1)
struct TByte {
	bool Bit0 : 1;
	bool Bit1 : 1;
	bool Bit2 : 1;
	bool Bit3 : 1;
	bool Bit4 : 1;
	bool Bit5 : 1;
	bool Bit6 : 1;
	bool Bit7 : 1;
};
#pragma pack(pop)

union TBitsMask {
	uint8_t   Value;
	TByte	  Mask;
};
TBitsMask ByteMask;


//    работа с 

ByteMask.Value = Wire.read(); // здесь у тебя все раскладёца по битам отоматически

if (ByteMask.Mask.Bit4) { // проверяй потом, да пей
	do_smth();
}

переделать под любую размерность не проблема
но, думаю, не в этом случае)

Так мы с дедом, вроде, обсуждали более продвинутый пример, где доступ к битам идёт как к элементам массива. Могу поискать, если надо.

1 лайк

Буду признателен, складываю в “копилочку” такое.

Обсуждения не нашёл (мож оно на амперке было), но вот тут вроде тоже работает - sizeof(bool) | Аппаратная платформа Arduino

2 лайка

Извиняюсь, не в тему. Тётушка. Одна в квартире. Прихожу - мёрзнет, хотя на улице +20 в данный момент. Отопительный сезон ещё не наступил, а обогреватель включать не хочет. И уже соплями гремит. Та, ППЦ! Ну ведь на лекарство больше потратишь, чем на электричество! Тем более, куда эти твои деньги?( Горе.

но на слипание не до конца проверили )))

#include "Printing.h"
#include "BoolArray.h"

static const int8_t totalBools = 15;

static CBoolArray<totalBools> booleanArray;

//
// Печать массива.
// Обратите внимание, что для печати "TRUE" и "FALSE" мы используем 
//	элемент массива в качестве bool в операторе "?"
//
void printArray(const char * title) {
	Serial << "*** " << title << "\r\n";
	for (int8_t i = 0; i < totalBools; i++) {
		Serial << "booleanArray[" << i << "]=" 
			<< (booleanArray[i] ? "TRUE" : "FALSE") << "\r\n";
	}
	Serial << "-------------------------------\r\n";
}

void setup(void) {
	Serial.begin(57600);
	// 
	// Убедимся, что размер правильный
	Serial << "sizeof(booleanArray) = " << sizeof(booleanArray) << "\r\n";
	//
	//	Печатаем массив. Там сначала все false
	printArray("All elements are FALSE");
	//
	//	Делаем все true и опять печатаем
	for (int8_t i = 0; i < totalBools; booleanArray[i] = true, ++i);
	printArray("All elements are TRUE");
	//
	//	Делаем чётные элементы false, а нечётные - true
	for (int8_t i = 0; i < totalBools; booleanArray[i] = (i % 2), ++i);
	printArray("Even elements are FALSE while odd elements are TRUE");

	//	Делаем чётные элементы true, а нечётные - false
	for (int8_t i = 0; i < totalBools; booleanArray[i] = !(i % 2), ++i);
	printArray("Even elements are TRUE  while odd elements are FALSE");
}

void loop(void) {}