const int ponPinZ = A2;
const int dirPinZ = 2;
const int overPinZ = 13;
const int upPinZ = 0;
const int downPinZ = 1;
const int stepPinZ = 12;
const int ponPinX = A0;
const int dirPinX = 3;
const int overPinXY = 4;
const int rightPinX = 5;
const int leftPinX = 6;
const int stepPinX = 7;
const int ponPinY = A1;
const int dirPinY = 11;
const int pushPinY = 8;
const int pullPinY = 9;
const int stepPinY = 10;
int ledStateX = LOW;
int ponValueX = 0;
int ledStateY = LOW;
int ponValueY = 0;
int ledStateZ = LOW;
int ponValueZ = 0;
unsigned long stepTimerX = 0;
unsigned long stepTimerOldX = 0;
unsigned long stepTimerY = 0;
unsigned long stepTimerOldY = 0;
unsigned long stepTimerZ = 0;
unsigned long stepTimerOldZ = 0;
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
int lcdSpeedX = 0;
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(3, 0);
lcd.print("manual control");
lcd.setCursor(0, 3);
lcd.print("x speed:");
pinMode(stepPinZ, OUTPUT);
pinMode(dirPinZ, OUTPUT);
pinMode(ponPinZ, INPUT);
pinMode(upPinZ, INPUT_PULLUP);
pinMode(downPinZ, INPUT_PULLUP);
pinMode(overPinZ, INPUT_PULLUP);
pinMode(stepPinX, OUTPUT);
pinMode(dirPinX, OUTPUT);
pinMode(ponPinX, INPUT);
pinMode(leftPinX, INPUT_PULLUP);
pinMode(rightPinX, INPUT_PULLUP);
pinMode(overPinXY, INPUT_PULLUP);
pinMode(stepPinY, OUTPUT);
pinMode(dirPinY, OUTPUT);
pinMode(ponPinY, INPUT);
pinMode(pushPinY, INPUT_PULLUP);
pinMode(pullPinY, INPUT_PULLUP);
}
void pulseGenZ(int paramZ) {
stepTimerZ = millis();
if (stepTimerZ - stepTimerOldZ > paramZ) { // таймер пульсации от крутилки
stepTimerOldZ = stepTimerZ;
if (ledStateZ == LOW)
ledStateZ = HIGH;
else
ledStateZ = LOW;
digitalWrite(stepPinZ, ledStateZ);
}
}
void pulseGenX(int paramX) {
stepTimerX = millis();
if (stepTimerX - stepTimerOldX > paramX) { // таймер пульсации от крутилки
stepTimerOldX = stepTimerX;
if (ledStateX == LOW)
ledStateX = HIGH;
else
ledStateX = LOW;
digitalWrite(stepPinX, ledStateX);
}
}
void pulseGenY(int paramY) {
stepTimerY = millis();
if (stepTimerY - stepTimerOldY > paramY) { // таймер пульсации от крутилки
stepTimerOldY = stepTimerY;
if (ledStateY == LOW)
ledStateY = HIGH;
else
ledStateY = LOW;
digitalWrite(stepPinY, ledStateY);
}
}
void loop() {
ponValueX = map(analogRead(ponPinX), 0, 1023, 100, 500);
ponValueY = map(analogRead(ponPinY), 0, 1023, 100, 500);
ponValueZ = map(analogRead(ponPinZ), 0, 1023, 100, 500);
if (digitalRead(overPinXY) == HIGH) { // проверка овердрайва для спидометра
lcdSpeedX = map(analogRead(ponPinX), 0, 1023, 0, 100); // считывание скорости X для экрана
if (lcdSpeedX < 100) { // затирание 2-3х значных цифр
lcd.setCursor(11, 3);
lcd.print(" ");
}
if (lcdSpeedX < 10) {
lcd.setCursor(10, 3);
lcd.print(" ");
}
lcd.setCursor(9, 3);
lcd.print(lcdSpeedX);
} else {
lcd.setCursor(9, 3);
lcd.print("OVERDRIVE!");
lcd.setCursor(9, 3);
lcd.print(" ");
}
if (digitalRead(overPinXY) == HIGH) { // цикл регулируемой подачи XY
if (digitalRead(leftPinX) == LOW) {
digitalWrite(dirPinX, HIGH);
pulseGenX(ponValueX);
lcd.setCursor(15, 3);
lcd.print(" <");
lcd.setCursor(15, 3);
lcd.print(" < ");
lcd.setCursor(15, 3);
lcd.print("< ");
lcd.setCursor(15, 3);
lcd.print(" ");
} else if (digitalRead(rightPinX) == LOW) {
digitalWrite(dirPinX, LOW);
pulseGenX(ponValueX);
} else if (digitalRead(pullPinY) == LOW) {
digitalWrite(dirPinY, LOW);
pulseGenY(ponValueY);
} else if (digitalRead(pushPinY) == LOW) {
digitalWrite(dirPinY, HIGH);
pulseGenY(ponValueY);
}
else {
digitalWrite(dirPinY, LOW);
digitalWrite(stepPinY, LOW);
digitalWrite(dirPinX, LOW);
digitalWrite(stepPinX, LOW); // чтобы точно потух
}
} else {
if (digitalRead(leftPinX) == LOW) { // цикл ускоренной подачи XY
digitalWrite(dirPinX, HIGH);
pulseGenX(100);
} else if (digitalRead(rightPinX) == LOW) {
digitalWrite(dirPinX, LOW);
pulseGenX(100);
} else if (digitalRead(pullPinY) == LOW) {
digitalWrite(dirPinY, LOW);
pulseGenY(100);
} else if (digitalRead(pushPinY) == LOW) {
digitalWrite(dirPinY, HIGH);
pulseGenY(100);
} else {
digitalWrite(dirPinY, LOW);
digitalWrite(stepPinY, LOW);
digitalWrite(dirPinX, LOW);
digitalWrite(stepPinX, LOW); // чтобы точно потух
}
}
if (digitalRead(overPinZ) == HIGH) { // цикл регулируемой подачи Z
if (digitalRead(upPinZ) == LOW) {
digitalWrite(dirPinZ, HIGH);
pulseGenZ(ponValueZ);
} else if (digitalRead(downPinZ) == LOW) {
digitalWrite(dirPinZ, LOW);
pulseGenZ(ponValueZ);
}
else {
digitalWrite(dirPinZ, LOW);
digitalWrite(stepPinZ, LOW); // чтобы точно потух
}
} else {
if (digitalRead(upPinZ) == LOW) { // цикл ускоренной подачи Z
digitalWrite(dirPinZ, HIGH);
pulseGenZ(100);
} else if (digitalRead(downPinZ) == LOW) {
digitalWrite(dirPinZ, LOW);
pulseGenZ(100);
} else {
digitalWrite(dirPinZ, LOW);
digitalWrite(stepPinZ, LOW); // чтобы точно потух
}
}
}