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?

, 👍2

Обсуждение

Что произойдет, если вы также закомментируете весь код, который использует и создает String messageText?, @ocrdu

Ваш MCU занят печатью текста и ожиданием., @Kwasmich

Я не вижу в вашем коде ничего, что могло бы сделать его таким медленным. Не могли бы вы попробовать просто void loop(){Serial.println(analogRead(A2));delay(100);}?, @Edgar Bonet


2 ответа


Лучший ответ:

3

Оказывается, проблема заключалась в контакте A2 на плате.

Когда я использовал контакт A0 (или другую плату), проблема исчезла.

Я понял, что что-то не так, когда заметил, что значения из горшка были странными (я ожидал значений в диапазоне 0–1023, но получил значения от 170 до 250).

,

Кстати, вы можете использовать команду Arduino «map», чтобы сопоставить диапазон с другим диапазоном., @Michel Keijzers


2

Операция String+ очень дорогая. Скорее всего, он делает следующее:

  • Создайте новый блок памяти, чтобы разместить старое строковое содержимое и текст, который нужно объединить.
  • Скопировать текущую строку в новое место.
  • Объединить строку
  • Освободите старую память

Помимо создания пробелов в памяти, которые могут иметь катастрофические последствия для SRAM всего 2 КБ Arduino Uno, это занимает много времени.

Несколько советов:

  • Не используйте строки
  • Не объединяйте строки без необходимости
  • Чтобы сэкономить больше времени, используйте короткие строки.

Если вам действительно нужно отладить критическую по времени часть, скопируйте числа, которые вы хотите напечатать, в массив, и ПОСЛЕ того, как вы сделаете весь «настоящий» код, начните печатать числа.

,

Также нет причин объединять строки для последовательного вывода. Просто печатайте части одну за другой. Чтобы получить «Число: 5 бананов», вы можете использовать Serial.print («Число:»); Serial.print (число_переменной); Serial.println("бананы"), @chrisl

@chrisl это действительно мой второй совет., @Michel Keijzers

Спасибо за отличный совет. К сожалению, я не могу отметить это как ответ на вопрос, так как моя проблема была вызвана чем-то другим (см. мой ответ)., @Hoppy

Нет проблем, кстати, вы тоже можете принять свой ответ., @Michel Keijzers