1. Assessment Device
Definition:A device designed totestthe wire accessingskillsof the operator underthe addedstressor
of time.Inside the case isaneightquestiontestpertainingtogeneral EODknowledge.The answersto
each questioncorrespondtoa wire’scolorinside the Ethernetcable. The colororderinwhichthe
operatoranswersinisthe same orderinwhichthe wiresmustbe cut. Once the case is openedanLCD
will indicate the amountof time remaining withastartingtime of eightminutes.
Hardware: ATMega328P (Arduino)
Arming: Plugthe powercable intothe wall andturn the keyswitchto on.
Firing:Time runs out,more than one wire cut out of order,pushingred microswitch,cuttingall wiresat
once,removingEthernetfromthe jack.
Code:
#define VERSION"1.1"
//Library Inclusions
#include <Wire.h>
#include <LCDi2cNHD.h>
#include <inttypes.h>
//Set LCD Address
LCDi2cNHD lcd = LCDi2cNHD(4,20,0x50>>1,0);
uint8_t rows = 4;
uint8_t cols= 20;
//Pin Values
int DI = 1;
int microSwitch = 2;
int AI = 3;
int penalty= 4;
int wireA= 5;
int wireB = 6;
int wireC= 7;
int wireD = 8;
int wireE= 9;
int wireF= 10;
int wireG = 11;
int wireH = 12;
//Variable Values
int TIME = 480;
int skips[8];
int order [8];
2. int submit[8];
int rate = 1;
int wireVal [9];
int AIstate = LOW;
int honest= 0;
int errorCount = 0;
const long interval = 1000;
unsignedlongpreviousMillis=0;
unsignedlongspreviousMillis=0;
void setup()
{
pinMode (DI,OUTPUT);
pinMode (microSwitch,INPUT);
pinMode (AI,OUTPUT);
pinMode (penalty,OUTPUT);
pinMode (wireA,INPUT);
pinMode (wireB,INPUT);
pinMode (wireC,INPUT);
pinMode (wireD,INPUT);
pinMode (wireE,INPUT);
pinMode (wireF,INPUT);
pinMode (wireG,INPUT);
pinMode (wireH,INPUT);
//Initialize the LCD
lcd.init();
lcd.clear();
//Reads value from microswitch
while (digitalRead(microSwitch) == 1)
{
delay (1);
}
//Initialize skipvaluesto 0
for (inti = 0; i < 8; i++)
{
skips [i]= 0;
submit [i]= 10;
order [i] = i;
}
delay(1000);
}
3. void loop()
{
getDigital();
testDigital();
penTest();
//Beepand countdownwithout delay
unsignedlongcurrentMillis= millis();
if(currentMillis- previousMillis>=(interval / rate))
{
previousMillis=currentMillis;
countdown();
if (AIstate == LOW)
{
AIstate = HIGH;
}
else
{
AIstate = LOW;
}
digitalWrite (AI,AIstate);
}
}
//Test penaltyconditions
void penTest()
{
int counter= 0;
//Killsif the microswitch was pressedafter lidopens
if(digitalRead(microSwitch) == 1)
{
kill();
}
//Killsif time runs out
if(TIME == 0)
{
kill();
}
//Sums up all the valuesof the wires
for (inti = 0; i < 8; i++)
{
4. counter = counter+ wireVal [i];
}
unsignedlongsecondMillis=millis();
if(secondMillis- spreviousMillis>=interval)
{
spreviousMillis=secondMillis;
if (counter== 1)
{
honest= 1;
}
}
//Disarms ifall the wire valessum up to zero
if((counter== 0) && (honest== 1))
{
disarm();
}
//Killsif all wiresare cut at once
if((counter== 0) && (honest== 0))
{
kill();
}
}
//Penalty siren
void kill()
{
digitalWrite (AI,LOW);
lcd.clear();
lcd.setCursor(0,2);
lcd.print("YOU");
lcd.setCursor(1,5);
lcd.print("BETTER");
lcd.setCursor(2,11);
lcd.print("RUN");
lcd.setCursor(3,14);
lcd.print("FAST");
delay(2000);
digitalWrite (penalty,HIGH);
delay(1000);
digitalWrite (penalty,LOW);
delay(1000);
5. reminder();
}
//Reads and storeswire values
void getDigital()
{
for (inti = 0; i < 8; i++)
{
wireVal [i]= digitalRead(i+5);
}
}
//Determinesifa wire value is cut out of order
void testDigital()
{
int buffer;
int holder;
for (inti = 0; i < 8; i++)
{
if ((wireVal [i]== 0) && skips[i] == 0)
{
skips[i] = 1;
holder= i;
for (intj = 0; j < 8; j++)
{
if(submit[j] > 9)
{
submit [j]= i;
if (submit[j]!= order [j])
{
rate = 10000;
errorCount++;
submit[j] = 10;
buffer= 8 - i;
for (intk = 1; k < buffer;k++)
{
order [holder]= order [holder+1];
holder++;
}
}
break;
}
}
}
}
6. if(errorCount == 2)
{
kill();
}
}
//Disarm function
void disarm()
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print(" DISARMED");
digitalWrite (AI,LOW);
digitalWrite (penalty,LOW);
delay(500);
digitalWrite (AI,HIGH);
delay(100);
digitalWrite (AI,LOW);
delay(50);
digitalWrite (AI,HIGH);
delay(100);
digitalWrite (AI,LOW);
delay(50);
digitalWrite (AI,HIGH);
delay(100);
digitalWrite (AI,LOW);
digitalWrite (DI,HIGH);
delay(60000);
reminder();
}
//Displays a countdownto the screen
void countdown()
{
int minutes= TIME / 60;
int seconds= TIME % 60;
lcd.setCursor(1,0);
lcd.print(" Time Remaining");
lcd.setCursor(2,8);
lcd.print(minutes);
lcd.print(":");
if(seconds> 9)
{
lcd.print(seconds);
}
else
7. {
lcd.print("0");
lcd.print(seconds);
}
TIME--;
}
//Reminderto turn off the device and resetthe cable
void reminder()
{
digitalWrite (AI,LOW);
digitalWrite (penalty,LOW);
lcd.clear();
lcd.print("POWEROFFANDRESET");
while (1)
{
digitalWrite (AI,HIGH);
digitalWrite (DI,HIGH);
delay(100);
digitalWrite (DI,LOW);
digitalWrite (AI,LOW);
delay (900);
}
}