Hello everyone
I am currently working on a project for a timelapse slider which is at the moment, being driven by an Uno, Linksprite Motor Shield and a geared DC motor. This will eventually go over to a NEMA 17 stepper motor but hey, it works at the moment! ![]()
I am having trouble getting my head around 1st, merging an LCD code with a motor control code, then furthermore, getting the "presets" written in the LCD menu system. I have 3 codes written for differing speeds etc for the motor, but cannot work out how to write it all together!
I do have an Adafruit I2C 16x2 LCD on the way, so wanted to get the codes sorted so that when that arrives tomorrow, I can upload and test it all out. The following two codes are ones that both work individually on the current LCD and Motor respectively. I know i will be changing them slightly (pins etc) when the new LCD arrives.
I have read numerous tutorials, guides and information on this but cannot find anything that helps! So over to you fine and extremely knowledgable members! ![]()
#include <LiquidCrystal.h>
// Initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
//States for the menu.
int currentMenuItem = 0;
int lastState = 0;
void setup() {
//Set the characters and column numbers.
lcd.begin(16, 2);
//Print default title.
clearPrintTitle();
}
void loop() {
//Call the main menu.
mainMenu();
}
void mainMenu() {
//State = 0 every loop cycle.
int state = 0;
//Refresh the button pressed.
int x = analogRead (0);
//Set the Row 0, Col 0 position.
lcd.setCursor(0,0);
//Check analog values from LCD Keypad Shield
if (x < 100) {
//Right
} else if (x < 200) {
//Up
state = 1;
} else if (x < 400){
//Down
state = 2;
} else if (x < 600){
//Left
} else if (x < 800){
//Select
state = 3;
}
//If we are out of bounds on th menu then reset it.
if (currentMenuItem < 0 || currentMenuItem > 4) {
currentMenuItem = 0;
}
//If we have changed Index, saves re-draws.
if (state != lastState) {
if (state == 1) {
//If Up
currentMenuItem = currentMenuItem - 1;
displayMenu(currentMenuItem);
} else if (state == 2) {
//If Down
currentMenuItem = currentMenuItem + 1;
displayMenu(currentMenuItem);
} else if (state == 3) {
//If Selected
selectMenu(currentMenuItem);
}
//Save the last State to compare.
lastState = state;
}
//Small delay
delay(5);
}
//Display Menu Option based on Index.
void displayMenu(int x) {
switch (x) {
case 1:
clearPrintTitle();
lcd.print ("-> PRESET 1");
break;
case 2:
clearPrintTitle();
lcd.print ("-> PRESET 2");
break;
case 3:
clearPrintTitle();
lcd.print ("-> PRESET 3");
break;
case 4:
clearPrintTitle();
lcd.print ("-> PRESET 4");
break;
}
}
//Print a basic header on Row 1.
void clearPrintTitle() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ISO100-TIMELAPSE");
lcd.setCursor(0,1);
}
//Show the selection on Screen.
void selectMenu(int x) {
switch (x) {
case 1:
clearPrintTitle();
lcd.print ("CHOSEN PRESET 1");
//Call the function that belongs to Option 1
break;
case 2:
clearPrintTitle();
lcd.print ("CHOSED PRESET 2");
//Call the function that belongs to Option 2
break;
case 3:
clearPrintTitle();
lcd.print ("CHOSEN PRESET 3");
//Call the function that belongs to Option 3
break;
case 4:
clearPrintTitle();
lcd.print ("CHOSEN PRESET 4");
//Call the function that belongs to Option 4
break;
}
}
and one of the motor codes
//. Motor shield
//
//
int pinI1=8;//define I1 interface
int pinI2=11;//define I2 interface
int speedpinA=9;//enable motor A
int pinI3=12;//define I3 interface
int pinI4=13;//define I4 interface
int speedpinB=10;//enable motor B
int spead =100;//define the spead of motor
void setup()
{
pinMode(pinI1,OUTPUT);
pinMode(pinI2,OUTPUT);
pinMode(speedpinA,OUTPUT);
pinMode(pinI3,OUTPUT);
pinMode(pinI4,OUTPUT);
pinMode(speedpinB,OUTPUT);
}
void forward()
{
analogWrite(speedpinA,spead);//input a simulation value to set the speed
analogWrite(speedpinB,spead);
digitalWrite(pinI4,HIGH);//turn DC Motor B move clockwise
digitalWrite(pinI3,LOW);
digitalWrite(pinI2,LOW);//turn DC Motor A move clockwise
digitalWrite(pinI1,HIGH);
}
void stop()//
{
digitalWrite(speedpinA,LOW);// Unenble the pin, to stop the motor. this should be done to avid damaging the motor.
digitalWrite(speedpinB,LOW);
delay(5000); // pause time of camera moving in milliseconds
}
void loop()
{
forward();
delay(1500); // time motor spins for in milliseconds
stop();
}
Thank you all in advance
Jay