Added old firmware and pcb design files

These are all design documents that I thought I had lost. It's may make
me cringe, but it's still cool to use it to see how far I've come.
This commit is contained in:
2016-05-12 20:04:43 -07:00
parent a4df0d921d
commit b300c76103
1047 changed files with 379298 additions and 0 deletions

View File

@@ -0,0 +1,829 @@
///////////////////////////////////////////////////////////////////////////////////////////////
//Includes, Defines, Instantiations, and Global Variables//////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
//Includes
#include "DualVNH5019MotorShield.h" //Library for the motor driver shield
#include <EEPROM.h> //EEPROM Storage Library for storing config changes
#include <SoftwareSerial.h> //Software Serial Library needed for lcd communications
#include <StopWatch.h> //Stopwatch library for timing purposes
#include <avr/pgmspace.h> //PROGMEM library for storage of config
#include <String.h>
//Pin Definitions (Arduino Suggested Method)
const unsigned char LcdTX = 5; //Pin connected to LCD RX Line
const unsigned char StartSwitch = 11; //Pin connected to start switch
const unsigned char StopSwitch = 13; //Pin connected to stop switch
const unsigned char EncoderLed = A2; //Pin connected to rotary encoder led
const unsigned char EncoderButton = A3; //Pin connected to rotary encoder led
const unsigned char EncoderChannelB = A4; //Pin connected to channel A of the rotary encoder
const unsigned char EncoderChannelA = A5; //Pin connected to channel B of the rotary encoder
//Instantiations
SoftwareSerial LcdSerial(3, LcdTX); //Software Serial Instantiation with Pin 3 as dummy for RX
DualVNH5019MotorShield MotorDriver; //Motor Driver Library Instantiation
StopWatch MyStopWatch(StopWatch::SECONDS); //StopWatch Instantiation for measuring time
enum ArduinoPrograms{ //Enumeration for defining the arduino program states
StandardDechorionation = 0, //This is the standard Dechorianation Program
TwoFourDechorionation = 1, //Used for embryo's 24 hours old
PronaseAndRinse = 2, //This is an alternating pronase and rinse cycle
RinseOnly = 3, //This only does the rinse cycle
SDConfig = 4, //Config page for the standard dechorionation
TFConfig = 5, //Config page for the 24 hour
PnRConfig = 6, //Config page for Pronase and Rinse
ROConfig = 7, //Config page for Rinse Only
ProgramSelection = 8 //Presents a program selection screen
} ArduinoProgram = ProgramSelection; //This selects the arduino program to run
//Global Variables and Constants and Configs
const unsigned char TitleTimeout = 2; //Time in seconds to display the main device title
const unsigned char LcdPageDelay = 3; //Seconds to wait before the lcd changes pages.
const unsigned char ConfigPageTimeout = 5; //Time in seconds to wait before dropping the user back to the program selection screen
const unsigned int DebounceTimeout = 300; //Timeout in milliseconds of the button debounce delay
unsigned char DoneOnce = 0; //Variable to store whether something has happened or not.
unsigned char EStop = 0; //Variable to store the status of the system's estop button
unsigned char CycleSkip = 0; //Variable to store whether the user wants to skip the current cycle of a program.
signed char SelectedProgram = 0; //Holds the current program selection. This is not the currently active program.
signed char SelectedConfig = 0; //Hold the current config selection.
unsigned char PreviousConfig = 0; //A value to hold the previous config value. Used for smoothing the rotary encoder reading.
unsigned char EncoderChannelALastValue = LOW; //This variable stores the previous state of channel a on the rotary encoder. This is needed to determine direction.
unsigned char EncoderReferenceVariable = LOW; //This is a dummy varaible for direction determination on for the rotary encoder.
String ConfigVal; //This is used to store the value returned from PROGMEM and converting it to a char array.
int NewVal; //This holds the new value
int PrevVal; //This holds the previous value when changing configs
const unsigned int MaxDriveSpeed = 400; //Max drive speed value given by the motor driver library
const unsigned int RotationMinDriveSpeed = 75; //Minimum value to get the motor to turn
const unsigned int PumpMinDriveSpeed = 75; //Minimum value to get the motor to turn
const unsigned int PumpMaxDriveSpeed = 180;
unsigned int MaxRampValue = 300; //The maximum reasonable value used when ramping the motors
unsigned int MaxPumpRampValue = 150;
unsigned int MinRampValue = 1; //The minimum reasonable value used when ramping the motors
unsigned int CycleSeconds; //Stores the seconds that each cycle should run for.
unsigned int DriveLoop; //Looping variable for driving motors
//| Program List Top | Program List Bottom |
PROGMEM prog_char* ProgramNames[][2] = { //Strings for program names shown on the LCD
{"1: Standard ", " Dechorionation"},
{"2: 24 Hour Old ", " Dechorionation"},
{"3: 6 Hour HPF ", " Dechorionation"}, //Note that "Pronase and Rinse" has been changed to this.
{"4: Rinse Cycle ", " Only "}
};
// | Main Page Top | Main Page Bottom | Adjust Page Top | Max Value | EEPROM Address |
PROGMEM const prog_char* StandardDechorionationConfig[][5] = {
{"Pronase Cycle 1 ", " Minutes ", " Minutes ", (const prog_char*)256, (const prog_char*)0},
{"Pronase Cycle 1 ", " Seconds ", " Seconds ", (const prog_char*)60, (const prog_char*)1},
{" Rinse Cycle ", " Minutes ", " Minutes ", (const prog_char*)256, (const prog_char*)2},
{" Rinse Cycle ", " Seconds ", " Seconds ", (const prog_char*)60, (const prog_char*)3},
{"Pronase Cycle 2 ", " Minutes ", " Minutes ", (const prog_char*)256, (const prog_char*)4},
{"Pronase Cycle 2 ", " Seconds ", " Seconds ", (const prog_char*)60, (const prog_char*)5},
{" Rotation Speed ", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)7},
{"Rotation Ramping", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)6},
{" Pump Speed ", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)8},
{" Pump Ramp ", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)9}
};
const unsigned char NumSDConfig = 10; //Stores the maximum number of available configs
unsigned char EEPROMConfigSD[NumSDConfig] = { //User Modifiable Standard Dechorionation Config Array
6, //Values correspond to each cycle above, in same array order
30, //Default values here are for initial EEPROM Programming
1,
0,
10,
0,
50,
75,
100,
100
};
// | Main Page Top | Main Page Bottom | Adjust Page Top | Max Value | EEPROM Address |
PROGMEM const prog_char* TwoFourDechorionationConfig[][5] = {
{"Pronase Cycle 1 ", " Minutes ", " Minutes ", (const prog_char*)256, (const prog_char*)10},
{"Pronase Cycle 1 ", " Seconds ", " Seconds ", (const prog_char*)60, (const prog_char*)11},
{" Rinse Cycle ", " Minutes ", " Minutes ", (const prog_char*)256, (const prog_char*)12},
{" Rinse Cycle ", " Seconds ", " Seconds ", (const prog_char*)60, (const prog_char*)13},
{"Pronase Cycle 2 ", " Minutes ", " Minutes ", (const prog_char*)256, (const prog_char*)14},
{"Pronase Cycle 2 ", " Seconds ", " Seconds ", (const prog_char*)60, (const prog_char*)15},
{" Rotation Speed ", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)16},
{"Rotation Ramping", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)17},
{" Pump Speed ", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)18},
{" Pump Ramp ", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)19}
};
const unsigned char NumTFConfig = 10; //Stores the maximum number of available configs
unsigned char EEPROMConfigTF[NumTFConfig] = { //User Modifiable 24 Hour Dechorionation Config Array
3, //Values correspond to each cycle above, in same array order
0, //Default values here are for initial EEPROM Programming
1,
0,
10,
0,
85,
85,
85,
85
};
// | Main Page Top | Main Page Bottom | Adjust Page Top | Max Value | EEPROM Address |
PROGMEM const prog_char* PronaseAndRinseConfig[][5] = {
{"Pronase Cycle 1 ", " Minutes ", " Minutes ", (const prog_char*)256, (const prog_char*)10},
{"Pronase Cycle 1 ", " Seconds ", " Seconds ", (const prog_char*)60, (const prog_char*)11},
{" Rinse Cycle ", " Minutes ", " Minutes ", (const prog_char*)256, (const prog_char*)12},
{" Rinse Cycle ", " Seconds ", " Seconds ", (const prog_char*)60, (const prog_char*)13},
{"Pronase Cycle 2 ", " Minutes ", " Minutes ", (const prog_char*)256, (const prog_char*)14},
{"Pronase Cycle 2 ", " Seconds ", " Seconds ", (const prog_char*)60, (const prog_char*)15},
{" Rotation Speed ", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)16},
{"Rotation Ramping", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)17},
{" Pump Speed ", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)18},
{" Pump Ramp ", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)19}
};
const unsigned char NumPnRConfig = 10;
unsigned char EEPROMConfigPnR[NumPnRConfig] = { //User Modifiable Pronase and Rinse Config Array
6, //Values correspond to each cycle above, in same array order
30, //Default values here are for initial EEPROM Programming
1,
0,
10,
0,
85,
85,
85,
85
};
// | Main Page Top | Main Page Bottom | Adjust Page Top | Max Value | EEPROM Address |
PROGMEM const prog_char* RinseOnlyConfig[][5] = {
{" Rinse Cycle ", " Minutes ", " Minutes ", (const prog_char*)256, (const prog_char*)30},
{" Rinse Cycle ", " Seconds ", " Seconds ", (const prog_char*)60, (const prog_char*)31},
{" Pump Speed ", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)32},
{" Pump Ramp ", " Percentage ", " Percent ", (const prog_char*)100, (const prog_char*)33}
};
const unsigned char NumROConfig = 4;
unsigned char EEPROMConfigRO[NumROConfig] = { //User Modifiable Standard Dechorionation Config Array
1, //Values correspond to each cycle above, in same array order
0, //Default values here are for initial EEPROM Programming
85,
85
};
///////////////////////////////////////////////////////////////////////////////////////////////
//Arduino Setup////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
void setup(){
MotorDriver.init(); //Initialize the VNH5019 Motor Driving Shield
InitializePins(); //Initialize pins for switches, rotary encoder, and leds
Serial.begin(115200); //Start communicating to PC at 115200 baud
LcdSerial.begin(9600); //Start communicating with LCD dispaly at 9600 buad
delay(TitleTimeout* 500); //Wait for Lcd to initialize
FullLcdClear(); //Clear the LCD to remove artifacts
FullLcdWrite((unsigned char*)" Tanguay Labs ", (unsigned char*)"Dechorionator #2"); //Show the device name
Serial.println("Dechorionator Initialized"); //Debug on Serial
delay(TitleTimeout* 1000); //Wait on name screen
FullLcdClear(); //Clear the LCD
//SaveToEEPROM(); //Used to write initial EEPROM configuration. It should no longer be needed.
ReadFromEEPROM(); //Reads user configured settings from EEPROM into config arrays
GetInitialEncoderData();
}
///////////////////////////////////////////////////////////////////////////////////////////////
//Main Arduino Program Loop////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
void loop(){
switch(ArduinoProgram){
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
case ProgramSelection:
if(DoneOnce != 1){ ShowProgramListIntro();} //Show an intro screen if the device has just turned on
DisplayProgramList(); //Show the currently selected program title
if(CheckProgramStart() | CheckConfigButton()){ //If the start button or configuration button are pressed, immediately switch to the new program
SelectedConfig = PreviousConfig = 0; //Set config variables to 0 in preperation
break; //Immediately break if a button has been pressed
}
SelectedProgram = ConstrainProgramList(SelectedProgram + ReturnEncoderDirection());//Determine if the encoder has moved, and change the program display if it has
break;
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
case StandardDechorionation:
EStop = 0;
//Pronase Cycle 1
FullLcdWrite((unsigned char*)" Starting ",(unsigned char*)"Pronase Cycle 1 ");
delay(LcdPageDelay*500);
CycleSkip = 0;
ClearAndRestartStopWatch();
CycleSeconds = ((60*EEPROMConfigSD[0]) + EEPROMConfigSD[1]);
while(MyStopWatch.elapsed() < CycleSeconds & !EStop & !CycleSkip){
for(DriveLoop = RotationMinDriveSpeed ; DriveLoop < MaxDriveSpeed ; DriveLoop = DriveLoop + ((EEPROMConfigSD[7]*MaxRampValue)/100)){
MotorDriver.setM1Speed((DriveLoop * EEPROMConfigSD[6])/100);
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
for( ; DriveLoop > RotationMinDriveSpeed ; DriveLoop = DriveLoop - ((EEPROMConfigSD[7]*MaxRampValue)/100)){
MotorDriver.setM1Speed((DriveLoop * EEPROMConfigSD[6])/100);
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
}
SoftStopMotor(1); //Stops Motor 1, rotation motor
//Rinse Cycle
if(!EStop){
FullLcdWrite((unsigned char*)" Starting ",(unsigned char*)" Rinse Cycle ");
delay(LcdPageDelay*500);
CycleSkip = 0;
ClearAndRestartStopWatch();
CycleSeconds = ((60*EEPROMConfigSD[2]) + EEPROMConfigSD[3]);
for(DriveLoop = PumpMinDriveSpeed ; DriveLoop < PumpMaxDriveSpeed ; DriveLoop = DriveLoop + (((EEPROMConfigSD[9]/4)*MaxPumpRampValue)/100)){
MotorDriver.setM2Speed((EEPROMConfigSD[8]*DriveLoop)/100);
delay(250);
}
MotorDriver.setM2Speed((EEPROMConfigSD[8]*PumpMaxDriveSpeed)/100);
}
while(MyStopWatch.elapsed() < CycleSeconds & !EStop & !CycleSkip){
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
SoftStopMotor(2);
//Pronase Cycle 2
if(!EStop){
FullLcdWrite((unsigned char*)" Starting ",(unsigned char*)"Pronase Cycle 2 ");
delay(LcdPageDelay*500);
CycleSkip = 0;
ClearAndRestartStopWatch();
CycleSeconds = ((60*EEPROMConfigSD[4]) + EEPROMConfigSD[5]);
}
while(MyStopWatch.elapsed() < CycleSeconds & !EStop & !CycleSkip){
for(DriveLoop = RotationMinDriveSpeed ; DriveLoop < MaxDriveSpeed ; DriveLoop = DriveLoop + ((EEPROMConfigSD[7]*MaxRampValue)/100)){
MotorDriver.setM1Speed((DriveLoop * EEPROMConfigSD[6])/100);
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
for( ; DriveLoop > RotationMinDriveSpeed ; DriveLoop = DriveLoop - ((EEPROMConfigSD[7]*MaxRampValue)/100)){
MotorDriver.setM1Speed((DriveLoop * EEPROMConfigSD[6])/100);
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
}
SoftStopMotor(1); //Stops Motor 1, rotation motor
EStop = 0;
GoToProgramSelection();
break;
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
case TwoFourDechorionation:
EStop = 0;
//Pronase Cycle 1
FullLcdWrite((unsigned char*)" Starting ",(unsigned char*)"Pronase Cycle 1 ");
delay(LcdPageDelay*500);
CycleSkip = 0;
ClearAndRestartStopWatch();
CycleSeconds = ((60*EEPROMConfigTF[0]) + EEPROMConfigTF[1]);
while(MyStopWatch.elapsed() < CycleSeconds & !EStop & !CycleSkip){
for(DriveLoop = RotationMinDriveSpeed ; DriveLoop < MaxDriveSpeed ; DriveLoop = DriveLoop + ((EEPROMConfigTF[7]*MaxRampValue)/100)){
MotorDriver.setM1Speed((DriveLoop * EEPROMConfigTF[6])/100);
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
for( ; DriveLoop > RotationMinDriveSpeed ; DriveLoop = DriveLoop - ((EEPROMConfigTF[7]*MaxRampValue)/100)){
MotorDriver.setM1Speed((DriveLoop * EEPROMConfigTF[6])/100);
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
}
SoftStopMotor(1); //Stops Motor 1, rotation motor
//Rinse Cycle
if(!EStop){
FullLcdWrite((unsigned char*)" Starting ",(unsigned char*)" Rinse Cycle ");
delay(LcdPageDelay*500);
CycleSkip = 0;
ClearAndRestartStopWatch();
CycleSeconds = ((60*EEPROMConfigTF[2]) + EEPROMConfigTF[3]);
for(DriveLoop = PumpMinDriveSpeed ; DriveLoop < PumpMaxDriveSpeed ; DriveLoop = DriveLoop + ((EEPROMConfigTF[9]*MaxPumpRampValue)/100)){
MotorDriver.setM2Speed((EEPROMConfigTF[8]*DriveLoop)/100);
}
MotorDriver.setM2Speed((EEPROMConfigTF[8]*PumpMaxDriveSpeed)/100);
}
while(MyStopWatch.elapsed() < CycleSeconds & !EStop & !CycleSkip){
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
SoftStopMotor(2);
//Pronase Cycle 2
if(!EStop){
FullLcdWrite((unsigned char*)" Starting ",(unsigned char*)"Pronase Cycle 2 ");
delay(LcdPageDelay*500);
CycleSkip = 0;
ClearAndRestartStopWatch();
CycleSeconds = ((60*EEPROMConfigTF[4]) + EEPROMConfigTF[5]);
}
while(MyStopWatch.elapsed() < CycleSeconds & !EStop & !CycleSkip){
for(DriveLoop = RotationMinDriveSpeed ; DriveLoop < MaxDriveSpeed ; DriveLoop = DriveLoop + ((EEPROMConfigTF[7]*MaxRampValue)/100)){
MotorDriver.setM1Speed((DriveLoop * EEPROMConfigTF[6])/100);
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
for( ; DriveLoop > RotationMinDriveSpeed ; DriveLoop = DriveLoop - ((EEPROMConfigTF[7]*MaxRampValue)/100)){
MotorDriver.setM1Speed((DriveLoop * EEPROMConfigTF[6])/100);
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
}
SoftStopMotor(1); //Stops Motor 1, rotation motor
EStop = 0;
GoToProgramSelection();
break;
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
case PronaseAndRinse:
EStop = 0;
//Pronase Cycle 1
FullLcdWrite((unsigned char*)" Starting ",(unsigned char*)"Pronase Cycle 1 ");
delay(LcdPageDelay*500);
CycleSkip = 0;
ClearAndRestartStopWatch();
CycleSeconds = ((60*EEPROMConfigPnR[0]) + EEPROMConfigPnR[1]);
while(MyStopWatch.elapsed() < CycleSeconds & !EStop & !CycleSkip){
for(DriveLoop = RotationMinDriveSpeed ; DriveLoop < MaxDriveSpeed ; DriveLoop = DriveLoop + ((EEPROMConfigPnR[7]*MaxRampValue)/100)){
MotorDriver.setM1Speed((DriveLoop * EEPROMConfigPnR[6])/100);
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
for( ; DriveLoop > RotationMinDriveSpeed ; DriveLoop = DriveLoop - ((EEPROMConfigPnR[7]*MaxRampValue)/100)){
MotorDriver.setM1Speed((DriveLoop * EEPROMConfigPnR[6])/100);
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
}
SoftStopMotor(1); //Stops Motor 1, rotation motor
//Rinse Cycle
if(!EStop){
FullLcdWrite((unsigned char*)" Starting ",(unsigned char*)" Rinse Cycle ");
delay(LcdPageDelay*500);
CycleSkip = 0;
ClearAndRestartStopWatch();
CycleSeconds = ((60*EEPROMConfigPnR[2]) + EEPROMConfigPnR[3]);
for(DriveLoop = PumpMinDriveSpeed ; DriveLoop < PumpMaxDriveSpeed ; DriveLoop = DriveLoop + ((EEPROMConfigPnR[9]*MaxPumpRampValue)/100)){
MotorDriver.setM2Speed((EEPROMConfigPnR[8]*DriveLoop)/100);
}
MotorDriver.setM2Speed((EEPROMConfigPnR[8]*PumpMaxDriveSpeed)/100);
}
while(MyStopWatch.elapsed() < CycleSeconds & !EStop & !CycleSkip){
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
SoftStopMotor(2);
//Pronase Cycle 2
if(!EStop){
FullLcdWrite((unsigned char*)" Starting ",(unsigned char*)"Pronase Cycle 2 ");
delay(LcdPageDelay*500);
CycleSkip = 0;
ClearAndRestartStopWatch();
CycleSeconds = ((60*EEPROMConfigPnR[4]) + EEPROMConfigPnR[5]);
}
while(MyStopWatch.elapsed() < CycleSeconds & !EStop & !CycleSkip){
for(DriveLoop = RotationMinDriveSpeed ; DriveLoop < MaxDriveSpeed ; DriveLoop = DriveLoop + ((EEPROMConfigPnR[7]*MaxRampValue)/100)){
MotorDriver.setM1Speed((DriveLoop * EEPROMConfigPnR[6])/100);
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
for( ; DriveLoop > RotationMinDriveSpeed ; DriveLoop = DriveLoop - ((EEPROMConfigPnR[7]*MaxRampValue)/100)){
MotorDriver.setM1Speed((DriveLoop * EEPROMConfigPnR[6])/100);
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
}
SoftStopMotor(1); //Stops Motor 1, rotation motor
EStop = 0;
GoToProgramSelection();
break;
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
case RinseOnly:
EStop = 0;
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
FullLcdWrite((unsigned char*)" Starting ",(unsigned char*)" Rinse Cycle ");
if(!EStop){
delay(LcdPageDelay*500);
CycleSkip = 0;
ClearAndRestartStopWatch();
CycleSeconds = ((60*EEPROMConfigRO[0]) + EEPROMConfigRO[1]);
for(DriveLoop = PumpMinDriveSpeed ; DriveLoop < PumpMaxDriveSpeed ; DriveLoop = DriveLoop + ((EEPROMConfigRO[3]*MaxPumpRampValue)/100)){
MotorDriver.setM2Speed((EEPROMConfigRO[2]*DriveLoop)/100);
}
MotorDriver.setM2Speed((EEPROMConfigRO[8]*PumpMaxDriveSpeed)/100);
}
while(MyStopWatch.elapsed() < CycleSeconds & !EStop & !CycleSkip){
LcdFullWriteString((unsigned char*)" Time Remaining ",(" " + String((CycleSeconds - MyStopWatch.elapsed()), DEC) + " "));
if(digitalRead(StopSwitch) == LOW){
SoftStopMotor(1);
GoToProgramSelection();
EStop = 1;
break;
}
if(digitalRead(StartSwitch) == LOW){
delay(DebounceTimeout);
CycleSkip = 1;
break;
}
}
SoftStopMotor(2);
EStop = 0;
GoToProgramSelection();
break;
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
case SDConfig:
ClearAndRestartStopWatch();;
while(MyStopWatch.elapsed() < (ConfigPageTimeout)){
if(PreviousConfig != SelectedConfig ){
ClearAndRestartStopWatch();
}
ShowSDConfigMainScreen();
if(digitalRead(EncoderButton) == LOW){
MyStopWatch.stop();
delay(DebounceTimeout);
PrevVal = NewVal = (int)EEPROMConfigSD[SelectedConfig];
ConfigVal = " " + String(NewVal, DEC) + " ";
ShowSDConfigIndividualConfigScreen();
while(digitalRead(EncoderButton) == HIGH){
NewVal = SDConfigIndividualConstrain(NewVal + ReturnEncoderDirection());
if(NewVal != PrevVal){
PrevVal = NewVal;
ConfigVal = " " + String(NewVal, DEC) + " ";
ShowSDConfigIndividualConfigScreen();
}
}
EEPROMConfigSD[SelectedConfig] = NewVal;
delay(DebounceTimeout);
ClearAndRestartStopWatch();
}
PreviousConfig = SelectedConfig;
SelectedConfig = SDConfigMainConstrain(SelectedConfig += ReturnEncoderDirection());
if(digitalRead(StartSwitch) == LOW){
GoToProgramSelection();
SDConfigSaveToEEPROM();
LcdWriteSavingScreen();
break;
}
if(digitalRead(StopSwitch) == LOW){
GoToProgramSelection();
break;
}
}
GoToProgramSelection();
break;
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
case TFConfig:
ClearAndRestartStopWatch();
while(MyStopWatch.elapsed() < (ConfigPageTimeout)){
if(PreviousConfig != SelectedConfig ){
ClearAndRestartStopWatch();
}
ShowTFConfigMainScreen();
if(digitalRead(EncoderButton) == LOW){
MyStopWatch.stop();
delay(DebounceTimeout);
PrevVal = NewVal = (int)EEPROMConfigTF[SelectedConfig];
ConfigVal = " " + String(NewVal, DEC) + " ";
ShowTFConfigIndividualConfigScreen();
while(digitalRead(EncoderButton) == HIGH){
NewVal = TFConfigIndividualConstrain(NewVal + ReturnEncoderDirection());
if(NewVal != PrevVal){
PrevVal = NewVal;
ConfigVal = " " + String(NewVal, DEC) + " ";
ShowTFConfigIndividualConfigScreen();
}
}
EEPROMConfigTF[SelectedConfig] = NewVal;
delay(DebounceTimeout);
ClearAndRestartStopWatch();
}
PreviousConfig = SelectedConfig;
SelectedConfig = TFConfigMainConstrain(SelectedConfig += ReturnEncoderDirection());
if(digitalRead(StartSwitch) == LOW){
GoToProgramSelection();
TFConfigSaveToEEPROM();
LcdWriteSavingScreen();
break;
}
if(digitalRead(StopSwitch) == LOW){
GoToProgramSelection();
break;
}
}
GoToProgramSelection();
break;
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
case PnRConfig:
ClearAndRestartStopWatch();
while(MyStopWatch.elapsed() < (ConfigPageTimeout)){
if(PreviousConfig != SelectedConfig ){
ClearAndRestartStopWatch();
}
ShowPnRConfigMainScreen();
if(digitalRead(EncoderButton) == LOW){
MyStopWatch.stop();
delay(DebounceTimeout);
PrevVal = NewVal = (int)EEPROMConfigPnR[SelectedConfig];
ConfigVal = " " + String(NewVal, DEC) + " ";
ShowPnRConfigIndividualConfigScreen();
while(digitalRead(EncoderButton) == HIGH){
NewVal = PnRConfigIndividualConstrain(NewVal + ReturnEncoderDirection());
if(NewVal != PrevVal){
PrevVal = NewVal;
ConfigVal = " " + String(NewVal, DEC) + " ";
ShowPnRConfigIndividualConfigScreen();
}
}
EEPROMConfigPnR[SelectedConfig] = NewVal;
delay(DebounceTimeout);
ClearAndRestartStopWatch();
}
PreviousConfig = SelectedConfig;
SelectedConfig = PnRConfigMainConstrain(SelectedConfig += ReturnEncoderDirection());
if(digitalRead(StartSwitch) == LOW){
GoToProgramSelection();
PnRConfigSaveToEEPROM();
LcdWriteSavingScreen();
break;
}
if(digitalRead(StopSwitch) == LOW){
GoToProgramSelection();
break;
}
}
GoToProgramSelection();
break;
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
case ROConfig:
ClearAndRestartStopWatch();
while(MyStopWatch.elapsed() < (ConfigPageTimeout)){
if(PreviousConfig != SelectedConfig ){
ClearAndRestartStopWatch();
}
ShowROConfigMainScreen();
if(digitalRead(EncoderButton) == LOW){
MyStopWatch.stop();
delay(DebounceTimeout);
PrevVal = NewVal = (int)EEPROMConfigRO[SelectedConfig];
ConfigVal = " " + String(NewVal, DEC) + " ";
ShowROConfigIndividualConfigScreen();
while(digitalRead(EncoderButton) == HIGH){
NewVal = ROConfigIndividualConstrain(NewVal + ReturnEncoderDirection());
if(NewVal != PrevVal){
PrevVal = NewVal;
ConfigVal = " " + String(NewVal, DEC) + " ";
ShowROConfigIndividualConfigScreen();
}
}
EEPROMConfigRO[SelectedConfig] = NewVal;
delay(DebounceTimeout);
ClearAndRestartStopWatch();
}
PreviousConfig = SelectedConfig;
SelectedConfig = ROConfigMainConstrain(SelectedConfig += ReturnEncoderDirection());
if(digitalRead(StartSwitch) == LOW){
GoToProgramSelection();
ROConfigSaveToEEPROM();
LcdWriteSavingScreen();
break;
}
if(digitalRead(StopSwitch) == LOW){
GoToProgramSelection();
break;
}
}
GoToProgramSelection();
break;
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
default:
FullLcdWrite((unsigned char*)"Fatal Error ", (unsigned char*)"Contact Support ");
while(1);
break;
};
}

View File

@@ -0,0 +1,52 @@
void LcdMoveToTop(){
LcdSerial.write(254); //Put LCD into move mode
LcdSerial.write(128); //Move to the first character of the first row
}
void LcdMoveToBottom(){
LcdSerial.write(254); //Put LCD into move mode
LcdSerial.write(192); //Move to the first character of the second row
}
void FullLcdClear(){
LcdSerial.write(254); //Send special command character
LcdSerial.write(1); //Send Clear Screen Command
}
void TopLcdClear(){
LcdMoveToTop();
LcdSerial.write(" "); //Write a blank 16 character string
}
void BottomLcdClear(){
LcdMoveToBottom();
LcdSerial.write(" "); //Write a blank 16 character string
}
void FullLcdWrite(unsigned char* TopLcd, unsigned char* BottomLcd){
TopLcdWrite(TopLcd);
BottomLcdWrite(BottomLcd);
}
void TopLcdWrite(unsigned char *TopLcd){
LcdMoveToTop();
LcdSerial.write((const char*)TopLcd); //Write string
}
void BottomLcdWrite(unsigned char *BottomLcd){
LcdMoveToBottom();
LcdSerial.write((const char*)BottomLcd); //Write string
}
void LcdFullWriteString(unsigned char* TopLcd, String BottomLcd){
TopLcdWrite(TopLcd);
LcdMoveToBottom();
LcdSerial.print(BottomLcd);
}
void LcdWriteSavingScreen(){
FullLcdWrite((unsigned char*)" Settings Saved ",(unsigned char*)" Sucessfully ");
delay(1500);
}

View File

@@ -0,0 +1,56 @@
void ReadFromEEPROM(){
SDConfigLoadFromEEPROM();
TFConfigLoadFromEEPROM();
PnRConfigLoadFromEEPROM();
ROConfigLoadFromEEPROM();
}
void SaveToEEPROM(){
SDConfigSaveToEEPROM();
TFConfigSaveToEEPROM();
PnRConfigSaveToEEPROM();
ROConfigSaveToEEPROM();
}
void DisplayProgramList(){
FullLcdWrite((unsigned char*)pgm_read_word(&ProgramNames[SelectedProgram][0]), (unsigned char*)pgm_read_word(&ProgramNames[SelectedProgram][1]));
}
void GetInitialEncoderData(){
EncoderChannelALastValue = EncoderReferenceVariable = digitalRead(EncoderChannelA);
}
signed char ReturnEncoderDirection(){
EncoderReferenceVariable = digitalRead(EncoderChannelA);
if((EncoderChannelALastValue == LOW) && (EncoderReferenceVariable == HIGH)){
if(digitalRead(EncoderChannelB) == LOW){
EncoderChannelALastValue = EncoderReferenceVariable;;
return 1;
}else{
EncoderChannelALastValue = EncoderReferenceVariable;
return -1;
}
}
EncoderChannelALastValue = EncoderReferenceVariable;
return 0;
}
void ClearAndRestartStopWatch(){
MyStopWatch.reset();
MyStopWatch.start();
}
void SoftStopMotor(unsigned char Motor){
if(Motor == 1){
for( ; DriveLoop != RotationMinDriveSpeed ; DriveLoop--){
MotorDriver.setM1Speed(DriveLoop);
}
MotorDriver.setM1Speed(0);
}
else if(Motor == 2){
for( ; DriveLoop != PumpMinDriveSpeed ; DriveLoop--){
MotorDriver.setM2Speed(DriveLoop);
}
MotorDriver.setM2Speed(0);
}
}

View File

@@ -0,0 +1,39 @@
void ShowProgramListIntro(){
FullLcdWrite((unsigned char*)"Select Program, ",(unsigned char*)"Press Start "); //Show the start screen
delay(TitleTimeout* 1000); //Wait for three seconds
FullLcdClear();
DoneOnce = 1; //Set DoneOnce to 1 so we know it's been started for the first time
EStop = 0;
}
signed char ConstrainProgramList(signed char ProgramList){
if(ProgramList == -1){
return 3;
}else if(ProgramList == 4){
return 0;
}
}
unsigned char CheckConfigButton(){
if(digitalRead(EncoderButton) == LOW){
delay(DebounceTimeout);
SelectedConfig = 0;
ArduinoProgram = ArduinoPrograms((char)SelectedProgram + 4);
return 1;
}
return 0;
}
unsigned char CheckProgramStart(){
if(digitalRead(StartSwitch) == LOW){
ArduinoProgram = (ArduinoPrograms)SelectedProgram; //Change arduino program selector to the new one
return 1;
}
return 0;
}
void GoToProgramSelection(){
delay(DebounceTimeout);
ArduinoProgram = ProgramSelection;
}

View File

@@ -0,0 +1,39 @@
void ShowPnRConfigMainScreen(){
FullLcdWrite((unsigned char*)pgm_read_word(&PronaseAndRinseConfig[SelectedConfig][0]), (unsigned char*)pgm_read_word(&PronaseAndRinseConfig[SelectedConfig][1]));
}
void ShowPnRConfigIndividualConfigScreen(){
LcdFullWriteString((unsigned char*)pgm_read_word(&PronaseAndRinseConfig[SelectedConfig][2]), ConfigVal);
}
int PnRConfigMainConstrain(signed int Constrain){
int Constraint = NumPnRConfig - 1;
if(Constrain > Constraint){
Constrain = (NumPnRConfig - 1);
}else if(Constrain < 0){
Constrain = 0;
}
return Constrain;
}
int PnRConfigIndividualConstrain(signed int Constrain){
int Constraint = (int)pgm_read_word(&PronaseAndRinseConfig[SelectedConfig][3]);
if(Constrain > Constraint){
Constrain = (int)pgm_read_word(&PronaseAndRinseConfig[SelectedConfig][3]);
}else if(Constrain < 0){
Constrain = 0;
}
return Constrain;
}
void PnRConfigLoadFromEEPROM(){
for(int i = 0 ; i < NumPnRConfig ; i++){
EEPROMConfigPnR[i] = EEPROM.read(pgm_read_word(&PronaseAndRinseConfig[i][4]));
}
}
void PnRConfigSaveToEEPROM(){
for(int i = 0 ; i < NumPnRConfig ; i++){
EEPROM.write(pgm_read_word(&PronaseAndRinseConfig[i][4]),EEPROMConfigPnR[i]);
}
}

View File

@@ -0,0 +1,39 @@
void ShowROConfigMainScreen(){
FullLcdWrite((unsigned char*)pgm_read_word(&RinseOnlyConfig[SelectedConfig][0]), (unsigned char*)pgm_read_word(&RinseOnlyConfig[SelectedConfig][1]));
}
void ShowROConfigIndividualConfigScreen(){
LcdFullWriteString((unsigned char*)pgm_read_word(&RinseOnlyConfig[SelectedConfig][2]), ConfigVal);
}
int ROConfigMainConstrain(signed int Constrain){
int Constraint = NumROConfig - 1;
if(Constrain > Constraint){
Constrain = (NumROConfig - 1);
}else if(Constrain < 0){
Constrain = 0;
}
return Constrain;
}
int ROConfigIndividualConstrain(signed int Constrain){
int Constraint = (int)pgm_read_word(&RinseOnlyConfig[SelectedConfig][3]);
if(Constrain > Constraint){
Constrain = (int)pgm_read_word(&RinseOnlyConfig[SelectedConfig][3]);
}else if(Constrain < 0){
Constrain = 0;
}
return Constrain;
}
void ROConfigLoadFromEEPROM(){
for(int i = 0 ; i < NumROConfig ; i++){
EEPROMConfigRO[i] = EEPROM.read(pgm_read_word(&RinseOnlyConfig[i][4]));
}
}
void ROConfigSaveToEEPROM(){
for(int i = 0 ; i < NumROConfig ; i++){
EEPROM.write(pgm_read_word(&RinseOnlyConfig[i][4]),EEPROMConfigRO[i]);
}
}

View File

@@ -0,0 +1,15 @@
void InitializePins(){
pinMode(StartSwitch, INPUT); //Set Start Switch Pin to Input
pinMode(StopSwitch, INPUT); //Set Stop Switch Pin to Input
digitalWrite(StartSwitch, HIGH); //Set the internal pullup resistor for the switch
digitalWrite(StopSwitch, HIGH); //Set the internal pullup resistor for the switch
pinMode(EncoderLed, OUTPUT); //Set LED Pin to Output
pinMode(EncoderButton, INPUT); //Set Encoder Button Pin to Input
pinMode(EncoderChannelA, INPUT); //Set Encoder Channel A Pin to Input
pinMode(EncoderChannelB, INPUT); //Set Encoder Channel B Pin to Input
digitalWrite(EncoderLed, HIGH);
digitalWrite(EncoderButton, HIGH); //Set the internal pullup resistor for the switch
digitalWrite(EncoderChannelA, HIGH); //Set the internal pullup resistor for the switch
digitalWrite(EncoderChannelB, HIGH); //Set the internal pullup resistor for the switch
}

View File

@@ -0,0 +1,49 @@
///////////////////////////////////////////////////////////////////////////////////////////////
//Program Functions////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
//Config Functions/////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
void ShowSDConfigMainScreen(){
FullLcdWrite((unsigned char*)pgm_read_word(&StandardDechorionationConfig[SelectedConfig][0]), (unsigned char*)pgm_read_word(&StandardDechorionationConfig[SelectedConfig][1]));
}
void ShowSDConfigIndividualConfigScreen(){
LcdFullWriteString((unsigned char*)pgm_read_word(&StandardDechorionationConfig[SelectedConfig][2]), ConfigVal);
}
int SDConfigMainConstrain(signed int Constrain){
int Constraint = NumSDConfig - 1;
if(Constrain > Constraint){
Constrain = (NumSDConfig - 1);
}else if(Constrain < 0){
Constrain = 0;
}
return Constrain;
}
int SDConfigIndividualConstrain(signed int Constrain){
int Constraint = (int)pgm_read_word(&StandardDechorionationConfig[SelectedConfig][3]);
if(Constrain > Constraint){
Constrain = (int)pgm_read_word(&StandardDechorionationConfig[SelectedConfig][3]);
}else if(Constrain < 0){
Constrain = 0;
}
return Constrain;
}
void SDConfigLoadFromEEPROM(){
for(int i = 0 ; i < NumSDConfig ; i++){
EEPROMConfigSD[i] = EEPROM.read(pgm_read_word(&StandardDechorionationConfig[i][4]));
}
}
void SDConfigSaveToEEPROM(){
for(int i = 0 ; i < NumSDConfig ; i++){
EEPROM.write(pgm_read_word(&StandardDechorionationConfig[i][4]),EEPROMConfigSD[i]);
}
}

View File

@@ -0,0 +1,39 @@
void ShowTFConfigMainScreen(){
FullLcdWrite((unsigned char*)pgm_read_word(&TwoFourDechorionationConfig[SelectedConfig][0]), (unsigned char*)pgm_read_word(&TwoFourDechorionationConfig[SelectedConfig][1]));
}
void ShowTFConfigIndividualConfigScreen(){
LcdFullWriteString((unsigned char*)pgm_read_word(&TwoFourDechorionationConfig[SelectedConfig][2]), ConfigVal);
}
int TFConfigMainConstrain(signed int Constrain){
int Constraint = NumTFConfig - 1;
if(Constrain > Constraint){
Constrain = (NumTFConfig - 1);
}else if(Constrain < 0){
Constrain = 0;
}
return Constrain;
}
int TFConfigIndividualConstrain(signed int Constrain){
int Constraint = (int)pgm_read_word(&TwoFourDechorionationConfig[SelectedConfig][3]);
if(Constrain > Constraint){
Constrain = (int)pgm_read_word(&TwoFourDechorionationConfig[SelectedConfig][3]);
}else if(Constrain < 0){
Constrain = 0;
}
return Constrain;
}
void TFConfigLoadFromEEPROM(){
for(int i = 0 ; i < NumTFConfig ; i++){
EEPROMConfigTF[i] = EEPROM.read(pgm_read_word(&TwoFourDechorionationConfig[i][4]));
}
}
void TFConfigSaveToEEPROM(){
for(int i = 0 ; i < NumTFConfig ; i++){
EEPROM.write(pgm_read_word(&TwoFourDechorionationConfig[i][4]),EEPROMConfigTF[i]);
}
}

View File

@@ -0,0 +1,528 @@
#LyX 2.0 created this file. For more info see http://www.lyx.org/
\lyxformat 413
\begin_document
\begin_header
\textclass article
\use_default_options true
\maintain_unincluded_children false
\language english
\language_package default
\inputencoding auto
\fontencoding global
\font_roman default
\font_sans default
\font_typewriter default
\font_default_family default
\use_non_tex_fonts false
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100
\graphics default
\default_output_format default
\output_sync 0
\bibtex_command default
\index_command default
\paperfontsize default
\spacing single
\use_hyperref false
\papersize default
\use_geometry false
\use_amsmath 1
\use_esint 1
\use_mhchem 1
\use_mathdots 1
\cite_engine basic
\use_bibtopic false
\use_indices false
\paperorientation portrait
\suppress_date true
\use_refstyle 1
\index Index
\shortcut idx
\color #008000
\end_index
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\paragraph_indentation default
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\html_math_output 0
\html_css_as_file 0
\html_be_strict false
\end_header
\begin_body
\begin_layout Title
\series bold
Dechorionation Table User Manual - Draft
\end_layout
\begin_layout Standard
\align center
Sinhubber Aquatic Research Laboratory
\end_layout
\begin_layout Standard
\align center
Oregon State University
\end_layout
\begin_layout Standard
\align center
Corwin Perren
\end_layout
\begin_layout Standard
\begin_inset Newpage pagebreak
\end_inset
\end_layout
\begin_layout Part*
Firmware Rev 1.0
\end_layout
\begin_layout Section*
Using the Dechorionator
\end_layout
\begin_layout Enumerate
Turn on the Dechorionator using the power switch located on the rear of
the unit.
\end_layout
\begin_layout Enumerate
Wait until the device has finished powering up and shows the program selection
screen.
\end_layout
\begin_layout Enumerate
Rotate the selection knob until the desired program is shown.
\end_layout
\begin_layout Enumerate
Press the green start button to begin the program.
\end_layout
\begin_layout Enumerate
To skip a particular cycle in a program, press the start button.
\end_layout
\begin_layout Enumerate
Press the stop button at any time to immediately end the currently running
program and return to the selection screen.
\end_layout
\begin_layout Section*
Changing Settings
\end_layout
\begin_layout Enumerate
Rotate the selection knob until the program containing the settings you
would like to modify is shown.
\end_layout
\begin_layout Enumerate
Press the knob to enter the settings editor for that program.
\end_layout
\begin_layout Enumerate
Rotate the selection knob until the setting you would like to change is
shown.
\end_layout
\begin_layout Enumerate
Press the knob to enter the setting's edit screen.
\end_layout
\begin_layout Enumerate
Rotate the selection knob until the desired value is displayed.
\end_layout
\begin_layout Enumerate
Press the knob to save the new value and return to the settings selection
screen.
\end_layout
\begin_layout Enumerate
Repeat for any other settings you would like to change for the selected
program.
\end_layout
\begin_layout Enumerate
Saving Settings
\end_layout
\begin_deeper
\begin_layout Enumerate
Save settings temporarily (Does not persist through reboots).
\end_layout
\begin_deeper
\begin_layout Enumerate
Return to the settings selection screen.
\end_layout
\begin_layout Enumerate
Press the stop button or wait for a few seconds for it to timeout.
\end_layout
\begin_layout Enumerate
You will be returned to the main program selection screen and any modified
settings will be applied until a reboot.
\end_layout
\end_deeper
\begin_layout Enumerate
Save settings permanently (Settings will persist through reboots).
\end_layout
\begin_deeper
\begin_layout Enumerate
Return to the settings selection screen.
\end_layout
\begin_layout Enumerate
Press the start button.
\end_layout
\begin_layout Enumerate
\begin_inset Quotes eld
\end_inset
Settings Saved Sucessfully
\begin_inset Quotes erd
\end_inset
should display breifly before returning to the main program selection screen.
\end_layout
\end_deeper
\end_deeper
\begin_layout Section*
Program Cycle Information and Settings Defaults
\end_layout
\begin_layout Standard
\shape italic
Note that cycles are in order and motor settings apply to all cycles for
a given program.
\end_layout
\begin_layout Subsubsection*
Standard Dechorionation Cycles
\end_layout
\begin_layout Enumerate
Pronase Cycle 1
\end_layout
\begin_deeper
\begin_layout Enumerate
Pronase Cycle 1 - Minutes :
\series bold
6
\end_layout
\begin_layout Enumerate
Pronase Cycle 1 - Seconds :
\series bold
30
\end_layout
\end_deeper
\begin_layout Enumerate
Rinse Cycle
\end_layout
\begin_deeper
\begin_layout Enumerate
Rinse Cycle - Minutes :
\series bold
1
\end_layout
\begin_layout Enumerate
Rinse Cycle - Seconds :
\series bold
0
\end_layout
\end_deeper
\begin_layout Enumerate
Pronase Cycle 2
\end_layout
\begin_deeper
\begin_layout Enumerate
Pronase Cycle 2 - Minutes :
\series bold
10
\end_layout
\begin_layout Enumerate
Pronase Cycle 2 - Seconds :
\series bold
0
\end_layout
\end_deeper
\begin_layout Enumerate
Motor Settings
\end_layout
\begin_deeper
\begin_layout Enumerate
Rotation Speed - Percentage :
\series bold
85
\end_layout
\begin_layout Enumerate
Rotation Ramping Percentage :
\series bold
85
\end_layout
\begin_layout Enumerate
Pump Speed :
\series bold
50
\end_layout
\begin_layout Enumerate
Pump ramp :
\series bold
85
\end_layout
\end_deeper
\begin_layout Subsubsection*
24 Hour Dechorionation Cycles
\end_layout
\begin_layout Enumerate
Pronase Cycle 1
\end_layout
\begin_deeper
\begin_layout Enumerate
Pronase Cycle 1 - Minutes :
\series bold
3
\end_layout
\begin_layout Enumerate
Pronase Cycle 1 - Seconds :
\series bold
0
\end_layout
\end_deeper
\begin_layout Enumerate
Rinse Cycle
\end_layout
\begin_deeper
\begin_layout Enumerate
Rinse Cycle - Minutes :
\series bold
1
\end_layout
\begin_layout Enumerate
Rinse Cycle - Seconds :
\series bold
0
\end_layout
\end_deeper
\begin_layout Enumerate
Pronase Cycle 2
\end_layout
\begin_deeper
\begin_layout Enumerate
Pronase Cycle 2 - Minutes :
\series bold
10
\end_layout
\begin_layout Enumerate
Pronase Cycle 2 - Seconds :
\series bold
0
\end_layout
\end_deeper
\begin_layout Enumerate
Motor Settings
\end_layout
\begin_deeper
\begin_layout Enumerate
Rotation Speed - Percentage :
\series bold
85
\end_layout
\begin_layout Enumerate
Rotation Ramping Percentage :
\series bold
85
\end_layout
\begin_layout Enumerate
Pump Speed :
\series bold
50
\end_layout
\begin_layout Enumerate
Pump ramp :
\series bold
85
\end_layout
\end_deeper
\begin_layout Subsubsection*
6 Hour HPF Dechorionation Cycles
\end_layout
\begin_layout Enumerate
Pronase Cycle 1
\end_layout
\begin_deeper
\begin_layout Enumerate
Pronase Cycle 1 - Minutes :
\series bold
6
\end_layout
\begin_layout Enumerate
Pronase Cycle 1 - Seconds :
\series bold
30
\end_layout
\end_deeper
\begin_layout Enumerate
Rinse Cycle
\end_layout
\begin_deeper
\begin_layout Enumerate
Rinse Cycle - Minutes :
\series bold
1
\end_layout
\begin_layout Enumerate
Rinse Cycle - Seconds :
\series bold
0
\end_layout
\end_deeper
\begin_layout Enumerate
Pronase Cycle 2
\end_layout
\begin_deeper
\begin_layout Enumerate
Pronase Cycle 2 - Minutes :
\series bold
10
\end_layout
\begin_layout Enumerate
Pronase Cycle 2 - Seconds :
\series bold
0
\end_layout
\end_deeper
\begin_layout Enumerate
Motor Settings
\end_layout
\begin_deeper
\begin_layout Enumerate
Rotation Speed - Percentage :
\series bold
85
\end_layout
\begin_layout Enumerate
Rotation Ramping Percentage :
\series bold
85
\end_layout
\begin_layout Enumerate
Pump Speed :
\series bold
50
\end_layout
\begin_layout Enumerate
Pump ramp :
\series bold
85
\end_layout
\end_deeper
\begin_layout Subsubsection*
Rinse Cycle
\end_layout
\begin_layout Enumerate
Rinse Cycle
\end_layout
\begin_deeper
\begin_layout Enumerate
Rinse Cycle - Minutes :
\series bold
1
\end_layout
\begin_layout Enumerate
Rinse Cycle - Seconds :
\series bold
0
\end_layout
\end_deeper
\begin_layout Enumerate
Motor Settings
\end_layout
\begin_deeper
\begin_layout Enumerate
Pump Speed :
\series bold
50
\end_layout
\begin_layout Enumerate
Pump ramp :
\series bold
85
\end_layout
\end_deeper
\end_body
\end_document