Требуется помощь, получить давление с датчика BMP 280

Пытаюсь написать программу, требуется давление с датчика BMP 280 при старте ардуино, но я не могу разобраться как это реализовать, моя программа перестаёт работать после объявления переменной/
Вот программа, нужна библиотека Гайвера для BME 280

GyverBME280 bme;
const float press = (bme.readPressure()); //переменная, определяющая начальное давление
void setup() {
  Serial.begin(9600);
  Serial.println("Start");
  
  // запуск датчика и проверка на работоспособность
  if (!bme.begin(0x76)) Serial.println("Error!");
  
}
void loop() {
  // температура
  Serial.print("Temperature: ");
  Serial.println(bme.readTemperature());
  // влажность
  Serial.print("Humidity: ");
  Serial.println(bme.readHumidity());
  // давление
  Serial.print("Pressure: ");
  Serial.println(bme.readPressure());
  // начальное давление
  Serial.print("Start pressure: ");
  Serial.println(press);
  delay(1000);
}

из чего это видно что она нужна, где инклюд?

Так а пошто у гайвера у самого не спросить

Вы прямо при обьявлении переменной в строке 2 пытаетесь читать значения с датчика, который будет проинициализирован только в строке 8 (и еще не известно - успешно ли).
Так нельзя.

В строке два надо оставить только обьявление переменной:

а измерять давление только после запуска датчика в строке 8

Исправление - убрал ошибочное const в обьявлении переменной, иначе ей потом нельзя будет присвоить значение.

#include <GyverBME280.h>
GyverBME280 bme;
volatile float pressure = 0.00;  //переменная, определяющая начальное давление


void setup() {
  Serial.begin(9600);
  Serial.println("Start");
 
  // запуск датчика и проверка на работоспособность
  while(!bme.begin(0x76)) {
    Serial.println("Error!");
    delay(1000);
  }
  
  Serial.println("BME280 is OK");
  pressure = bme.readPressure();
  Serial.println(pressure);
}


void loop() {
  // температура
  Serial.print("Temperature: ");
  Serial.println(bme.readTemperature());
  // влажность
  Serial.print("Humidity: ");
  Serial.println(bme.readHumidity());
  // давление
  Serial.print("Pressure: ");
  Serial.println(bme.readPressure());
  // начальное давление
  Serial.print("Start pressure: ");
  Serial.println(pressure);
  delay(1000);
}

зачем volatile ?

Return из сетапа? - и куда? :slight_smile:

1 лайк

один раз она точно изменится с 0 на значение, а по ретурну тебе видней куда, я жеж не настоящий сталевар
PS тут хорошо GOTO отработает, отправив в вечный пустой цикл видимо

В луп, не?

int main() {
    init();               // Инициализация аппаратных компонентов (таймеры, UART и т. д.)
    setup();              // Вызов пользовательской функции setup()

    while (true) {
        loop();           // Вызов пользовательской функции loop()
        // Если используется Serial, то вызывается yield() для поддержки фоновых задач
    }

    return 0;
}

лучше видимо было бы так:

  // запуск датчика и проверка на работоспособность
  while(!bme.begin(0x76)) {
    Serial.println("Error!");
    delay(1000)
  }
  if (!bme.begin(0x76)) {
    Serial.println("Error!");
    while(1);
  }

Возможно, но только это явно не то, что нужно для случая, когда датчик не найден, а в ЛУПе его пытаются использовать

надо запустить процедуру поиска I2C устройств, найденные адреса проверить на соответствие датчику BME280 и если какой-то адрес соответствует запустить инициализацию с этим адресом, а если устройство не найдено вывести соответствующее предупреждение и варианты устранения неисправности, разве не так?

Как всегда, блин!

ТС не привёл полного кода, не пояснил в чём его проблема (не считать же пояснением вот этот набор слов)

А тут уже пошли какие-то супер-решения и срач по их поводу :slight_smile:

Вроде, только среда.

3 лайка
  1. Тема в Песочницу. Если ТС сам не захочет делать - то место ей в “Ищу исполнителя”. Ну или на крайний случай ЧЧ.
  2. “нужна библиотека Гайвера для BME 280” - А где Вы её подключаете?
  3. Во второй строке Вы объявляете константу (это нормально), но которой присваиваете считанные значения с датчика (напрягитесь), доступность которого (датчика имеется ввиду) проверяете в 8 строке. Ничего не навивает странного???
  4. моя программа перестаёт работать после объявления переменной” - А где у Вас в программе, простите, переменная? Вы бы хоть обозначили оную, потому что я в упор никаких переменных в программе не вижу.

А если извращаться, то надо иначе. Хотя бы

вот так
#include <БИБЛИОТЕКА_ОТ_GYVERA_ТОЧКА_ХЭ>   // Подключаем реальную библиотеку, я просто не знаю как она называется.

GyverBME280 bme;
float press;       //переменная, определяющая начальное давление

void setup() {
  Serial.begin(9600);
  Serial.println("Start");

  // запуск датчика и проверка на работоспособность
  if (!bme.begin(0x76)) {   // Трындец, датчик не отвечает
    Serial.println("Error!");
    while (1) {                 // Уходим в безсознательное и сигнализируем об этом мигаением на 13 пине ардуины (13 пин - это пин на котором у ардуино нано подключен встроенный светодиод)
      pinMode(13, OUTPUT);
      digitalWrite(13, !digitalRead(13));
      delay(300);
    }
  }
  press = bme.readPressure();     // задаём начальное давление
}
void loop() {
  // температура
  Serial.print("Temperature: ");
  Serial.println(bme.readTemperature());
  // влажность
  Serial.print("Humidity: ");
  Serial.println(bme.readHumidity());
  // давление
  Serial.print("Pressure: ");
  Serial.println(bme.readPressure());
  // начальное давление
  Serial.print("Start pressure: ");
  Serial.println(press);
  delay(1000);
}

Воооот…

1 лайк