Подключение таймеров в проект

skarakashev
Offline
Зарегистрирован: 22.10.2020

Добрый день,

Есть некоторый проект, в котором я не могу как правильно подключить таймеры. Блок схему прилагаю, возможно она не особо корректно написана, но суть должна быть ясна. И прикладываю свою код, прошу сильно палками не бить, я только учусь). Прошу проверки и помощи в правильном подключении таймеров.

Схема: /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;
  }
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

а можете пояснить, что происходит в строчке 20? а также 23, 28, 35 и тд

skarakashev
Offline
Зарегистрирован: 22.10.2020

Там, проходит проверка равно ли значение 1 или 0. Если 1, то счетчик прибавляет 1. В данном случае, GPIO1 принимает сигнал от внешнего устройства. Надеюсь, понятно. А GPIO2 и GPIO3 это светодиоды. Схема, есть чуть выше.

b707
Offline
Зарегистрирован: 26.05.2017

skarakashev пишет:

Там, проходит проверка равно ли значение 1 или 0. В данном случае, GPIO1 принимает сигнал от внешнего устройства. Надеюсь, понятно.

ну если не доходит, то придется как маленькому обьяснять.

GPIO_01, согласно коду - переменная типа int. В строке 5 вы присваиваете ей значение 10 и больше не меняете, поэтому в строчках 20, 23... и так далее она никак не может быть ни 0, ни 1

Так понятнее?

skarakashev
Offline
Зарегистрирован: 22.10.2020

Да. А стоп, моя ошибка в коде, я пины присваивал каждому GPI0.

b707
Offline
Зарегистрирован: 26.05.2017

исправляйте и выкладывайте новый код

skarakashev
Offline
Зарегистрирован: 22.10.2020
#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(10, INPUT);
  pinMode(12, OUTPUT);
  pinMode(13, 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;
  }
  }

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Для чего это вот всё?

skarakashev
Offline
Зарегистрирован: 22.10.2020

Это проект, для проверки идет ли сигнал от внешнего устройства, посылает ли он пульсы, а светодиоды как индикаторы. Как-то так.

b707
Offline
Зарегистрирован: 26.05.2017

skarakashev - не вижу. где вы что-то исправили?

Бредовые строчки 20, 23 и тд - остались на месте

skarakashev
Offline
Зарегистрирован: 22.10.2020

Видимо, я не понимаю, о чем идет речь, сейчас попробую вникнуть. Прошу прощения, за тупость(

b707
Offline
Зарегистрирован: 26.05.2017

skarakashev пишет:

Видимо, я не понимаю, о чем идет, речь, сейчас попробую вникнуть. Прошу прощения, за тупость(

еще раз, у вас GPIO_01 - это НОМЕР ПИНА, а не его состояние. Состояние пина вы в своем коде нигде не читаете, поэтому никакой "сигнал от внешнего устройства" принять не можете

Вам оператор digitalRead() знаком?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

skarakashev пишет:

Видимо, я не понимаю, о чем идет речь, сейчас попробую вникнуть. Прошу прощения, за тупость(

есть немного, вы выбрали пин, далее надо прочитать, какой уровень сигнала на нем
if (digitalRead(здесь номер пина) == 1)   ...

skarakashev
Offline
Зарегистрирован: 22.10.2020

b707 пишет:

еще раз, у вас GPIO_01 - это НОМЕР ПИНА, а не его состояние. Состояние пина вы в своем коде нигде не читаете, поэтому никакой "сигнал от внешнего устройства" принять не можете

Вам оператор digitalRead() знаком?

Теперь, да. Спасибо

skarakashev
Offline
Зарегистрирован: 22.10.2020

ua6em пишет:

есть немного, вы выбрали пин, далее надо прочитать, какой уровень сигнала на нем
if (digitalRead(здесь номер пина) == 1)   ...

Спасибо

skarakashev
Offline
Зарегистрирован: 22.10.2020
#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(10, INPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  }
  
void loop(){
  if (digitalRead(10) == 1)
  {
    pCounter++;
    if (digitalRead(10) == 1)
    {
      return 0;
    } else {
      for (int setTimer = 300; setTimer < 0; setTimer--) {
        if (digitalRead(10) == 0)
        {
          return 0;
        } else if (setTimer < 50) {
          return 0;
        } else {
          pCounter++;
          if (digitalRead(10) != 0) {
            return 0;
          } else if (setTimer <= 300) {
            continue;
          } else {
            break;
          }
        }
      }
      digitalWrite(12, HIGH);
      if (pCounter > 0) {
        for (int setTimer = 2000; setTimer < 0; setTimer--) {
          do {
            digitalWrite(13, HIGH);
          } while (setTimer > 0);
        }
        digitalWrite(13, LOW);
        pCounter--;
        return 0;
      } else {
        digitalWrite(12, LOW);
        return 0;
      }
    }
  }
  else {
    return 0;
  }
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

опять криво... ну хотя бы так. Работает?

Вернемся к исходному вопросу - проблема не пропала?

skarakashev
Offline
Зарегистрирован: 22.10.2020

b707 пишет:

опять криво... ну хотя бы так. Работает?

Вернемся к исходному вопросу - проблема не пропала?

1) А как не криво? я хочу сделать, чтобы было понятно и верно, всё таки еще учусь.

2) Нет не пропала, проблема в том, что нужно подключить таймеры, которые будут отсчитывать время (300ms и тд) в цикле, и я так и не понял как это правильно сделать, так как я писал чисто на с++, а потом решил переносить это всё на ардуино и вычитал, что в ардуино есть библеотки которые упрощают работу с таймерами.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

я б тебе, канеш, свою биб-ку присоветовал, да боюсь ниасилишь. 

https://github.com/DetSimen/Arduino_TimerList

b707
Offline
Зарегистрирован: 26.05.2017

skarakashev пишет:

1) А как не криво? я хочу сделать, чтобы было понятно и верно, всё таки еще учусь.

раз у вас в начале кода определены переменные GPIO_01 GPIO_02 и тд для пинов - зачем вы в операторы digitalRead() используете номера? - используйте переменные. иначе зачем вы их завели

Цитата:
2) Нет не пропала, проблема в том, что нужно подключить таймеры, которые будут отсчитывать время (300ms и тд) в цикле, и я так и не понял как это правильно сделать, так как я писал чисто на с++, а потом решил переносить это всё на ардуино и вычитал, что в ардуино есть библеотки которые упрощают работу с таймерами.

ардуино вообще-то именно на C++ и программируется. Если вы уже написали код на С++ без библиотек - лучше доделывайте его, библиотеки таймеров в большинстве случаев  - это костыли для неучей. не умеющих работать с временем МК напрямую...

skarakashev
Offline
Зарегистрирован: 22.10.2020

DetSimen пишет:

я б тебе, канеш, свою биб-ку присоветовал, да боюсь ниасилишь. 

https://github.com/DetSimen/Arduino_TimerList

Спасибо, попробую изучить.

skarakashev
Offline
Зарегистрирован: 22.10.2020

b707 пишет:

раз у вас в начале кода определены переменные GPIO_01 GPIO_02 и тд для пинов - зачем вы в операторы digitalRead() используете номера? - используйте переменные. иначе зачем вы их завели

b707 пишет:

ардуиновообще-то именно на C++ и программируется. Если вы уже написали код на С++ без библиотек - лучше доделывайте его, библиотеки таймеров в большинстве случаев  - это костыли для неучей. не умеющих работать с временем МК напрямую...

Спасибо, а вот если посмотреть мой текущий код, таймеры верно работают?

int GPIO_01 = 10;
int GPIO_02 = 12;
int GPIO_03 = 13;

int pCounter = 0;
int setTimer = 0;

void setup(){
  Serial.begin(9600);
  pinMode(10, INPUT); // GPIO_01
  pinMode(12, OUTPUT); // GPIO_02
  pinMode(13, OUTPUT); // GPIO_03
  }
  
void loop(){
  if (digitalRead(GPIO_01) == 1)
  {
    pCounter++;
    if (digitalRead(GPIO_01) == 1)
    {
      return 0;
    } else {
      for (int setTimer = 300; setTimer < 0; setTimer--) {
        if (digitalRead(GPIO_01) == 0)
        {
          return 0;
        } else if (setTimer < 50) {
          return 0;
        } else {
          pCounter++;
          if (digitalRead(GPIO_01) != 0) {
            return 0;
          } else if (setTimer <= 300) {
            continue;
          } else {
            break;
          }
        }
      }
      digitalWrite(GPIO_02, HIGH);
      if (pCounter > 0) {
        for (int setTimer = 2000; setTimer < 0; setTimer--) {
          do {
            digitalWrite(GPIO_03, HIGH);
          } while (setTimer > 0);
        }
        digitalWrite(GPIO_03, LOW);
        pCounter--;
        return 0;
      } else {
        digitalWrite(GPIO_02, LOW);
        return 0;
      }
    }
  }
  else {
    return 0;
  }
  }

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

я б тебе, канеш, свою биб-ку присоветовал, да боюсь ниасилишь. 

https://github.com/DetSimen/Arduino_TimerList

если человек писал на С++ и не осилит, то что говорить о начинающих )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

у тебя уже есть один таймер встроенный, даже два millis() в частности можно им в прерывании воспользоваться

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

skarakashev пишет:

 моя ошибка в коде

Боюсь, что не в коде :-(

skarakashev
Offline
Зарегистрирован: 22.10.2020

ЕвгенийП пишет:

Боюсь, что не в коде :-(

Поясните, пожалуйста.

skarakashev
Offline
Зарегистрирован: 22.10.2020

ua6em пишет:

у тебя уже есть один таймер встроенный, даже два millis() в частности можно им в прерывании воспользоваться

Спасибо, буду пытаться.

b707
Offline
Зарегистрирован: 26.05.2017

skarakashev пишет:

Спасибо, а вот если посмотреть мой текущий код, таймеры верно работают?

int GPIO_01 = 10;
int GPIO_02 = 12;
int GPIO_03 = 13;

int pCounter = 0;
int setTimer = 0;

void setup(){
  Serial.begin(9600);
  pinMode(10, INPUT); // GPIO_01
  pinMode(12, OUTPUT); // GPIO_02
  pinMode(13, OUTPUT); // GPIO_03
  }
  
void loop(){
  if (digitalRead(GPIO_01) == 1)
  {
    pCounter++;
    if (digitalRead(GPIO_01) == 1)
    {
      return 0;
    } else {
      for (int setTimer = 300; setTimer < 0; setTimer--) {
        if (digitalRead(GPIO_01) == 0)
        {
          return 0;
        } else if (setTimer < 50) {
          return 0;
        } else {
          pCounter++;
          if (digitalRead(GPIO_01) != 0) {
            return 0;
          } else if (setTimer <= 300) {
            continue;
          } else {
            break;
          }
        }
      }
      digitalWrite(GPIO_02, HIGH);
      if (pCounter > 0) {
        for (int setTimer = 2000; setTimer < 0; setTimer--) {
          do {
            digitalWrite(GPIO_03, HIGH);
          } while (setTimer > 0);
        }
        digitalWrite(GPIO_03, LOW);
        pCounter--;
        return 0;
      } else {
        digitalWrite(GPIO_02, LOW);
        return 0;
      }
    }
  }
  else {
    return 0;
  }
  }

 

а где тут таймеры? я вижу переменную с названием setTimer. но никаких таймеров нет. Совершенно непонятно. что вы с этой переменной хотите делать. но чтобы не хотели - в условиях циклов for у вас написана полная чушь.

skarakashev - признайтесь. вы ведь в этом коде не понимаете ни строчки. верно? Нашли его где-то в инете, увидали слово "таймер" - вот и повелись... Неправильно поступаете, обучаться надо постепенно. начните с простых скетчей. тот же блинк без делей - это отличный пример таймеров на миллис. Потом постепенно усложняйте. добавляйте нужные вам функции. Главное - в каждый момент понимать, что вы делаете

skarakashev
Offline
Зарегистрирован: 22.10.2020

b707 пишет:

а где тут таймеры? я вижу переменную с названием setTimer. но никаких таймеров нет. Совершенно непонятно. что вы с этой переменной хотите делать. но чтобы не хотели - в условиях циклов for у вас написана полная чушь.

skarakashev - признайтесь. вы ведь в этом коде не понимаете ни строчки. верно? Нашли его где-то в инете, увидали слово "таймер" - вот и повелись... Неправильно поступаете, обучаться надо постепенно. начните с простых скетчей. тот же блинк без делей - это отличный пример таймеров на миллис. Потом постепенно усложняйте. добавляйте нужные вам функции. Главное - в каждый момент понимать, что вы делаете

Спорить с вами не буду, писал код сам по блок схеме в Visual Studio, так как я его вижу, после начал, его переносить на ардуино, спасибо за совет, начну с нуля.

b707
Offline
Зарегистрирован: 26.05.2017

skarakashev пишет:

Спросить с вами не буду

а смысл спорить? лучше исправлять ошибки и учиться.

Что у вас написано в скобках for в строчках 23 и 42? Возьмите справочник, посмотрите синтаксиси for. сравните со своим кодом... Исправите - приходите, будем искать ошибки дальше.

Может и до таймеров доберемся. пока в этом коде смысла в них нет

skarakashev
Offline
Зарегистрирован: 22.10.2020

b707 пишет:

а смысл спорить? лучше исправлять ошибки и учиться.

Что у вас написано в скобках for в строчках 23 и 42? Возьмите справочник, посмотрите синтаксиси for. сравните со своим кодом... Исправите - приходите, будем искать ошибки дальше.

Может и до таймеров доберемся. пока в этом коде смысла в них нет

Спасибо!

b707
Offline
Зарегистрирован: 26.05.2017

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

skarakashev
Offline
Зарегистрирован: 22.10.2020

b707 пишет:

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

Обиды никакой нет, всё хорошо, буду изучать более детально, спасибо.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

skarakashev пишет:

ЕвгенийП пишет:

Боюсь, что не в коде :-(

Поясните, пожалуйста.

Проблема кода - это следствие. Изначальная проблема в подходе к делу.

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

Я профессионально программирую 40+ лет и тем не менее я не пишу кусков кода такого размера без единой отладочной печати! Никогда! А Вы считаете. что можете себе это позволить. Вот в этом проблема. А "в коде" это уже следствие этой.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Я профессионально программирую 40+ лет ...

тогда вопрос, что всё таки лучше применять для пинов int или #define?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

что всё таки лучше применять для пинов int или #define?

Вопрос из серии "Что лучше всего?". Я на такой уже отвечал на амперке.

Если Вы имели в виду, что номер пина ни при каких условиях не будет изменяться, то это уже другой разговор. В этом случае я бы предпочёл constexpr uint8_t.

Есть общее соображение на эту тему. Для чего Вам нужен номер пина? Чтобы передавать функциям типа pinMode / digitalRead и т.п. В таком случае идеально передавать в точности тот тип, которого ожидают функции. А они ожидают uint8_t (см. Arduino.h). Ну, а если менять не собираетесь, то constexpr.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

что всё таки лучше применять для пинов int или #define?

Вопрос из серии "Что лучше всего?". Я на такой уже отвечал на амперке.

Если Вы имели в виду, что номер пина ни при каких условиях не будет изменяться, то это уже другой разговор. В этом случае я бы предпочёл constexpr uint8_t.

Есть общее соображение на эту тему. Для чего Вам нужен номер пина? Чтобы передавать функциям типа pinMode / digitalRead и т.п. В таком случае идеально передавать в точности тот тип, которого ожидают функции. А они ожидают uint8_t (см. Arduino.h). Ну, а если менять не собираетесь, то constexpr.

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:
ресурсы одинаково
Не в ресурсах дело. Последний абзац перечитайте. Это общий принцип - "давайте функции то, чего она ждёт".