Подключение таймеров в проект
- Войдите на сайт для отправки комментариев
Чт, 22/10/2020 - 12:05
Добрый день,
Есть некоторый проект, в котором я не могу как правильно подключить таймеры. Блок схему прилагаю, возможно она не особо корректно написана, но суть должна быть ясна. И прикладываю свою код, прошу сильно палками не бить, я только учусь). Прошу проверки и помощи в правильном подключении таймеров.
Схема: /sites/default/files/u58804/pulselogic-1.jpg
#include <arduino-timer.h> auto timer = timer_create_default(); int GPIO_01 = 10; int GPIO_02 = 12; int GPIO_03 = 13; int pCounter = 0; //int setTimer = 0; void setup(){ Serial.begin(9600); pinMode(GPIO_01, INPUT); pinMode(GPIO_02, OUTPUT); pinMode(GPIO_03, OUTPUT); } void loop(){ if (GPIO_01 == 1) { pCounter++; if (GPIO_01 == 1) { return 0; } else { for (int setTimer = 300; setTimer < 0; setTimer--) { if (GPIO_01 == 0) { return 0; } else if (setTimer < 50) { return 0; } else { pCounter++; if (GPIO_01 != 0) { return 0; } else if (setTimer <= 300) { continue; } else { break; } } } GPIO_02 = 1; if (pCounter > 0) { for (int setTimer = 2000; setTimer < 0; setTimer--) { do { GPIO_03 = 1; } while (setTimer > 0); } GPIO_03 = 0; pCounter--; return 0; } else { GPIO_02 = 0; return 0; } } } else { return 0; } }
а можете пояснить, что происходит в строчке 20? а также 23, 28, 35 и тд
Там, проходит проверка равно ли значение 1 или 0. Если 1, то счетчик прибавляет 1. В данном случае, GPIO1 принимает сигнал от внешнего устройства. Надеюсь, понятно. А GPIO2 и GPIO3 это светодиоды. Схема, есть чуть выше.
Там, проходит проверка равно ли значение 1 или 0. В данном случае, GPIO1 принимает сигнал от внешнего устройства. Надеюсь, понятно.
ну если не доходит, то придется как маленькому обьяснять.
GPIO_01, согласно коду - переменная типа int. В строке 5 вы присваиваете ей значение 10 и больше не меняете, поэтому в строчках 20, 23... и так далее она никак не может быть ни 0, ни 1
Так понятнее?
Да. А стоп, моя ошибка в коде, я пины присваивал каждому GPI0.
исправляйте и выкладывайте новый код
Для чего это вот всё?
Это проект, для проверки идет ли сигнал от внешнего устройства, посылает ли он пульсы, а светодиоды как индикаторы. Как-то так.
skarakashev - не вижу. где вы что-то исправили?
Бредовые строчки 20, 23 и тд - остались на месте
Видимо, я не понимаю, о чем идет речь, сейчас попробую вникнуть. Прошу прощения, за тупость(
Видимо, я не понимаю, о чем идет, речь, сейчас попробую вникнуть. Прошу прощения, за тупость(
еще раз, у вас GPIO_01 - это НОМЕР ПИНА, а не его состояние. Состояние пина вы в своем коде нигде не читаете, поэтому никакой "сигнал от внешнего устройства" принять не можете
Вам оператор digitalRead() знаком?
Видимо, я не понимаю, о чем идет речь, сейчас попробую вникнуть. Прошу прощения, за тупость(
есть немного, вы выбрали пин, далее надо прочитать, какой уровень сигнала на нем
if (digitalRead(здесь номер пина) == 1) ...
еще раз, у вас GPIO_01 - это НОМЕР ПИНА, а не его состояние. Состояние пина вы в своем коде нигде не читаете, поэтому никакой "сигнал от внешнего устройства" принять не можете
Вам оператор digitalRead() знаком?
Теперь, да. Спасибо
есть немного, вы выбрали пин, далее надо прочитать, какой уровень сигнала на нем
if (digitalRead(здесь номер пина) == 1) ...
Спасибо
опять криво... ну хотя бы так. Работает?
Вернемся к исходному вопросу - проблема не пропала?
опять криво... ну хотя бы так. Работает?
Вернемся к исходному вопросу - проблема не пропала?
1) А как не криво? я хочу сделать, чтобы было понятно и верно, всё таки еще учусь.
2) Нет не пропала, проблема в том, что нужно подключить таймеры, которые будут отсчитывать время (300ms и тд) в цикле, и я так и не понял как это правильно сделать, так как я писал чисто на с++, а потом решил переносить это всё на ардуино и вычитал, что в ардуино есть библеотки которые упрощают работу с таймерами.
я б тебе, канеш, свою биб-ку присоветовал, да боюсь ниасилишь.
https://github.com/DetSimen/Arduino_TimerList
1) А как не криво? я хочу сделать, чтобы было понятно и верно, всё таки еще учусь.
раз у вас в начале кода определены переменные GPIO_01 GPIO_02 и тд для пинов - зачем вы в операторы digitalRead() используете номера? - используйте переменные. иначе зачем вы их завели
ардуино вообще-то именно на C++ и программируется. Если вы уже написали код на С++ без библиотек - лучше доделывайте его, библиотеки таймеров в большинстве случаев - это костыли для неучей. не умеющих работать с временем МК напрямую...
я б тебе, канеш, свою биб-ку присоветовал, да боюсь ниасилишь.
https://github.com/DetSimen/Arduino_TimerList
Спасибо, попробую изучить.
раз у вас в начале кода определены переменные GPIO_01 GPIO_02 и тд для пинов - зачем вы в операторы digitalRead() используете номера? - используйте переменные. иначе зачем вы их завели
ардуиновообще-то именно на C++ и программируется. Если вы уже написали код на С++ без библиотек - лучше доделывайте его, библиотеки таймеров в большинстве случаев - это костыли для неучей. не умеющих работать с временем МК напрямую...
Спасибо, а вот если посмотреть мой текущий код, таймеры верно работают?
я б тебе, канеш, свою биб-ку присоветовал, да боюсь ниасилишь.
https://github.com/DetSimen/Arduino_TimerList
если человек писал на С++ и не осилит, то что говорить о начинающих )))
у тебя уже есть один таймер встроенный, даже два millis() в частности можно им в прерывании воспользоваться
моя ошибка в коде
Боюсь, что не в коде :-(
Боюсь, что не в коде :-(
Поясните, пожалуйста.
у тебя уже есть один таймер встроенный, даже два millis() в частности можно им в прерывании воспользоваться
Спасибо, буду пытаться.
Спасибо, а вот если посмотреть мой текущий код, таймеры верно работают?
а где тут таймеры? я вижу переменную с названием setTimer. но никаких таймеров нет. Совершенно непонятно. что вы с этой переменной хотите делать. но чтобы не хотели - в условиях циклов for у вас написана полная чушь.
skarakashev - признайтесь. вы ведь в этом коде не понимаете ни строчки. верно? Нашли его где-то в инете, увидали слово "таймер" - вот и повелись... Неправильно поступаете, обучаться надо постепенно. начните с простых скетчей. тот же блинк без делей - это отличный пример таймеров на миллис. Потом постепенно усложняйте. добавляйте нужные вам функции. Главное - в каждый момент понимать, что вы делаете
а где тут таймеры? я вижу переменную с названием setTimer. но никаких таймеров нет. Совершенно непонятно. что вы с этой переменной хотите делать. но чтобы не хотели - в условиях циклов for у вас написана полная чушь.
skarakashev - признайтесь. вы ведь в этом коде не понимаете ни строчки. верно? Нашли его где-то в инете, увидали слово "таймер" - вот и повелись... Неправильно поступаете, обучаться надо постепенно. начните с простых скетчей. тот же блинк без делей - это отличный пример таймеров на миллис. Потом постепенно усложняйте. добавляйте нужные вам функции. Главное - в каждый момент понимать, что вы делаете
Спорить с вами не буду, писал код сам по блок схеме в Visual Studio, так как я его вижу, после начал, его переносить на ардуино, спасибо за совет, начну с нуля.
Спросить с вами не буду
а смысл спорить? лучше исправлять ошибки и учиться.
Что у вас написано в скобках for в строчках 23 и 42? Возьмите справочник, посмотрите синтаксиси for. сравните со своим кодом... Исправите - приходите, будем искать ошибки дальше.
Может и до таймеров доберемся. пока в этом коде смысла в них нет
а смысл спорить? лучше исправлять ошибки и учиться.
Что у вас написано в скобках for в строчках 23 и 42? Возьмите справочник, посмотрите синтаксиси for. сравните со своим кодом... Исправите - приходите, будем искать ошибки дальше.
Может и до таймеров доберемся. пока в этом коде смысла в них нет
Спасибо!
И не обижайтесь на то, что я предположил, что это не ваш код. Не так важно, чей он - важнее чтобы вы его понимали. а вот этого я как раз не вижу...
И не обижайтесь на то, что я предположил, что это не ваш код. Не так важно, чей он - важнее чтобы вы его понимали. а вот этого я как раз не вижу...
Обиды никакой нет, всё хорошо, буду изучать более детально, спасибо.
Боюсь, что не в коде :-(
Поясните, пожалуйста.
Проблема кода - это следствие. Изначальная проблема в подходе к делу.
Слона нужно есть по частям, а Вы напихиваете в рот гораздо больше, чем можете за раз проглотить. Пишите маленькими кусочками и обязательной отладочной печатью. Переходите к новому кусочку только, когда прежний уже не вызывает сомнений в правильности.
Я профессионально программирую 40+ лет и тем не менее я не пишу кусков кода такого размера без единой отладочной печати! Никогда! А Вы считаете. что можете себе это позволить. Вот в этом проблема. А "в коде" это уже следствие этой.
Я профессионально программирую 40+ лет ...
тогда вопрос, что всё таки лучше применять для пинов int или #define?
что всё таки лучше применять для пинов int или #define?
Вопрос из серии "Что лучше всего?". Я на такой уже отвечал на амперке.
Если Вы имели в виду, что номер пина ни при каких условиях не будет изменяться, то это уже другой разговор. В этом случае я бы предпочёл constexpr uint8_t.
Есть общее соображение на эту тему. Для чего Вам нужен номер пина? Чтобы передавать функциям типа pinMode / digitalRead и т.п. В таком случае идеально передавать в точности тот тип, которого ожидают функции. А они ожидают uint8_t (см. Arduino.h). Ну, а если менять не собираетесь, то constexpr.
что всё таки лучше применять для пинов int или #define?
Вопрос из серии "Что лучше всего?". Я на такой уже отвечал на амперке.
Если Вы имели в виду, что номер пина ни при каких условиях не будет изменяться, то это уже другой разговор. В этом случае я бы предпочёл constexpr uint8_t.
Есть общее соображение на эту тему. Для чего Вам нужен номер пина? Чтобы передавать функциям типа pinMode / digitalRead и т.п. В таком случае идеально передавать в точности тот тип, которого ожидают функции. А они ожидают uint8_t (см. Arduino.h). Ну, а если менять не собираетесь, то constexpr.
я особенностей процессора не знаю, в коде компилируется отнимая ресурсы одинаково, вот и интересовался, расходуется ли дополнительный такт взять данные по адресу или константу тоже через адрес грузит, зайду почитаю на амперке