Here is the current code running on the Arduino.
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <Keypad.h>
#include <Keypad_I2C.h>
int i2caddress = 0x20;
int TILT1_1_DIR_PIN = 22;
int TILT1_1_STEP_PIN = 23;
int TILT1_2_DIR_PIN = 24;
int TILT1_2_STEP_PIN = 25;
int TILT1_3_DIR_PIN = 26;
int TILT1_3_STEP_PIN = 27;
int TILT1_4_DIR_PIN = 28;
int TILT1_4_STEP_PIN = 29;
int TILT_LIMIT_1 = 50;
int Calibrate = 0;
int TILT_1_STEPS;
int value_tilt = 55;
int value_height = 0;
int num;
int GOTO_TILT = Calibrate;
int target_pos;
int i = 16;
int j = 9;
char menu;
char setting_1[20];
char setting_2[20];
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Four columns
// Define the Keymap
char keys[ROWS][COLS] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Keypad pins connected to the I2C-Expander pins P0-P6
byte rowPins[ROWS] = {0, 1, 2, 3}; // connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6, 7}; // connect to the column pinouts of the keypad
// Create the Keypad
Keypad_I2C Keypad_I2C( makeKeymap(keys), rowPins, colPins, ROWS, COLS, i2caddress);
void setup() {
Serial.begin(9600);
pinMode(TILT1_1_DIR_PIN, OUTPUT);
pinMode(TILT1_1_STEP_PIN, OUTPUT);
pinMode(TILT1_2_DIR_PIN, OUTPUT);
pinMode(TILT1_2_STEP_PIN, OUTPUT);
pinMode(TILT1_3_DIR_PIN, OUTPUT);
pinMode(TILT1_3_STEP_PIN, OUTPUT);
pinMode(TILT1_4_DIR_PIN, OUTPUT);
pinMode(TILT1_4_STEP_PIN, OUTPUT);
pinMode(TILT_LIMIT_1, INPUT);
Keypad_I2C.begin();
lcd.begin (20, 4);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Enter Calibration");
lcd.setCursor(0,3);
lcd.print("Press # to continue");
lcd.setCursor(0,1);
lcd.print("Number: ");
int num = 0;
char key = Keypad_I2C.getKey();
while (key != '#')
{
switch (key)
{
case NO_KEY:
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
lcd.setCursor (j, 1);
lcd.print(key);
j++;
num = num * 10 + (key - '0');
break;
case '*':
num = 0;
j = 9;
lcd.clear();
break;
}
key = Keypad_I2C.getKey();
}
j = 9;
Calibrate = num;
lcd.clear();
lcd.setCursor(0,1);
lcd.print(" Calibrating... ");
while (digitalRead(TILT_LIMIT_1)) { // Do this until the switch is activated
digitalWrite(TILT1_1_DIR_PIN, LOW); // (HIGH = anti-clockwise / LOW = clockwise)
digitalWrite(TILT1_2_DIR_PIN, HIGH);
digitalWrite(TILT1_3_DIR_PIN, LOW);
digitalWrite(TILT1_4_DIR_PIN, HIGH);
digitalWrite(TILT1_1_STEP_PIN, HIGH);
digitalWrite(TILT1_2_STEP_PIN, HIGH);
digitalWrite(TILT1_3_STEP_PIN, HIGH);
digitalWrite(TILT1_4_STEP_PIN, HIGH);
delayMicroseconds(600); // Delay to slow down speed of Stepper
digitalWrite(TILT1_1_STEP_PIN, LOW);
digitalWrite(TILT1_2_STEP_PIN, LOW);
digitalWrite(TILT1_3_STEP_PIN, LOW);
digitalWrite(TILT1_4_STEP_PIN, LOW);
delayMicroseconds(600);
}
while (!digitalRead(TILT_LIMIT_1)) { // Do this until the switch is not activated
digitalWrite(TILT1_1_DIR_PIN, HIGH);
digitalWrite(TILT1_2_DIR_PIN, LOW);
digitalWrite(TILT1_3_DIR_PIN, HIGH);
digitalWrite(TILT1_4_DIR_PIN, LOW);
digitalWrite(TILT1_1_STEP_PIN, HIGH);
digitalWrite(TILT1_2_STEP_PIN, HIGH);
digitalWrite(TILT1_3_STEP_PIN, HIGH);
digitalWrite(TILT1_4_STEP_PIN, HIGH);
delayMicroseconds(1000); // More delay to slow even more while moving away from switch
digitalWrite(TILT1_1_STEP_PIN, LOW);
digitalWrite(TILT1_2_STEP_PIN, LOW);
digitalWrite(TILT1_3_STEP_PIN, LOW);
digitalWrite(TILT1_4_STEP_PIN, LOW);
delayMicroseconds(1000);
}
TILT_1_STEPS = Calibrate;// Reset position variable to position
value_tilt = Calibrate;
if (TILT_1_STEPS == Calibrate) {
lcd.clear();
lcd.setCursor (0, 1);
lcd.print (" Calibration ");
lcd.setCursor (0, 2);
lcd.print(" Complete ");
delay(2000);
lcd.clear();
}
lcd.setCursor ( 0, 0 ); // go to the top left corner
lcd.print("To set Tilt,"); // write this string on the top row
lcd.setCursor ( 0, 1 ); // go to the 2nd row
lcd.print("press 'A'"); // pad string with spaces for centering
}
void loop() {
Serial.print("Void loop entered \n");
tooFar();
pickOne();
}
void tooFar() {
Serial.print("tooFar loop entered \n");
if (value_tilt <= Calibrate) {
while ( TILT_1_STEPS >= 0 && TILT_1_STEPS <= Calibrate && TILT_1_STEPS < value_tilt)
{
digitalWrite(TILT1_1_DIR_PIN, HIGH);
digitalWrite(TILT1_2_DIR_PIN, HIGH);
digitalWrite(TILT1_3_DIR_PIN, HIGH);
digitalWrite(TILT1_4_DIR_PIN, HIGH);
if (TILT_1_STEPS < value_tilt)
{
digitalWrite(TILT1_1_STEP_PIN, HIGH);
digitalWrite(TILT1_2_STEP_PIN, HIGH);
digitalWrite(TILT1_3_STEP_PIN, HIGH);
digitalWrite(TILT1_4_STEP_PIN, HIGH);
delayMicroseconds(1000);
digitalWrite(TILT1_1_STEP_PIN, LOW);
digitalWrite(TILT1_2_STEP_PIN, LOW);
digitalWrite(TILT1_3_STEP_PIN, LOW);
digitalWrite(TILT1_4_STEP_PIN, LOW);
delayMicroseconds(1000);
TILT_1_STEPS++;
}
else;
}
while (TILT_1_STEPS >= 0 && TILT_1_STEPS <= Calibrate && TILT_1_STEPS > value_tilt)
{
digitalWrite(TILT1_1_DIR_PIN, LOW);
digitalWrite(TILT1_2_DIR_PIN, LOW);
digitalWrite(TILT1_3_DIR_PIN, LOW);
digitalWrite(TILT1_4_DIR_PIN, LOW);
if (TILT_1_STEPS > value_tilt)
{
digitalWrite(TILT1_1_DIR_PIN, LOW);
digitalWrite(TILT1_2_DIR_PIN, LOW);
digitalWrite(TILT1_3_DIR_PIN, LOW);
digitalWrite(TILT1_4_DIR_PIN, LOW);
digitalWrite(TILT1_1_STEP_PIN, HIGH);
digitalWrite(TILT1_2_STEP_PIN, HIGH);
digitalWrite(TILT1_3_STEP_PIN, HIGH);
digitalWrite(TILT1_4_STEP_PIN, HIGH);
delayMicroseconds(1000);
digitalWrite(TILT1_1_STEP_PIN, LOW);
digitalWrite(TILT1_2_STEP_PIN, LOW);
digitalWrite(TILT1_3_STEP_PIN, LOW);
digitalWrite(TILT1_4_STEP_PIN, LOW);
delayMicroseconds(1000);
TILT_1_STEPS--;
}
else;
}
}}
int GetNumber ()
{
Serial.print("GetNumber loop entered \n");
int num = 0;
char key = Keypad_I2C.getKey();
while (key != '#')
{
switch (key)
{
case NO_KEY:
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
lcd.setCursor (i, 0);
lcd.print(key);
i++;
num = num * 10 + (key - '0');
break;
case '*':
num = 0;
i = 16;
lcd.clear();
break;
}
key = Keypad_I2C.getKey();
}
i = 16;
value_tilt = num;
return num;
}
void pickOne() {
Serial.print("pickOne entered \n");
char whatdo = Keypad_I2C.getKey();
while (whatdo != '*')
{
switch (whatdo)
{
case NO_KEY:
break;
case 'A':
lcd.clear();
lcd.setCursor (0, 2);
lcd.print("Press # to confirm");
lcd.setCursor (0, 0);
lcd.print ("Set tilt to:");
GetNumber();
tooFar();
lcd.clear();
lcd.setCursor (0, 0);
sprintf(setting_1, "Tilt set to: %i", value_tilt);
lcd.print(setting_1);
lcd.setCursor (0, 1);
lcd.print("To set:");
lcd.setCursor(0, 2);
lcd.print("Tilt press 'A'");
break;
case 'C':
value_tilt = 0;
value_height = 0;
break;
case 'D':
lcd.clear();
lcd.setCursor (0, 0);
sprintf(setting_1, "Tilt set to: %i", value_tilt);
lcd.print(setting_1);
lcd.setCursor (0, 1);
break;
case '*':
value_tilt = 0;
value_height = 0;
break;
}
whatdo = Keypad_I2C.getKey();
}
}
I will try and get an up to date wiring diagram done.
Hammy - Right now the keypad is connected directly to the I2C expander. How would I go about adding in the pull up/pull down resistors and do I need to change the code for this? How would I add a check into my code for the proposed 50mS?
Thanks All!