#include <LiquidCrystal.h> //screen arduino library
#include <Stepper.h> //Stepper motor library
LiquidCrystal lcd(13, 12, 11, 10, 9, 8); //declares screen wiring
Stepper myStepper(200, 6, 7); //Setsup stepper motor, steps per rev, dir, step
// Rotary Encoder Inputs
#define RotaryCLK 2
#define RotaryDT 3
#define PushButton 5
int menu_counter = 0;
int CLKNow;
int CLKPrevious;
unsigned long lastButtonPress = 0;
float decimal;
bool menu1_selected = false;
bool menu2_selected = false;
bool menu3_selected = false;
bool menu4_selected = false;
bool start_test = false;
bool Reset = false;
float stepNUM;
double S_time = 0; //final calculation
double menu1_Value = 0; //value within menu 1
double menu2_Value = 0; //value within menu 2
double menu3_Value = 0; //value within menu 3
double menu4_Value = 0; //value within menu 4
void setup()
{
// Set encoder pins as inputs
pinMode(RotaryCLK, INPUT);
pinMode(RotaryDT, INPUT);
pinMode(PushButton, INPUT_PULLUP);
// Setup Serial Monitor
Serial.begin(9600);
// Read the initial state of CLK
CLKPrevious = digitalRead(RotaryCLK);
//LCD setup
lcd.begin(16, 2);
lcd.clear(); //clear the whole LCD
lcd.setCursor(0, 0);
attachInterrupt(digitalPinToInterrupt(2), rotate, CHANGE); //CLK pin is an interrupt pin
}
/////////////////////////////////MAIN LOOP/////////////////////////////////
void loop()
{
if (menu1_selected == false && menu2_selected == false && menu3_selected == false && menu4_selected == false && Reset == false)
{
menu();
}
else
{
selector();
}
}
///////////////////////////////////////////////////////////////////////////
/////////////////////////////////FUNCTIONS/////////////////////////////////
////////////////////////////READS ENCODER INPUT////////////////////////////
void rotate()
{
CLKNow = digitalRead(RotaryCLK);
if (CLKNow != CLKPrevious && CLKNow == 1)
{
if (digitalRead(RotaryDT) != CLKNow)
{
menu_counter --;
} else {
menu_counter ++;
}
//Serial.print("Menu Counter: ");
//Serial.println(menu_counter);
}
CLKPrevious = CLKNow;
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////MENU////////////////////////////////////
void selector()
{
int btnState = digitalRead(PushButton);
///////////////////////////////////MENU 1///////////////////////////////////
if (menu1_selected == true)
{
double large = menu_counter;
lcd.print("X Cycle no.: ");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print((large * 100), 0);
delay(600);
lcd.clear();
if (menu_counter == -1) {
menu_counter = 1000;
}
else {
menu_counter = menu_counter;
}
if (btnState == LOW) {
if (millis() - lastButtonPress > 50)
{
menu1_selected = !menu1_selected;
menu1_Value = large*100;
menu_counter = 0;
}
lastButtonPress = millis();
}
delay(1);
}
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////MENU 2///////////////////////////////////
else if (menu2_selected == true)
{
decimal = menu_counter;
menu2_Value = decimal / 2;
lcd.print("X Collapse: ");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(menu2_Value, 1);
lcd.print("mm");
delay(600);
lcd.clear();
if (menu_counter <= 0) {
menu_counter = 80;
}
else {
menu_counter = menu_counter;
}
if (menu_counter > 80) {
menu_counter = 1;
}
if (btnState == LOW) {
if (millis() - lastButtonPress > 100)
{
menu2_selected = !menu2_selected;
menu2_Value = decimal / 2;
menu_counter = 1;
}
lastButtonPress = millis();
}
delay(1);
}
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////MENU 3///////////////////////////////////
else if (menu3_selected == true)
{
decimal = menu_counter;
menu3_Value = decimal / 2;
lcd.print("X Time-on:");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(menu3_Value, 1);
lcd.print("s");
delay(600);
lcd.clear();
if (menu_counter == -1) {
menu_counter = 0;
}
else {
menu_counter = menu_counter;
}
if (menu_counter > 10) {
menu_counter = 0;
}
if (btnState == LOW) {
if (millis() - lastButtonPress > 50)
{
menu3_selected = !menu3_selected;
menu3_Value = decimal / 2;
menu_counter = 2;
}
lastButtonPress = millis();
}
delay(1);
}
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////MENU 3///////////////////////////////////
else if (menu4_selected == true)
{
decimal = menu_counter;
menu4_Value = decimal / 2;
lcd.print("X Time-off:");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(menu4_Value, 1);
lcd.print("s");
delay(600);
lcd.clear();
if (menu_counter == -1) {
menu_counter = 0;
}
else {
menu_counter = menu_counter;
}
if (menu_counter > 10) {
menu_counter = 1;
}
if (btnState == LOW) {
if (millis() - lastButtonPress > 50)
{
menu4_selected = !menu4_selected;
menu4_Value = decimal / 2;
menu_counter = 3;
}
lastButtonPress = millis();
}
delay(1);
}
///////////////////////////////////////////////////////////////////////////
}
////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////MENU DISPLAY///////////////////////////
void menu()
{
int btnState = digitalRead(PushButton);
switch (menu_counter)
{
case -1:
menu_counter = 4;
break;
case 0:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("> Cycle no.: ");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(menu1_Value, 0);
delay(600);
lcd.clear();
if (btnState == LOW) {
if (millis() - lastButtonPress > 50)
{
menu1_selected = true;
}
lastButtonPress = millis();
}
delay(1);
break;
case 1:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("> Collapse: ");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(menu2_Value, 1);
lcd.print("mm");
delay(600);
lcd.clear();
if (btnState == LOW) {
if (millis() - lastButtonPress > 50)
{
menu2_selected = true;
}
lastButtonPress = millis();
}
delay(1);
break;
case 2:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("> Time-on:");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(menu3_Value, 1);
lcd.print("s");
delay(600);
lcd.clear();
if (btnState == LOW) {
if (millis() - lastButtonPress > 50)
{
menu3_selected = true;
}
lastButtonPress = millis();
}
delay(1);
break;
case 3:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("> Time-off:");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(menu4_Value, 1);
lcd.print("s");
delay(600);
lcd.clear();
if (btnState == LOW) {
if (millis() - lastButtonPress > 50)
{
menu4_selected = true;
}
lastButtonPress = millis();
}
delay(1);
break;
case 4:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("> Start test?");
lcd.setCursor(0, 1);
lcd.print(" Yes?");
delay(600);
if (btnState == LOW) {
if (millis() - lastButtonPress > 50)
{
calculation();
}
// Remember last button press event
lastButtonPress = millis();
}
delay(1);
break;
case 5:
menu_counter = 0;
break;
}
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////STEP TIME CALCULATION///////////////////////////
void calculation()
{
if (menu1_Value != 0 && menu2_Value != 0 && menu3_Value != 0 && menu4_Value != 0)
{
double total_time = menu3_Value + menu4_Value;
S_time = (total_time * menu1_Value) / (0.0178 * menu2_Value * 2.5 * 0.5);
stepNUM = menu2_Value * 44.5;
delay(200);
motor();
}
else {
lcd.clear();
lcd.print("Missing Some");
lcd.setCursor(0, 1);
lcd.print("Variables!");
delay(2500);
menu();
}
}
///////////////////////////////////////////////////////////////////////////
//////////////////////////////MOTOR STEPPING///////////////////////////////
void motor()
{
for (float count = 0; count <= (stepNUM + 1); count++)
{
lcd.clear();
lcd.print("Test Running");
lcd.setCursor(0, 1);
int complete = 100 * (count / stepNUM);
lcd.print("Progress: ");
lcd.print(complete);
lcd.print(" % ");
delay(500);
myStepper.step(4);
delay(S_time);
lcd.clear();
if (complete >= 100.00)
{
S_time = 0;
menu1_Value = 0;
menu2_Value = 0;
menu3_Value = 0;
menu4_Value = 0;
Reset = true;
delay(100);
reset();
}
}
}
///////////////////////////////////////////////////////////////////////////
void reset()
{
int btnState = digitalRead(PushButton);
if (btnState == LOW) {
if (millis() - lastButtonPress > 50)
{
Serial.println("Resetting");
}
lastButtonPress = millis();
delay(1);
}
else {
lcd.clear();
lcd.print("Test Complete");
lcd.setCursor(0, 1);
lcd.print("Press to reset");
delay(500);
}
// Remember last button press event
}
////////////////////////////////RESET TEST/////////////////////////////////