Объяснение типа данных в отношении AnalogRead фоторезистора

Это фундаментальный вопрос - очень новый (1-й пост) и пытающийся изучить. У меня есть фотоэлемент, соединенный последовательно с резистором 10 кОм между 5v & Gnd (чтобы сделать делитель напряжения), а разделенное напряжение подключается к A1. В моем коде, когда я указываю тип данных как uint8_t, я получаю значения в диапазоне 200, но когда я меняю тип на uint16_t, значения изменяются на диапазон 1000. Где я должен искать, чтобы понять это поведение?

, 👍1


1 ответ


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

2

Вы должны сохранить его uint16_t.

См.: analogRead.

Он показывает, что возвращаемое значение представляет собой 10-битное число, что означает значение от 0 до 1023.

Если вы используете uint8_t, который представляет собой 8-битное значение, он может хранить только значения от 0 до 255. Это означает, что если значение выше, самые значащие биты обрезаются/удаляются, и у вас остается только модуль значения 256.

При 16-битном значении оставшиеся 6 бит не используются, но это не имеет значения. Он имеет 10 бит, которые вы получаете от функции analogRead. Пример

Предположим, что значение равно 1000 в двоичном формате:

11 1110 1000

Написано в 16 битах (используя uint16_t), переместите его вправо и добавьте к префиксу нули, которые вы получите:

0000 0011 1110 1000

Однако, если вы попытаетесь сохранить это в 8 битах (используя uint8_t), вы получите:

11 1110 1000

Какое значение равно 232 вместо 1000.

Некоторые рекомендации:

  • Всегда используйте тип, который соответствует значению, которое вы хотите сохранить (в худшем случае).
  • Если вы точно знаете, что ваше значение будет неотрицательным, используйте беззнаковый тип (например, uint8_t).
  • Если вы хотите сохранить память (или это является хорошей практикой), используйте значение, которое не обязательно должно быть большим (таким образом, если вы знаете, что значение никогда не будет больше 1023, как в вашем случае, не используйте uint32_t).
,