Увеличение или уменьшение значения байта const внутри кода с помощью кнопки

Я вроде как новичок в мире Arduino. Я решил сделать самообучающийся проект с Arduino, где он управляет конвейером, который просто перемещается справа налево и обратно. Есть кнопка запуска и остановки. На каждом конце конвейера расположены индуктивные датчики для остановки двигателя, когда он достигает конечного положения. После задержки конвейер снова начинает движение в противоположном направлении. Внутри кода у меня есть счетчик циклов, который останавливает конвейер после определенного количества циклов. Теперь мой вопрос в том, как я мог бы изменить значение счетчика циклов с помощью двух кнопок. Одно для того чтобы увеличить другое для того чтобы уменьшить.

Если есть кто-то, кто мог бы помочь, я был бы признателен. Спасибо уже

const byte sensorLinksEnd  =  2;
const byte sensorRechtsEnd =  3;
const byte startPin        =  4;
const byte stopPin         =  5;
const byte relaisLinks     =  6;
const byte relaisRechts    =  7;

enum {relaisAn, relaisAus};
enum {warten, on, rechts, haltrechts, links, haltlinks, off};
byte schritt = warten;
byte zyklus = 20; //cycles
const byte maxzyklus = 20; //max cycles

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start...."));
  pinMode(sensorLinksEnd, INPUT);
  pinMode(sensorRechtsEnd, INPUT);
  pinMode(startPin, INPUT);
  pinMode(stopPin,  INPUT);
  pinMode(relaisLinks, OUTPUT);
  digitalWrite(relaisLinks, relaisAus);
  pinMode(relaisRechts, OUTPUT);
  digitalWrite(relaisRechts, relaisAus);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop() {
  schrittkette();
}

void schrittkette()
{
  static unsigned long lastmillis;
  const unsigned long pauseZeit = 5000; // in ms
  if (digitalRead(stopPin))
  {
    schritt = off;
  }
  switch (schritt)
  {
    case warten:
      if (digitalRead(startPin))
      {
        zyklus = 0;
        schritt = on;
      }
      digitalWrite(relaisRechts, relaisAus);
      digitalWrite(relaisLinks, relaisAus);
      break;
    case on:
      digitalWrite(LED_BUILTIN, HIGH);
      schritt = rechts;
      break;
    case rechts:
      digitalWrite(relaisRechts, relaisAn);
      if (digitalRead(sensorRechtsEnd))
      {
        digitalWrite(relaisRechts, relaisAus);
        schritt = haltrechts;
        lastmillis = millis();
      }
      break;
    case haltrechts:
      digitalWrite(relaisRechts, relaisAus);
      digitalWrite(relaisLinks, relaisAus);
      if (millis() - lastmillis > pauseZeit)
      {
        schritt = links;
      }
      break;
    case links:
      digitalWrite(relaisRechts, relaisAus);
      digitalWrite(relaisLinks, relaisAn);
      if (digitalRead(sensorLinksEnd))
      {
        digitalWrite(relaisLinks, relaisAus);
        schritt = haltlinks;
        lastmillis = millis();
      }
      break;
    case haltlinks:
      digitalWrite(relaisRechts, relaisAus);
      digitalWrite(relaisLinks, relaisAus);
      if (millis() - lastmillis > pauseZeit)
      {
        if (zyklus == maxzyklus)
        {
          schritt = off;
        }
        else
        {
          zyklus++; 
          schritt = rechts;
        }
      }
      break;
    case off:
      digitalWrite(LED_BUILTIN, LOW);
      schritt = warten;
      break;
  }
}

, 👍3

Обсуждение

Что вы пробовали до сих пор? С чем именно у вас проблемы? И, пожалуйста, укажите свой код в своем вопросе (пожалуйста, не в комментариях)., @chrisl

Формулировка в теме вашего вопроса заставляет меня задуматься, читали ли вы [что делает const](https://www.arduino.cc/reference/en/language/variables/variable-scope-qualifiers/const/)., @timemage

@timemage спасибо за ответ. Хорошо, константа доступна только для чтения. Какова была бы альтернатива этому? Как я могу опубликовать здесь свой полный код? Извините, что я здесь в первый раз, @Carlos Costa

Я поместил полный код в первый вопрос, @Carlos Costa

Альтернативой было бы не использовать там ключевое слово " const. Если он не должен быть постоянным, то не используйте ключевое слово " const. Что касается всего вашего вопроса: вы могли бы разделить его на кнопки чтения и на переменные изменения. С чем именно у вас проблемы и что вы пробовали до сих пор? Вы искали в Гугле учебники о том, как читать кнопки?, @chrisl

@chrisl Теперь я знаю, что не могу использовать const. Мне понадобится, я думаю, unsigned int или, лучше, unsigned long. Я хочу иметь возможность изменять большое число. Что-то около 60000 циклов. Именно в учебниках я смог сделать кнопки "Пуск" и "стоп". Но, к сожалению, чтобы изменить переменную, как я хочу, я до сих пор не нашел ничего, что мог бы понять. Я полный новичок в кодировании на c++. То, что я до сих пор брал из примеров или просил дать несколько советов. Если вы знаете учебник, который поможет в этой конкретной ситуации, я был бы признателен вам за помощь, @Carlos Costa

@CarlosCosta это "maxzyklus", который вы хотите использовать в качестве переменной счетчика циклов?, @sa_leinad

Всем спасибо за помощь. Я нашел решение., @Carlos Costa

Как я могу простым способом показать здесь свой код?, @Carlos Costa

@Carloscost Если вы нашли решение своей проблемы, вы можете написать собственный ответ на свой вопрос и принять его как правильный. Рад, что вы нашли решение и готовы поделиться им. +1, @chrisl


1 ответ


1

Ключевое слово const сообщает компилятору C/C++, что переменная является константой и больше не может быть изменена в вашем коде.

Просто удалите const, и вы сможете изменить maxzyklus, используя 2 цифровых входа.

byte maxzyklus = 20; //max cycles
,