int pinA = 2;
int pinB = 7;
int button = 3;
volatile int state = 0;
volatile int timeButtonDown = 0;
volatile bool isButtonDown = false;
volatile bool longPressReleased = true;
volatile bool flagButton = false;
const int timeButtonPressed = 3000;
volatile bool flagButtonLong = false;
volatile bool flagCW = false;
volatile bool flagCCW = false;
void but();
void turnAround();
void setup() {
pinMode(pinA, INPUT);
pinMode(pinB, INPUT);
pinMode(button, INPUT);
attachInterrupt(0, turnAround, CHANGE);
attachInterrupt(digitalPinToInterrupt(button), but, CHANGE);
Serial.begin(9600);
}
void loop() {
if (flagCW) {
Serial.println("turn_right"); // Шаг вращения по часовой стрелке
flagCW = false; // Действие обработано - сбрасываем флаг
}
if (flagCCW) {
Serial.println("turn_left"); // Шаг вращения против часовой стрелки
flagCCW = false; // Действие обработано - сбрасываем флаг
}
if (millis() - timeButtonDown > timeButtonPressed && isButtonDown) { // Время длительного удержания наступило
flagButtonLong = true; // long press
}
if (flagButton) {
Serial.println("Short press");
flagButton = false; // short press
}
if (flagButtonLong && isButtonDown) {
if (!digitalRead(button) && millis() - timeButtonDown > timeButtonPressed) {
Serial.println("long_press");
}
isButtonDown = false;
flagButtonLong = false;
}
}
void turnAround()
{
int pinAValue = digitalRead(pinA); // Получаем состояние пинов A и B
int pinBValue = digitalRead(pinB);
cli(); // Запрещаем обработку прерываний, чтобы не отвлекаться
if (!pinAValue && pinBValue) state = 1; // Если при спаде линии А на линии B лог. единица, то вращение в одну сторону
if (!pinAValue && !pinBValue) state = -1; // Если при спаде линии А на линии B лог. ноль, то вращение в другую сторону
if (pinAValue && state != 0) {
if ((state == 1 && !pinBValue) || (state == -1 && pinBValue)) { // Если на линии А снова единица, фиксируем шаг
if (state == 1) flagCW = true; // Флаг вращения по часовой стрелке
if (state == -1) flagCCW = true; // Флаг вращения против часовой стрелки
state = 0;
}
}
sei(); // Разрешаем обработку прерываний
}
void but() {
if (millis() - timeButtonDown < 50) {
Serial.println("Return");
return;
}
int pinButValue = digitalRead(button);
Serial.println(pinButValue);
cli();
timeButtonDown = millis();
if (!pinButValue) {
isButtonDown = true;
Serial.println("isButtonDown");
} else if (isButtonDown) {
if (!longPressReleased) {
Serial.println("long press is not released");
flagButton = true;
}
Serial.println("Resetting");
isButtonDown = false;
longPressReleased = false;
}
sei();
}