Original article by Author at http://lab.dejaworks.com
See the code in action on Tinkercad
//************************************************************************
//****** Real Bit Level Boolean Utilisation Macro Definitions ***********
//****** Created by Trevor D.BEYDAG 09 May 2016 ***********
//****** http://lab.dejaworks.com ***********
//****** Please keep credits intact when using and/or reproducing ********
//************************************************************************
#define BB_TRUE(bp,bb) bp |= bb
#define BB_FALSE(bp,bb) bp &= ~(bb)
#define BB_READ(bp,bb) bool(bp & bb)
//************************************************************************
// Boolean variable definitions are here
// You can give any name to your boolean. I used "BB_" as prefix of (B)it (B)oolean
// Every BB should have a 2^n number max 128
#define BB_LED_RED 1
#define BB_LED_ORANGE 2
#define BB_LED_GREEN 4
#define BB_LED_BLUE 8
#define BB_ANY 16
#define BB_OTHER 32
#define BB_VAR1 64
#define BB_VAR2 128
// This is one byte variable which contains 8 boolean, so 7 bytes saved!
// If you need more boolean variable you can add another boolPack e.g. boolPack2
// With this method; 24 boolean variable can be stored in 3 bytes intead of 24bytes in SDRAM memory!
byte boolPack = 0;
//************************************************************************
int ledBlue = 13;
int ledGreen = 12;
int ledOrange = 11;
int ledRed = 10;
void setup() {
Serial.begin(9600);
pinMode(ledBlue, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(ledOrange, OUTPUT);
pinMode(ledRed, OUTPUT);
// set real Bit Boolean values
setBoolVars();
//Show all values of booleans
showStatus();
}
void showStatus(){
Serial.println(F("====================="));
Serial.println(F("Check indivual boolean values:"));
Serial.print(F("Blue LED status: "));
Serial.println(BB_READ(boolPack, BB_LED_BLUE));
if (BB_READ(boolPack, BB_LED_BLUE)) {
digitalWrite(ledBlue, HIGH);
}
else {
digitalWrite(ledBlue, LOW);
}
Serial.print(F("Green LED status: "));
Serial.println(BB_READ(boolPack, BB_LED_GREEN));
if (BB_READ(boolPack, BB_LED_GREEN)) {
digitalWrite(ledGreen, HIGH);
}
else {
digitalWrite(ledGreen, LOW);
}
Serial.print(F("Orange LED status: "));
Serial.println(BB_READ(boolPack, BB_LED_ORANGE));
if (BB_READ(boolPack, BB_LED_ORANGE)) {
digitalWrite(ledOrange, HIGH);
}
else {
digitalWrite(ledOrange, LOW);
}
Serial.print(F("Red LED status: "));
Serial.println(BB_READ(boolPack, BB_LED_RED));
if (BB_READ(boolPack, BB_LED_RED)) {
digitalWrite(ledRed, HIGH);
}
else {
digitalWrite(ledRed, LOW);
}
Serial.println(F("Other unused variables:"));
Serial.println(BB_READ(boolPack, BB_ANY));
Serial.println(BB_READ(boolPack, BB_OTHER));
Serial.println(BB_READ(boolPack, BB_VAR1));
Serial.println(BB_READ(boolPack, BB_VAR2));
Serial.print(F("Free RAM:"));
Serial.println(freeRam ());
}
void loop() { }
void setBoolVars() {
// set real Bit Boolean BB_LED_BLUE to true
BB_TRUE(boolPack, BB_LED_BLUE);
// set real Bit Boolean BB_LED_ORANGE to true
BB_TRUE(boolPack, BB_LED_ORANGE);
// up to 8 boolean can set to true/false at once,
//example below 2 booleans set to true
BB_TRUE(boolPack, BB_OTHER + BB_VAR1);
}
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
