I uploaded the code from the linked site to my Uno with an I2C LCD attached. I too saw nothing at all printed to the LCD. I do not have nor do I have an inclination to try to find the LCD library that you are using. There are just too many (incompatible) libraries named LiquidCrystal_I2C. So I modified your code to use the hd44780 I2C LCD library (see below). The display now works.
For an I2C LCD display to work, the I2C address and the I2C backpack to LCD pin mapping must be correct. If the library default settings for either or both are not correct the LCD will not work. You can try to figure out the right pin mapping and use an I2C scanner to find the address, but if you install and use the hd44780 library that is done automatically by the library.
To install the hd44780 library. The hd44780 library is the best available for I2C LCDs. The library is available in the Library Manager. Go to Library Manager (in the IDE menus, Sketch, Include Libraries, Manage Libraries) and in the Topics dropdown choose Display and in the Filter your search box enter hd44780. Select and install the hd44780 library by Bill Perry.
The class that you want to use is the hd44780_I2Cexp class. There are examples to show how to use the library. The nice thing about the hd44780 library is that it will autodetect the I2C address and the I2C backpack to LCD pin mapping.
In the examples, there is a diagnostic sketch that will help us to help you if you still have trouble with the display. Run the diagnostic sketch and post the results.
Here is the code modified to use the hd44780 library. There are many compile warnings that you should resolve. Enable the display of compile warnings in the IDE Files, Preferences menu.
If you still do not see anything on the display, try adjusting the contrast pot on the I2C backpack.
/*
Fast IR Game by mgbig V1.0
*/
#include <IRremote.h>
#include <Wire.h>
//#include <LiquidCrystal_I2C.h>
#include <hd44780.h> // main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c expander i/o class header
char up = 3;
char down = 1;
char ok = 2;
// Define 3 characters for the LCD Display
const byte up1[8] =
{
B00100,
B01110,
B10101,
B00100,
B00100,
B00100,
B00100,
B00100
};
const byte down1[8] =
{
B00100,
B00100,
B00100,
B00100,
B00100,
B10101,
B01110,
B00100
};
const byte ok1[8] =
{
B01110,
B01010,
B01110,
B10000,
B10100,
B11000,
B10100,
B10010
};
int RECV_PIN = 11; // IR Sensor on Pin 11
const char* howtoplay[23] =
{
"> FAST IR GAME <",
" Press key ",
"You have to", // if you don't want this howToPlay you can delete from here ...
"press the key,",
"that you see on",
"the screen, when",
"it is beetween",
"the fences (#).",
"It ist getting",
"faster and there",
"will be symbols",
"that you do not",
"have to hit!",
"Try to get to",
"Level 10 and win",
"the game. Before",
"you start, you",
"have to define",
"the keys on your",
"remote control",
"to play the game", // ... until here. Leave the last lines for propper work!
" Have fun !!",
""
};
String keyNames[] = {"up", "down", "right", "left", "ok", "+", "-", "#", "*"};
String keySymb[] = {"", "", "", "", "", "", "", "", ""};
long keys[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int keycount = 7;
int lev;
int xpos = 1;
int xadd = 1;
int xleft;
int xright;
int xstart = 0;
int xend = 15;
int actSym = 0;
int score; // All together score
int scorePerLev; // Symbols in actual level
int scoreNextLev = 50; // Symbols until next level
int gameState = -1;
bool pressed = false;
IRrecv irrecv(RECV_PIN);
decode_results results;
//LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
hd44780_I2Cexp lcd; // declare lcd object: auto locate & auto config expander chip
void setup()
{
Serial.begin(9600);
//lcd.init(); // initialize the lcd
lcd.begin(16,2);
lcd.backlight();
lcd.createChar(up, up1);
lcd.createChar(down, down1);
lcd.createChar(ok, ok1);
keySymb[0] = "\3";
keySymb[1] = "\1";
keySymb[2] = "\176";
keySymb[3] = "\177";
keySymb[4] = "\2";
keySymb[5] = "+";
keySymb[6] = "-";
keySymb[7] = "#";
keySymb[8] = "*";
irrecv.enableIRIn(); // Start the receiver
info(); //howtoplay show once at the start, can be removed when you know how to play
randomSeed(analogRead(1));
}
void loop()
{
// define keys only once
// gameState= -1
// ################################
if (gameState == -1)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Define Keys to"));
lcd.setCursor(0, 1);
lcd.print(F("play the game..."));
delay(3000);
pressed = false;
for (int i = 0; i < keycount; i++) // 0 und 5
{
pressed = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Key for:"));
lcd.print(keyNames[i]);
while (pressed != true)
{
if (irrecv.decode(&results))
{
keys[i] = results.value;
lcd.setCursor(0, 1);
lcd.print(F(" ok!"));
Serial.println(keys[i]);
delay(500);
irrecv.resume(); // Receive the next value
pressed = true;
}
}
pressed = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Repaet key!"));
lcd.print(keyNames[i]);
irrecv.resume();
while (pressed != true)
{
if (irrecv.decode(&results))
{
if (keys[i] == results.value)
{
lcd.setCursor(0, 1);
lcd.print(F("is the same!"));
delay(500);
pressed = true;
}
else
{
lcd.setCursor(0, 1);
lcd.print(F("wrong!"));
delay(500);
lcd.setCursor(0, 1);
lcd.print(" ");
}
irrecv.resume();
}
}
}
gameState = 0; // ok to select level
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Keys done!"));
delay(2000);
}
// Select Level
// gameState=0
//###########################
if (gameState == 0)
{
lev = 1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Select Level+ok"));
lcd.setCursor(0, 1);
lcd.print(F("Level: "));
lcd.print(lev);
irrecv.resume();
pressed = false;
Serial.println("Level");
Serial.println(pressed);
while (pressed != true)
{
if (irrecv.decode(&results))
{
Serial.println(results.value);
if (results.value == keys[0]) lev++;
if (results.value == keys[1]) lev--;
if (results.value == keys[4]) pressed = true;
if (lev < 1) lev = 1;
if (lev > 10) lev = 10;
lcd.setCursor(7, 1);
lcd.print(lev);
lcd.print(" ");
irrecv.resume();
}
delay(250);
}
lcd.setCursor(0, 0);
lcd.print(F("Ok! Play in "));
delay(2000);
lcd.clear();
gameState = 1; // Main gameplay
score = 0;
scorePerLev = 0;
keycount = 7;
xleft = 4;
xright = 11;
drawField("");
irrecv.resume();
Serial.println(F("Level Set"));
}
// Main Game
// gameState=1
//###############################
if (gameState == 1)
{
xpos = 0;
xadd = 1;
int k = 0;
bool rightkey = false;
pressed = false;
actSym = floor(random(0, keycount));
while (pressed != true)
{
Serial.println(xpos);
if (irrecv.decode(&results))
{
for (int i = 0; i < keycount; i++)
{
if (results.value == keys[i])
{
rightkey = true;
k = i;
}
}
if (rightkey == true)
{
scorePerLev++;
if (xpos <= xleft || xpos >= xright)
{
score = score - (4 + lev);
// negativ sound
}
if (actSym == k)
{
lcd.setCursor(xpos, 1);
lcd.print(" ");
score++;
drawField("");
changeDirection();
}
else
{
score = score - (2 + lev);
drawField(" :( ");
// negativ sound
}
actSym = floor(random(0, keycount));
rightkey = false;
}
delay(10);
irrecv.resume();
if (scorePerLev == scoreNextLev)
{
scorePerLev = 0;
lev++;
drawField("");
if (lev < 11)
{
lcd.setCursor(0, 1);
lcd.print(F("Next level!"));
waitForOK();
// Check for score and display message here later
lcd.setCursor(0, 1);
lcd.print(" ");
}
else
{
gameState = 5;
pressed = true;
}
}
}
lcd.setCursor(xpos, 1);
lcd.print(" ");
xpos = xpos + xadd;
if (xpos == xend + 1 || xpos == xstart - 1)
{
if (actSym < 7)
{
score = score - (2 * (lev + 5));
drawField(" :( ");
}
else
{
drawField("");
}
changeDirection();
actSym = floor(random(0, keycount));
// negativ sound
}
lcd.setCursor(xpos, 1);
lcd.print(keySymb[actSym]);
delay(200 - (lev * 10));
if (score < 0)
{
gameState = 9;
pressed = true;
}
} // Main Game loop End
}
// Win
// ##################
if (gameState == 5)
{
// positiv sound
lcd.setCursor(0, 1);
lcd.print(F("You win the Game"));
lcd.setCursor(0, 0);
lcd.print("Bravo! ");
waitForOK();
gameState = 0;
}
// Game Over
// ##################
if (gameState == 9)
{
// negativ sound
for (int i = 0; i < 5; i++)
{
lcd.setCursor(0, 1);
lcd.print(" ");
delay(200);
lcd.setCursor(0, 1);
lcd.print(F(" Game over! "));
delay(300);
}
waitForOK();
gameState = 0;
}
}
void info ()
{
int i = 0;
while (howtoplay[i] != "")
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(howtoplay[i]);
lcd.setCursor(0, 1);
lcd.print(howtoplay[i + 1]);
delay(300);
waitForKey();
i++;
}
irrecv.resume();
}
void drawField(String empty)
{
Serial.println(F("drawField"));
int SCur;
if (empty == "") empty = " ";
lcd.setCursor(0, 0);
lcd.print("################");
if (lev > 3)
{
xleft = floor(random(4, 7));
xright = xleft + 7;
if (lev > 6) xright = xleft + 6;
if (lev > 9) xright = xleft + 5;
}
if (lev > 4) keycount = 8;
if (lev > 6) keycount = 9;
lcd.setCursor(xleft + 1, 0);
lcd.print(empty.substring(0, xright - xleft - 1));
lcd.setCursor(0, 0);
lcd.print("L");
lcd.print(lev);
if (score < 1000) SCur = 13;
if (score < 100) SCur = 14;
if (score < 10) SCur = 15;
if (score < 0) SCur = 14;
lcd.setCursor(SCur, 0);
lcd.print(score);
}
void changeDirection()
{
xpos = xstart;
xadd = 1;
if (lev > 3)
{
int dir = floor(random(0, 2));
if (dir == 1)
{
xpos = xend;
xadd = -1;
}
}
}
void waitForKey ()
{
bool press = false;
irrecv.resume();
while (press == false)
{
if (irrecv.decode(&results))
{
if (results.value != 0) press = true;
irrecv.resume();
delay(200);
}
}
}
void waitForOK()
{
delay(1000);
bool press = false;
irrecv.resume();
while (press == false)
{
if (irrecv.decode(&results))
{
if (results.value == keys[4]) press = true;
irrecv.resume();
delay(200);
}
}
}
The IR remote decoder also seems to work with the IRremote 2.80 version. I did no more than get the LCD to work and see if the decoder will function so the rest is up to you. We will gladly help if you get stuck.
I got a low memory warning when compiling for an Uno. Using the F macro on all string literal print statements saved 10% of SRAM and the warning no longer shows.