#include "LiquidCrystal_I2C_Menu_Btns.h"
#include <Wire.h>
#include <SD.h>
//#include <EEPROM.h>
#include "AccelStepper.h"
#include "MultiStepper.h"
//#include <Servo.h>
//#include "ServoSmooth.h"
//#include "smoothUtil.h"
#include "VarSpeedServo.h"
// Define pin connections
const int dirPinZ = 2; // blue
const int dirPinX = 4;
const int dirPinY = 6;
const int stepPinZ = 3; //yellow
const int stepPinX = 5;
const int stepPinY = 7;
// Define motor interface type
#define motorInterfaceType 1
MultiStepper steppers;
// Creates an instance
AccelStepper myStepperZ (motorInterfaceType, stepPinZ, dirPinZ);// orange arrow
AccelStepper myStepperX(motorInterfaceType, stepPinX, dirPinX); // red aroow
AccelStepper myStepperY(motorInterfaceType, stepPinY, dirPinY); //blue arrow
VarSpeedServo gripHand;
LiquidCrystal_I2C_Menu_Btns lcd(0x27, 20, 4);
// Пины, к которым подключены кнопки
#define pinUp 2
#define pinDown 3
#define pinEnter 4
#define pinBack 5 // Back - необязательная кнопка
uint8_t selectedMenuItem;
int brightness = 50;
int _delay = 10;
byte numberTileX =0; //номер плитки по осі Х, відлік з нуля
byte numberTileY =0; //номер плитки по осі У, відлік з нуля
int saveNumberDice =0; //останній поставлений кубик
int diceSize =7 ; //розмір сторін кубика
// Обработчики пунктов меню SetBrightness и SetDelay
// Используются для ввода значений brightness и _delay
void TileSelection()
{return ;
lcd.clear();
lcd.printAt(0,0,"Tile selection");
lcd.printAt(1,1,"X=");
lcd.printAt(7,1,"Y=");
lcd.printAt(9,1,numberTileY);
//lcd.printfAt(0, 0, "Tile selection");
numberTileX = lcd.inputValAt<byte>(3,1, 0, 100, numberTileX, 1);
numberTileY = lcd.inputValAt<byte>(9,1, 0, 100, numberTileY, 1);
}
void StartTheProgram()
{
lcd.clear();
Serial.println("start program");
lcd.printAt(1,0,"Program is running ");
lcd.printAt(0,1,"Tile X= ");
lcd.printAt(7,1,numberTileX);
lcd.printAt(9,1,"Tile Y= ");
lcd.printAt(16,1,numberTileY);
delay(2000);
//кінець програми
lcd.clear();
lcd.printAt(4,1,"END PROGRAM");
lcd.printAt(2,3,"press OK or BACK");
while(lcd.getButtonsState()!=eBack)
{
}
}
void StartWithTheNumberOfTheCube()
{
//brightness = lcd.inputVal<uint8_t>("Input brightness(%)", 0, 100, brightness, 5);
}
void SetTheCubeSize()
{
lcd.clear();
lcd.printAt(0,0,"Set The Cube Size ");
lcd.printAt(1,1,"Cube Size mm");
lcd.printAt(11,1,diceSize);
//lcd.printfAt(0, 0, "Tile selection");
diceSize = lcd.inputValAt<byte>(11,1, 5, 20, diceSize, 1);
//numberTileY = lcd.inputValAt<byte>(9,1, 0, 100, numberTileY, 1);
}
void SetBrightness() {
brightness = lcd.inputVal("Input brightness(%)", 0, 100, brightness, 5);
//Serial.println(selectedMenuItem);
}
void SetDelay() {
Serial.println(selectedMenuItem);
_delay = lcd.inputVal("Input delay(ms)", 0, 20, _delay);
}
// Объявим перечисление, используемое в качестве ключа пунктов меню
enum {mkBack, mkRoot, mkTileSelection, mkStartTheProgram, mkStartWithTheNumberOfTheCube, mkSetTheCubeSize, mkSetDelay};
// Описание меню
// структура пункта меню: {ParentKey, Key, Caption, [Handler]}
sMenuItem menu[] = {
{mkBack, mkRoot, "Main menu"},
{mkRoot, mkTileSelection, "Tile Selection",TileSelection},
{mkRoot, mkStartTheProgram, "Start The Program", StartTheProgram},
{mkRoot, mkStartWithTheNumberOfTheCube, "Start with the number of the cube", StartWithTheNumberOfTheCube},
{mkRoot, mkSetTheCubeSize, "Set the cube size", SetTheCubeSize},
{mkRoot, mkBack, "Back", NULL}
};
uint8_t menuLen = sizeof(menu) / sizeof(sMenuItem);
void setup() {
lcd.begin();
Serial.begin(115200);
//Serial.println(menuLen);
lcd.attachButtons(pinUp, pinDown, pinEnter, pinBack);
}
void loop() {
/*uint8_t*/ selectedMenuItem = lcd.showMenu(menu, menuLen, 1); // Вызываем меню
/* Реакция на выбор пунктов меню SetBrightness и SetDelay реализована
* в функциях-обработчиках.
* При необходимости здесь может располагаться анализ значения selectedMenuItem
* для пунктов, не имеющих обработчиков:*/
//if (selectedMenuItem == mkSetDelay) { Serial.println(selectedMenuItem);}
//Serial.println();
//Serial.println(selectedMenuItem);
}
void homePosition()
{
}