Quiero coleccionar hazlo tu mismo instrumento que medirá la presión atmosférica y la temperatura. El sensor de temperatura debe ser remoto y ajustado, ya que debe medir la temperatura a una cierta distancia del dispositivo. Me gustaría tener un dispositivo portátil con un rango de trabajo de -30 ° C a 50 ° C. Pero esto requiere que todos los componentes puedan funcionar en este rango de temperatura. Los componentes que pueden funcionar en un rango de temperatura extendido son más caros y es más difícil comprarlos.
Para hacer realidad mi sueño, la junta me ayudará, que describí en el artículo "Tablero GY-BMP280-3.3 para medir presión barométrica y temperatura».
En la práctica, se sabe que durante el montaje y la configuración electronica Antes de su fabricación, debe verificar la capacidad de servicio de todos los materiales y componentes de cada uno por separado. De lo contrario, puede confundirse más tarde y, como resultado, el producto electrónico no funcionará y será muy difícil encontrar la causa del mal funcionamiento.
Empecemos
Primera etapa. Instale una consola de software libre en su computadora Arduino IDE para escribir programas (bocetos), compilarlos y luego escribirlos en el microcontrolador Mega328P instalado en la placa. Le recomiendo que descargue la versión de shell de ARDUINO 1.6.5. Por qué Inicialmente, el proyecto ARDUINO era uno, ahora los desarrolladores se han dispersado y continúan desarrollando el sistema ARDUINO, pero cada uno a su manera, con pequeños matices. Usé la versión ARDUINO 1.6.5. Debe instalarse y probarse para colaborar con la placa Arduino Uno utilizando los ejemplos más simples.
Segunda etapa. Verificamos la placa GY-BMP280-3.3 para medir la presión barométrica y la temperatura. Tomamos 4 cables, los conectamos GY-BMP280-3.3 y Arduino Uno, como se muestra en la foto y el diagrama. Las curvas delgadas líneas multicolores son conductores.
Comencemos por verificar la placa GY-BMP280-3.3. Para hacer esto, debe instalar la biblioteca en el IDE de Arduino, escrita por programadores que trabajan en el sitio. Como regla general, después de instalar la biblioteca en Arduino IDE, aparecen ejemplos (ejemplos) de código. Al cambiar ligeramente el código de muestra, podemos compilarlo en datos que sean comprensibles para el microcontrolador y luego enviarlo a la memoria del microcontrolador. Puede encontrar un ejemplo (muestra) prestando atención a las dos fotos de la pantalla a continuación.
Después de escribir datos en el microcontrolador de la placa Arduino Uno, inmediatamente comienza a ejecutar el programa (código) y envía los datos mediante un cable USB a la computadora a la que está conectada la placa Arduino Uno.Y podemos ver el resultado de la medición de la placa GY-BMP280-3.3 en la ventana Arduino IDE, llamada "monitor de puerto serie".
Podemos ver el resultado de las mediciones en la placa GY-BMP280-3.3 en el programa estándar de Windows Hyper Terminal, después de cerrar el shell Arduino Uno y configurar una sesión en el programa Hyper Terminal. Es decir, podemos obtener los resultados de la placa GY-BMP280-3.3 conectando el Arduino Uno a cualquier computadora con un cable USB en el que esté instalado el controlador de la placa Arduino Uno. Hay varias bibliotecas para trabajar con GY-BMP280-3.3. Todo me funcionó con la biblioteca. El archivo que descargue de este sitio se verá así: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Debe renombrarse como: iarduino_Pressure_BMP.zip. Ahora necesitamos instalar la biblioteca iarduino_Pressure_BMP en el shell Arduino IDE.
Inicie el IDE de Arduino, vaya al menú Biblioteca Sketch / Include Librari / Add.ZIP ... luego seleccione el archivo iarduino_Pressure_BMP.zip y haga clic en el botón Abrir. También necesita instalar las bibliotecas:,. Después de instalar las bibliotecas, reiniciamos el shell Arduino IDE, es decir, lo cerramos y lo iniciamos nuevamente. Luego seleccione el menú Archivo / Muestras / iarduino Presión BMP (sensores de presión) / ejemplo.
Vemos el código en la ventana.
El código deberá modificarse ligeramente.
En la quinta línea, elimine dos barras "//" y agregue (0x76) o (0x77) en la undécima línea. (0x76) es la dirección de la placa del barómetro. Mi placa GY-BMP280-3.3 conectada al bus I2C resultó tener la misma dirección (0x76). ¿Cómo averiguar el número del dispositivo conectado al bus I2C? Obtendrá la respuesta a esta pregunta leyendo el artículo completo.
Entonces, arreglamos el código en la ventana, ahora comenzamos a verificar y compilar el código en el menú Sketch / Check / Compile. Si la verificación y compilación del código es exitosa, entonces en el menú Sketch / Load, comenzamos la grabación del programa en Arduino Uno.
Si la descarga se realiza correctamente, al abrir el monitor de puerto serie en el menú: Herramientas / Monitor de puerto serie, veremos los datos enviados por la placa GY-BMP280-3.3.
En la siguiente captura de pantalla, el resultado de la placa GY-BMP280-3.3 trabajando en una computadora en la que el shell Arduino IDE no está instalado. Los datos son recibidos por el programa PuTTY.
Al mismo tiempo, se fotografió un barómetro aneroide de laboratorio, que estaba ubicado al lado de la placa GY-BMP280-3.3. Al comparar las lecturas del instrumento, usted mismo puede sacar conclusiones sobre la precisión de la placa GY-BMP280-3.3. Barómetro aneroide certificado por laboratorio estatal.
Tercera etapa. Comprobación de la pantalla LCD con el módulo de interfaz I2C. Encontramos una pantalla LDC con un módulo de interfaz que se conecta a través del bus I2C al Arduino UNO.
Verificamos su funcionamiento utilizando ejemplos del shell Arduino IDE. Pero antes de eso, determinamos la dirección del módulo de interfaz. Mi módulo de interfaz tiene una dirección de 0x3F. Inserté esta dirección en la línea de boceto: LiquidCrystal_I2C lcd (0x3F, 16.2);
Determiné esta dirección usando el bosquejo del "escáner de direcciones del dispositivo I2C" descrito en.
Lancé el shell Arduino IDE, del artículo copié el código del programa y pegué su ventana Arduino IDE.
Comencé la compilación, luego escribí el código en la placa Arduino UNO, a la que se conectaron la placa GY-BMP280-3.3 y la pantalla LDC con el módulo de interfaz I2C. Luego, en el monitor de puerto serie obtuve el siguiente resultado. Mi módulo de interfaz tiene una dirección de 0x3F.
Cuarta etapa. Comprobación del sensor de temperatura DS18b20. Lo conectamos de la siguiente manera.
La biblioteca OneWire Arduino para trabajar con el sensor de temperatura DS18b20 ya está instalada.
Abra la muestra DS18x20_Temperature, compile, cargue, mire el resultado de la medición en el monitor del puerto serie. Si todo funciona, continúe con el siguiente paso.
Quinta etapa. Asamblea casa estaciones meteorológicas en el GY-BMP280-3.3 y Ds18b20.
Montamos el dispositivo de acuerdo con el esquema:
Recibí el código del dispositivo combinando todos los ejemplos en uno y configurando la salida en la pantalla de visualización LDC. Esto es lo que obtuve:
// Descomente para una implementación de software del bus I2C: //
// #define pin_SW_SDA 3 // Asigna cualquier pin Arduino para que funcione como una línea SDA del bus de software I2C.
// #define pin_SW_SCL 9 // Asigna cualquier pin Arduino para que actúe como la línea SCL del bus de software I2C.
// Descomente la compatibilidad con la mayoría de las placas: //
#include
#include // La biblioteca iarduino usará los métodos y funciones de la biblioteca Wire.
#include // Biblioteca para trabajar LDC tipo 1602 en el bus I2C
//
#include // Conecte la biblioteca iarduino_Pressure_BMP para trabajar con BMP180 o BMP280.
sensor iarduino_Pressure_BMP (0x76); // Declara un objeto sensor para trabajar con un sensor de presión usando las funciones y métodos de la biblioteca iarduino_Pressure_BMP.
LiquidCrystal_I2C lcd (0x3F, 16.2);
OneWire ds (10);
configuración nula () {
lcd.init ();
lcd.backlight ();
Serial.begin (9600); // Inicie la transferencia de datos al monitor del puerto serie a 9600 baudios.
retraso (1000); // Estamos esperando la finalización de los transitorios al aplicar energía
sensor.begin (73); // Inicia el trabajo con el sensor. La altitud actual se tomará como 73 m. - la altura de la ciudad de Buzuluk sobre el nivel del mar
} //
bucle vacío () {
// Lea los datos y visualice: temperatura en ° C, presión en mm. rt., cambio de altura relativo al especificado en la función de inicio (por defecto 0 metros).
lcd.setCursor (0,0); // define el punto de salida "P =" en el LDC
lcd.print ("P =");
lcd.print (sensor.pressure / 1000.3); // divide el valor de P emitido por BMP280 por 1000 y establece la salida de 3 decimales
lcd.setCursor (12.0); // define el punto de salida "kPa" en el LDC
lcd.print ("kPa");
lcd.setCursor (0,1);
lcd.print ("T =");
lcd.print (sensor.temperature, 1); // establece la salida de 1 decimal
lcd.setCursor (6.1);
// lcd.print ("C");
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1);
if (sensor.read (1)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tMM.PT.CT, \ t T = "+ sensor.temperature +" * C, \ t \ t B = "+ sensor.altitude +" M. ");}
else {Serial.println ("HET OTBETA OT CEHCOPA");}
// Lea los datos y visualice: temperatura en ° C y presión en Pa, presión en mm. rt., cambio de altura relativo al especificado en la función de inicio (por defecto 0 metros).
if (sensor.read (2)) {Serial.println ((String) "CEHCOP BMP" + sensor.type + ": \ t P =" + sensor.pressure + "\ tPa, \ t \ t T =" + sensor.temperature + "* C, \ t \ t B =" + sensor.altitude + "M.");}
else {Serial.println ("HET OTBETA OT CEHCOPA");}
byte i;
byte presente = 0;
byte type_s;
datos de bytes [12];
byte addr [8];
flotador celsius, fahrenheit;
if (! ds.search (addr)) {
Serial.println ("No más direcciones");
Serial.println ();
ds.reset_search ();
retraso (250);
volver
}
Serial.print ("ROM =");
para (i = 0; i & lt; 8; i ++) {
Serial.write ('');
Serial.print (addr [i], HEX);
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
Serial.println ("¡CRC no es válido!");
volver
}
Serial.println ();
// el primer byte ROM indica qué chip
interruptor (addr [0]) {
caso 0x10:
Serial.println ("Chip = DS18S20"); // o DS1820 antiguo
type_s = 1;
romper
caso 0x28:
Serial.println ("Chip = DS18B20");
type_s = 0;
romper
caso 0x22:
Serial.println ("Chip = DS1822");
type_s = 0;
romper
por defecto:
Serial.println ("El dispositivo no es un dispositivo de la familia DS18x20");
volver
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // comienza la conversión, con el parásito encendido al final
retraso (1000); // quizás 750 ms es suficiente, quizás no
// podríamos hacer un ds.depower () aquí, pero el reinicio se encargará de ello.
presente = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Leer Scratchpad
Serial.print ("Datos =");
Serial.print (presente, HEX);
Serial.print ("");
for (i = 0; i & lt; 9; i ++) {// necesitamos 9 bytes
datos [i] = ds.read ();
Serial.print (datos [i], HEX);
Serial.print ("");
}
Serial.print ("CRC =");
Serial.print (OneWire :: crc8 (datos, 8), HEX);
Serial.println ();
// Convertir los datos a la temperatura real
// porque el resultado es un entero con signo de 16 bits, debería
// se almacena en un tipo "int16_t", que siempre tiene 16 bits
// incluso cuando se compila en un procesador de 32 bits.
int16_t raw = (datos [1] & lt; & lt; 8) | datos [0];
if (type_s) {
raw = raw & lt; & lt; 3; // resolución predeterminada de 9 bits
if (datos [7] == 0x10) {
// "cuenta restante" ofrece una resolución completa de 12 bits
raw = (raw & amp; 0xFFF0) + 12 - datos [6];
}
} más {
byte cfg = (datos [4] & amp; 0x60);
// a baja resolución, los bits bajos no están definidos, así que pongamos a cero
if (cfg == 0x00) raw = raw & amp; ~ 7; // Resolución de 9 bits, 93,75 ms
más si (cfg == 0x20) raw = raw & amp; ~ 3; // resolución de 10 bits, 187,5 ms
más si (cfg == 0x40) raw = raw & amp; ~ 1; // 11 bits de resolución, 375 ms
//// el valor predeterminado es 12 bits de resolución, 750 ms de tiempo de conversión
}
celsius = (flotante) crudo / 16.0;
Fahrenheit = Celsius * 1.8 + 32.0;
Serial.print ("Temperatura =");
Serial.print (celsius);
Serial.print ("Celsius");
Serial.print (fahrenheit);
Serial.println ("Fahrenheit");
lcd.setCursor (8.1); // define el punto de salida "Tds =" en el LDC
lcd.print ("Tds =");
lcd.print (celsius, 1);
retraso (3000);
}
Esto es lo que obtuve:
La placa GY-BMP280-3.3 libera presión en pascales, lo que no es muy conveniente. No pude resolver el problema de cómo hacer que los datos de presión de salida de la placa GY-BMP280-3.3 en kilopascales. Resolví este problema en la línea de salida de la pantalla LDC.
lcd.print (sensor.pressure / 1000.3); // divide el valor de P emitido por BMP280 por 1000 y establece la salida de 3 decimales
La placa GY-BMP280-3.3 también proporciona valores de altitud.
sensor.begin (73); // Inicia el trabajo con el sensor. La altitud actual se tomará como 73 m. - la altura de la ciudad de Buzuluk sobre el nivel del mar
Si te relajarás en el mar y cambiarás "sensor.begin (73);" en "sensor.begin (0);" en el código, y luego compile y guarde el programa en la estación meteorológica local en el GY-BMP280-3.3 y Ds18b20, y haga una salida de altura a la pantalla LDC, también obtendrá un altímetro.
// lcd.setCursor (9,1);
// lcd.print ("H =");
// lcd.print (sensor.altitude, 1); // Imprime los valores de altura en metros con un decimal
La alimentación se suministra al circuito en mi versión a través de un cable USB. Puede usar un convertidor de pulso de refuerzo de bajo voltaje de 5V / 600 mA y su estación meteorológica será portátil. Este tipo de fuente de alimentación se describe bien en articulo.
Recopilación exitosa!