Отображение значений с аналогового входа дает неожиданные значения?

Мега 2560

Я считываю значения из 3 горшков, а затем сопоставляю их со значениями от 0 до 255

#define REDPIN   7
#define GREENPIN 8
#define BLUEPIN  9

int red_pot   = A0;  // аналоговый вывод, используемый для подключения потенциометра
int green_pot = A1;
int blue_pot  = A3;


void setup() {

  pinMode(REDPIN,   OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN,  OUTPUT);

  Serial.begin(38400); // порт отладки
  Serial.setTimeout(50);
}


void loop() {

  int red, green, blue; 

  red   = analogRead(red_pot);
  green = analogRead(green_pot);
  blue  = analogRead(blue_pot);

  Serial.print(" r = ");
  Serial.print(red);

  Serial.print(" b = ");
  Serial.print(blue);

  Serial.print(" g = ");
  Serial.print(green);
  Serial.print("\n\n\n");


  // отображать значения
  red   = map(red,   20, 650, 0, 255);     
  green = map(green, 20, 570, 0, 255);
  blue  = map(blue,  20, 570, 0, 255);


  Serial.print("red map : ");
  Serial.print(red);

  Serial.print(" green map : ");
  Serial.print(green);

  Serial.print(" blue map : ");
  Serial.print(blue);
  Serial.print('\n\n\n');

  analogWrite(REDPIN,   red); 
  analogWrite(GREENPIN, green);
  analogWrite(BLUEPIN,  blue);    
}

красный & зеленый ведет себя так, как ожидалось, а синий — нет, из последовательного монитора...

Когда синий имеет самое низкое значение,

Когда синий имеет максимальное значение

Я изменил назначение аналоговых контактов blue, но проблема та же.

Есть какие-нибудь подсказки, что происходит?

Обновление №1

Я подумал, что это может быть какая-то ошибка знака int, поэтому я изменил операцию map на,

blue  = map(abs(blue), 20, 670, 0, 255);

Это не имело значения.

, 👍0

Обсуждение

В вашем операторе печати сначала печатаются r, b и g, но в вашем выводе сначала отображается отображение. Вы уверены, что значения в коробках принадлежат друг другу?, @Michel Keijzers

да, если я оставлю горшки в настройках, значения будут стабильными +/- 5 на входе, но почти те же значения, @DrBwts


1 ответ


1

Обратите внимание, что функция «карта» Arduino на самом деле такова:

long map(long x, long in_min, long in_max, long out_min, long out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

...так что, если вы передадите значение "минимум из", которое меньше, чем фактическое значение, из которого вы сопоставляете, вы получите отрицательное число, учитывая, что ваш "минимум на выходе" равен нулю.

В нескольких ваших примерах вы установили минимум 20, но передали значение 19. Если ваша программа не терпит отрицательных чисел (например, как отрицательное число повлияет на аппаратное обеспечение ШИМ), рассмотрите возможность тестирования на меньшее значение, чем минимальные и выше максимальных значений перед использованием функции карты.

,

Я понимаю, что это не относится напрямую к вашему примеру кода в сочетании с вашим выводом. Однако очевидно, что вывод не напрямую из кода, так как он печатается в обратном порядке. Попробуйте снова запустить свой код и проверить вывод. Если это указывает на что-то другое, пожалуйста, измените свой вопрос. Если это подтвердит ваш первоначальный пост - тогда мне придется еще немного подумать и пересмотреть свой ответ., @st2000

это определенно вывод из кода, я понятия не имею, почему последовательный монитор выводит в формате, как есть. Также могу подтвердить, что min(blue) == 22, но чтобы убедиться, что я уменьшил диапазон с 20 до 10, но результат остался прежним., @DrBwts

@DrBwts — функцию constrain() можно использовать для обеспечения передачи надлежащего диапазона «чисел» в функцию map(): https://www.arduino.cc/reference/en/language/functions /математика/ограничения/, @VE7JRO

Но в коде вы печатаете r, b, g перед тем, как напечатать красную карту, зеленую карту, а затем синюю карту. Кроме того, между ними должно быть 3 строки. Таким образом, порядок, в котором вы печатаете значения в своем вопросе, заставляет читателя думать, что значения r, b и g относятся к следующему набору значений красной карты, зеленой карты и синей карты. Не предыдущие значения красной карты, зеленой карты и синей карты, как вы указываете в своих красных и желтых полях. Я бы попытался снизить значение «минимальной карты от» до нуля, чтобы убедиться. Если проблема не устранена, я бы упростил код и обрабатывал только «синий» ввод POT., @st2000

странно, я изменил код, чтобы получить разумный последовательный вывод, буквально меняющий «\n\n\n» на «\n», и теперь он работает нормально, @DrBwts

Это хорошие новости! Мне нужно будет проверить настройки Arduino, чтобы быть уверенным, но «\n» обычно представляет собой просто возврат каретки, а «\r» — перевод строки. В сочетании они дают вам как возврат к началу строки, так и переход к следующей строке. Но Unix (он же Linus, Android, Solaris и т. д.) и Windows тянут нас быстрее. В Unix предполагается, что «\r» не требуется, в то время как в Windows предполагается, что «\n» не требуется. Смущенный? Почти все были. Таким образом, в последующие десятилетия было написано много программного обеспечения, которое автоматически (плохо) имело дело с этим. Так может быть и с последовательным монитором Arduino., @st2000