Apologies. Here’s the full script (including debug statements):
#include <Servo.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <IRremote.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Servo gateServo;
int SERVO = 48, BUZZER = 52, R1 = 40, R2 = 42, R3 = 44, G = 46, SENSOR = A13, SCLPIN = 21, SDAPIN = 20, IR = 53;
unsigned long STARTBUTTON = 50;
float startTime, endTime;
IRrecv irrecv(IR);
void setup() {
Serial.begin(9600);
gateServo.attach(SERVO);
pinMode(STARTBUTTON, INPUT);
pinMode(IR, INPUT);
pinMode(BUZZER, OUTPUT);
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);
pinMode(R3, OUTPUT);
pinMode(G, OUTPUT);
pinMode(SENSOR, INPUT);
pinMode(SCLPIN, OUTPUT);
pinMode(SDAPIN, OUTPUT);
irrecv.enableIRIn();
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;)
;
}
raiseGate();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
}
void loop() {
raiseGate();
delay(100);
introBanner();
//detectButton();
readIR();
startLights();
runRace();
}
void dropGate(void) {
gateServo.write(90);
}
void raiseGate(void) {
gateServo.write(0);
}
void startLights(void) {
digitalWrite(R1, HIGH);
beep(200);
delay(750);
digitalWrite(R1, LOW);
digitalWrite(R2, HIGH);
beep(200);
delay(750);
digitalWrite(R2, LOW);
digitalWrite(R3, HIGH);
beep(200);
delay(750);
digitalWrite(R3, LOW);
digitalWrite(G, HIGH);
dropGate();
startTime = millis();
digitalWrite(BUZZER, HIGH);
flashText("GO!!!!", 500, 3);
digitalWrite(BUZZER, LOW);
digitalWrite(G, LOW);
}
void beep(int duration) {
digitalWrite(BUZZER, HIGH);
delay(duration);
digitalWrite(BUZZER, LOW);
}
void detectButton(void) {
while (digitalRead(STARTBUTTON) == LOW)
;
}
void runRace(void) {
int sensorVal = 0;
while (sensorVal < 10) {
sensorVal = analogRead(SENSOR);
}
endTime = millis();
displayTime();
}
void displayTime(void) {
float time = (endTime - startTime) / 1000;
display.setTextSize(2);
display.setCursor(22, 13);
display.print(time);
display.print(" sec");
display.display();
strobe();
//detectButton();
readIR();
}
void displayText(char* content) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(26, 13);
display.println(content);
display.display();
}
void scrollText(char* content) {
display.clearDisplay();
display.setTextSize(1, 2);
display.setCursor(10, 13);
display.println(content);
display.display();
display.startscrollleft(0x00, 0x0F);
}
void introBanner(void) {
display.clearDisplay();
display.setCursor(31, 13);
display.println("START");
display.display();
delay(1000);
display.clearDisplay();
display.setCursor(35, 13);
display.println("YOUR");
display.display();
delay(1000);
display.clearDisplay();
display.setCursor(23, 13);
display.println("ENGINES");
display.display();
delay(1000);
scrollText("GET READY TO RACE");
}
void flashText(char* content, int interval, int iterations) {
display.stopscroll();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
for (int i = 0; i < iterations; i++) {
display.setCursor(33, 13);
display.println(content);
display.display();
delay(interval);
display.clearDisplay();
display.display();
delay(interval);
}
}
void strobe(void) {
for (int i = 0; i < 3; i++) {
digitalWrite(R1, HIGH);
delay(50);
digitalWrite(R1, LOW);
delay(50);
digitalWrite(R2, HIGH);
delay(50);
digitalWrite(R2, LOW);
delay(50);
digitalWrite(R3, HIGH);
delay(50);
digitalWrite(R3, LOW);
delay(50);
digitalWrite(G, HIGH);
delay(50);
digitalWrite(G, LOW);
delay(50);
}
}
void readIR(void) {
decode_results results;
int ret = 0;
Serial.println("1");
Serial.println(irrecv.decode(&results));
Serial.println(results.value, HEX);
delay(1000);
while (ret == 0) {
irrecv.decode(&results);
Serial.println("2");
Serial.println(irrecv.decode(&results));
Serial.println(results.value, HEX);
delay(1000);
if (results.value == 0xFFB04F) {
ret = 1;
Serial.println("3");
Serial.println(irrecv.decode(&results));
Serial.println(results.value, HEX);
delay(1000);
}
}
irrecv.resume();
}