       The latter can be inefficient since you're storing and retrieving in Flash
       an additional array, of pointers.
       */
+  namespace UI {
+
+    const char title[] PROGMEM      = "  Dremel Centrifuge";
+    const char setTime[] PROGMEM    = "Set time: ";
+    const char setSpeed[] PROGMEM   = "Set speed: ---";
+    const char pushStart[] PROGMEM  = "   Push to Start!";
+
+    // UI associated with SPINNING mode
+    const char finishedIn[] PROGMEM = "Finished in: ";
+    const char pushStop[] PROGMEM   = "   Push to Stop! ";
+
+  } // namespace UI
 
   /* char var_name[] vs char* var_name:
     `char var_name[]` is an ARRAY of characters, which is different from `char*`

  // Motor is OFF on startup
  digitalWrite(MOTOR_PIN, LOW);

  // Associate static elements of LCD UI with a temporary Mode
  Mode setupMode = {
    .UIStringPtrs =
    {
      titleStr,  // accessing a whole array, so its (starting) address is returned
      null_str,
      setSpeedStr,
      null_str
    },
    .id = 0
  };

  // Initialize static (not the keyword) elements of LCD UI
  for(int row = 0; row < LCD_ROWS; row++) {

    lcd.setCursor(0, row);

    /* `pgm_read_word` implementation:
      Implements a Load Program Memory instruction on an 8-bit RAM
      address argument that's converted to a 16-bit Flash memory address before
      the address is read and has its stored value returned.
      http://www.atmel.com/images/doc1233.pdf
      http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__pgmspace_1ga7fa92c0a662403a643859e0f33b0a182.html

      Need `&` because it's not just the char arrays[] that's stored in Flash,
      but the pointers to these strings, held in UIStringPtrs, are stored in
      Flash too. So, convert the pointer and then return its Flash data.
      */

    // Read and the UIStringPtrs from Flash memory, and print
    lcd.print( (PGM_P) pgm_read_word(&(setupMode.UIStringPtrs[row])));

  } // for loop LCD_ROWS

} // void setup()

/////////////////////////////////////////////////////////////////////////////////

void loop()
{

  /* Explanation of `static` and statically allocated memory in C++:


    different areas of RAM and by different means.
    */

  // Define a custom type, whose enumerated values are the size of `char`s
  enum class Mode : char {
  
    SETTING_TIME,
    SETTING_SPEED,
    SPINNING

  }; // enum class Mode

  static Mode currentMode = Mode::SETTING_TIME;         // initialization over assignment; set SETTING_TIME as the first mode!

  // Extension of LiquidCystal as a Stream
  static Printer<LiquidCrystal> lcdPrinter(&lcd);

  // Functors customizing methods on lcdPrinter
  static NormalPrint raw;                               // Default constructors
