Arduino Uno — случайное изменение переменных

Итак, у меня есть схема таймера (не думаю, что это проблема)

Извините, что получилось немного сумбурно.

И у меня есть этот код (вероятно, проблема):

// LiquidCrystal - Версия: Последняя
#include <LiquidCrystal.h>

/*

*/


const int switchUnitButton = 9;
const int selectButton = 10;
const int startButton = 8;
const int stopButton = 7;
const int d4 = 5;
const int d5 = 4;
const int d6 = 3;
const int d7 = 2;
const int rs = 12;
const int en = 11;
String unit = "sec";
int unitCycle = 1;
int secCount = 0;
int minCount = 0;
int hourCount = 0;
int dayCount = 0;
int switchUnitState;
int prevUnitState;
int selectState;
int prevSelectState;
int startState;
int prevStartState;
int stopState;
int prevStopState;
LiquidCrystal lcd = LiquidCrystal(rs, en, d4, d5, d6, d7);

void setup() {
  Serial.begin(9600);
  pinMode(switchUnitButton, INPUT);
  pinMode(selectButton, INPUT);
  pinMode(startButton, INPUT);
  pinMode(stopButton, INPUT);
  lcd.begin(16, 2);
  lcd.clear();
}

void loop() {

  switchUnitState = digitalRead(switchUnitButton);
  selectState = digitalRead(selectButton);
  startState = digitalRead(startButton);
  stopState = digitalRead(stopButton);

  if (switchUnitState == HIGH) {
    if (prevUnitState != switchUnitState) {
      if (unitCycle < 4) {
       unitCycle++;
      } else if (unitCycle == 4) {
       unitCycle = 1;
      }    
    }
  }

  Serial.print(unitCycle + "\n");

  if (unitCycle == 1) {
    unit = "sec";
  } else if (unitCycle == 2) {
    unit = "min";
  } else if (unitCycle == 3) {
    unit = "hour";
  } else {
    unit = "day";
  }

  Serial.print(unit + "\n");

  if (selectState == HIGH) {
    if (prevSelectState != selectState) {
      if (unit == "day") {
        dayCount++;
      } else if (unit == "sec") {
        secCount++;
      } else if (unit == "hour") {
        hourCount++;
      } else if (unit == "min") {
        minCount++;
      }
    }
  }

  lcd.setCursor(0, 0);
  lcd.print("Sec: " + String(secCount) + " Min: " + String(minCount));
  lcd.setCursor(0, 1);
  lcd.print("Hr: " + String(hourCount) + " Day: " + String(dayCount));

  prevUnitState = switchUnitState;
  prevSelectState = selectState;
  prevStartState = startState;
  prevStopState = stopState;
}

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

, 👍0

Обсуждение

У вас вторая кнопка подключена неправильно или это просто «опечатка»?, @Majenko

Да, и все эти злоупотребления со строками вызовут неисчислимые проблемы. Вам это не нужно *ничего*., @Majenko

Итак, мне следует просто использовать unitCycle для какой единицы, а не для меняющейся строки? И да, эта кнопка была «опечаткой»;, @BeastCoder2

Я исправил эту "опечатку", @BeastCoder2

Никогда не бывает призыва изменить такую строку или использовать ее в качестве переменной состояния. Просто выведите другое слово в зависимости от цикла. И не забудьте использовать F() для ваших литералов, чтобы сэкономить оперативную память., @Majenko

@Маженко Хорошо, я подумаю об этом, спасибо, @BeastCoder2

Кажется, ты забыл отладить кнопки., @Edgar Bonet


1 ответ


1

Вы серьезно злоупотребляете классом String. В вашей программе нет абсолютно никакой необходимости использовать какие-либо строки.

Например:

  if (unitCycle == 1) {
    unit = "sec";
  } else if (unitCycle == 2) {
    unit = "min";
  } else if (unitCycle == 3) {
    unit = "hour";
  } else {
    unit = "day";
  }

  Serial.print(unit + "\n");

лучше было бы написать так:

  if (unitCycle == 1) {
    Serial.println(F("sec"));
  } else if (unitCycle == 2) {
    Serial.println(F("min"));
  } else if (unitCycle == 3) {
    Serial.println(F("hour"));
  } else {
    Serial.println(F("day"));
  }

И:

  if (selectState == HIGH) {
    if (prevSelectState != selectState) {
      if (unit == "day") {
        dayCount++;
      } else if (unit == "sec") {
        secCount++;
      } else if (unit == "hour") {
        hourCount++;
      } else if (unit == "min") {
        minCount++;
      }
    }
  }

как:

  if (selectState == HIGH) {
    if (prevSelectState != selectState) {
      if (unitCycle == 1) {
        secCount++;
      } else if (unitCycle == 2) {
        minCount++;
      } else if (unitCycle == 3) {
        hourCount++;
      } else {
        dayCount++;
      }
    }
  }

И дальше главный грех:

lcd.print("Sec: " + String(secCount) + " Min: " + String(minCount));

Все эти создания, конкатенации и уничтожения строк — просто зло. Вместо этого используйте:

lcd.print(F("Sec: "));
lcd.print(secCount);
lcd.print(F(" Min: "));
lcd.print(minCount);
,

Ха-ха, хорошо, спасибо, что уделили время и помогли!, @BeastCoder2

@BeastCoder2 Возможно, вам захочется прочитать это: https://majko.co.uk/blog/evils-arduino-strings, @Majenko

Хорошо, я сделаю, ваш сайт действительно классный!, @BeastCoder2

закатил глаза... у меня один провод был вставлен не в тот контакт..., @BeastCoder2