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;
}
И иногда, когда я не нажимаю кнопку, значение единицы измерения меняется, а иногда, когда я нажимаю кнопку выбора для увеличения суммы, меняется, к какой единице оно добавляется. А иногда перед строкой есть части из других единиц измерения, например «час», что происходит?
@BeastCoder2, 👍0
Обсуждение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
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Объяснение кода MPU6050
- Как я могу прервать задержку() при нажатии кнопки?
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Как установить управляющий регистр в модуле RTC DS3231 для Arduino UNO R3?
- Как повторить другое действие внутри цикла?
- Клиент веб-сокета Arduino CC3000
У вас вторая кнопка подключена неправильно или это просто «опечатка»?, @Majenko
Да, и все эти злоупотребления со строками вызовут неисчислимые проблемы. Вам это не нужно *ничего*., @Majenko
Итак, мне следует просто использовать unitCycle для какой единицы, а не для меняющейся строки? И да, эта кнопка была «опечаткой»;, @BeastCoder2
Я исправил эту "опечатку", @BeastCoder2
Никогда не бывает призыва изменить такую строку или использовать ее в качестве переменной состояния. Просто выведите другое слово в зависимости от цикла. И не забудьте использовать F() для ваших литералов, чтобы сэкономить оперативную память., @Majenko
@Маженко Хорошо, я подумаю об этом, спасибо, @BeastCoder2
Кажется, ты забыл отладить кнопки., @Edgar Bonet