Arduino Uno отстает в простом цикле
У меня есть простой скетч Arduino, с которым я экспериментировал на своем Uno.
Идея проста: пользователь включает потенциометр (контакт A2), когда он достигает определенного порога, загорается светодиод (контакт 7).
Вот код:
// Цифровые контакты
const byte ledPin = 7;
// Аналоговые выводы
const byte userInputPotPin = A2;
// Константы потенциометра
const int userInputPotMinimumValue = 0;
const int userInputPotMaximumValue = 1023;
const int userInputMinimumValue = 1;
const int userInputMaximumValue = 100;
// Переменные
const int threshold = 90;
void setup()
{
Serial.begin(9600);
// Цифровые выводы
pinMode(ledPin, OUTPUT);
// Аналоговые выводы
pinMode(userInputPotPin, INPUT);
}
void loop()
{
int rawValue = analogRead(userInputPotPin);
int mappedValue = map(rawValue, userInputPotMinimumValue, userInputPotMaximumValue, userInputMinimumValue, userInputMaximumValue);
String messageText;
messageText += "Raw: " + String(rawValue) + "\t";
messageText += "Mapped:" + String(mappedValue);
if(mappedValue > threshold)
{
messageText += "\tThreshold exceeded!";
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW);
}
Serial.println(messageText);
delay(100);
}
Проблема в том, что когда он запущен, аппаратное обеспечение очень не отвечает - я могу повернуть горшок, но я не вижу изменения света в течение нескольких минут. Сообщения журнала в последовательном мониторе также кажутся отстающими.
Я пытался:
* Удаление операторов Serial (чтобы не было последовательной связи во время работы скетча) и просто наблюдение за светодиодом. Это не имеет значения.
* Увеличение значения задержки до 1000. Это не влияет на отзывчивость.
Однако, когда я запускаю скетч на своем Mega2560, проблема исчезает, и схема реагирует так, как я и ожидал.
Что-то не так с моей платой Uno?
@Hoppy, 👍2
Обсуждение2 ответа
Лучший ответ:
Оказывается, проблема заключалась в контакте A2 на плате.
Когда я использовал контакт A0 (или другую плату), проблема исчезла.
Я понял, что что-то не так, когда заметил, что значения из горшка были странными (я ожидал значений в диапазоне 0–1023, но получил значения от 170 до 250).
Кстати, вы можете использовать команду Arduino «map», чтобы сопоставить диапазон с другим диапазоном., @Michel Keijzers
Операция String+ очень дорогая. Скорее всего, он делает следующее:
- Создайте новый блок памяти, чтобы разместить старое строковое содержимое и текст, который нужно объединить.
- Скопировать текущую строку в новое место.
- Объединить строку
- Освободите старую память
Помимо создания пробелов в памяти, которые могут иметь катастрофические последствия для SRAM всего 2 КБ Arduino Uno, это занимает много времени.
Несколько советов:
- Не используйте строки
- Не объединяйте строки без необходимости
- Чтобы сэкономить больше времени, используйте короткие строки.
Если вам действительно нужно отладить критическую по времени часть, скопируйте числа, которые вы хотите напечатать, в массив, и ПОСЛЕ того, как вы сделаете весь «настоящий» код, начните печатать числа.
Также нет причин объединять строки для последовательного вывода. Просто печатайте части одну за другой. Чтобы получить «Число: 5 бананов», вы можете использовать Serial.print («Число:»); Serial.print (число_переменной); Serial.println("бананы")
, @chrisl
@chrisl это действительно мой второй совет., @Michel Keijzers
Спасибо за отличный совет. К сожалению, я не могу отметить это как ответ на вопрос, так как моя проблема была вызвана чем-то другим (см. мой ответ)., @Hoppy
Нет проблем, кстати, вы тоже можете принять свой ответ., @Michel Keijzers
- Как эмулировать аналоговый потенциометр с помощью ШИМ
- ЖК-дисплей странные символы
- Сбой Arduino во время последовательной печати без очевидной причины
- Как контролировать скорость двухпроводного вентилятора с помощью Arduino и только потенциометра?
- ЖК-дисплей не отображает текст
- Считанное значение не меняется при вращении потенциометра в Arduino?
- AnalogWrite не работает - при попытке контролировать скорость двигателя постоянного тока
- Почему моя «подсказка настроения» не работает?
Что произойдет, если вы также закомментируете весь код, который использует и создает String messageText?, @ocrdu
Ваш MCU занят печатью текста и ожиданием., @Kwasmich
Я не вижу в вашем коде ничего, что могло бы сделать его таким медленным. Не могли бы вы попробовать просто
void loop(){Serial.println(analogRead(A2));delay(100);}
?, @Edgar Bonet