Opis BMP180 / GY-68
GY-68 - Moduł wyposażony w układ BMP-180. Jest to moduł służący do pomiaru ciśnienia i temperatury.
Jest zasilany napięciem 3,3V ale wejścia danych działają zarówno przy użyciu napięcia 5V jak i 3,3V.
Łatwo można go użyć do pomiaru zmian wysokości położenia n.p.m. - poprzez pomiar zmian ciśnienia atmosferycznego.
Specyfikacja:
- Napięcie zasilania: 1,8 -3,6 V
- Średni pobór prądu: 0,5 uA
- Zakres pomiaru ciśnienia: 300 - 1100hPa
- Dokładność: 0,02 hPa (w trybie zaawansowanym)
- Wyjście: Interfeis I2C
- Szum pomiaru Maks prędkości magistrali I2C: 3,5Mhz
- Wymiary: 13x10 mm
- Złącze raster 2.54mm
Wyprowadzenia
Czujnik posiada cztery wyprowadzenia typu goldpin - raster 2,54 mm, co umożliwia bezpośrednie wpięcie w płytkę stykową.
Nazwa | Opis |
---|---|
VCC | Napięcie zasilania modułu w zakresie 1,8 -3,6 V. |
GND | Masa układu. |
SDA | linia danych i2c |
SCL | linia zegara i2c |
Biblioteka ułatwiająca obsługę modułu GY-68 / BMP180.
BMP180 / GY-68 + Arduino pomiar temperatury i ciśnienia, stacja meteo
Ideą projektu jest stworzenie układu, który przy pomocy czujnika BMP180 pozwoli na pomiar temperatury i ciśnienia, oraz wypisanie ich wartości poprzez UART.
Ponadto w układzie wykorzystano trzy diody, aby wskazywać tendencję pogody:
- dioda niebieska – będzie padać deszcz,
- dioda zielona – brak zmian pogody,
- dioda żółta – słoneczna pogoda.
Tendencje te są określane na podstawie ostatnich pięciu pomiarów ciśnienia.
Do stworzenia projektu wykorzystano następujące elementy:
- czujnik pomiaru ciśnienia i temperatury BMP-180
- mikrokontroler Arduino Nano
- diody LED opisujące tendencję ciśnienia
- rezystory 220Ω i 270Ω.
#include <Wire.h>
#include <bmp180.h>
#include <TimeLib.h>
// Dane wymagane do obsługi czasu
#define TIME_HEADER "T"
#define TIME_REQUEST 7
// Definiowanie wyjść diod
#define LED_NIEB 10
#define LED_ZIEL 9
#define LED_ZOLT 8
BMP180 bsensor; // Obiekt reprezentujący sensor
int lastMeas[5]; // Tablica przechowująca poprzednie pomiary
void setup() {
// Inicjalizuj obiekt. Czułość sensora ustawiona na 1;
bsensor.begin(1);
Serial.begin(9600);
// Synchronizacja czasu z komputerem
setSyncProvider(requestSync);
pinMode(LED_NIEB, OUTPUT);
pinMode(LED_ZIEL, OUTPUT);
pinMode(LED_ZOLT, OUTPUT);
}
void loop() {
// Pomiar temperatury. Wynik jest podany w setnych częściach stopnia.
int tempC = bsensor.getCelsiusHundredths();
Serial.print("Temperatura: "); Serial.print(tempC/100); Serial.println("*C");
// Pomiar ciśnienia. Wynik jest podany w Paskalach.
long pressurePascals = bsensor.getPressurePascals();
Serial.print("Cisnienie: "); Serial.print(pressurePascals/100);
Serial.println("hPa");Serial.println();
// Sprawdzanie tendencji ciśnienia z ostatnich 5 pomiarów.
// Dopisanie ostatniego wyniku do tablicy
if(second()==0) {
lastMeas[minute()%5]=pressurePascals;
}
// Sprawdzenie jaka jest różnica między ostatnim pomiarem a czterema poprzednimi
int roznica = 5*pressurePascals - lastMeas[0]- lastMeas[1]- lastMeas[2]- lastMeas[3]-
lastMeas[4];
if(abs(roznica)<100) {
// Jeśli różnica jest niewielka, pogoda się utrzymuje. Zapal zieloną diodę
digitalWrite(LED_NIEB, LOW);
digitalWrite (LED_ZIEL, HIGH);
digitalWrite (LED_ZOLT, LOW);
} else if(roznica<0) {
// Jeśli wynik jest ujemny, pogoda pogarsza się. Zapal niebieską diodę.
digitalWrite (LED_NIEB, HIGH);
digitalWrite (LED_ZIEL, LOW);
digitalWrite (LED_ZOLT, LOW);
} else {
// Jeśli wynik jest dodatni, pogoda polepsza się. Zapal żółtą diodę.
digitalWrite (LED_NIEB, LOW);
digitalWrite (LED_ZIEL, LOW);
digitalWrite (LED_ZOLT, HIGH);
}
delay(1000);
}
// Funkcje odpowiedzialne za synchronizację czasu
void processSyncMessage() {
unsigned long pctime;
const unsigned long DEFAULT_TIME = 1357041600;
if(Serial.find(TIME_HEADER)) {
pctime = Serial.parseInt();
if(pctime >= DEFAULT_TIME) {
setTime(pctime);
}
Serial.print(pctime);
}
}
time_t requestSync() {
Serial.write(TIME_REQUEST);
return 0;
}