If I might make a suggestion with regard to the I2C...
I appreciate the use of a constructor to initialise the device specific EN, RW and RS values however I feel that it needs to be expanded to permit the specification of the back light values which are presently covered by the defines
#define LCD_NOBACKLIGHT 0x00
#define LCD_BACKLIGHTÂ 0xFF
I can see that there is a setBacklightPin method but i'm not sure that it covers all the options.
From the code samples I have gathered and my own hardware I have uncovered these as all being valid mask values.
#define LCD_BACKLIGHT 0x00
#define LCD_BACKLIGHT 0x08
#define LCD_BACKLIGHT 0xFF
#define LCD_NOBACKLIGHT 0x80
#define LCD_NOBACKLIGHT 0x00
I suspect it would be easier to just permit developers to input their masks directly through a constructor.