Dupa ce am testat ceasul, m-am gandit sa adaug si cateva informatii meteo. Am apelat la AI, dar de data asta, dupa vreo 4 zile de incercari, am zis sa incerc si eu. Nu mi-a iesit din prima, dar modificarea, sau mai bine zis adaptarea programului de ceas, era destul de simpla si cu o versiune de program destul de matura, am facut 2 filmulete
Programul ceasului contine o variabila ce permite activatea afisarii in text definit, dar a fost usor sa fac ca textul sa fie redefinit la fiecare actualizare a datelor de la serverul open-meteo.
English version: BMP180 sensor and Arduino Cu ceva timp in urma, am cumparat de pe ebay un modul GY-68 cu senzor de presiunea BMP180, despre care trebuie sa stim, in primul rand ca tensiunea de alimentare maxima este de 3,6V, deci putem sa-l alimentam de la placa Arduino din pinul notat 3.3V sau 3V (depinde de producatorul placii); mai trebuie sa stim ca modulul se conecteaza prin 2 fire (comunicare i2c).
Pe langa informatii despre presiune, senzorul masoara si temperatura cu o precizie de +10C.
// https://github.com/adafruit/Adafruit-BMP085-Library
#include <Wire.h>
#include <Adafruit_BMP085.h>
/*************************************************** This is an example for the BMP085 Barometric Pressure & Temp Sensor Designed specifically to work with the Adafruit BMP085 Breakout ----> https://www.adafruit.com/products/391 These displays use I2C to communicate, 2 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/Ladyada for Adafruit Industries. BSD license, all text above must be included in any redistribution ****************************************************/// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)// Connect GND to Ground// Connect SCL to i2c clock - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 5// Connect SDA to i2c data - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 4// EOC is not used, it signifies an end of conversion// XCLR is a reset pin, also not used here
Adafruit_BMP085 bmp;
voidsetup() {
Serial.begin(9600);
if (!bmp.begin()) {
Serial.println("nu exita senzor compatibil BMP085 sau BMP180");
while (1) {}
}
}
voidloop() {
Serial.print("Temperatura = ");
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print("Presiune = ");
Serial.print(bmp.readPressure());
Serial.print(" Pa / ");
// Serial.print("Presiune = ");float presiune1 = bmp.readPressure()/101.325;
presiune1 = presiune1 * 0.760;
Serial.print(presiune1);
Serial.println(" mmHg");
// Calculate altitude assuming 'standard' barometric// pressure of 1013.25 millibar = 101325 PascalSerial.print("Altitudine = ");
Serial.print(bmp.readAltitude());
Serial.println(" m");
Serial.print("Presiune la nivelul marii (calculata) = ");
Serial.print(bmp.readSealevelPressure());
Serial.print(" Pa / ");
// http://en.wikipedia.org/wiki/Atmospheric_pressure#Mean_sea_level_pressure// Serial.print("Presiure la nivelul marii (calculata) = ");float presiune = bmp.readSealevelPressure()/101.325;
presiune = presiune * 0.760;
Serial.print(presiune);
Serial.println(" mmHg");
// you can get a more precise measurement of altitude// if you know the current sea level pressure which will// vary with weather and such. If it is 1015 millibars// that is equal to 101500 Pascals.Serial.print("Altitudine reala = ");
Serial.print(bmp.readAltitude(101500));
Serial.println(" m");
Serial.println();
delay(2500);
}
Am folosit acest senzor intr-un proiect mai amplu, o ministatie meteo cu Arduino Due si un afisaj grafic color de 2,2" cu driver ILI9341. Acest proiect a fost prezentat detaliat in articolul Arduino Due si afisajul QVGA de 2,2" (5,6cm) comandat de ILI9341.
Revenind la senzor si placa Arduino Uno, am zis ca e mai util sa afisez informatiile pe un ecran alfanumeric 1602, de genul:
// adapted sketch by niq_ro from http://nicuflorica.blogspot.ro/ & http://arduinotehniq.blogspot.com/// https://github.com/adafruit/Adafruit-BMP085-Library
#include <Wire.h>
#include <Adafruit_BMP085.h>
/*************************************************** This is an example for the BMP085 Barometric Pressure & Temp Sensor Designed specifically to work with the Adafruit BMP085 Breakout ----> https://www.adafruit.com/products/391 These displays use I2C to communicate, 2 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/Ladyada for Adafruit Industries. BSD license, all text above must be included in any redistribution ****************************************************/// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)// Connect GND to Ground// Connect SCL to i2c clock - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 5// Connect SDA to i2c data - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 4// EOC is not used, it signifies an end of conversion// XCLR is a reset pin, also not used here// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pinsLiquidCrystal lcd(7, 6, 5, 4, 3, 2);
/* ------------------- | LCD | Arduino | ------------------- LCD RS pin to digital pin 7 | RS | D7 | LCD Enable pin to digital pin 6 | E | D6 | LCD D4 pin to digital pin 5 | D4 | D6 | LCD D5 pin to digital pin 4 | D5 | D4 | LCD D6 pin to digital pin 3 | D6 | D3 | LCD D7 pin to digital pin 2 | D7 | D2 | LCD R/W pin to ground | R/W | GND | -------------------*/
Adafruit_BMP085 bmp;
voidsetup() {
lcd.begin(16, 2);
// Print a logo message to the LCD.
lcd.print("www.tehnic.go.ro");
lcd.setCursor(0, 1);
lcd.print("creat de niq_ro");
delay (2500);
lcd.clear();
// Print another message to the LCD.
lcd.setCursor(2, 0);
lcd.print("termometru -");
lcd.setCursor(0, 1);
lcd.print("barometru ver1.0");
delay (2500);
lcd.clear();
Serial.begin(9600);
if (!bmp.begin()) {
Serial.println("nu exita senzor compatibil BMP085 sau BMP180");
while (1) {}
}
}
voidloop() {
Serial.print("Temperatura = ");
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print("Presiune = ");
Serial.print(bmp.readPressure());
Serial.print(" Pa / ");
// Serial.print("Presiune = ");float presiune1 = bmp.readPressure()/101.325;
presiune1 = presiune1 * 0.760;
Serial.print(presiune1);
Serial.println(" mmHg");
// Calculate altitude assuming 'standard' barometric// pressure of 1013.25 millibar = 101325 PascalSerial.print("Altitudine = ");
Serial.print(bmp.readAltitude());
Serial.println(" m");
Serial.print("Presiune la nivelul marii (calculata) = ");
Serial.print(bmp.readSealevelPressure());
Serial.print(" Pa / ");
// http://en.wikipedia.org/wiki/Atmospheric_pressure#Mean_sea_level_pressure// Serial.print("Presiure la nivelul marii (calculata) = ");float presiune = bmp.readSealevelPressure()/101.325;
presiune = presiune * 0.760;
Serial.print(presiune);
Serial.println(" mmHg");
// you can get a more precise measurement of altitude// if you know the current sea level pressure which will// vary with weather and such. If it is 1015 millibars// that is equal to 101500 Pascals.Serial.print("Altitudine reala = ");
Serial.print(bmp.readAltitude(101500));
Serial.println(" m");
Serial.println();
lcd.setCursor(1, 0);
lcd.print("temp.= ");
if ( bmp.readTemperature() < 10)
{
lcd.print(" ");
lcd.print(bmp.readTemperature());
}
else
{
lcd.print(bmp.readTemperature(),1);
}
lcd.write(0b11011111);
lcd.print("C ");
lcd.setCursor(1, 1);
lcd.print("pres.= p");
lcd.print(presiune,0);
lcd.print("mmHg ");
delay(2500);
}
iar schema este:
24.11.2014 In weak-end am primit 3 poze de la Dave, un radioamator foarte cunoscut din West Cumbria, care are blog-ul http://g4rvh.wordpress.com/. Dave si-a facut un shield facut la CNC prin frezare, dupa schema de mai sus. Sketch-ul l-am modificat sa-i prezinte temperatura in grade Fahrenheit in loc de Celsius, dupa informatiile din articolul Conversion of Temperature: