Suchcode

Anzeige der BMP180-Temperatur als Balkendiagramm auf LCD

Anzeige der BMP180-Temperatur als Balkendiagramm auf LCD

Die Anzeige der Temperatur als Balkendiagramm auf einem LCD-Bildschirm ist eine praktische Möglichkeit, Daten auf einen Blick lesbar zu machen, insbesondere aus der Ferne. Anstatt sich auf einen numerischen Wert zu konzentrieren, bietet ein Balkendiagramm eine sofortige visuelle Darstellung der aktuellen Temperatur im Verhältnis zu einem definierten Maximum. Dieses Projekt kombiniert einen BMP180 Barometer- und Temperatursensor mit einem 16x2 I2C LCD, um eine klare, proportionale Temperaturanzeige zu erstellen. Das Balkendiagramm füllt sich, während die Temperatur steigt, und wenn der Wert Ihr festgelegtes Maximum überschreitet, wechselt die Anzeige zu "Max", um einen Überlauf zu verhindern.

Dieses Setup ist perfekt für eine Vielzahl von Anwendungen, bei denen schnelles visuelles Feedback wichtiger ist als präzise Zahlen:

  • Ein visueller Raumthermometer für ein Zuhause oder Büro.
  • Ein Temperaturmonitor für ein Reptiliengehege oder ein Pflanzenterrarium erstellen.
  • Anzeige der Temperatur von einem 3D-Drucker oder der Steuerplatine einer CNC-Maschine.
  • Eine einfache Wetterstation mit einer übersichtlichen Temperaturanzeige herstellen.
  • Einen visuellen Temperaturmesser zu einem benutzerdefinierten PC-Bau oder einem Audioverstärker hinzufügen.

Dieser Leitfaden führt Sie durch das Verdrahten des Sensors und des Displays, das Konfigurieren des bereitgestellten Codes und das Verständnis, wie Sie ihn für Ihre eigenen Projekte anpassen können. Dieses Tutorial setzt voraus, dass Sie mit den Grundlagen des BMP180-Sensors und des I2C-LCD-Moduls vertraut sind, da es sich auf die Kombination dieser mit einer Balkendiagrammbibliothek konzentriert.

Benötigte Hardware

  • Arduino Uno (oder ähnliche Platine)
  • BMP180 Barometrischer Druck-/Temperatursensor
  • 16x2 LCD mit I2C-Modul
  • Jumperdrähte
  • Steckbrett (optional)

Verdrahtungsanleitung

Dieses Projekt verwendet das I2C-Protokoll sowohl für das LCD als auch für den BMP180-Sensor, was die Verdrahtung erheblich vereinfacht. Beide Geräte sind mit denselben zwei Datenleitungen und Stromschienen verbunden. Die Verdrahtung ist unkompliziert, und die farbcodierten Verbindungen unten entsprechen der Demonstration im Video.

Zuerst verbinden Sie das LCD-Modul. Der I2C-Rucksack auf dem LCD hat vier Pins: VCC, GND, SDA und SCL.

  • LCD VCC(weiße Draht) zu Arduino5V
  • LCD GNDzu ArduinoGND
  • LCD SDA(graues Kabel) zu ArduinoA4(SDA-Pin)
  • LCD SCL(pinke Draht) zu ArduinoA5(SCL-Pin)

Verbinden Sie als Nächstes den BMP180-Sensor. Es ist wichtig zu beachten, dass dieser Sensor an seinem VIN-Pin nicht 5V-tolerant ist und von der 3,3V-Schiene mit Strom versorgt werden muss.

  • BMP180 VIN(graues Kabel) zu Arduino3,3V(WARNUNG: Schließen Sie es nicht an 5V an, da der Sensor beschädigt wird!)
  • BMP180 GND(purpurfarbenes Kabel) zu ArduinoGND
  • BMP180 SDA(grüne Draht) zu ArduinoA4(SDA-Pin)
  • BMP180 SCL(blauer Draht) zum ArduinoA5(SCL-Pin)

Da beide Geräte am gleichen I2C-Bus angeschlossen sind, können Sie ihre SDA- und SCL-Pins mit den gleichen Arduino-Pins (A4 und A5) verbinden.

LCD Bargraph BMP180 LCD1602 wiring

Code-Erklärung

Der Code ist so konzipiert, dass er leicht konfigurierbar ist. Die wichtigsten Einstellungen befinden sich alle oben im Sketch, sodass Sie das Verhalten anpassen können, ohne in die Kernlogik eintauchen zu müssen. Hier sind die Hauptparameter, die Sie ändern können:

#define UNIT 'C' // unit type C for Celsius F for Fahrenheit
#define maxTemperature 40 // is the value in Celsius or Fahrenheit set in line above

Diese beiden Linien steuern die Einheit und den Maßstab Ihres Displays. DieUNITKonstante akzeptiert entweder einen Großbuchstaben'C'für Celsius oder ein Großbuchstabe'F'für Fahrenheit. DiemaxTemperatureWert definiert die obere Grenze Ihres Balkendiagramms. Wenn Sie dies beispielsweise auf50und die Einheit ist Celsius, dann wird 25°C als halb gefüllter Balken erscheinen, und 50°C wird ihn vollständig ausfüllen. Wenn die Temperatur diesen Wert überschreitet, wird die Anzeige "Max" anstelle eines Graphen zeigen. (im Video bei 05:49)

LiquidCrystal_I2C lcd(0x3f,lcdNumCols,lcdLine); //0x3f is address for I2C

Diese Zeile initialisiert das LCD. Die0x3fist die I2C-Adresse Ihres speziellen LCD-Moduls. Diese Adresse kann zwischen den Herstellern variieren. Um Ihre zu finden, können Sie ein I2C-Scanner-Sketch ausführen, das oft in der LCD-Bibliothek enthalten oder online verfügbar ist. Laden Sie einfach den Scanner hoch, öffnen Sie den Serial Monitor, und er wird die Adresse aller angeschlossenen I2C-Geräte anzeigen. (im Video um 07:13)

LcdBarGraphRobojax robojax(&lcd, 16, 0, 0);  // -- creating 16 character long bargraph starting at char 0 of line 0 (see video)

Diese Zeile konfiguriert das Balkendiagramm selbst. Der erste Parameter (&lcd) übergibt eine Referenz auf Ihr LCD-Objekt. Der zweite Parameter (16) ist die Länge des Balkendiagramms in Zeichen. Die dritten und vierten Parameter (0, 0) Definieren Sie die Ausgangsposition: die erste0ist die Spalte (Zeichenposition), und die zweite0ist die Zeile. Um das Diagramm in die zweite Zeile zu platzieren, müssten Sie den letzten Wert auf ändern.1. (im Video um 09:24)

Es gibt auch eine benutzerdefinierte Funktion namensgetTemp()im Code. Diese Funktion übernimmt die Kommunikation mit dem BMP180-Sensor. Sie liest die Temperatur aus und konvertiert sie in Fahrenheit, wenn Sie dies eingestellt haben.UNITzu'F', und gibt den Wert zurück. Wenn der Sensor nicht kommunizieren kann, gibt die Funktion zurück999als Fehlercode, den die Hauptschleife überprüft und eine "Fehler"-Nachricht auf dem LCD anzeigt. (im Video bei 15:31)

Live-Projekt-Demonstration

Im Video wird das Projekt mit einem Heißluftgebläse demonstriert. Wenn das Heißluftgebläse auf den BMP180-Sensor gerichtet wird, steigt die Temperaturanzeige auf dem LCD an. Während die Temperatur steigt, füllt sich das Balkendiagramm visuell proportional. Sobald die Temperatur den definierten Höchstwert (50°C in der Demo) überschreitet, verschwindet das Balkendiagramm und das Display zeigt "Max" zusammen mit der aktuellen Temperaturanzeige an. Sobald die Wärmequelle entfernt wird und die Temperatur wieder unter den Höchstwert fällt, erscheint das Balkendiagramm wieder und funktioniert normal. Dies zeigt deutlich, wie das Diagramm mit der Temperatur skaliert und wie der "Max"-Überlaufschutz funktioniert. (im Video um 17:34)

Sie können die Einheit auch auf Fahrenheit ändern, indem Sie einstellen#define UNIT 'F'und Anpassung dermaxTemperatureentsprechend. Die Demonstration zeigt, dass bei maximal 100°F die Anzeige ebenso effektiv funktioniert und die Temperatur sowie das Balkendiagramm in der ausgewählten Einheit anzeigt.

Kapitel

  • Einführung in die Anzeige der BMP180-Temperatur als Balkendiagramm
  • Warum ein Balkendiagramm zur Anzeige von Temperaturen verwenden?
  • [02:34] Verkabelung des LCD- und BMP180-Sensors
  • [03:34] Erklärung des Codes und der erforderlichen Bibliotheken
  • [07:13] Finden der I2C-Adresse Ihres LCDs
  • [09:24] Konfigurieren der Position und Länge des Balkendiagramms
  • [15:31] Verständnis der Funktion getTemp()
  • [17:34] Live-Demonstration mit einem Heißluftgebläse

Bilder

LCD1602-I2C display module with 4 wires
LCD1602-I2C display module with 4 wires
LCD Bargraph BMP180 LCD1602 wiring
LCD Bargraph BMP180 LCD1602 wiring
BMP180 module 1
BMP180 module 1
BMP180 module 2 back
BMP180 module 2 back
BMP180 module 3 with pin
BMP180 module 3 with pin
195-Display BMP180 temperature as a bar graph on an LCD using Arduino
Sprache: C++
/* Display temperature from BMP180 as bargraph on LCD 
 *  Original Sources: 
 *  BMP180 library from https://www.sparkfun.com/products/11824
 *  LCD library: https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
 *  Bargraph library from https://playground.arduino.cc/Code/LcdBarGraph/
 *  
 *  
 *  Written and updated by Ahmad Shamshiri on June 05, 2019
 *  for Robojax in Ajax, Ontario
  Watch video tutorial for this code: https://youtu.be/0IojNYgDD7U
  If you need the schematic diagram of this circuit, please visit  http://bit.ly/rj-udemy

* Robojax Arduino Course on Udemy where you get the schematic diagram of this sketch 
 * and many other robotics-related lectures and codes. Purchase the course here: http://bit.ly/rj-udemy


- (GND) to GND
+ (VDD) to 3.3V

(WARNING: Do not connect + to 5V or the sensor will be damaged!)

*/

#include <SFE_BMP180.h>
#include <Wire.h>


SFE_BMP180 rjt;// creating object called "rjt" (robojax temperature)
#define UNIT 'C' // unit type C for Celsius F for Fahrenheit
#define maxTemperature 40 // is the value in Celsius or Fahrenheit set in line above

// LCD settings
#include <LiquidCrystal_I2C.h>
byte lcdNumCols = 16; // -- number of columns in the LCD
byte lcdLine = 2; // -- number of lines in the LCD

LiquidCrystal_I2C lcd(0x3f,lcdNumCols,lcdLine); //0x3f is address for I2C
                  // to get I2C address, run I2C Scanner. 
                  //Link is provided (in same page as this code) at http://robojax.com/learn/arduino
// bargraph settings
#include <LcdBarGraphRobojax.h>
LcdBarGraphRobojax robojax(&lcd, 16, 0, 0);  // -- creating 16 character long bargraph starting at char 0 of line 0 (see video)



void setup()
{
  Serial.begin(9600);//initialize serial monitor
 // -- initializing the LCD
  lcd.begin();
  lcd.clear();
  lcd.print("Robojax"); 
   
 
  // Initialize the sensor (it is important to get calibration values stored on the device).

  if (rjt.begin())
  {
   lcd.setCursor (0,1); //  
    lcd.print("BMP180 Bargraph");  
  }else {
    lcd.setCursor (0,1); //  
    lcd.print("BMP180 Failed"); 
    while(1); // Pause forever.
  }
  // -- give use some time to read the text above
  delay(2000);
  lcd.clear();  
}// setup

void loop()
{
 // Robojax BMP180 Bargraph main loop

 robojax.clearLine(1);// clear line 1 to display fresh temperature
 float T = getTemp();// get the temperature
 float Tgraph=T;
 if(T !=999){
     if( Tgraph > maxTemperature){   
        Tgraph =0;
     }
        robojax.drawValue( Tgraph, maxTemperature);// draw the bargraph     
      // Print out the measurement:
      Serial.print("temperature: ");
      Serial.print(T,2);


      lcd.setCursor (0,1); //
      if(T< maxTemperature){       
       lcd.print("Temp.:"); 
      }else{
       lcd.print("Max.:"); 
      }
      lcd.setCursor (7,1); //
      lcd.print(T); // print  
      lcd.print((char)223);// prints degree symbol
      if(UNIT =='C'){
        lcd.print("C");//
        Serial.println(" deg C");         
      }else{
        lcd.print("F");
        Serial.println(" deg F");         
      }
      
   



  }else{
    Serial.print("Status error");
      lcd.setCursor (0,1); //
      lcd.print("Error ");     
  }

delay(500);
}


/*
 * 
 * @brief gets the temperature in Celsius or Fahrenheit
 * @param unit, should be capital C or capital F, C=Celsius F=Fahrenheit
 * @return temperature in Celsius or Fahrenheit
 * Written by Ahmad Shamshiri for Robojax.com 
 * on Wednesday, June 5th, 2019 at 22:30 in Ajax, Ontario, Canada
 * 
 */
 ////////////////////////////////////////////
double getTemp(){
    char status;
  double Temp,newTemp;
 
status = rjt.startTemperature();
  if (status != 0)
  {
    // Wait for the measurement to complete:
    delay(status);

    // Retrieve the completed temperature measurement:
    // Note that the measurement is stored in the variable T.
    // Function returns 1 if successful, 0 if failure.

    status = rjt.getTemperature(Temp);
    if (status != 0)
    {  
      if (UNIT =='F')
      {
        newTemp = (9.0/5.0)*Temp+32.0;// convert to degrees Fahrenheit
      }else{
        newTemp = Temp;// keeps degree Celsius
      }
    }
    return newTemp;    
  }else{
    return 999;// if error, then return 999
  }
}//getTemp/////////////////////////////

Dinge, die Sie vielleicht brauchen

Ressourcen & Referenzen

Dateien📁

Arduino-Bibliotheken (zip)