Увеличение или уменьшение значения байта 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;
}
}
@Carlos Costa, 👍3
Обсуждение1 ответ
Ключевое слово const сообщает компилятору C/C++, что переменная является константой и больше не может быть изменена в вашем коде.
Просто удалите const
, и вы сможете изменить maxzyklus
, используя 2 цифровых входа.
byte maxzyklus = 20; //max cycles
- Как переключить светодиод при нажатии кнопки?
- Определение того, была ли нажата и отпущена кнопка
- Нажать клавишу Windows, используя «keyboard.press();»
- Почему выходит ошибка: invalid conversion from 'const char*' to 'char' [-fpermissive]??
- Устранение дребезга кнопки с помощью прерывания
- Хорошая кнопка debouncing/Библиотека StateChange
- Напряжение меняется, но цифровой поток всегда HIGH
- Остановить мигание светодиодов
Что вы пробовали до сих пор? С чем именно у вас проблемы? И, пожалуйста, укажите свой код в своем вопросе (пожалуйста, не в комментариях)., @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