#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
const int triggerPin = 2;
const int eyesPin = 3;
const int solenoidPin = 4;
const int debounceDelay = 50; // Adjust as needed
enum FiringMode {
SemiAuto,
Burst,
FullAuto
};
FiringMode currentMode = SemiAuto;
bool eyesEnabled = true; // Default eyes to be off
void setup() {
pinMode(triggerPin, INPUT_PULLUP);
pinMode(eyesPin, INPUT);
pinMode(solenoidPin, OUTPUT);
// Initialize display
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x32
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
}
void loop() {
handleTrigger();
handleModeChange();
displayStats();
}
void handleTrigger() {
static unsigned long lastDebounceTime = 0;
static bool lastTriggerState = HIGH;
bool currentTriggerState = digitalRead(triggerPin);
if (currentTriggerState != lastTriggerState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (currentTriggerState == LOW) {
if (eyesEnabled && !digitalRead(eyesPin)) {
fire();
displayFire();
} else if (!eyesEnabled) {
fire();
displayFire();
}
}
}
lastTriggerState = currentTriggerState;
}
void handleModeChange() {
// Logic to change firing modes, perhaps through button presses
}
void fire() {
switch (currentMode) {
case SemiAuto:
digitalWrite(solenoidPin, HIGH);
delay(10); // Adjust as needed for solenoid activation time
digitalWrite(solenoidPin, LOW);
break;
case Burst:
// Logic for burst firing mode
break;
case FullAuto:
// Logic for full auto firing mode
break;
}
}
void displayStats() {
display.clearDisplay();
display.setCursor(0,0);
display.println("Firing Mode:");
display.println(getFiringModeAsString());
display.println("Eyes:");
display.println(eyesEnabled ? "Enabled" : "Disabled");
display.display();
}
void displayFire() {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Fire");
display.display();
}
String getFiringModeAsString() {
switch (currentMode) {
case SemiAuto:
return "Semi-Auto";
case Burst:
return "Burst";
case FullAuto:
return "Full Auto";
}
return "Unknown";
}