#include #include #include #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define PIN_RED 17 #define PIN_GREEN 16 #define PIN_BLUE 25 #define N_TOUCH 6 #define THRESHOLD 6 char values[] = {' ', ' ',' ', ' ', ' ',' ', ' ', ' ', ' '}; bool player1 = true; bool timeishalf = true; int selected = 4; static unsigned long lastmove = 0; Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); int touch_pins[N_TOUCH] = {3, 4, 2, 27, 1, 26}; int touch_values[N_TOUCH] = {0, 0, 0, 0, 0, 0}; bool pin_touched_now[N_TOUCH] = {false, false, false, false, false, false}; bool pin_touched_past[N_TOUCH] = {false, false, false, false, false, false}; void update_touch() { int t; int t_max = 200; int p; for (int i = 0; i < N_TOUCH; i++) { p = touch_pins[i]; // set to low pinMode(p, OUTPUT); digitalWriteFast(p, LOW); // settle delayMicroseconds(25); // enable pull-up pinMode(p, INPUT_PULLUP); // measure time to rise t = 0; while (!digitalReadFast(p) && t < t_max) { t++; } touch_values[i] = t; // update state pin_touched_past[i] = pin_touched_now[i]; pin_touched_now[i] = touch_values[i] > THRESHOLD; } } void setup() { Serial.begin(9600); Serial.begin(0); // initialize LED pinMode(PIN_RED, OUTPUT); pinMode(PIN_GREEN, OUTPUT); pinMode(PIN_BLUE, OUTPUT); // HIGH = LED off (they're connected to VCC instead of ground) digitalWrite(PIN_RED, HIGH); digitalWrite(PIN_GREEN, HIGH); digitalWrite(PIN_BLUE, HIGH); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println("SSD1306 allocation failed"); for(;;); } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); } void generatedisplay() { display.setCursor(0, 15); display.clearDisplay(); for (int r = 0 ; r < 3; r++) { for (int c = 0 ; c < 3; c++){ if ((values[r*3 + c] == 'X' || values[r*3 + c] == 'Y') && selected == (r*3 + c) && timeishalf == false) { display.print(' '); } else if (selected == (r*3 + c) && timeishalf == false) { if (player1){ display.print("X"); } else{ display.print("Y"); } } else { display.print(values[r*3 + c]); } if (c<2){ display.print(" | "); } } if (r<2){ if (r==1){ display.print(" "); if (player1){ display.print("player1"); } else{ display.print("player2"); } } display.println(); display.println("---------"); } } display.display(); if(values[0] == values[1] && values[1] == values[2] && values[2] != ' '){ win(); } else if(values[3] == values[4] && values[4] == values[5] && values[5] != ' '){ win(); } else if(values[6] == values[7] && values[7] == values[8] && values[8] != ' '){ win(); } else if(values[0] == values[3] && values[3] == values[6] && values[6] != ' '){ win(); } else if(values[1] == values[4] && values[4] == values[7] && values[7] != ' '){ win(); } else if(values[2] == values[5] && values[5] == values[8] && values[8] != ' '){ win(); } else if(values[0] == values[4] && values[4] == values[8] && values[8] != ' '){ win(); } else if(values[2] == values[4] && values[4] == values[6] && values[6] != ' '){ win(); } } void win(){ display.setCursor(0, 15); display.clearDisplay(); display.setTextSize(3); if(player1){ display.print("P1 WINS"); } else{ display.print("P2 WINS"); } display.display(); for(int i = 0 ; i < 9; i++) { values[i] = ' '; } selected = 4; lastmove = millis(); while(true) { if (millis() - lastmove >= 1000) { pin_touched_past[1] = false; update_touch(); if (!pin_touched_now[1] && pin_touched_past[1]) { // button 0 was just released, do something digitalWrite(PIN_GREEN, HIGH); pin_touched_past[1] = false; display.setTextSize(1); generatedisplay(); break; } } } } void loop() { update_touch(); everySecond(); if (pin_touched_now[1] && !pin_touched_past[1]) { digitalWrite(PIN_GREEN, LOW); } for (int i = 0; i<6;i++) { if (pin_touched_past[i] == true){ switch(i) { case 1: button1(); break; case 2: down(); break; case 3: left(); break; case 4: right(); break; case 5: up(); break; default: break; } } } } void button1() { if (millis() - lastmove >= 1000) { if (!pin_touched_now[1] && pin_touched_past[1]) { // button 0 was just released, do something digitalWrite(PIN_GREEN, HIGH); if (player1){ values[selected] = 'X'; } else{ values[selected] = 'Y'; } lastmove = millis(); generatedisplay(); pin_touched_past[1] = false; player1 = !player1; } } } void up() { if (millis() - lastmove >= 1000) { if (!pin_touched_now[5] && pin_touched_past[5]) { if (selected<3) { selected= selected + 6; } else{ selected= selected - 3; } lastmove = millis(); pin_touched_past[5] = false; } } } void down() { if (millis() - lastmove >= 1000) { if (!pin_touched_now[2] && pin_touched_past[2]) { if (selected>6) { selected= selected - 6; } else{ selected= selected + 3; } lastmove = millis(); pin_touched_past[2] = false; } } } void right() { if (millis() - lastmove >= 1000) { if (!pin_touched_now[4] && pin_touched_past[4]) { if (((selected+1)%3) == 0) { selected= selected - 2; } else{ selected= selected + 1; } lastmove = millis(); pin_touched_past[4] = false; } } } void left() { if (millis() - lastmove >= 1000) { if (!pin_touched_now[3] && pin_touched_past[3]) { if (((selected)%3)<1) { selected= selected + 2; } else{ selected= selected - 1; } lastmove = millis(); pin_touched_past[3] = false; } } } void everySecond() { static unsigned long last = 0; if (millis() - last >= 500) { last = millis(); timeishalf = !timeishalf; generatedisplay(); } }