BMP280, похоже, показывает странные показания давления.

Я подключил UNO к BMP280, и он отправляет показания через ESP-01 в ThingsSpeak, и кажется, все работает нормально, но мои показания давления кажутся немного странными.

Для ясности: любые неизмененные показания давления составляют около 35 000.

Насколько я понял, это в паскале, что немного странно, потому что ожидаемое значение паскаля должно быть около 100 000

Использованный код приведен ниже, что мне не хватает? Или показания в порядке?

Схема подключения и код, используемые ниже: схема подключения

    //Ключ канала ThingSpeak
String statusChWriteKey = "asd";

//Основные включает
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <SoftwareSerial.h>
SoftwareSerial EspSerial(6, 7); // Прием, Передача
#define HARDWARE_RESET 8

#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11 
#define BMP_CS 10

Adafruit_BMP280 bme; // I2C


int temperature = 0;
int pressure = 0;
int altitude = 0;


// Переменные, которые будут использоваться с таймерами
long writeTimingSeconds = 17; // ==> Определите время выборки в секундах для отправки данных
long startWriteTiming = 0;
long elapsedWriteTime = 0;

int spare = 0;
boolean error;

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

  pinMode(HARDWARE_RESET,OUTPUT);

  digitalWrite(HARDWARE_RESET, HIGH);

  Serial.println(F("BMP280 test"));

  if (!bme.begin()) {  
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    while (1);
  }

  EspSerial.begin(9600); // Связь с модулем Wi-Fi
  EspHardwareReset(); //Сброс по модулю WiFi
  startWriteTiming = millis(); // запускаем "программные часы"


}

void loop()
{

  start: //метка
  error=0;

  elapsedWriteTime = millis()-startWriteTiming; 

  if (elapsedWriteTime > (writeTimingSeconds*1000)) 
  {
    readSensors();
    writeThingSpeak();
    startWriteTiming = millis();   
  }

  if (error==1) //Повторно отправить, если передача не завершена
  {       
    Serial.println(" <<<< ERROR >>>>");
    delay (2000);  
    goto start; //переходим к метке «старт»
  }
}

/********* Read Sensors value *************/
void readSensors(void)
{
  temperature = bme.readTemperature();
  pressure = bme.readPressure();
  altitude = bme.readAltitude(1013.25);

}

/********* Conexao com TCP com Thingspeak *******/
void writeThingSpeak(void)
{

  startThingSpeakCmd();

  String getStr = "GET /update?api_key=";
  getStr += statusChWriteKey;
  getStr +="&field1=";
  getStr += String(temperature);
  getStr +="&field2=";
  getStr += String(pressure);
  getStr +="&field3=";
  getStr += String(altitude);
  getStr +="&field4=";
  getStr += String(spare);
  getStr += "\r\n\r\n";

  sendThingSpeakGetCmd(getStr); 
}

/********* Reset ESP *************/
void EspHardwareReset(void)
{
  Serial.println("Reseting......."); 
  digitalWrite(HARDWARE_RESET, LOW); 
  delay(500);
  digitalWrite(HARDWARE_RESET, HIGH);
  delay(8000);//Необходимый темп, чтобы прийти к нему
  Serial.println("RESET"); 
}

/********* Start communication with ThingSpeak*************/
void startThingSpeakCmd(void)
{
  EspSerial.flush();//освобождение буфера перед загрузкой

  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += "184.106.153.149"; // Endereco IP-адрес api.thingspeak.com
  cmd += "\",80";
  EspSerial.println(cmd);
  Serial.print("sent ==> Start cmd: ");
  Serial.println(cmd);

  if(EspSerial.find("Error"))
  {
    Serial.println("AT+CIPSTART error");
    return;
  }
}

/********* send a GET cmd to ThingSpeak *************/
String sendThingSpeakGetCmd(String getStr)
{
  String cmd = "AT+CIPSEND=";
  cmd += String(getStr.length());
  EspSerial.println(cmd);
  Serial.print("sent ==> lenght cmd: ");
  Serial.println(cmd);

  if(EspSerial.find((char *)">"))
  {
    EspSerial.print(getStr);
    Serial.print("sent ==> getStr: ");
    Serial.println(getStr);
    delay(500);//темп для обработки или GET, кажется, что задержка в настоящее время занята, но не приближается к команде

    String messageBody = "";
    while (EspSerial.available()) 
    {
      String line = EspSerial.readStringUntil('\n');
      if (line.length() == 1) 
      { //фактическое содержимое начинается после пустой строки (длина которой равна 1)
        messageBody = EspSerial.readStringUntil('\n');
      }
    }
    Serial.print("MessageBody received: ");
    Serial.println(messageBody);
    return messageBody;
  }
  else
  {
    EspSerial.println("AT+CIPCLOSE");     // оповещение пользователя
    Serial.println("ESP8266 CIPSEND ERROR: RESENDING"); //Отправить...
    spare = spare + 1;
    error=1;
    return "error";
  } 
}

, 👍0

Обсуждение

В технических характеристиках указано, что значение указано в гПа (гектопаскалях) ...... примечание: я только что проверил https://www.wunderground.com/, и там сообщается, что атмосферное давление в моем районе составляет 950,9 гПа. (что составляет 95090 Па), @jsotola

для начала протестируйте датчик, удалив весь код, не имеющий никакого отношения к считыванию датчика, и распечатайте необработанные показания датчика., @jsotola

Я сделал это, загрузил базовый эскиз примера в uno, который поставляется с библиотекой BMP280, без каких-либо преобразований он выводит измеренные данные и дает значения между 34.000 и 35.000. так что я думаю, что это не проблема с проводкой, но подозреваю, что неисправен чип, @mee


1 ответ


1

Похоже, вы смотрите на поле 3 в Thingspeak вместо поля 2...Вот почему:

Вы живете на небольшой высоте? Вот почему я задаю этот вопрос.

Это заявление:

давление = bmp.readPressure();

возвращает давление в паскалях (уровень моря составляет 101325 паскалей) из BMP280 и присваивает его переменной давления.

Чтобы получить давление в мб, необходимо разделить на 100 (мб = 1 гПа или 100 Паскалей). Если вы ожидаете значение 100 (кПа?), возможно, это означает, что вы живете недалеко от уровня моря... возможно, на высоте около 100 футов (35 м) или около того.

Если это так, то утверждение:

высота = bmp.readAltitude(1013.25);

который в конечном итоге передает в поле Thingspeak 3 расчетную высоту в метрах (в данном случае около 35 метров). Проверьте и убедитесь, что вы смотрите на поле 2 прибора Thingspeak, а не на поле 3 для показаний давления.

Если вы хотите увидеть давление в МБ, измените строку, в которой отображается давление с BME280, на следующую:

давление = bmp.readPressure()/100;

,