Непонятка с глобальными переменными

Тема в разделе "Arduino & Shields", создана пользователем 5diezov, 15 янв 2019.

  1. 5diezov

    5diezov Нерд

    Есть два датчика BH1750, BMP085.
    Вот BMP085 нормально работает с глобальными переменными объявленными в начале кода.
    А BH1750 показывает 0, при том что если локально объявить, то все в порядке.
    В чем загвоздка?
    Заранее спасибо.
    Код (C++):
    #include <BMP085.h>
    #include <Wire.h>
    #include <BH1750.h>

    BH1750 lightMeter;

    long t_bmp = 0, p_bmp = 0, alt = 0;
    int lux;

    void setup()
    {
    }

    void loop()
    {
    test();
    bmp();
    lightm();
    delay(2000);
    }

    void bmp()
    {
      BMP085 dps = BMP085();
      dps.init(MODE_ULTRA_HIGHRES, 1000, true);

      dps.getTemperature(&t_bmp);
      dps.getPressure(&p_bmp);
      dps.getAltitude(&alt);
      }


    void lightm(){
         lightMeter.begin();
         uint16_t lux = lightMeter.readLightLevel();
    }
     

    void test() {
    Serial.begin(9600);

    Serial.print("t_bmp:");
    Serial.println(t_bmp);
    Serial.print("pres:");
    Serial.println(p_bmp);
    Serial.print("alt:");
    Serial.println(alt);
    Serial.print("Light: ");
    Serial.print(lux);
    Serial.println(" lx");
    }
     
     
  2. DetSimen

    DetSimen Guest

    uint16_t тут лишнее
     
    Airbus и 5diezov нравится это.
  3. 5diezov

    5diezov Нерд

    Пребольшущее спасибо.
    все заработало.
     
  4. DetSimen

    DetSimen Guest

    А сможешь обьяснить, почему? Если понял...
    Пацкаска: "область видимости переменных С"
     
    Последнее редактирование модератором: 15 янв 2019
    5diezov, Asper Daffy и Vovka нравится это.
  5. parovoZZ

    parovoZZ Гуру

    не знает он, что локальные переменные "перебивают" глобальные.
     
    Airbus нравится это.
  6. 5diezov

    5diezov Нерд

    Такс, объяснить не смогу, но с удовольствием послушаю в чем дело.
    По поводу области видимости, переменная же объявляется у меня один раз:
    Код (C++):
    long t_bmp = 0, p_bmp = 0, alt = 0;
    int lux;
    А проблема с uint16_t, и переменная же не объявляется а используется глобальная:
    Код (C++):
    uint16_t lux = lightMeter.readLightLevel();
    В общем не знаю я.
     
  7. 5diezov

    5diezov Нерд

    все понял, перечитывая свое же сообщение))
    uint16_t - это и есть объявление переменной int, только с заданной шириной.
    Спасибочки.
     
  8. parovoZZ

    parovoZZ Гуру

    В каждой функции можешь объявить свою переменную
    и это будут абсолютно независимые переменные с одним лишь свойством - при выходе из тела функции переменная будет уничтожена.
     
    Airbus нравится это.
  9. Airbus

    Airbus Радиохулиган Модератор

    Код (C++):
    long t_bmp = 0, p_bmp = 0, alt = 0;
    int lux;
    А long обязательно?
     
  10. Vovka

    Vovka Гик

  11. parovoZZ

    parovoZZ Гуру

    а это чтобы восьмибитке не скучно было байты прожевывать.
     
    DetSimen и Vovka нравится это.
  12. Asper Daffy

    Asper Daffy Иксперд

    Размер имеет значение! Не верь тому, кто говорит, что нет!