I have a similar problem and I tried hard to make a sketch work on ATtiny85 with OLED1306 128x64 and U8g2lib.h. The sketch is compiling without any errors but after uploading to the ATtiny85 nothing is seen on the display. I tried several different constructors and varied many parameters but the OLED refuses to work.
The display is ok, it works on Arduino UNO and Hello world example of U8x8 is displayed (Hello world example of U8g2 NOT). I tried several OLEDs with the same results.
What's going wrong?
Arduino IDE: 1.8.10, U8g2 Library: 2.26.14, OLED1306 with I2C interface
The sketch:
//#include <TinyWireM.h>
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(/* clock=/ 2, / data=/ 0, / reset=*/ U8X8_PIN_NONE);
#define MAX_LENGTH 30 //30 segments max
#define X 0
#define Y 1
#define JOYSTICK_X 4
#define JOYSTICK_Y 3
#define DIR_THRESH 300 //Values must be either 0-300 or 723-1023 to count
uint8_t segmentPositions[MAX_LENGTH][2];
uint8_t headPosition[2] = {63, 31}; //Place snake in beginning to start
uint8_t foodPosition[2]; //Where the food is located
uint8_t tempPosition0[2]; //Store position of previous segment to pass on to next
uint8_t tempPosition1[2]; //Store position of previous segment to pass on to next
int segmentLength = 1;
void gameUpdate();
enum DIRECTIONS {
RIGHT,
DOWN,
LEFT,
UP
} currentDirection;
void setup() {
// TinyWireM.begin();
u8g2.begin();
pinMode(JOYSTICK_X, INPUT);
pinMode(JOYSTICK_Y, INPUT);
randomSeed(analogRead(0));
beginGame();
}
void loop() {
u8g2.firstPage();
do {
gameUpdate();
u8g2.setColorIndex(1);
}
while(u8g2.nextPage());
}
void beginGame(){
currentDirection = RIGHT;
spawnFood();
delay(1000);
}
bool checkCollisions(){
for(int i=1; i<segmentLength; i++){
if(segmentPositions*[X] == headPosition[X]){*
_ if(segmentPositions*[Y] == headPosition[Y]){_
_ return 1;_
_ }_
_ }_
_ }_
_ if(headPosition[X] <= 0 || headPosition[X] >= 128) return 1;_
_ else if(headPosition[Y] <= 0 || headPosition[Y] >= 64) return 1;_
_ return false;_
_}_
void spawnFood(){
_ int randomX = random(5, 123);_
_ int randomY = random(5, 60);_
_ foodPosition[X] = randomX;_
_ foodPosition[Y] = randomY;_
_}_
void checkFoodEaten(){
_ if(headPosition[X] == foodPosition[X] || headPosition[Y] == foodPosition[Y]){_
_ segmentLength += 1;_
_ spawnFood();_
_ }_
_}_
void updateDirection(){
int joy_x_val = analogRead(JOYSTICK_X);
int joy_y_val = analogRead(JOYSTICK_Y);
if(joy_x_val <= DIR_THRESH) currentDirection = LEFT;
else if(joy_x_val >= 1023-DIR_THRESH) currentDirection = RIGHT;
else if(joy_y_val <= DIR_THRESH) currentDirection = UP;
else if(joy_y_val >= 1023-DIR_THRESH) currentDirection = DOWN;
_}_
void displaySegments(){
_ for(int segment=0; segment < segmentLength; segment++){_
_ u8g2.drawPixel(segmentPositions[segment][X], segmentPositions[segment][Y]);_
_ }_
_ u8g2.drawPixel(foodPosition[X], foodPosition[Y]);_
_}_
void gameUpdate(){
_ updateDirection();_
_ tempPosition0[X] = headPosition[X];_
_ tempPosition0[Y] = headPosition[Y];_
_ switch(currentDirection){_
_ case UP:_
_ headPosition[Y] -= 1;_
_ break;_
_ case DOWN:_
_ headPosition[Y] += 1;_
_ break;_
_ case LEFT:_
_ headPosition[X] -= 1;_
_ break;_
_ case RIGHT:_
_ headPosition[X] += 1;_
_ break;_
_ }_
_ //Update each segment's position relative to the head*_
* for(int segment=1; segment < segmentLength; segment+= 2){*
* tempPosition1[X] = segmentPositions[segment][X];*
* tempPosition1[Y] = segmentPositions[segment][Y];*
* segmentPositions[segment][X] = tempPosition0[X];*
* segmentPositions[segment][Y] = tempPosition0[Y];*
* tempPosition0[X] = segmentPositions[segment+1][X];*
* tempPosition0[Y] = segmentPositions[segment+1][Y];*
* segmentPositions[segment+1][X] = tempPosition1[X];*
* segmentPositions[segment+1][Y] = tempPosition1[Y];*
* }*
* displaySegments();*
* checkFoodEaten();*
* if(checkCollisions()) endGame();*
* if(segmentLength>= MAX_LENGTH) endGame();
_ delay(50);_
_}_
void endGame(){
_ segmentLength = 1;_
_ headPosition[0] = 63;_
_ headPosition[1] = 31;_
_ beginGame();_
_}*_