Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Arduino + ESP Weather Box

Komponen dan persediaan

Arduino Nano R3
× 1
MyOctopus i2c Sensor Tekanan Udara Barometrik BMP280
× 1
LCD Nokia 5110
× 1
NodeMCU 1.0
× 1
OLED Grafis, 128 x 64
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)

Tentang proyek ini

Perangkat ini terdiri dari dua rakitan independen dalam satu kotak.

Salah satunya adalah barometer Arduino dengan sensor BMP180, yang berisi laporan perbedaan tekanan atmosfer secara realtime, -1h dan -3h. Laporan-laporan ini sangat berguna dalam ramalan cuaca lokal jangka pendek. Kode ini diambil dari situs web "shelvin.de", yang memasukkan perbedaan antara tekanan atmosfer absolut dan relatif untuk ketinggian tertentu dalam baris "druck_offset=" pada kode. Hasilnya ditampilkan pada layar LCD N5110, yang juga menunjukkan suhu internal.

Perangkat berikutnya ditenagai oleh papan ESP8266 yang menghubungkan layar oled 0,96 inci. ESP8266 terhubung melalui jaringan Wi-Fi ke halaman "openweathermap", dari mana dibutuhkan ramalan cuaca tiga hari dan menampilkannya di layar lama. Untuk tujuan ini, Anda perlu memasukkan kunci API dalam kode, yang diperoleh dari halaman Openweathermap. Instruksi lengkap lengkap untuk menginstal perpustakaan dan kode pada esp8266 diberikan di :

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

Dalam kasus khusus ini, saya menggunakan papan NodeMCU 1.0 (modul ESP12E).

Gambar di bawah menunjukkan skema perangkat lengkap.

Kode

  • File tanpa judul
File tanpa judulArduino
// Luftdruck Ausgabe aktuell// Luftdruckdifferenz wird mit 1 und 3 Stunden vorher (im EEPROM) verglichen und ausgegeben// Temperatur Ausgabe aktuell//// Bauteile:// LCD Display vom Nokia 5110// BMP180 Luftdrucksensor/ Arduino Uno//// Matthias Busse Versi 1.0 vom 21.9.2014#include #include #include  // Variabel EEPROM eepromAdresse=0, eepromMax=1023; // 1024 EEPROM Speicherplatze, 0-1023int eepromOldAdr, eepromDif1=60, eepromDif3=180; // 60/180 Speicherplatze (Menit) 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];// Power Down Variablenvolatile int sleepcounter =0; // Schlafzyklen mitzahlen// Tampilkan Variablenstatic const byte ASCII[][5] ={// ASCII Tabelle mit Font {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 T,{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 j,{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 d,{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>};# mendefinisikan RST 12#menentukan CE 11#menentukan DC 10#menentukan DIN 9#menentukan CLK 8menghindari setup(){ for(int i=0; saya  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); // Diff 3j 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("3j:"); if(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); // Temperatur ausgeben LcdXY(8,5); LcdWriteString("Suhu"); 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.648 bis .483.647//// Matthias Busse 23.5.2014 Versi 1.0byte oleh; for(int i=0;i <4;i++) { oleh =(lo>> ((3-i)*8)) &0x000000ff; EEPROM.tulis(adr+i, oleh); }} // 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 Versi 1.0long lo=0; for(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 Tabel oben for(int i =0; i <5; i++) LcdWriteData(ASCII[karakter - 0x20][i]); LcdWriteData(0x00); }void LcdWriteCmd(byte cmd){ // Kommando an Display senden digitalWrite(DC, LOW); // pin DC rendah untuk perintah digitalWrite(CE, LOW); shiftOut(DIN, CLK, MSBFIRST, cmd); //mengirim data serial digitalWrite(CE, HIGH);}void LcdWriteData(byte cmd){ // Tanggalkan tampilan senden digitalWrite(DC, HIGH); // pin DC tinggi untuk data digitalWrite(CE, LOW); shiftOut(DIN, CLK, MSBFIRST, cmd); //mengirim data serial digitalWrite(CE, HIGH);}void LcdClearScreen() { // Bildschirm leeren for(int i=0; i <504; i++) LcdWriteData(0x00);}void LcdClearLine(int line) { // Zeile leeren LcdXY(0, baris); for(int i=0; i <84; i++) LcdWriteData(0x00);}void LcdXY(int x, int y) { // posisi 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 =((panjang)ut - ac6) * ac5>> 15; //Suhu beechnen x2 =((panjang) 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>> oversampling_setting); 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); penundaan (5); //mehr als 4,5 ms mengembalikan 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 yang tidak ditandatangani; Wire.beginTransmission(I2C_ADDRESS); Wire.write(0xf6); Kawat.endTransmisi(); 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 (((panjang)msb<<16) | ((panjang)lsb<<8) | ((panjang)xlsb))>>(8-oversampling_setting);} void write_register(unsigned char, unsigned char v) { Wire.beginTransmission(I2C_ADDRESS); Kawat.tulis(r); Kawat.tulis(v); Wire.endTransmission();} char read_register(unsigned char r) {unsigned char v; Wire.beginTransmission(I2C_ADDRESS); Kawat.tulis(r); Kawat.endTransmisi(); Wire.requestFrom(I2C_ADDRESS, 1); while(!Wire.available()) {} // warten v =Wire.read(); return v;} int read_int_register(char r tidak bertanda) {unsigned char msb, lsb; Wire.beginTransmission(I2C_ADDRESS); Kawat.tulis(r); Kawat.endTransmisi(); 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; // Watchdog Interrupt einschalten MCUSR =MCUSR &B11110111;} ISR(WDT_vect) { sleepcounter ++; // Schlafzyklen mitzahlen}

Skema


Proses manufaktur

  1. Kazoo
  2. Membuat papan tempat memotong roti Arduino tanpa kabel jumper
  3. Giftduino - Kotak Hadiah Arduino yang Sempurna
  4. Suhu, Kelembaban, dan Tekanan BME280 pada Tampilan Berikutnya
  5. Datalogger Balon Cuaca Bertenaga Arduino
  6. $10 Portable Arduino Weather Station (AWS)
  7. eDOT - Jam Presisi dan Stasiun Cuaca Berbasis Arduino
  8. Stasiun Cuaca ArduinoThingSpeak
  9. Sensor Tekanan IoT:MKR GSM + Arduino Cloud + Google Spreadsheet
  10. Stasiun Cuaca Arduino