Проблема с работой прерывания и отсутствием отключения шаговика

абсолютно не лень, это же делается простым сочетанием клавиш )

Прост когда говоришь более чем на трёх языках бесконечно листать винд+пробел становится лень, да и каждый раз нужно делать разное число нажатий… в общем проще уже продолжать писать на английском

а, ну может, могу ошибаться, потому как говорю лишь на двух - русский и матерный…

вопрос я свой задал просто потому, что код очень похож на скопированный с какого-то ресурса интернетного, англоязычного.

и да, shift+alt жеж?

:grinning_face:
Увы, нет
Так что и решение посмотреть негде

Шифт альт робит, но так смена языка только в самом углу экрана, через винд пробел проще и нагляднее

Я присоединюсь к подозрению. Ибо, если код самописный, автор всегда может разобраться в его глюках. Делается это методом упрощения и отката на предыдущую работающую версию. Всегда есть одна строчка, которая меняет поведение от правильного до неправильного. И вопрос задается не целиком по коду, а “почему эта строчка влияет на работу устройства”. Ибо придуманный автором алгоритм всегда должен делать то, что хочет автор. Непослушность программы связана с незнанием аппаратной части или используемых библиотек. Но никак не своего алгоритма.

Какой, …ть, программы? Я вот не понимаю что здесь происходит(“интуитивно я, конечно, догадываюсь”(с))

1 лайк

может поможет…

#include <Wire.h>
#include <iarduino_RTC.h>
#include <Stepper.h>
#define STEPS 2048
Stepper stepper(STEPS, 4, 6, 5, 7);
iarduino_RTC watch(RTC_DS1302, 12, 10, 11);
volatile int TT = 0;
volatile int X = 0;
int STT, NT;

void setup() { watch.begin();
pinMode(2, INPUT_PULLUP);
attachInterrupt(0, JOHOHO_ITS_TIME_MASHINE, FALLING);
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);
// Настраиваем пины двигателя как выходы
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
}

void loop() {
watch.gettime();
STT = (60 * watch.hours + watch.minutes);
NT = STT; TT = 0;
// Фаза 1: Спортивный блок (0-11 минут)
waitForPhase(0, 11, STT);
rotateStepper();
signalBuzzer(1, 2000);
// Фаза 2: Научный блок (11-32 минуты)
waitForPhase(11, 32, STT);
rotateStepper();
signalBuzzer(2, 2000);
// Фаза 3: Повторение научного блока (32-38 минут)
waitForPhase(32, 38, STT);
rotateStepper();
signalBuzzer(2, 1000);
// Фаза 4: Отдых (38-69 минут)
waitForPhase(38, 69, STT);
rotateStepper();
signalBuzzer(2, 1000);
digitalWrite(9, HIGH);
delay(3000);
digitalWrite(9, LOW);
// Фаза 5: Завершение (69-79 минут)
waitForPhase(69, 79, STT);
rotateStepper();
signalBuzzer(6, 500);
}

void JOHOHO_ITS_TIME_MASHINE() {
digitalWrite(13, HIGH);
delay(300);
digitalWrite(13, LOW);
if (TT >= 0 && TT <= 10) {
X = TT; TT = 0;
} else if (TT >= 11 && TT <= 31) {
X += TT - 11; TT = 11;
} else if (TT >= 32 && TT <= 38) {
X += TT - 32; TT = 32;
} else if (TT >= 39 && TT <= 68) {
X += TT - 39; TT = 39;
} else if (TT >= 69 && TT <= 79) {
X += TT - 69; TT = 69;
} delay(2000);
}

void rotateStepper() {
stepper.setSpeed(10);
stepper.step(2048 * 4);
// Отключаем двигатель
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
void signalBuzzer(int times, int duration) {
for (int i = 0; i < times; i++) {
digitalWrite(9, HIGH);
delay(duration);
digitalWrite(9, LOW);
if (i < times - 1) delay(duration);
}
}
void waitForPhase(int startTT, int endTT, int initialTT) {
while (TT < endTT) {
watch.gettime();
NT = (60 * watch.hours + watch.minutes);
TT = (NT - initialTT - X);
delay(1000);
}
}

то есть вы не сможете усыновить взрослого мальчика 18+ если что ?)))
просто интересно куда уползти от сюда от безнадеги)))

1 лайк

Корооооооче

Представь что у тебя есть часы, по этим часам ты сверяешь время и не опаздываешь на свидание, это Нормальные часы

При этом ты не просыпаешься в одно им то же время потому твой день начинается не в одно и то же время. Это компенсирует счётчик Истинного времени (TT - Труу Тайм). Он начинает отсчёт твоих обычных дел с момента пробуждения и запуска робота.

При этом ты можешь задержаться не только в самом начале проснувшись не вовремя, но ещё и по ходу дня
Можно конечно забить и потратить на следующее событие меньше времени, но куда эффективнее иметь некий буфер времени в конце дня и расходовать на такие задержки
За это отвечает параметр Х - он дополнительно откатывает ТТ - истинное время или время в котором мы выполняем свои дела со стартов во время пробуждения, на некий промежуток, растущий с каждым откатом

Можешь представить это как если бы у тебя на руке было бы двое часов - одни ты не трогаешь, другие стартуют с полуночи в момент пробуждения и их же ты периодически откатываешь чуть назад

А счётчик NT нау тайм, нынешнее время - просто удобный способ извлечь часы и минуты из модуля часов и привести их к единому параметру с котором потом будет удобнее оперировать

Попробуйте написать программу без прерывания. Ваша задача прекрасно реализуется машиной состояний не используя аппаратные особенности микроконтроллера (прерывания). И для начала максимально просто - на циклах в небольшое количество минут (для простоты отладки) и с небольшим количеством фаз. Как только простейший алгоритм на цикл в 3 минуты, с 3 фазами и просто светодиодиком вместо шаговика заработает, начинаете пошагово усложнять. На каждый затык можно будет задать конкретный вопрос и получить конструктивный ответ. Иначе действительно тема скатится в ЧЧ, до пятницы осталось меньше 6 часов, а там такое начнется…

Ох вы как Золушка, в полночь тыкву получите…

Увы, я затем и тут чтобы понять что я не так делаю в программировании. Я что-то не так понимаю в части прерываний и в частности в возврате X и TT из прерывания в основной цикл
Поскольку судя по 13 светодиоду прерывания сами происходят, но вот значения не меняются

Да, я получу 60*0 + 0 то есть 0 минут, и часы реального времени совпадут с ТТ часами
Разве это создаст проблемы?

Нет, можно конечно перед делеями проверять нажатие кнопки, но это простой путь который не позволит продвинуться в программировании дальше. Как критический вариант норм, но всё же не идеален

А, стоп, только заметил что форум ещё и знак умножения заменил на ем…
Нужно полностью перепроверить код который сюда залился…


Он вообще кучу емок наставил…

Т.е. вы реально не видите проблемы?
@Мишутк оно вам надо?

ПЯТЬ часов прошло!

Я прокачиваю свой скилл понимания чужого кода. В моей работе это ежедневные задачи. Чем разнообразнее у меня “кормовая база”, тем легче мне дальше в своих рабочих задачах.

2 лайка