Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Arduino + ESP Weather Box

Componentes e suprimentos

Arduino Nano R3
× 1
MyOctopus i2c Sensor de pressão de ar barométrica BMP280
× 1
Nokia 5110 LCD
× 1
NodeMCU 1.0
× 1
OLED gráfico, 128 x 64
× 1

Ferramentas e máquinas necessárias

Ferro de soldar (genérico)

Sobre este projeto




Este dispositivo consiste em dois conjuntos independentes em uma caixa.

Um é o barômetro Arduino com o sensor BMP180, que contém um relatório em tempo real, -1h e -3h de diferença na pressão atmosférica. Esses relatórios são particularmente úteis na previsão do tempo local de curto prazo. O código é retirado do site "shelvin.de", no qual é inserida a diferença entre a pressão atmosférica absoluta e relativa para a altitude dada na linha "druck_offset =" do código. Os resultados são apresentados na tela LCD do N5110, que também mostra a temperatura interna.



O próximo dispositivo é alimentado por uma placa ESP8266 que conecta um display OLE de 0,96 polegadas. O ESP8266 é conectado via rede Wi-Fi à página "openweathermap", de onde tira uma previsão do tempo de três dias e a apresenta no display OLED. Para isso, você precisa inserir uma chave API no código, que é obtido na página Openweathermap. Instruções completas e detalhadas para instalar bibliotecas e código em esp8266 são fornecidas em:

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

Neste caso específico, uso a placa NodeMCU 1.0 (módulo ESP12E).

A imagem abaixo mostra o esquema do aparelho completo.

Código

  • Arquivo sem título
Arquivo sem título Arduino
 // Luftdruck Ausgabe aktuell // Luftdruckdifferenz wird mit 1 und 3 Stunden vorher (im EEPROM) verglichen und ausgegeben // Temperatur Ausgabe aktuell //// Bauteile:// LCD Display Nokia 5110 // BMP180 Luftdrucksor Uno //// Matthias Busse Versão 1.0 vom 21.9.2014 # include  #include  #include  // EEPROM Variablenint 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; int ac4, ac5, ac6 sem sinal; int temp =20, temp_mittel =200, teste =0; longo 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]; // Reduzir a variação da variável int sleepcounter =0; // Schlafzyklen mitzahlen // Display Variablenstatic 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 e, {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>}; # define RST 12 # define CE 11 # define DC 10 # define DIN 9 # define CLK 8void setup () {for (int i =0; i  800) {LcdXY (27,2); if (dDiff <0,0) LcdWriteString ("-"); else 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); // Dif 3h zuruck gehen if (eepromOldAdr <0) eepromOldAdr =eepromMax + 1 + eepromOldAdr; // uberlauf dAlt =(float) eepromReadLong (eepromOldAdr) /100.0; // alten Wert lesen dDiff =d-dAlt; // Differenz bilden LcdClearLine (3); LcdXY (8,3); // Ausgeben LcdWriteString ("3h:"); se (dAlt> 800) {LcdXY (27,3); if (dDiff <0,0) LcdWriteString ("-"); else 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); // Temperatura 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 Versão 1.0byte por; para (int i =0; i <4; i ++) {por =(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 Versão 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 [caractere - 0x20] [i]); LcdWriteData (0x00); } void LcdWriteCmd (byte cmd) {// Comando e Display senden digitalWrite (DC, LOW); // O pino DC é baixo para comandos digitalWrite (CE, LOW); shiftOut (DIN, CLK, MSBFIRST, cmd); // transmitir dados seriais digitalWrite (CE, HIGH);} void LcdWriteData (byte cmd) {// Daten um Display senden digitalWrite (DC, HIGH); // O pino DC é alto para dados digitalWrite (CE, LOW); shiftOut (DIN, CLK, MSBFIRST, cmd); // transmitir dados seriais digitalWrite (CE, HIGH);} void LcdClearScreen () {// Bildschirm ler para (int i =0; i <504; i ++) LcdWriteData (0x00);} void LcdClearLine (int line) {// Zeile leeren LcdXY (0, linha); for (int i =0; i <84; i ++) LcdWriteData (0x00);} void LcdXY (int x, int y) {// uma posição 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; long b4, b7 long sem sinal; x1 =((longo) ut - ac6) * ac5>> 15; // Temperatura berechnen x2 =((longo) 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) up - b3) * (50000>> configuração_de_ sobreamostragem); 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); atraso (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)); atraso (pressure_waittime [oversampling_setting]); caracteres sem sinal msb, lsb, xlsb; 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 (((longo) msb <<16) | ((longo) lsb <<8) | ((longo) 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 Sekunde WDTCSR =WDTCSR | B01000000; // Interrupção do Watchdog einschalten MCUSR =MCUSR &B11110111;} ISR (WDT_vect) {sleepcounter ++; // Schlafzyklen mitzahlen} 

Esquemas


Processo de manufatura

  1. Kazoo
  2. Construindo placas de ensaio Arduino sem fios de jumper
  3. Giftduino - A caixa de presente perfeita do Arduino
  4. BME280 Temperatura, Umidade e Pressão na Tela Nextion
  5. Registrador de dados do balão meteorológico Arduino
  6. $ 10 Estação meteorológica portátil Arduino (AWS)
  7. eDOT - Relógio de precisão baseado em Arduino e estação meteorológica
  8. Estação meteorológica ThingSpeak Arduino
  9. Sensor de pressão IoT:MKR GSM + Arduino Cloud + Planilhas Google
  10. Estação meteorológica Arduino