To bore you to death, and because I like to hear myself type. It'll take me a little time to rewire my press. The switches are currently switching 12VDC and for the app they just need to be providing ground.
Here's the code. Not the most elegant.
// Reloading Counter - Basic Version
// Has 4 input switches. System/counter reset button.
// Primed switch when a case gets primed
// Primed reset switch to reset above so no double counting
// Primer out switch when the tray is locked back by follower
//
// Has 3 Outputs
// Primed and increment Counter GREEN LED
// Primers Out RED LED
// Reset the counter (Amber LED)
// I/O Pin Assignments
const int IPrimed = 1; //Goes LOW when primed
const int IPrimedReset = 2; //Goes LOW to reset 1
const int IPrimersOut = 3; //Goes LOW when primers run out
const int ISysReset = 4; //Goes LOW when counter reset switch is pressed
const int OPrimed = 13; // Green LED to indicate case is primed
const int OPrimersOut = 12; // Red LED to indicate primers are out
const int OSysReset = 11; // Resets external counter
// Variables used
int SysReset = HIGH;
int PrimersOut = LOW;
int Primed = LOW;
int PrimedReset = LOW;
int PrimerCounter = 0;
int PrimedFlag = LOW;
unsigned long BlinkTime = 0;
int BlinkFlag = LOW;
int LowPrimerWarning = 98;
void setup() {
pinMode(OPrimed, OUTPUT); // Primed
pinMode(OPrimersOut, OUTPUT); // Primers Out
pinMode(OSysReset, OUTPUT); // reset counter
pinMode(IPrimed, INPUT_PULLUP); // Primed switch
pinMode(IPrimedReset, INPUT_PULLUP); // Primed Reset switch
pinMode(IPrimersOut, INPUT_PULLUP); // Primers Out switch
pinMode(ISysReset, INPUT_PULLUP); // System Reset switch
}
void loop() {
SysReset = digitalRead(ISysReset);
// Perform System Reset if Reset button is pushed
while (SysReset == LOW) {
digitalWrite(OSysReset, LOW); //Reset Counter
PrimerCounter = 0;
BlinkFlag = LOW;
//Blink Lights to signal reset
digitalWrite(OPrimed, HIGH);
digitalWrite(OPrimersOut, HIGH);
delay(200);
digitalWrite(OPrimed, LOW);
digitalWrite(OPrimersOut, LOW);
delay(200);
digitalWrite(OPrimed, HIGH);
digitalWrite(OPrimersOut, HIGH);
delay(200);
digitalWrite(OPrimed, LOW);
digitalWrite(OPrimersOut, LOW);
delay(200);
digitalWrite(OPrimed, HIGH);
digitalWrite(OPrimersOut, HIGH);
delay(200);
digitalWrite(OPrimed, LOW);
digitalWrite(OPrimersOut, LOW);
digitalWrite(OSysReset, HIGH); //Set Counter Reset back to HIGH
delay(350); // Give user one more chance to take finger off button
SysReset = digitalRead(ISysReset); // Read Button Again
PrimedFlag == LOW;
}
//Normal Operating Functions
// Read the switches
Primed = digitalRead(IPrimed);
PrimersOut = digitalRead(IPrimersOut);
PrimedReset = digitalRead(IPrimedReset);
// See if we just primed a case
if (Primed == LOW && PrimersOut == HIGH && PrimedFlag == LOW) {
digitalWrite(OPrimed, HIGH);
PrimedFlag = HIGH;
PrimerCounter ++;
}
// Check to see if we're on the upstroke and can reset the Primed LED
if (PrimedReset == LOW) {
digitalWrite(OPrimed, LOW);
PrimedFlag = LOW;
}
// Check to see if primers are all out
if (PrimersOut == LOW) {
digitalWrite(OPrimed, LOW);
digitalWrite(OPrimersOut, HIGH);
} else {
if (PrimerCounter < LowPrimerWarning) {
digitalWrite(OPrimersOut, LOW);
}
}
//Let's warn about impending primer outage if counter is at 98 or higher
if (PrimerCounter >= LowPrimerWarning && PrimersOut == HIGH) {
if (millis() - BlinkTime >= 450) {
if (BlinkFlag == LOW) {
BlinkFlag = HIGH;
} else {
BlinkFlag = LOW;
}
BlinkTime = millis();
digitalWrite(OPrimersOut, BlinkFlag);
}
}
}