I love using I2C LCD display on projects - they are pretty cheap and are useful for debugging or end user info and only use 2 I/O’s.
Typically I use something like this with a I2C backpack (https://www.dfrobot.com/product-135.html) or depending on the deals out there, get a basic LCD module and a separate I2C backpack and solder them together. The backpacks are often based on a PCF8574 or PCF8574A I2C to GPIO expander - and each has a different address range - PCF8574 (0x20-0x27), PCF8574A (0x38-0x3F). So I use this code to auto check which I have installed so I don’t have to edit code each time I get a new batch of LCDs
Add the LiquidCrystal_I2C_Spark library to your project
#include <LiquidCrystal_I2C_Spark.h>
define your display size
const int numLcdCols = 16;
const int numLcdrows = 2;
LiquidCrystal_I2C lcd(0x20,numLcdCols,numLcdrows);
void setup() {
Wire.begin();
Wire.beginTransmission(0x38); // check for alternate address here
if (Wire.endTransmission() == 0) { // alt LCD found
lcd = LiquidCrystal_I2C(0x38, numLcdCols, numLcdrows); // reinitialise lcd with new address
}
// if not found use lcd parameters defined in the constructor above
lcd.init(); // initialise the newly found lcd
lcd.backlight();
lcd.clear();
lcd.print("Hello World!");
}