Cerca codice

Visualizzazione della temperatura BMP180 come un grafico a barre su LCD

Visualizzazione della temperatura BMP180 come un grafico a barre su LCD

Visualizzare la temperatura come un grafico a barre su uno schermo LCD è un modo pratico per rendere i dati leggibili a colpo d'occhio, soprattutto da lontano. Invece di socchiudere gli occhi per vedere un valore numerico, un grafico a barre fornisce una rappresentazione visiva immediata della temperatura attuale rispetto a un massimo definito. Questo progetto combina un sensore di pressione barometrica e temperatura BMP180 con un LCD I2C 16x2 per creare un chiaro display della temperatura proporzionale. Il grafico a barre si riempie man mano che la temperatura aumenta e, quando la lettura supera il massimo impostato, il display cambia per mostrare "Max" per prevenire il sovraccarico.

Questa configurazione è perfetta per una varietà di applicazioni in cui un rapido feedback visivo è più importante dei numeri precisi:

  • Costruire un termometro visivo per una casa o un ufficio.
  • Creare un monitor di temperatura per un terrario di rettili o piante.
  • Visualizzazione della temperatura della scheda di controllo di una stampante 3D o di una macchina CNC.
  • Costruire una semplice stazione meteorologica con un indicatore della temperatura a colpo d'occhio.
  • Aggiungere un indicatore di temperatura visivo a un PC personalizzato o amplificatore audio.

Questa guida ti accompagnerà nel cablaggio del sensore e del display, nella configurazione del codice fornito e nella comprensione di come personalizzarlo per i tuoi progetti. Questo tutorial presuppone che tu abbia familiarità con le basi del sensore BMP180 e del modulo LCD I2C, poiché si concentra sulla loro combinazione con una libreria per grafici a barre.

Hardware richiesto

  • Arduino Uno (o scheda simile)
  • Sensore di pressione/temperatura barometrica BMP180
  • LCD 16x2 con modulo I2C
  • Cavi jumper
  • Breadboard (opzionale)

Guida all'impianto elettrico

Questo progetto utilizza il protocollo I2C sia per il LCD che per il sensore BMP180, il che semplifica notevolmente il cablaggio. Entrambi i dispositivi si collegano alle stesse due linee di dati e ai binari di alimentazione. Il cablaggio è semplice e le connessioni codificate a colori riportate di seguito corrispondono alla dimostrazione nel video.

Per prima cosa, collega il modulo LCD. Il circuito I2C sul LCD ha quattro pin: VCC, GND, SDA e SCL.

  • LCD VCC(cavo bianco) a Arduino5V
  • LCD GNDa ArduinoGND
  • LCD SDA(cavo grigio) ad ArduinoA4(pin SDA)
  • LCD SCL(cavo rosa) all'ArduinoA5(SCL pin)

Successivamente, collega il sensore BMP180. È fondamentale notare che questo sensore non è tollerante a 5V sul suo pin VIN e deve essere alimentato dalla linea a 3.3V.

  • BMP180 VINcavo grigio a Arduino3.3V(ATTENZIONE: Non collegare a 5V o il sensore verrà danneggiato!)
  • BMP180 GNDcavo viola) all'ArduinoGND
  • BMP180 SDA(filo verde) a ArduinoA4(pin SDA)
  • BMP180 SCL(che fio blu) a ArduinoA5(Pin SCL)

Poiché entrambi i dispositivi sono sulla stessa linea I2C, puoi collegare i loro pin SDA e SCL agli stessi pin di Arduino (A4 e A5, rispettivamente).

LCD Bargraph BMP180 LCD1602 wiring

Spiegazione del codice

Il codice è progettato per essere facilmente configurabile. Le impostazioni chiave si trovano tutte nella parte superiore dello sketch, consentendoti di modificare il comportamento senza dover entrare nella logica principale. Ecco i principali parametri che puoi cambiare:

#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

Queste due linee controllano l'unità e la scala del tuo display. LaUNITla costante accetta sia una lettera maiuscola'C'per Celsius o una maiuscola'F'per Fahrenheit. IlmaxTemperatureil valore definisce il limite superiore del tuo grafico a barre. Ad esempio, se imposti questo a50e l'unità è Celsius, allora 25°C apparirà come una barra a metà riempita, e 50°C la riempirà completamente. Se la temperatura supera questo valore, il display mostrerà "Max" invece di un grafico. (nel video alle 05:49)

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

Questa riga inizializza il LCD.0x3fè l'indirizzo I2C del tuo specifico modulo LCD. Questo indirizzo può variare tra i produttori. Per trovare il tuo, puoi eseguire uno sketch di scansione I2C, che è spesso incluso nella libreria LCD o disponibile online. Basta caricare lo scanner, aprire il Monitor Seriale e segnalerà l'indirizzo di qualsiasi dispositivo I2C connesso. (nel video alle 07:13)

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

Questa linea configura il grafico a barre stesso. Il primo parametro (&lcd passes un riferimento al tuo oggetto LCD. Il secondo parametro (16) è la lunghezza del grafico a barre in caratteri. Il terzo e il quarto parametro (0, 0definire la posizione iniziale: la prima0è la colonna (posizione del carattere), e il secondo0è la riga. Per posizionare il grafico sulla seconda riga, dovresti cambiare l'ultimo valore in1. (nel video alle 09:24)

C'è anche una funzione personalizzata chiamatagetTemp()nel codice. Questa funzione gestisce la comunicazione con il sensore BMP180. Legge la temperatura, la converte in Fahrenheit se hai impostatoUNITa'F', e restituisce il valore. Se il sensore non riesce a comunicare, la funzione restituisce999come codice di errore, che il ciclo principale controlla e visualizza un messaggio di "Errore" sul LCD. (nel video alle 15:31)

Dimostrazione del Progetto dal Vivo

Nel video, il progetto viene dimostrato utilizzando una pistola termica. Quando la pistola termica viene soffiata sul sensore BMP180, la lettura della temperatura sul LCD aumenta. Man mano che la temperatura sale, il grafico a barre si riempie visivamente in modo proporzionale. Quando la temperatura supera il massimo definito (50°C nella demo), il grafico a barre scompare e il display mostra "Max" insieme alla lettura attuale della temperatura. Una volta rimossa la sorgente di calore e la temperatura scende di nuovo sotto il massimo, il grafico a barre riappare e funziona normalmente di nuovo. Questo mostra chiaramente come il grafico scala con la temperatura e come funziona la protezione contro il trabocco "Max". (nel video alle 17:34)

Puoi anche cambiare l'unità in Fahrenheit impostando#define UNIT 'F'e regolando ilmaxTemperaturedi conseguenza. La dimostrazione mostra che con una temperatura massima di 100°F, il display funziona altrettanto efficacemente, mostrando la temperatura e il grafico a barre nell'unità selezionata.

Capitoli

  • Introduzione alla visualizzazione della temperatura BMP180 come un grafico a barre
  • Perché usare un diagramma a barre per la visualizzazione della temperatura
  • [02:34] Cablaggio del display LCD e del sensore BMP180
  • [03:34] Spiegando il codice e le librerie necessarie
  • [07:13] Trovare l'indirizzo I2C del tuo LCD
  • [09:24] Configurazione della posizione e della lunghezza del grafico a barre
  • [15:31] Comprendere la funzione getTemp()
  • [17:34] Dimostrazione dal vivo con una pistola termica

Immagini

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
Lingua: 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/////////////////////////////

Cose di cui potresti avere bisogno

Risorse e riferimenti

File📁

Librerie Arduino (zip)