산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino + ESP Weather Box

구성품 및 소모품

Arduino Nano R3
× 1
MyOctopus i2c 기압 센서 BMP280
× 1
노키아 5110 LCD
× 1
NodeMCU 1.0
× 1
그래픽 OLED, 128 x 64
× 1

필요한 도구 및 기계

납땜 인두(일반)

이 프로젝트 정보

이 장치는 하나의 상자에 두 개의 독립적인 어셈블리로 구성되어 있습니다.

하나는 대기압의 실시간 -1h 및 -3h 차이에 대한 보고서가 포함된 BMP180 센서가 있는 Arduino 기압계입니다. 이 보고서는 단기 지역 일기 예보에 특히 유용합니다. 코드는 "shelvin.de" 웹사이트에서 가져온 것으로, 코드의 "druck_offset=" 줄에 주어진 고도에 대한 절대 대기압과 상대 대기압 간의 차이가 입력됩니다. 결과는 N5110 LCD 화면에 표시되며 내부 온도도 표시됩니다.

다음 장치는 0.96인치 OLED 디스플레이를 연결하는 ESP8266 보드로 구동됩니다. ESP8266은 Wi-Fi 네트워크를 통해 "openweathermap" 페이지에 연결되며, 여기에서 3일 간의 일기 예보를 가져와 oled 디스플레이에 표시합니다. 이를 위해서는 Openweathermap 페이지에서 가져온 API 키를 코드에 입력해야 합니다. esp8266에 라이브러리 및 코드를 설치하기 위한 전체 세부 지침은 다음에서 제공됩니다.

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

이 특별한 경우에는 NodeMCU 1.0(ESP12E 모듈) 보드를 사용합니다.

아래 그림은 전체 장치의 구성을 보여줍니다.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • 제목 없는 파일
  • 제목 없는 파일Arduino
    // Luftdruck Ausgabe aktuell// Luftdruckdifferenz wird mit 1 und 3 Stunden vorher (im EEPROM) verglichen und ausgegeben// Temperatur Ausgabe aktuell//// Bauteile:// LCD Display vom Nokia 5180 Luft// Uno//// Matthias Busse 버전 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(분) 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 }; // ㄹ. 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=float t, temp_offset=0.0, d, dAlt, dDiff, druck_offset=2.0;int zeitabgl=0, mitteln=5;char tstring[5], dstring[7];// 전원 끄기 변수nvolatile int sleepcounter =0; // Schlafzyklen mitzahlen// 디스플레이 변수nstatic const byte ASCII[][5] ={// ASCII Tabelle mit 글꼴 {0x00, 0x00, 0x00, 0x00, 0x00} // 20 ,{0x00, 0x00, 0x000} // 21 !,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 ",{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #,{0x24, // 0x2a, 0x27f}, 24 $,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &,{0x00, 0x05, 0x003, // ' ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 ),{0x14, 0x08, // 0x3e, 20x0 0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c,,{0x08, 0x08, 0x08, 0x08, // 0x08, // 0x60, 0x60, 0x00, 0x00} // 2e .,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /,{0x3e, 0x51, 0x49, // 0x45,{ 0x03e} 0x7f, 0x40, 0x00} // 31 1,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2,{0x21, 0x41, 0x45, 0x4b, 0x33, // 0x4b, 0x31}, // 0x33 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, 30x29} , 0x36, 0x36, 0x00, 0x00} // 3a :,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b;,{0x08, 0x14, 0x22, 0x41, 0x30, //{ , 0x14, 0x14, 0x14} // 3d =,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e>,{0x02, 0x01, 0x51, 0x09, 0x06, // 0x4 , 0x41, 0x3e} // 40 @,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B,{0x41e, , 0x22} // 43 C,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E,{0x7f, 00x09, } // 46 F,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H,{0x00, 0x41, 0x00} / 49 나,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K,{0x7f, 0x40, 0x400, // L,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N,{0x3e, 0x41, // 0x41, 0x7f} {0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R,{0x46, 0x499,0, // 53 S,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U,{0x1f, 0x20, 0x200, // Y56 V,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X,{0x07, 0x08, 0x070,0 ,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [,{0x02, 0x04, // 0x08, 50x10? 0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ],{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^,{0x40, 0x40, // 0x40, 0x40_, // 0x01, 0x02, 0x04, 0x00} // 60 `,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a,{0x7f, 0x48, 0x44, 0x44, 0x838} 0x44, 0x44, 0x20} // 63 c,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d,{0x38, 0x54, 0x54, 0x54, 0x18} // 0x65 e, 0x01, 0x02} // 66 f,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h,{0x400, 0x00} // 69 나,{0x20, 0x40 , 0x44, 0x3d, 0x00} // 6a j ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k,{0x00, 0x41, 0x7f, 0x40, 0x00, // 0x40, 0x00}, // 6c , 0x04, 0x78} // 6d m,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n,{0x38, 0x44, 0x44, 0x44, 0x38} // x14 ,o,{0 , 0x08} // 70p,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r,{0x48, 0x5 } // 73 s,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u,{0x1c, 0x20,00 / 76 v,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x,{0x0c, 0x50, 0x500, // 0x50, // y,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {,{0x00, 0x00, 0x0}f, 70x {0x00, 0x41, 0x36, 0x08, 0x00} // 7d },{0x10, 0x08, 0x08, 0x10, 0x08} // 7e <,{0x78, 0x46, 0x41, 0x78}; 정의 RST 12#define CE 11#define DC 10#define DIN 9#define CLK 8void setup(){ for(int i=0; 나는  800) { LcdXY(27,2); if(dDiff <0.0) LcdWriteString("-"); 그렇지 않으면 LcdWriteString("+"); if(dDiff <0.0) dDiff=dDiff*-1.0; // 절대적 LcdXY(34,2); LcdWriteString(dtostrf(dDiff,4,2,dstring)); } LcdXY(60,2); LcdWriteString("hPa"); eepromOldAdr=eepromadress -(eepromDif3*4); // Diff 3h zuruck gehen if(eepromOldAdr <0) eepromOldAdr =eepromMax + 1 + eepromOldAdr; // uberlauf dAlt=(float)eepromReadLong(eepromOldAdr)/100.0; // alten Wert lesen dDiff=d-dAlt; // 다른 이미지 LcdClearLine(3); LcdXY(8,3); // Ausgeben LcdWriteString("3h:"); if(dAlt> 800) { LcdXY(27,3); if(dDiff <0.0) LcdWriteString("-"); 그렇지 않으면 LcdWriteString("+"); if(dDiff <0.0) dDiff=dDiff*-1.0; // 절대적 LcdXY(34,3); LcdWriteString(dtostrf(dDiff,4,2,dstring)); } LcdXY(60,3); LcdWriteString("hPa"); LcdClearLine(5); // 온도 온도 LcdXY(8,5); LcdWriteString("온도"); LcdXY(43,5); LcdWriteString(dtostrf(t,4,1,tstring)); LcdXY(73,5); LcdWriteString("C"); eepromadress +=4; if(eepromadress> eepromMax) eepromadress=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. .483.647//// Matthias Busse 23.5.2014 버전 1.0byte by; for(int i=0;i <4;i++) { by =(lo>> ((3-i)*8)) &0x000000ff; EEPROM.write(adr+i, by); }} // 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 버전 =1.0long lo 0; for(int i=0;i <3;i++){ lo +=EEPROM.read(adr+i); 로 =로 <<8; } lo +=EEPROM.read(adr+3); return lo;} // eepromReadLongvoid LcdWriteString(char *characters) { // 문자열 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[문자 - 0x20][i]); LcdWriteData(0x00); }void LcdWriteCmd(byte cmd){ // Kommando 디스플레이 senden digitalWrite(DC, LOW); //DC 핀은 명령에 대해 로우입니다. digitalWrite(CE, LOW); shiftOut(DIN, CLK, MSBFIRST, cmd); // 직렬 데이터 전송 digitalWrite(CE, HIGH);}void LcdWriteData(byte cmd){ // 디스플레이 날짜 지정 senden digitalWrite(DC, HIGH); //DC 핀은 데이터에 대해 높음 digitalWrite(CE, LOW); shiftOut(DIN, CLK, MSBFIRST, cmd); //직렬 데이터 전송 digitalWrite(CE, HIGH);}void LcdClearScreen() { // Bildschrm leeren for(int i=0; i <504; i++) LcdWriteData(0x00);}void LcdClearLine(int line) { // Zeile leeren LcdXY(0, 라인); for(int i=0; i <84; i++) LcdWriteData(0x00);}void LcdXY(int x, int y) { // X / Y 위치 gehen LcdWriteCmd(0x80|x); // 스팔트 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 =((긴) ut - ac6) * ac5>> 15; //온도 x2 =((long) mc <<11) / (x1 + md); b5 =x1 + x2; *온도 =(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); 지연(5); //mehr als 4.5ms 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)); 지연(압력 대기 시간[오버샘플링_설정]); 부호 없는 문자 msb, lsb, xlsb; Wire.beginTransmission(I2C_ADDRESS); Wire.write(0xf6); Wire.endTransmission(); Wire.requestFrom(I2C_ADDRESS, 3); while(!Wire.available()) {} // 경고 msb =Wire.read(); while(!Wire.available()) {} // 경고 lsb |=Wire.read(); while(!Wire.available()) {} // 경고 xlsb |=Wire.read(); return (((long)msb<<16) | ((long)lsb<<8) | ((long)xlsb))>>(8-oversampling_setting);} 무효 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()) {} // 경고 msb =Wire.read(); while(!Wire.available()) {} // warten lsb =Wire.read(); 반환(((int)msb<<8) | ((int)lsb));} 무효 pwrDown(int sekunden) { set_sleep_mode(SLEEP_MODE_PWR_DOWN); // den tiefsten Schlaf auswahlen PWR_DOWN for(int i=0; i  ergibt ca. 1 세쿤데 WDTCSR =WDTCSR | B01000000; // 워치독 인터럽트 einschalten MCUSR =MCUSR &B11110111;} ISR(WDT_vect) { sleepcounter ++; // Schlafzyklen mitzahlen}

    회로도


    제조공정

    1. 카주
    2. 점퍼 와이어 없이 Arduino 브레드보드 만들기
    3. Giftduino - 완벽한 Arduino 선물 상자
    4. Nextion 디스플레이의 BME280 온도, 습도 및 압력
    5. Arduino 기반 날씨 풍선 데이터 로거
    6. $10 휴대용 Arduino 기상 관측소(AWS)
    7. eDOT - Arduino 기반 정밀 시계 및 기상 관측소
    8. ThingSpeak Arduino 기상 관측소
    9. IoT 압력 센서:MKR GSM + Arduino Cloud + Google Sheets
    10. Arduino 기상 관측소