Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Arduino + ESP Weather Box

Componentes y suministros

Arduino Nano R3
× 1
Sensor de presión de aire barométrico MyOctopus i2c BMP280
× 1
Nokia 5110 LCD
× 1
NodeMCU 1.0
× 1
OLED gráfico, 128 x 64
× 1

Herramientas y máquinas necesarias

Soldador (genérico)

Acerca de este proyecto

Este dispositivo consta de dos conjuntos independientes en una caja.

Uno es el barómetro Arduino con el sensor BMP180, que contiene un informe de diferencia de presión atmosférica en tiempo real, -1h y -3h. Estos informes son particularmente útiles en la previsión meteorológica local a corto plazo. El código se toma del sitio web "shelvin.de", en el que se ingresa la diferencia entre la presión atmosférica absoluta y relativa para la altitud dada en la línea "druck_offset =" en el código. Los resultados se presentan en la pantalla LCD del N5110, que también muestra la temperatura interna.

El siguiente dispositivo funciona con una placa ESP8266 que conecta una pantalla OLED de 0,96 pulgadas. El ESP8266 está conectado a través de una red Wi-Fi a la página "openweathermap", desde donde toma un pronóstico del tiempo de tres días y lo presenta en la pantalla OLED. Para este propósito, debe ingresar una clave API en el código, que se obtiene de la página de Openweathermap. Las instrucciones detalladas completas para instalar bibliotecas y código en esp8266 se encuentran en:

https://blog.squix.org/wp-content/uploads/2017/06/esp8266weatherstationgettingstartedguide-20170608.pdf

En este caso particular, utilizo la placa NodeMCU 1.0 (módulo ESP12E).

La siguiente imagen muestra el esquema del dispositivo completo.

Código

  • Archivo sin título
Archivo sin título Arduino
 // Luftdruck Ausgabe aktuell // Luftdruckdifferenz wird mit 1 und 3 Stunden vorher (im EEPROM) verglichen und ausgegeben // Temperature Ausgabe aktuell //// Bauteile:// Pantalla LCD de Nokia 5110 // BMP180 Luftdrucksensor // Arduino Uno //// Matthias Busse Versión 1.0 vom 21.9.2014 # include  #include  #include  // Variable EEPROM nint eepromAdresse =0, eepromMax =1023; // 1024 EEPROM Speicherplatze, 0-1023int eepromOldAdr, eepromDif1 =60, eepromDif3 =180; // 60/180 Speicherplatze (Minuten) zuruck vergleichen // BMP180 Variablen # define I2C_ADDRESS 0x77const unsigned char oversampling_setting =3; // oversamplig:0 ungenau (13ms) ... 3 genau (34ms) const unsigned char pressure_waittime [4] ={5, 8, 14, 26}; // lt. Datenblatt BMP-180int ac1, ac2, ac3, b1, b2, mb, mc, md; unsigned int ac4, ac5, ac6; int temp =20, temp_mittel =200, test =0; long druck =1013, druck_mittel =101300; float t, temp_offset =0.0, d, dAlt, dDiff, druck_offset =2.0; int zeitabgl =0, mitteln =5; char tstring [5], dstring [7]; // Variable de apagado nvolatile int sleepcounter =0; // Schlafzyklen mitzahlen // Mostrar variable estática const byte ASCII [] [5] ={// ASCII Tabelle mit Fonts {0x00, 0x00, 0x00, 0x00, 0x00} // 20, {0x00, 0x00, 0x5f, 0x00, 0x00} // 21!, {0x00, 0x07, 0x00, 0x07, 0x00} // 22 ", {0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #, {0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $, {0x23, 0x13, 0x08, 0x64, 0x62} // 25%, {0x36, 0x49, 0x55, 0x22, 0x50} // 26 &, {0x00, 0x05, 0x03, 0x00, 0x00} // 27 ' , {0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (, {0x00, 0x41, 0x22, 0x1c, 0x00} // 29), {0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *, { 0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +, {0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,, {0x08, 0x08, 0x08, 0x08, 0x08} // 2d -, {0x00, 0x60, 0x60, 0x00, 0x00} // 2e., {0x20, 0x10, 0x08, 0x04, 0x02} // 2f /, {0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0, {0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1, {0x42, 0x61, 0x51, 0x49, 0x46} // 32 2, {0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3, {0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4, {0x27, 0x45, 0x45, 0x45, 0x39} // 35 5, {0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6, {0x01, 0x71, 0x09, 0x05, 0x03} // 37 7, {0x36, 0x49, 0x49, 0x49, 0x36} // 38 8, {0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9, {0x00 , 0x36, 0x36, 0x00, 0x00} // 3a:, {0x00, 0x56, 0x36, 0x00, 0x00} // 3b;, {0x08, 0x14, 0x22, 0x41, 0x00} // 3c <, {0x14, 0x14 , 0x14, 0x14, 0x14} // 3d =, {0x00, 0x41, 0x22, 0x14, 0x08} // 3e>, {0x02, 0x01, 0x51, 0x09, 0x06} // 3f?, {0x32, 0x49, 0x79 , 0x41, 0x3e} // 40 @, {0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A, {0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B, {0x3e, 0x41, 0x41, 0x41 , 0x22} // 43 C, {0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D, {0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E, {0x7f, 0x09, 0x09, 0x09, 0x01 } // 46 F, {0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G, {0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H, {0x00, 0x41, 0x7f, 0x41, 0x00} / / 49 I, {0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J, {0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K, {0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L, {0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M, {0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N, {0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O, {0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P, {0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q, {0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R, {0x46, 0x49, 0x49, 0x49, 0x31} // 53 S, {0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T, {0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U, {0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V, {0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W, {0x63, 0x14, 0x08, 0x14, 0x63} // 58 X, {0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y , {0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z, {0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [, {0x02, 0x04, 0x08, 0x10, 0x20} // 5c?, { 0x00, 0x41, 0x41, 0x7f, 0x00} // 5d], {0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^, {0x40, 0x40, 0x40, 0x40, 0x40} // 5f _, {0x00, 0x01, 0x02, 0x04, 0x00} // 60 `, {0x20, 0x54, 0x54, 0x54, 0x78} // 61 a, {0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b, {0x38, 0x44, 0x44, 0x44, 0x20} // 63 c, {0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d, {0x38, 0x54, 0x54, 0x54, 0x18} // 65 e, {0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f, {0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g, {0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h, {0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i, {0x20, 0x40 , 0x44, 0x3d, 0x00} // 6a j, {0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k, {0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l, {0x7c, 0x04, 0x18 , 0x04, 0x78} // 6d m, {0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n, {0x38, 0x44, 0x44, 0x44, 0x38} // 6f o, {0x7c, 0x14, 0x14, 0x14 , 0x08} // 70 p, {0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q, {0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r, {0x48, 0x54, 0x54, 0x54, 0x20 } // 73 s, {0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t, {0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u, {0x1c, 0x20, 0x40, 0x20, 0x1c} / / 76 v, {0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w, {0x44, 0x28, 0x10, 0x28, 0x44} // 78 x, {0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y, {0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z, {0x00, 0x08, 0x36, 0x41, 0x00} // 7b {, {0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |, {0x00, 0x41, 0x36, 0x08, 0x00} // 7d}, {0x10, 0x08, 0x08, 0x10, 0x08} // 7e <, {0x78, 0x46, 0x41, 0x46, 0x78} // 7f>}; # definir RST 12 # definir CE 11 # definir DC 10 # definir DIN 9 # definir CLK 8void setup () {for (int i =0; i  800) {LcdXY (27,2); si (dDiff <0.0) LcdWriteString ("-"); más LcdWriteString ("+"); if (dDiff <0.0) dDiff =dDiff * -1.0; // Absolutwert LcdXY (34,2); LcdWriteString (dtostrf (dDiff, 4,2, dstring)); } LcdXY (60,2); LcdWriteString ("hPa"); eepromOldAdr =eepromAdresse - (eepromDif3 * 4); // Diferencia 3h zuruck gehen if (eepromOldAdr <0) eepromOldAdr =eepromMax + 1 + eepromOldAdr; // uberlauf dAlt =(flotante) eepromReadLong (eepromOldAdr) /100.0; // alten Wert lesen dDiff =d-dAlt; // Differenz bilden LcdClearLine (3); LcdXY (8,3); // Ausgeben LcdWriteString ("3h:"); si (dAlt> 800) {LcdXY (27,3); si (dDiff <0.0) LcdWriteString ("-"); más LcdWriteString ("+"); if (dDiff <0.0) dDiff =dDiff * -1.0; // Absolutwert LcdXY (34,3); LcdWriteString (dtostrf (dDiff, 4,2, dstring)); } LcdXY (60,3); LcdWriteString ("hPa"); LcdClearLine (5); // Temperatur ausgeben LcdXY (8,5); LcdWriteString ("Temp."); LcdXY (43,5); LcdWriteString (dtostrf (t, 4,1, tstring)); LcdXY (73,5); LcdWriteString ("C"); eepromAdresse + =4; if (eepromAdresse> eepromMax) eepromAdresse =0; pwrDown (54); // ATmega328 fahrt runter fur den Rest der 60 Sekunden} void eepromWriteLong (long lo, int adr) {// long Wert in das EEPROM schreiben // Eingabe:adr Speicherplatz // Eingabe:lo Zahl, Wertebereich -2.147.483.648 bis 2.147 .483.647 //// Matthias Busse 23.5.2014 Versión 1.0byte de; para (int i =0; i <4; i ++) {by =(lo>> ((3-i) * 8)) &0x000000ff; EEPROM.write (adr + i, por); }} // eepromWriteLonglong eepromReadLong (int adr) {// long int Wert aus 4 Byte EEPROM lesen // Eingabe:adr bis adr + 3 // Ausgabe:long Wert //// Matthias Busse 23.5.2014 Version 1.0long lo =0; para (int i =0; i <3; i ++) {lo + =EEPROM.read (adr + i); lo =lo <<8; } lo + =EEPROM.read (adr + 3); return lo;} // eepromReadLongvoid LcdWriteString (char * characters) {// String ausgeben while (* characters) LcdWriteCharacter (* characters ++);} void LcdWriteCharacter (char character) {// ASCII Zeichen ausgeben aus der Tabelle oben for (int i =0; i <5; i ++) LcdWriteData (ASCII [carácter - 0x20] [i]); LcdWriteData (0x00); } void LcdWriteCmd (byte cmd) {// Comando un Display senden digitalWrite (DC, LOW); // El pin DC es bajo para los comandos digitalWrite (CE, LOW); shiftOut (DIN, CLK, MSBFIRST, cmd); // transmite datos en serie digitalWrite (CE, HIGH);} void LcdWriteData (byte cmd) {// Daten una pantalla senden digitalWrite (DC, HIGH); // El pin DC es alto para datos digitalWrite (CE, LOW); shiftOut (DIN, CLK, MSBFIRST, cmd); // transmitir datos en serie digitalWrite (CE, HIGH);} void LcdClearScreen () {// Bildschirm leeren for (int i =0; i <504; i ++) LcdWriteData (0x00);} void LcdClearLine (int line) {// Zeile leeren LcdXY (0, línea); for (int i =0; i <84; i ++) LcdWriteData (0x00);} void LcdXY (int x, int y) {// una posición X / Y gehen LcdWriteCmd (0x80 | x); // Spalte LcdWriteCmd (0x40 | y); // Zeile} void bmp180_read_temperature_and_pressure (int * temp, long * druck) {int ut =bmp180_read_ut (); long up =bmp180_read_up (); long x1, x2, x3, b3, b5, b6, p; unsigned long b4, b7; x1 =((largo) ut - ac6) * ac5>> 15; // Temperatur berechnen x2 =((largo) mc <<11) / (x1 + md); b5 =x1 + x2; * temp =(b5 + 8)>> 4; b6 =b5 - 4000; // Druck berechnen x1 =(b2 * (b6 * b6>> 12))>> 11; x2 =ac2 * b6>> 11; x3 =x1 + x2; if (oversampling_setting ==3) b3 =((int32_t) ac1 * 4 + x3 + 2) <<1; if (oversampling_setting ==2) b3 =((int32_t) ac1 * 4 + x3 + 2); if (oversampling_setting ==1) b3 =((int32_t) ac1 * 4 + x3 + 2)>> 1; if (oversampling_setting ==0) b3 =((int32_t) ac1 * 4 + x3 + 2)>> 2; x1 =ac3 * b6>> 13; x2 =(b1 * (b6 * b6>> 12))>> 16; x3 =((x1 + x2) + 2)>> 2; b4 =(ac4 * (uint32_t) (x3 + 32768))>> 15; b7 =((uint32_t) arriba - b3) * (50000>> ajuste_sobremuestreo); p =b7 <0x80000000? (b7 * 2) / b4:(b7 / b4) * 2; x1 =(p>
> 8) * (p>
> 8); x1 =(x1 * 3038)>> 16; x2 =(-7357 * p)>> 16; * druck =p + ((x1 + x2 + 3791)>> 4);} unsigned int bmp180_read_ut () {write_register (0xf4,0x2e); retraso (5); // mehr als 4.5 ms return read_int_register (0xf6);} void bmp180_get_cal_data () {ac1 =read_int_register (0xAA); ac2 =read_int_register (0xAC); ac3 =read_int_register (0xAE); ac4 =read_int_register (0xB0); ac5 =read_int_register (0xB2); ac6 =read_int_register (0xB4); b1 =read_int_register (0xB6); b2 =read_int_register (0xB8); mb =read_int_register (0xBA); mc =read_int_register (0xBC); md =read_int_register (0xBE);} long bmp180_read_up () {write_register (0xf4,0x34 + (oversampling_setting <<6)); delay (pressure_waittime [oversampling_setting]); char msb, lsb, xlsb sin firmar; Wire.beginTransmission (I2C_ADDRESS); Wire.write (0xf6); Wire.endTransmission (); Wire.requestFrom (I2C_ADDRESS, 3); while (! Wire.available ()) {} // warten msb =Wire.read (); while (! Wire.available ()) {} // warten lsb | =Wire.read (); while (! Wire.available ()) {} // warten xlsb | =Wire.read (); return (((long) msb <<16) | ((long) lsb <<8) | ((long) xlsb))>> (8-oversampling_setting);} void write_register (unsigned char r, unsigned char v) { Wire.beginTransmission (I2C_ADDRESS); Wire.write (r); Wire.write (v); Wire.endTransmission ();} char read_register (unsigned char r) {unsigned char v; Wire.beginTransmission (I2C_ADDRESS); Wire.write (r); Wire.endTransmission (); Wire.requestFrom (I2C_ADDRESS, 1); while (! Wire.available ()) {} // warten v =Wire.read (); return v;} int read_int_register (unsigned char r) {unsigned char msb, lsb; Wire.beginTransmission (I2C_ADDRESS); Wire.write (r); Wire.endTransmission (); Wire.requestFrom (I2C_ADDRESS, 2); while (! Wire.available ()) {} // warten msb =Wire.read (); while (! Wire.available ()) {} // warten lsb =Wire.read (); return (((int) msb <<8) | ((int) lsb));} void pwrDown (int sekunden) {set_sleep_mode (SLEEP_MODE_PWR_DOWN); // den tiefsten Schlaf auswahlen PWR_DOWN for (int i =0; i  ergibt ca. 1 segundo WDTCSR =WDTCSR | B01000000; // Interrupción del perro guardián einschalten MCUSR =MCUSR &B11110111;} ISR (WDT_vect) {sleepcounter ++; // Schlafzyklen mitzahlen} 

Esquemas


Proceso de manufactura

  1. Kazoo
  2. Construyendo placas de prueba Arduino sin cables de puente
  3. Giftduino - La caja de regalo perfecta para Arduino
  4. BME280 Temperatura, humedad y presión en la pantalla Nextion
  5. Registrador de datos de globos meteorológicos con tecnología Arduino
  6. $ 10 Estación meteorológica portátil Arduino (AWS)
  7. eDOT - Reloj de precisión y estación meteorológica basados ​​en Arduino
  8. Estación meteorológica ThingSpeak Arduino
  9. Sensor de presión de IoT:MKR GSM + Arduino Cloud + Hojas de cálculo de Google
  10. Estación meteorológica Arduino
  11. Arduino Arcade LEGO Games Box