Project: MOTE Gallery Acronym Generator


The MOTE gallery got its name because it shares the first floor with our Shopbot and milling machines. The first suggestion was to call it the dusty gallery, then dust mote, then Mote. Then we figured MOTE should be an acronym; a generative acronym in particular.

Here’s a little Arduino board and code that generates suitable expansions of the MOTE acronym. It is a good example of using the PROGMEM command to store strings in program memory (flash) rather than RAM.

#include <SoftwareSerial.h>
#include <avr/pgmspace.h>
#include "U8glib.h"

U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);

int line1 = 22;
int line2 = 34;
int line3 = 46;
int line4 = 58;
int left = 24;

int i = 0;
int j = 0;
int k = 0;
int l = 0;

int MAX = 50;

prog_char m_0[] PROGMEM = "useum";
prog_char m_1[] PROGMEM = "anor";
prog_char m_2[] PROGMEM = "ausoleum";
prog_char m_3[] PROGMEM = "acabre";
prog_char m_4[] PROGMEM = "acaroni";
prog_char m_5[] PROGMEM = "achete";
prog_char m_6[] PROGMEM = "achine";
prog_char m_7[] PROGMEM = "achinery";
prog_char m_8[] PROGMEM = "acho";
prog_char m_9[] PROGMEM = "ackerel";
prog_char m_10[] PROGMEM = "acro";
prog_char m_11[] PROGMEM = "acrocosm";
prog_char m_12[] PROGMEM = "ad";
prog_char m_13[] PROGMEM = "adam";
prog_char m_14[] PROGMEM = "ade";
prog_char m_15[] PROGMEM = "adhouse";
prog_char m_16[] PROGMEM = "adman";
prog_char m_17[] PROGMEM = "adness";
prog_char m_18[] PROGMEM = "aelstrom";
prog_char m_19[] PROGMEM = "afia";
prog_char m_20[] PROGMEM = "agazine";
prog_char m_21[] PROGMEM = "agenta";
prog_char m_22[] PROGMEM = "aggot";
prog_char m_23[] PROGMEM = "agic";
prog_char m_24[] PROGMEM = "agical";
prog_char m_25[] PROGMEM = "agician";
prog_char m_26[] PROGMEM = "agistrate";
prog_char m_27[] PROGMEM = "agnanimous";
prog_char m_28[] PROGMEM = "agnesium";
prog_char m_29[] PROGMEM = "agnet";
prog_char m_30[] PROGMEM = "agnetic";
prog_char m_31[] PROGMEM = "agnification";
prog_char m_32[] PROGMEM = "agnificence";
prog_char m_33[] PROGMEM = "agnificent";
prog_char m_34[] PROGMEM = "agnificently";
prog_char m_35[] PROGMEM = "agnify";
prog_char m_36[] PROGMEM = "agnolia";
prog_char m_37[] PROGMEM = "agpie";
prog_char m_38[] PROGMEM = "ahogany";
prog_char m_39[] PROGMEM = "aid";
prog_char m_40[] PROGMEM = "aiden";
prog_char m_41[] PROGMEM = "ailbox";
prog_char m_42[] PROGMEM = "ailman";
prog_char m_43[] PROGMEM = "ain";
prog_char m_44[] PROGMEM = "ainframe";
prog_char m_45[] PROGMEM = "ainland";
prog_char m_46[] PROGMEM = "ainly";
prog_char m_47[] PROGMEM = "ainstream";
prog_char m_48[] PROGMEM = "ajestic";
prog_char m_49[] PROGMEM = "ajor";

PROGMEM const char *m_table[] = {m_0, m_1, m_2, m_3, m_4, m_5, m_6, m_7, m_8, m_9, m_10,
m_11, m_12, m_13, m_14, m_15, m_16, m_17, m_18, m_19, m_20, m_21, m_22, m_23, m_24, 
m_25, m_26, m_27, m_28, m_29, m_30, m_31, m_32, m_33, m_34, m_35, m_36, m_37, m_38,
m_39, m_40, m_41, m_42, m_43, m_44, m_45, m_46, m_47, m_48, m_49};

prog_char o_0[] PROGMEM = "af";
prog_char o_1[] PROGMEM = "ak";
prog_char o_2[] PROGMEM = "atmeal";
prog_char o_3[] PROGMEM = "bject";
prog_char o_4[] PROGMEM = "bligatory";
prog_char o_5[] PROGMEM = "blivious";
prog_char o_6[] PROGMEM = "blong";
prog_char o_7[] PROGMEM = "bnoxious";
prog_char o_8[] PROGMEM = "bnoxiously";
prog_char o_9[] PROGMEM = "boe";
prog_char o_10[] PROGMEM = "bscene";
prog_char o_11[] PROGMEM = "bscenity";
prog_char o_12[] PROGMEM = "bscure";
prog_char o_13[] PROGMEM = "bservatory";
prog_char o_14[] PROGMEM = "bsessed";
prog_char o_15[] PROGMEM = "bsolete";
prog_char o_16[] PROGMEM = "bstacle";
prog_char o_17[] PROGMEM = "bstruction";
prog_char o_18[] PROGMEM = "bstructive";
prog_char o_19[] PROGMEM = "btainable";
prog_char o_20[] PROGMEM = "btrusive";
prog_char o_21[] PROGMEM = "btuse";
prog_char o_22[] PROGMEM = "bvious";
prog_char o_23[] PROGMEM = "ccasion";
prog_char o_24[] PROGMEM = "ccult";
prog_char o_25[] PROGMEM = "ccupancy";
prog_char o_26[] PROGMEM = "ccupant";
prog_char o_27[] PROGMEM = "ccupation";
prog_char o_28[] PROGMEM = "ccupational";
prog_char o_29[] PROGMEM = "cean";
prog_char o_30[] PROGMEM = "ctagonal";
prog_char o_31[] PROGMEM = "ctave";
prog_char o_32[] PROGMEM = "ctopi";
prog_char o_33[] PROGMEM = "ddity";
prog_char o_34[] PROGMEM = "ddly";
prog_char o_35[] PROGMEM = "ddness";
prog_char o_36[] PROGMEM = "dious";
prog_char o_37[] PROGMEM = "dyssey";
prog_char o_38[] PROGMEM = "f";
prog_char o_39[] PROGMEM = "ff";
prog_char o_40[] PROGMEM = "ffender";
prog_char o_41[] PROGMEM = "ffering";
prog_char o_42[] PROGMEM = "ffhand";
prog_char o_43[] PROGMEM = "ffice";
prog_char o_44[] PROGMEM = "fficial";
prog_char o_45[] PROGMEM = "ffset";
prog_char o_46[] PROGMEM = "ffshoot";
prog_char o_47[] PROGMEM = "ften";
prog_char o_48[] PROGMEM = "gre";
prog_char o_49[] PROGMEM = "ink";
PROGMEM const char *o_table[] = {o_0, o_1, o_2, o_3, o_4, o_5, o_6, o_7, o_8, o_9, o_10, 
o_11, o_12, o_13, o_14, o_15, o_16, o_17, o_18, o_19, o_20, o_21, o_22, o_23, o_24, o_25, 
o_26, o_27, o_28, o_29, o_30, o_31, o_32, o_33, o_34, o_35, o_36, o_37, o_38, o_39, o_40, 
o_41, o_42, o_43, o_44, o_45, o_46, o_47, o_48, o_49};

prog_char t_0[] PROGMEM = "ree";
prog_char t_1[] PROGMEM = "remendous";
prog_char t_2[] PROGMEM = "rench";
prog_char t_3[] PROGMEM = "urtle";
prog_char t_4[] PROGMEM = "rick";
prog_char t_5[] PROGMEM = "rigonometry";
prog_char t_6[] PROGMEM = "rillion";
prog_char t_7[] PROGMEM = "rilogy";
prog_char t_8[] PROGMEM = "rinket";
prog_char t_9[] PROGMEM = "rio";
prog_char t_10[] PROGMEM = "riumphant";
prog_char t_11[] PROGMEM = "rombone";
prog_char t_12[] PROGMEM = "rouble";
prog_char t_13[] PROGMEM = "roupe";
prog_char t_14[] PROGMEM = "rousers";
prog_char t_15[] PROGMEM = "rout";
prog_char t_16[] PROGMEM = "ruffle";
prog_char t_17[] PROGMEM = "ruth";
prog_char t_18[] PROGMEM = "uba";
prog_char t_19[] PROGMEM = "ubby";
prog_char t_20[] PROGMEM = "ube";
prog_char t_21[] PROGMEM = "uberculosis";
prog_char t_22[] PROGMEM = "ugboat";
prog_char t_23[] PROGMEM = "umbler";
prog_char t_24[] PROGMEM = "itantic";
prog_char t_25[] PROGMEM = "umor";
prog_char t_26[] PROGMEM = "umult";
prog_char t_27[] PROGMEM = "umultuous";
prog_char t_28[] PROGMEM = "una";
prog_char t_29[] PROGMEM = "undra";
prog_char t_30[] PROGMEM = "une";
prog_char t_31[] PROGMEM = "uner";
prog_char t_32[] PROGMEM = "urban";
prog_char t_33[] PROGMEM = "urbine";
prog_char t_34[] PROGMEM = "urd";
prog_char t_35[] PROGMEM = "urf";
prog_char t_36[] PROGMEM = "urgid";
prog_char t_37[] PROGMEM = "urkey";
prog_char t_38[] PROGMEM = "urmoil";
prog_char t_39[] PROGMEM = "urn";
prog_char t_40[] PROGMEM = "urnaround";
prog_char t_41[] PROGMEM = "urncoat";
prog_char t_42[] PROGMEM = "errible";
prog_char t_43[] PROGMEM = "urnip";
prog_char t_44[] PROGMEM = "urpentine";
prog_char t_45[] PROGMEM = "urquoise";
prog_char t_46[] PROGMEM = "widdle";
prog_char t_47[] PROGMEM = "wilight";
prog_char t_48[] PROGMEM = "winkle";
prog_char t_49[] PROGMEM = "wisted";
PROGMEM const char *t_table[] = {t_0, t_1, t_2, t_3, t_4, t_5, t_6, t_7, t_8, t_9, t_10, 
t_11, t_12, t_13, t_14, t_15, t_16, t_17, t_18, t_19, t_20, t_21, t_22, t_23, t_24, t_25, 
t_26, t_27, t_28, t_29, t_30, t_31, t_32, t_33, t_34, t_35, t_36, t_37, t_38, t_39, t_40, 
t_41, t_42, t_43, t_44, t_45, t_46, t_47, t_48, t_49};

prog_char e_0[] PROGMEM = "ar";
prog_char e_1[] PROGMEM = "arth";
prog_char e_2[] PROGMEM = "atery";
prog_char e_3[] PROGMEM = "aves";
prog_char e_4[] PROGMEM = "avesdropper";
prog_char e_5[] PROGMEM = "bullience";
prog_char e_6[] PROGMEM = "conomy";
prog_char e_7[] PROGMEM = "cosystem";
prog_char e_8[] PROGMEM = "cstasy";
prog_char e_9[] PROGMEM = "dification";
prog_char e_10[] PROGMEM = "ducation";
prog_char e_11[] PROGMEM = "ffervescence";
prog_char e_12[] PROGMEM = "galitarianism";
prog_char e_13[] PROGMEM = "gg";
prog_char e_14[] PROGMEM = "go";
prog_char e_15[] PROGMEM = "jaculate";
prog_char e_16[] PROGMEM = "lbow";
prog_char e_17[] PROGMEM = "lder";
prog_char e_18[] PROGMEM = "lectrode";
prog_char e_19[] PROGMEM = "lements";
prog_char e_20[] PROGMEM = "lephant";
prog_char e_21[] PROGMEM = "lite";
prog_char e_22[] PROGMEM = "loquence";
prog_char e_23[] PROGMEM = "mbroidery";
prog_char e_24[] PROGMEM = "mbryo";
prog_char e_25[] PROGMEM = "mcee";
prog_char e_26[] PROGMEM = "mergence";
prog_char e_27[] PROGMEM = "mergency";
prog_char e_28[] PROGMEM = "missary";
prog_char e_29[] PROGMEM = "mployee";
prog_char e_30[] PROGMEM = "mployer";
prog_char e_31[] PROGMEM = "mployment";
prog_char e_32[] PROGMEM = "mporium";
prog_char e_33[] PROGMEM = "mpress";
prog_char e_34[] PROGMEM = "nchilada";
prog_char e_35[] PROGMEM = "ncumbrance";
prog_char e_36[] PROGMEM = "ncyclopedia";
prog_char e_37[] PROGMEM = "nemy";
prog_char e_38[] PROGMEM = "nergetic";
prog_char e_39[] PROGMEM = "nergy";
prog_char e_40[] PROGMEM = "ngine";
prog_char e_41[] PROGMEM = "ngineer";
prog_char e_42[] PROGMEM = "ngineering";
prog_char e_43[] PROGMEM = "nsemble";
prog_char e_44[] PROGMEM = "ntertainment";
prog_char e_45[] PROGMEM = "nticement";
prog_char e_46[] PROGMEM = "ntomology";
prog_char e_47[] PROGMEM = "ntrails";
prog_char e_48[] PROGMEM = "ntrance";
prog_char e_49[] PROGMEM = "nvelope";
PROGMEM const char *e_table[] = {e_0, e_1, e_2, e_3, e_4, e_5, e_6, e_7, e_8, e_9, e_10, 
e_11, e_12, e_13, e_14, e_15, e_16, e_17, e_18, e_19, e_20, e_21, e_22, e_23, e_24, e_25, 
e_26, e_27, e_28, e_29, e_30, e_31, e_32, e_33, e_34, e_35, e_36, e_37, e_38, e_39, e_40, 
e_41, e_42, e_43, e_44, e_45, e_46, e_47, e_48, e_49};

int buffersize = 16;
char buffer[16];

void draw(void) {
  // graphic commands to redraw the complete screen should be placed here  
  strcpy_P(buffer, (char*)pgm_read_word(&(m_table[i])));
  u8g.drawStr( left, line1, "M");
  u8g.drawStr( left+9, line1, buffer);

  strcpy_P(buffer, (char*)pgm_read_word(&(o_table[j])));
    u8g.drawStr( left, line2, "O");
    u8g.drawStr( left+9, line2, buffer);

  strcpy_P(buffer, (char*)pgm_read_word(&(t_table[k])));
    u8g.drawStr( left, line3, "T");
    u8g.drawStr( left+9, line3, buffer);  

  strcpy_P(buffer, (char*)pgm_read_word(&(e_table[l])));
    u8g.drawStr( left, line4, "E");
    u8g.drawStr( left+9, line4, buffer);


void setup() {
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {

void loop() {
  do {
  } while( u8g.nextPage() );
  i = random(MAX);
  j = random(MAX);
  k = random(MAX);
  l = random(MAX);
  // rebuild the picture after some delay