#include <LiquidCrystal.h>
#include <Servo.h>
//-----------------------------lcd ----------------------------------
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//------------------------- stepper ----------------------------------
#define stepPin 7
#define dirPin 8
//------------------------- servo ----------------------------------
Servo snippers;
#define servo 1
#define openAngle 180
#define closedAngle 0
//--------------------------- input ----------------------------------
#define leftButton 13
#define rightButton 9
#define upButton 10
#define downButton 6
//-------------------- user settings ----------------------------------
unsigned int wireLength = 0;
unsigned int wireQuantity = 0;
//------------------ system settings ----------------------------------
int state = 0;
int incrementSpeed = 1;
int previousWireLength = 0;
int previousWireQuantity = 0;
float mmPerStep = 0.18096;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2); //LCD columns and rows
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(leftButton, INPUT_PULLUP);
pinMode(rightButton, INPUT_PULLUP);
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
snippers.attach(servo);
snippers.write(openAngle);
delay(1000);
}
void loop() {
if (!digitalRead(rightButton)){
if(state == 5){state = 0;}
else{state += 1;}
delay(200);
lcd.clear();}
if (!digitalRead(leftButton) && state > 0 && state < 4){
state -=1;
delay(200);
lcd.clear();}
switch (state){
case 0:
homeScreen();
break;
case 1:
chooseWireLength();
break;
case 2:
chooseWireQuantity();
break;
case 3:
confirm();
break;
case 4:
currentlyCutting();
break;
case 5:
finishedCutting();
break; }
}
void homeScreen(){
lcd.setCursor(0, 0);
lcd.print("WIRE CUTTER");
lcd.setCursor(8, 1);
lcd.print("NEXT>>");
delay(100);}
void chooseWireLength(){
wireLength = changeValue(wireLength);
if(previousWireLength != wireLength){
lcd.clear();
previousWireLength = wireLength;}
//Display information on LCD
lcd.setCursor(0, 0);
lcd.print("LENGTH: " + (String)wireLength + "mm");
displayNavigation(); }
void chooseWireQuantity(){
wireQuantity = changeValue(wireQuantity);
if(previousWireQuantity != wireQuantity){
lcd.clear();
previousWireQuantity = wireQuantity;}
//Display information on LCD
lcd.setCursor(0, 0);
lcd.print("QUANTITY: " + (String)wireQuantity+ "pcs") ;
displayNavigation(); }
void confirm(){
lcd.setCursor(0, 0);
lcd.print((String)wireLength +" mm / " + (String)wireQuantity + " pcs");
lcd.setCursor(0, 1);
lcd.print("<<BACK");
lcd.setCursor(8, 1);
lcd.print("START>>");
delay(100);}
void currentlyCutting(){
lcd.setCursor(0, 0);
lcd.print((String)0 + " / " + (String)wireQuantity);
lcd.setCursor(0, 1);
lcd.print("???s");
int stepsToTake = (int)wireLength/mmPerStep;
for(int i = 0; i < wireQuantity; i++){
unsigned long timeForOneCycle = millis();
digitalWrite(dirPin,HIGH);
for(int x = 0; x < stepsToTake; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(500);
digitalWrite(stepPin,LOW);
delayMicroseconds(500);}
lcd.setCursor(0, 0);
lcd.print((String)(i+1) + " / " + (String)wireQuantity+"pcs");
snippers.write(closedAngle);
delay(600);
snippers.write(openAngle);
delay(600);
lcd.setCursor(0, 1);
unsigned long timeRemaining = ((millis() - timeForOneCycle)*(wireQuantity - (i+1)))/1000;
lcd.print((String)timeRemaining + " s");}
wireLength = 0; wireQuantity = 0; state = 5; }
void finishedCutting(){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CUTTING COMPLETE");
lcd.setCursor(8, 1);
lcd.print("NEXT>>");
delay(100);}
int changeValue(int currentValue){
if (!digitalRead(upButton)) {
delay(100);
currentValue += incrementSpeed;}
if (!digitalRead(downButton)) {
if(currentValue - incrementSpeed >= 0){
delay(100);
currentValue -= incrementSpeed;}
else{currentValue = 0;}
}
if (!digitalRead(downButton) && !digitalRead(upButton)){
incrementSpeed = 1;}
return currentValue;}
void displayNavigation(){
lcd.setCursor(0, 1);
lcd.print("<<BACK");
lcd.setCursor(8, 1);
lcd.print("NEXT>>");
delay(100);}
'아두이노' 카테고리의 다른 글
L298N 스텝모터 드라이버 (0) | 2019.05.23 |
---|---|
커팅기 내용 (0) | 2019.05.16 |
에레베이터 (0) | 2018.11.04 |
캐스케이드 방법을 이용한 시퀸스 제어회로 설계 (0) | 2018.10.01 |
양솔밸브 실린더 시퀸스 제어 (0) | 2018.09.28 |