При том, что состояние всех пинов хранится в единственной переменной побитно.
Да, я это предположил. А что мешает хранить в массиве bool-ов например? Скетч не смотрел.
Да, ничего не мешает. Просто данных в 8 раз больше будет. Если это не проблема, то в путь.
Если хранить именно как bool, то это в 8 раз больше памяти, а если как byte, то это еще надо уметь работать с битовым массивом.
Я тоже сам скетч не смотрел, но этот фрагмент уже цитировался в ответах.
Обычно, экономией занимается старая гвардия - у них это в крови, потому что детство трудное было.(
Я это относительно программирования сказал. Хотя, это и к обычным людям относится.
ТС не умеет, а остальным не нужно.
И не умеет, и не хочет, мне так кажется.(
кадата сохранил пример от Деда
// обьявление
#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();
}
переделать под любую размерность не проблема
но, думаю, не в этом случае)
Так мы с дедом, вроде, обсуждали более продвинутый пример, где доступ к битам идёт как к элементам массива. Могу поискать, если надо.
Буду признателен, складываю в “копилочку” такое.
Обсуждения не нашёл (мож оно на амперке было), но вот тут вроде тоже работает - sizeof(bool) | Аппаратная платформа Arduino
Извиняюсь, не в тему. Тётушка. Одна в квартире. Прихожу - мёрзнет, хотя на улице +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) {}