Szukaj kodu

Lekcja 96-4: Czujnik ciśnienia barometrycznego, temperatury i przybliżonej wysokości BMP390 z Arduino jako termostat

Lekcja 96-4: Czujnik ciśnienia barometrycznego, temperatury i przybliżonej wysokości BMP390 z Arduino jako termostat

Ten poradnik pokazuje, jak zbudować inteligentny termostat z wykorzystaniem czujnika ciśnienia barometrycznego, temperatury i przybliżonej wysokości BMP390 z Arduino. BMP390 to bardzo precyzyjny czujnik firmy Bosch, który może mierzyć temperaturę, ciśnienie i obliczać przybliżoną wysokość na podstawie ciśnienia na poziomie morza. W tym projekcie użyjemy go do sterowania przekaźnikiem, który może włączać i wyłączać grzejnik lub chłodnicę w zależności od progów temperatury, tworząc w pełni funkcjonalny system termostatu.

BMP380_pink-module-gravitiy-1
BMP380_pink-module-1

Ten projekt ma kilka praktycznych zastosowań, w tym:

  • Tworzenie inteligentnego termostatu domowego w celu utrzymania komfortowej temperatury w pomieszczeniu
  • Budowa systemu wentylacji szklarni sterowanego temperaturą
  • Ochrona wrażliwej elektroniki przed przegrzaniem
  • Sterowanie inkubatorem dla jaj lub gadów
  • Monitorowanie i regulacja temperatury w piwnicy na wino lub magazynie
BMP380_pink-module-3-size

Wymagany sprzęt

  • Arduino Uno (lub kompatybilna płyta)
  • Moduł czujnika ciśnienia barometrycznego BMP390
  • Moduł przekaźnika (do sterowania grzejnikiem/chłodnicą)
  • Urządzenie grzewcze lub chłodzące do sterowania
  • Przewody połączeniowe
  • Płytka stykowa (opcjonalnie)

Zrozumienie czujnika BMP390

BMP390 to bardzo precyzyjny czujnik ciśnienia barometrycznego produkowany przez firmę Bosch. Sam czujnik mierzy zaledwie 2mm x 2mm x 0,75mm, co czyni go niezwykle kompaktowym. Płytka breakout, której użyjesz, zawiera wszystkie niezbędne elementy pomocnicze, takie jak rezystory podciągające, regulator napięcia i konwerter poziomów logicznych, co pozwala zasilać go napięciem 3,3 V lub 5 V (na filmie o 01:44).

Czujnik może mierzyć ciśnienie od 300 do 1250 hektopaskali z dokładnością bezwzględną ±0,5 hPa w zakresie od 0 do 65 stopni Celsjusza. Jego dokładność względna jest jeszcze lepsza i wynosi ±0,03 hPa, co przekłada się na około ±25 centymetrów różnicy wysokości. Czujnik ma również maksymalną częstotliwość próbkowania 200 Hz, co czyni go odpowiednim do zastosowań wymagających szybkich odczytów (na filmie o 04:10).

Schemat połączeń

BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-2

Podłączenie BMP390 do Arduino jest proste dzięki interfejsowi I2C, który wymaga tylko dwóch przewodów do komunikacji danych oraz połączeń zasilania. Pin VIN czujnika łączy się z 5 V (lub 3,3 V) na Arduino, masa łączy się z masą, SCL łączy się z pinem SCL (A5 na Uno), a SDA łączy się z pinem SDA (A4 na Uno) (na filmie o 05:45).

W przypadku modułu przekaźnika podłączysz jego pin sterujący do pinu cyfrowego 8 na Arduino, VCC do 5 V, a masę do masy. Urządzenie, które chcesz kontrolować (grzejnik lub chłodnica), podłączasz do zacisków wyjściowych przekaźnika.

Unikalną cechą tego projektu jest to, że kod definiuje pin 12 jako wyjście zasilania dla modułu BMP390. Oznacza to, że możesz zasilać czujnik bezpośrednio z pinu Arduino bez potrzeby stosowania osobnej szyny zasilającej na płytce stykowej (na filmie o 08:46). Kod ustawia ten pin w stan wysoki w sekcji setup, aby zapewnić 5 V dla czujnika.

Instalacja wymaganych bibliotek

Przed wgraniem kodu musisz zainstalować bibliotekę Adafruit BMP3XX. Otwórz Arduino IDE, przejdź do Szkic → Dołącz bibliotekę → Zarządzaj bibliotekami, wyszukaj „Adafruit BMP3XX” i kliknij Zainstaluj (na filmie o 10:29). Ta biblioteka obsługuje całą komunikację niskiego poziomu z czujnikiem BMP390.

Wyjaśnienie kodu

Kod tego projektu termostatu został zaprojektowany tak, aby był w dużym stopniu konfigurowalny. Przyjrzyjmy się kluczowym ustawieniom konfigurowalnym przez użytkownika na początku programu.

Definicje pinów

Możesz zmienić, które piny Arduino są używane do zasilania czujnika i sterowania przekaźnikiem:

int bmpVCCPin = 12;//zdefiniuj pin 12 jako VCC dla czujnika bmp
const int relayPin = 8;

bmpVCCPin zapewnia zasilanie 5 V dla modułu BMP390. relayPin steruje modułem przekaźnika, który przełącza grzejnik lub chłodnicę.

BMP288-1
BMP380_pink-module-gravitiy-1

Ustawienia termostatu

Te stałe definiują sposób działania termostatu:

const int TEMPERATURE_UNIT = 1;//1=Celsjusz, 2=Fahrenheit, 3=Kelwin
const float START_TEMPERATURE = 32.0;//jednostka powyżej
const float STOP_TEMPERATURE = 45.0;//jednostka powyżej
const int CONTROL_TYPE = 2;// 1= grzejnik, 2=chłodnica
  • TEMPERATURE_UNIT: Ustawia skalę temperatury. Użyj 1 dla Celsjusza, 2 dla Fahrenheita lub 3 dla Kelwina.
  • START_TEMPERATURE: Temperatura, przy której przekaźnik włącza się (w trybie grzania) lub wyłącza (w trybie chłodzenia).
  • STOP_TEMPERATURE: Temperatura, przy której przekaźnik wyłącza się (w trybie grzania) lub włącza (w trybie chłodzenia).
  • CONTROL_TYPE: Ustaw na 1 dla sterowania grzałką (włącza się, gdy jest zimno) lub 2 dla sterowania chłodzeniem (włącza się, gdy jest gorąco).

Na przykład w demonstracji temperatura startowa jest ustawiona na 30°C, a stop na 45°C, aby można było szybko przetestować zachowanie za pomocą opalarki. W rzeczywistym zastosowaniu ustawiłbyś je bliżej siebie, np. 20°C i 23°C, aby utrzymać komfortową temperaturę w pomieszczeniu (na wideo w 30:07).

Funkcje niestandardowe

Kod zawiera kilka funkcji niestandardowych, których możesz używać i modyfikować:

  • loadControl(): Ta funkcja implementuje logikę termostatu. Porównuje bieżącą temperaturę z progami START i STOP oraz wywołuje relayControl() odpowiednio. Zachowanie zmienia się w zależności od tego, czy ustawisz CONTROL_TYPE na 1 (grzałka) czy 2 (chłodzenie).
  • relayControl(int state): Ta funkcja włącza lub wyłącza przekaźnik i wypisuje status na monitorze szeregowym. Przekaż jej relayON lub relayOFF.
  • readValues(): Ta funkcja odczytuje czujnik i zapisuje temperaturę, ciśnienie i wysokość w zmiennych globalnych. Automatycznie konwertuje temperaturę na wybraną jednostkę.
  • printTemperature(): Ta funkcja wypisuje odczyt temperatury z odpowiednim symbolem jednostki na monitorze szeregowym.

Jak działa termostat

Logika termostatu działa poprzez porównywanie bieżącej temperatury z skonfigurowanymi progami. W trybie grzania (CONTROL_TYPE = 1), gdy temperatura spadnie do lub poniżej START_TEMPERATURE, przekaźnik włącza się, aby aktywować urządzenie grzewcze. Grzałka pozostaje włączona, dopóki temperatura nie wzrośnie do STOP_TEMPERATURE, przy którym przekaźnik się wyłącza. Tworzy to efekt histerezy, który zapobiega szybkiemu włączaniu i wyłączaniu (na wideo w 31:04).

W trybie chłodzenia (CONTROL_TYPE = 2) logika jest odwrócona. Przekaźnik włącza się, gdy temperatura osiągnie lub przekroczy STOP_TEMPERATURE, a wyłącza się, gdy spadnie z powrotem do START_TEMPERATURE.

Demonstracja na wideo pokazuje to działające z opalarką. Gdy temperatura osiągnęła 45°C, przekaźnik wyłączył się, a dioda wskaźnikowa zgasła. Po ochłodzeniu do 30°C przekaźnik aktywował się ponownie, aby włączyć grzałkę (na wideo w 31:53).

Demonstracja projektu na żywo

Wideo zawiera praktyczny test wysokości BMP390. Prowadzący zabrał czujnik do miejsca w Ajax, Ontario, Kanada, i zmierzył wysokość na poziomie gruntu w pobliżu lodowiska. Czujnik początkowo odczytał około -15 metrów, co reprezentuje różnicę między lokalną kalibracją ciśnienia na poziomie morza a rzeczywistą wysokością tego miejsca (na wideo w 33:04).

Zabierając czujnik na 25. piętro pobliskiego budynku, odczyt zmienił się na około 57,2 metra. Różnica około 72 metrów między parterem a 25. piętrem pokazuje zdolność czujnika do wykrywania znaczących zmian wysokości. Ten test potwierdza przydatność BMP390 do zastosowań wymagających monitorowania wysokości (na wideo w 36:16).

Demonstracja termostatu pokazuje przekaźnik wyłączający się, gdy temperatura przekroczyła próg stop 45°C, a dioda wskaźnikowa zgasła. Po ochłodzeniu czujnika z powrotem poniżej 30°C, przekaźnik aktywował się ponownie, demonstrując niezawodne sterowanie temperaturą oparte na histerezie (na wideo w 31:04).

Powiązane projekty z tego wideo

Rozdziały

  • [00:00] Wprowadzenie do projektu z czujnikiem BMP390
  • [01:19] Zrozumienie specyfikacji czujnika BMP390
  • [05:45] Schemat połączeń BMP390 z Arduino Uno
  • [10:29] Instalacja biblioteki Adafruit BMP3XX
  • [11:38] Wyjaśnienie kodu do podstawowego odczytu czujnika
  • [15:51] Dodanie sterowania przekaźnikiem do pracy termostatu
  • [17:30] Konfiguracja wyświetlacza LCD (opcjonalnie)
  • [22:52] Wyświetlanie ciśnienia i wysokości na LCD
  • [30:07] Demonstracja termostatu z opalarką
  • [32:12] Test wysokości na 25. piętrze

Obrazy

BMP288-1
BMP288-1
BMP380_pink-module-4
BMP380_pink-module-4
BMP380_pink-module-3-size
BMP380_pink-module-3-size
BMP380_pink-module-2
BMP380_pink-module-2
BMP380_pink-module-1
BMP380_pink-module-1
BMP380_pink-module-gravitiy-1
BMP380_pink-module-gravitiy-1
BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-2
BMP390_arduino_wiring_pink-2
437-Lesson 96-4: Using BMP390 as thermostat (heater or cooler)
Język: C++
/*
 * Lesson 96: Using BMP390  as  thermostat
 * with Arduino using it as a Thermostat to control a heater or cooler
 * Download and resource page https://robojax.com/RJT457

 * Watch video instruction on YouTube:  https://youtu.be/XevQYG_A5xA
 * 
 * Code updated by Ahmad Shamshiri for Robojax.com
 * on Jan 13, 2022 at 17:10 in Ajax, Ontario, Canada
  
  This video is part of the Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
 

If you found this tutorial helpful, please support me so I can continue creating content like this
and make a donation using PayPal http://robojax.com/L/?id=64


  This is a library for the BMP390 temperature & pressure sensor

  Designed specifically to work with the Adafruit BMP388 Breakout
  ----> http://www.adafruit.com/products/3966

  These sensors use I2C or SPI to communicate; 2 or 4 pins are required
  to interface.

  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing products
  from Adafruit!

  Written by Limor Fried & Kevin Townsend for Adafruit Industries.
  BSD license, all text above must be included in any redistribution
 **************************************************************************
 */
#include <Wire.h>

#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"


#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BMP3XX bmp;
int bmpVCCPin = 12;//define pin 12 as VCC for bmp sensor

// all thermostat settings

const int relayPin =8;
const int relayON = HIGH;// 
const int relayOFF = LOW; //
int relayState = relayOFF;//initial state of relay

const int TEMPERATURE_UNIT =1;//1=Celsius, 2=Fahrenheit, 3=Kelvin
const float START_TEMPERATURE = 32.0;//unit above
const float STOP_TEMPERATURE = 45.0;//unit above
const int CONTROL_TYPE = 2;// 1= heater, 2=cooler

//do not change the line below
float temperature, pressure, altitude;



void setup() {
  Serial.begin(9600);
  while (!Serial);
  Serial.println("Adafruit BMP388 / BMP390 test");

  pinMode(bmpVCCPin, OUTPUT);// set pin as output
  digitalWrite(bmpVCCPin,HIGH);// always keep it high (5V) for BMB390 module
  delay(500);//wait for the bmpVCCPin to turn ON.    

  
  pinMode(relayPin, OUTPUT);//pin for relay
  digitalWrite(relayPin, relayState);//change initial state of relay


  if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire
  Serial.println("Could not find a valid BMP3 sensor, check wiring!");
    while (1);
  }

  // Set up oversampling and filter initialization
  bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
  bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
  bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
  bmp.setOutputDataRate(BMP3_ODR_50_HZ);


  
  
}

void loop() {
  if (! bmp.performReading()) {
    Serial.println("Failed to perform reading :(");
    return;
  }
    readValues();
    printTemperature();

  Serial.println();
   loadControl(); 

   //do extra action if temperature is greater than 89.5
   if(temperature >=89.5)
   {
    ///and your code here
   }
  delay(2000);//wait 2 seconds or make is less or more
}



/*
 * loadControl()
 * @brief controls the load based 
 * @param state can be either : relayON or relayOFF

 * @return returns none
 * Written by Ahmad Shamshiri for robojax.com
 * on Jan 15, 2022 at 08:11 in Ajax, Ontario, Canada
 */
void loadControl()
{
//Robojax.com heater/cooler with BMP390 Thermocoupler  
     // Serial.print("Start: ");
     // Serial.print(START_TEMPERATURE);
     // Serial.print(" Stop: ");
      //Serial.println(STOP_TEMPERATURE);      
  if(CONTROL_TYPE ==1)
  {
    if(START_TEMPERATURE >= temperature && STOP_TEMPERATURE >=temperature)
    {
      relayControl(relayON);
    }
    if(STOP_TEMPERATURE <=temperature)
    {
      relayControl(relayOFF);
    }
  }else{
    if(START_TEMPERATURE >= temperature && STOP_TEMPERATURE >=temperature)
    {
      relayControl(relayOFF);
    }
    if(STOP_TEMPERATURE <=temperature)
    {
      relayControl(relayON);
    }
  }
    
//Robojax.com heater/cooler with BMP390 Thermocoupler
}//loadControl()


/*
 * relayControl(int state))
 * @brief turns the relay ON or OFF
 * @param state is "relayON" or "relayOFF" defined at the top of the code
 * @return returns none
 * Written by Ahmad Shamshiri for robojax.com
 * on May 20, 2020 at 15:23 in Ajax, Ontario, Canada
 */
void relayControl(int state)
{
  //Robojax.com heater/cooler with BMP390 Thermocoupler
  if(state ==relayON)
  {
    digitalWrite(relayPin, relayON);
    Serial.println("Relay ON");   
  }else{
   digitalWrite(relayPin, relayOFF);    
    Serial.println("Relay OFF");   
  }
  //Robojax.com heater/cooler with BMP390 Thermocoupler  

}//relayControl()


/*
 *  readValues()
 * @brief reads the temperature based on the TEMPERATURE_UNIT
 * @param average temperature

 * @return returns one of the values above
 * Written by Ahmad Shamshiri for robojax.com
 * on Jan 15, 2022 at 08:02 in Ajax, Ontario, Canada
 */
void readValues()
{
 //Robojax.com heater/cooler with BMP390 Thermocoupler 

  altitude =  bmp.readAltitude(SEALEVELPRESSURE_HPA);// read altitude
  pressure = bmp.pressure / 100.0F; // get  pressure in hecto pascal
  
  
  if(TEMPERATURE_UNIT ==2)
   {
   temperature = bmp.temperature *9/5 + 32;//convert to Fahrenheit 
   }else if(TEMPERATURE_UNIT ==3)
   {
    temperature = bmp.temperature + 273.15;//convert to Kelvin
   }else{
    temperature = bmp.temperature;// return Celsius
   }    
 //Robojax.com heater/cooler with BMP390 Thermocoupler 
}// readValues()


/*
 * printTemperature()
 * @brief prints  temperature on serial monitor
 * @param character type
 * @param "type" is character
 *     C = Celsius
 *     K = Kelvin
 *     F = Fahrenheit
 * @return none
 * Written by Ahmad Shamshiri for robojax.com
 * on Jan 15, 2022 at 08:09 in Ajax, Ontario, Canada
 * www.Robojax.com
 */
void printTemperature()
{
//Robojax.com heater/cooler with BMP390 Thermocoupler
   Serial.print(temperature);
    printDegree();    
  if(TEMPERATURE_UNIT ==2)
   {
     Serial.print("F");
    }else if(TEMPERATURE_UNIT ==3)
   {
     Serial.print("K");
   }else{
     Serial.print("C");
   }    
  Serial.println();
//Robojax.com heater/cooler with BMP390 Thermocoupler  
}//printTemperature()

/*
 * @brief prints degree symbol on serial monitor
 * @param none
 * @return returns nothing
 * Written by Ahmad Shamshiri on July 13, 2019
 * for Robojax Tutorial Robojax.com
 */
void printDegree()
{
    Serial.print("\\xC2"); 
    Serial.print("\\xB0");  
}

Rzeczy, których możesz potrzebować

Zasoby i odniesienia

Pliki📁

Karta katalogowa (pdf)