Как правильно снимать данные с термометра?

Тема в разделе "Arduino & Shields", создана пользователем abrikos, 13 июн 2013.

  1. abrikos

    abrikos Нерд

    Термометр
    https://amperka.ru/product/thermometer-lm35
    В коде считываю данные (код с сайта производителя)
    Код (C):

        int val=analogRead(5);//Connect LM35 on Analog 5
        int temperatureC=(500*val)>>10;
     
    Проблема: если val становится 66, то temperatureC уходит в отрицательное значение (-32)
    До значения val=65 все нормально temperatureC = +31, дальше абсолютное значение температуры верное, но с отрицательным знаком.
    Можно ли значение в цельсиях получать как-нибудь иначе чем сдвигом?
    Честно говоря не совсем понимаю работу сдвига (как он в отрицательные значения уводит) и смысл его применения в данном случае.
     
  2. HighDigital

    HighDigital Гик

    Скиньте весь код целиком, для удобства, поместите его в тег
    Код (C):
     
     
  3. Mitrandir

    Mitrandir Гуру

    500*66 = 33 000

    максисальный инт 32 767
    соответственно происходит переполнение

    33 000 в двоичной системе:
    1000 0000 1110 1000

    так как старший бит равен 1 то ты получаешь отрицательное значение
    затем отрицательное значение двигаешь на 10 позиций, как я понял из поведения операция сдвига не затронула знаковый бит

    попробуй unsigned int использовать

    с 65 получилось так как 65 * 500 = 32 500
    0111 1110 1111 0100
    и данные нормально сдвинулись
     
    Megakoteyka, HighDigital и roggedhorse нравится это.
  4. Mitrandir

    Mitrandir Гуру

    когда мы сдвигаем знаковое целое вправо, и знаковый бит введен, то старшие биты заполняются 1
    т.е.

    1000 0000 1110 1000 >> 10 = 1111 1111 1110 0000 = -16 368