2023年5月27日 星期六

arduino BMP180壓力溫度感測器+0.96OLED液晶螢幕顯示(密封失敗,建議換密封材料)

 很久沒有寫arduino程式了,這次完成的專案能夠解決許多壓力檢測的問題,學習到原來I2C多個裝置要如何設定比較恰當,這個頁面說明你可以了解
1.BMP180 壓力溫度感測器
一開始的  //BMP180 設定
void setup()內的  //BMP180setup
void loop()內的  //BMP180display

2.0.96OLDE顯示方法
一開始的  //0.96 OLED 設定
void setup()內的  //OLEDsetup
void loop()內的  //OLEDdisplay

3.I2C多個裝置該如何設定

成品,能顯示溫度(C)、壓力(hPa、cmHg、atm)




運用用5ml有栓針筒+自己的黑色橡膠塞打洞穿線 後用 防水防漏填縫劑 大量填滿後方做出密封(可惜後來還是失敗了)效果,有栓針筒後期運用可以接三通閥與軟管,能夠做很多其他的運用。
(注意!!!這樣無法完全密封,還是建議使用環氧樹酯試看看,我會再修正做法)


I2C多個裝置設定參考網頁
電子學與Arduino: 12.多個I2C裝置(2個GY-30,1個LCD) https://www.youtube.com/watch?v=i4SW3FkwOd8
裡面有一個可以掃描I2C的scanner程式scanner程式可以先灌入arduino後進行掃描,可以發現不同的I2C裝置位址,0x3C通常是液晶螢幕的位址


針筒密封點子,這網頁是用環氧樹酯進行密封,感覺會更硬更好用
https://swharden.com/blog/2017-04-29-precision-pressure-meter-project/

Arduino程式碼如下

//需安裝LIBRARY BMP180MI by Gregor Christandl


//BMP180 設定
#include <Arduino.h>
#include <Wire.h>
#include <BMP180TwoWire.h>
#define I2C_ADDRESS_BMP180 0x77   //0x77是掃描得知的BMP180 I2C位址
//create an BMP180 object using the I2C interface
BMP180TwoWire bmp180(&Wire, I2C_ADDRESS_BMP180);

//0.96 OLED 設定
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// 設定OLED
#define OLED_RESET  0x3C     //0x3c是掃描得知的液晶螢幕I2C位址
Adafruit_SSD1306 display(OLED_RESET);   //這裡要小心,有些原來的OLED設定太複雜反而無法抓到OLED,這樣寫剛剛好


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


//BMP180setup
while (!Serial);
Wire.begin();
//begin() initializes the interface, checks the sensor ID and reads the calibration parameters.  
if (!bmp180.begin())
{
Serial.println("begin() failed. check your BMP180 Interface and I2C Address.");
while (1);
}
//reset sensor to default parameters.
bmp180.resetToDefaults();
//enable ultra high resolution mode for pressure measurements
bmp180.setSamplingMode(BMP180MI::MODE_UHR);


      //OLEDsetup
      // 偵測是否安裝好OLED了
      if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 一般1306 OLED的位址都是0x3C
        Serial.println(F("SSD1306 allocation failed"));
        for(;;); // Don't proceed, loop forever
      }
      // 顯示Adafruit的LOGO,算是開機畫面
      display.display();
      delay(1000); // 停1秒
      // 清除畫面
      display.clearDisplay();
}

void loop() {

  double T180,P180;
  T180=bmp180.getTemperature();
  P180=bmp180.getPressure();

  //OLEDdisplay
  display.clearDisplay();
  display.setTextSize(1);         // 設定文字大小
  display.setTextColor(1);        // 1:OLED預設的顏色(這個會依該OLED的顏色來決定)
  display.setCursor(0,0);         // 設定起始座標
  display.println("DCJHS_OrangeV");
  display.print("T:   ");
  display.print(T180);   //顯示BMP180偵測溫度
  display.println(" .C");
  display.print("P: ");
  display.print(P180/100,2);  //顯示BMP180偵測壓力/100轉換成百帕
  display.println(" hPa");
  display.print(P180/1333.2,2);  //顯示BMP180偵測壓力/100轉換成百帕
  display.print(" cmHg  ");
  display.print(P180/101325,2);  //顯示BMP180偵測壓力/100轉換成百帕
  display.println(" atm");
  
  display.display();              // 要有這行才會把文字顯示出來

  //BMP180display
//start a temperature measurement
if (!bmp180.measureTemperature())
{
Serial.println("could not start temperature measurement, is a measurement already running?");
return;
}
//wait for the measurement to finish. proceed as soon as hasValue() returned true. 
do
{
delay(1000);
} while (!bmp180.hasValue());
Serial.print("Temperature: "); 
Serial.print(bmp180.getTemperature()); 
Serial.println(" degC");
//start a pressure measurement. pressure measurements depend on temperature measurement, you should only start a pressure 
//measurement immediately after a temperature measurement. 
if (!bmp180.measurePressure())
{
Serial.println("could not start perssure measurement, is a measurement already running?");
return;
}
//wait for the measurement to finish. proceed as soon as hasValue() returned true. 
do
{
delay(100);
} while (!bmp180.hasValue());
Serial.print("Pressure: "); 
Serial.print(bmp180.getPressure());
Serial.println(" Pa");

}

沒有留言:

張貼留言