#include //Libraries //OLED #include #include #include #include "SSD1306Wire.h" //LCD #include #include //Definitions //OLED related variables #define OLED_ADDR 0x3c #define OLED_SDA 21//4 //TTGO board without SD Card has OLED SDA connected to pin 4 of ESP32 #define OLED_SCL 22//15 //TTGO board without SD Card has OLED SCL connected to pin 15 of ESP32 #define OLED_X_res 64 #define OLED_Y_res 128 //LCD Variables #define LCD_ADDR 0x27 //Double segment #define S1_A 17 #define S1_B 39 // input only #define S1_C 16 //(old 4 due to ADC) #define S1_D 13 #define S1_E 5 //(old 15 due to ADC) #define S1_F 23 #define S1_G 36 // input only #define S2_A 34 // input only #define S2_B 26 #define S2_C 14 #define S2_D 12 #define S2_E 27 #define S2_F 32 #define S2_G 10 //35 // input only //Potentiometre #define P1_A 15 //(old 5 due to ADC) #define P1_B 4 //(old 16 due to ADC) #define P2_A 25 #define P2_B 33 #define seconde 1000 //Instanciation LiquidCrystal_I2C lcd(LCD_ADDR,16,2); SSD1306Wire display(OLED_ADDR, OLED_SDA, OLED_SCL); int counter = 60; SegmentDisplay segmentDisplay_1(S1_A, S1_B, S1_C, S1_D, S1_E, S1_F, S1_G, 0); SegmentDisplay segmentDisplay_2(S2_A, S2_B, S2_C, S2_D, S2_E, S2_F, S2_G, 0); int Segment_counter_1 = 0; int Segment_counter_2 = 0; //Variables float res = 4095; float delaytime; enum status { INIT, GAME, END, CAT_WIN, CAT_LOOSE }; int game_status = INIT; int16_t radius = 4; unsigned long time_counter = 0; bool home_1 = 0; bool home_2 = 0; bool init_message=0; void showOLEDMessage(String line1, String line2, String line3) { //display.init(); // clears screen display.clear(); display.setFont(ArialMT_Plain_16); display.drawString(0, 0, line1); // adds to buffer display.drawString(0, 20, line2); display.drawString(0, 40, line3); display.display(); // displays content in buffer } void showOLEDMessage_blink(String message){ delaytime = millis(); showOLEDMessage("",message,"" ); display.display(); while(millis()-delaytime <800){ } showOLEDMessage("","" ,"" ); display.display(); delaytime = millis(); while(millis()-delaytime <200){ } showOLEDMessage("",message ,"" ); display.display(); delaytime = millis(); while(millis()-delaytime <800){ } showOLEDMessage("","" ,"" ); display.display(); delaytime = millis(); while(millis()-delaytime <200){ } showOLEDMessage("",message ,"" ); display.display(); delaytime = millis(); while(millis()-delaytime <800){ } } void showOLEDMessage_player(String messageL, String messageR){ showOLEDMessage(messageR + "-->","","<--" + messageL ); display.display(); delaytime = millis(); while(millis()-delaytime < 2000){ } } void showLCDMessage(String line1, String line2){ lcd.clear(); lcd.setCursor(0, 0); lcd.print(line1); lcd.setCursor(0, 1); lcd.print(line2); } void Init_Pot(){ //Potentiometre pinMode(P1_A,INPUT); pinMode(P1_B,INPUT); pinMode(P2_A,INPUT); pinMode(P2_B,INPUT); } void Init_LCD(){ lcd.begin(21, 22); // initialize the lcd // Print a message to the LCD. lcd.backlight(); lcd.setCursor(0,0); lcd.print("Hello, world!"); lcd.setCursor(0,1); lcd.print("by EasyIoT"); } void Segment(int seg){ digitalWrite(seg,LOW); delay(50); digitalWrite(seg,HIGH); delay(50); } void setup() { // put your setup code here, to run once: Serial.begin(9600); Init_Pot(); Init_LCD; display.displayOn(); display.init(); lcd.begin(21, 22); // initialize the lcd // Print a message to the LCD. lcd.backlight(); lcd.setCursor(0,0); } void loop() { int16_t vP1_A = analogRead(P1_A)/res*OLED_X_res; int16_t vP1_B = analogRead(P1_B)/res*OLED_Y_res; int16_t vP2_A = analogRead(P2_A)/res*OLED_X_res; int16_t vP2_B = (res-analogRead(P2_B))/res*OLED_Y_res; //Game workflow switch (game_status) { case INIT: if (init_message == 0){ init_message = 1; showOLEDMessage_blink("Go home to start !"); showOLEDMessage_player("Cat's home","Mouse home"); showOLEDMessage("...Catch me !","" ,"" ); } if (vP1_B < 10 && vP1_A > 53){ display.drawRect(0, 64-12, 12, 12); bool home_1 = 1; } if (vP2_B > 118 && vP2_A < 5){ display.drawRect(128-12, 0, 12, 12); bool home_2 = 1; } if ( home_1 && home_2){ game_status = GAME; } break; case GAME: init_message = 0; showOLEDMessage_player("You're the Cat !","Run !!!"); showOLEDMessage("","The game lasts 40s",""); display.display(); case END: //Statement break; case CAT_WIN: lcd.setCursor(0,0); lcd.print("Cat Win"); Segment_counter_1 += 1; Segment_counter_2 += 0; game_status = INIT; break; case CAT_LOOSE: lcd.setCursor(0,0); lcd.print("Cat loose"); Segment_counter_1 += 0; Segment_counter_2 += 1; game_status = INIT; break; default: // statements break; } //Score segmentDisplay_1.displayHex(Segment_counter_1, false); segmentDisplay_2.displayHex(Segment_counter_2, false); lcd.setCursor(0,0); lcd.print("Cat : " + String(Segment_counter_1)); lcd.setCursor(9,0); lcd.print("Mouse : " + String(Segment_counter_2)); //Resolution // X : 64 // Y : 128 //Draw players display.drawCircle( vP1_B, vP1_A, radius); display.fillCircle( vP2_B, vP2_A, radius); //Draw homes display.drawRect(0, 64-10, 10, 10); display.drawRect(128-10, 0, 10, 10); display.display(); if ((sq((vP1_A-vP2_A)) + sq((vP1_B-vP2_B)) <= sq(radius)) && game_status == GAME){ game_status = CAT_WIN; counter = 40; showOLEDMessage_blink("You loose !"); } if (millis() > time_counter + seconde){ time_counter += seconde; counter = counter-1; lcd.setCursor(0,1); lcd.print(String(counter) + " s"); } else if (counter == 0) { game_status = CAT_LOOSE; counter = 40; } else if (game_status != GAME){ time_counter = millis() ; } }