亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino + ESP 气象箱

组件和用品

Arduino Nano R3
× 1
MyOctopus i2c 气压传感器 BMP280
× 1
诺基亚 5110 LCD
× 1
NodeMCU 1.0
× 1
图形 OLED,128 x 64
× 1

必要的工具和机器

烙铁(通用)

关于这个项目

该装置由两个独立的组件在一个盒子中组成。

一个是带有 BMP180 传感器的 Arduino 气压计,它包含实时、-1 小时和 -3 小时大气压差的报告。这些报告在当地的短期天气预报中特别有用。 Тhe 代码取自“shelvin.de”网站,其中在代码的“druck_offset=”行中输入给定高度的绝对和相对大气压力之间的差值。结果显示在 N5110 LCD 屏幕上,该屏幕还显示内部温度。

下一个设备由连接 0.96 英寸 oled 显示器的 ESP8266 板供电。 ESP8266 通过 Wi-Fi 网络连接到“openweathermap”页面,从中获取三天的天气预报并将其显示在 oled 显示屏上。为此,您需要在代码中输入 API 密钥,该密钥是从 Openweathermap 页面获取的。在 esp8266 上安装库和代码的完整详细说明位于:

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

在这种特殊情况下,我使用 NodeMCU 1.0(ESP12E 模块)板。

下图为完整装置的方案。

代码

  • 无标题文件
无标题文件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 5110// BMP1uckrdsensor Uno//// Matthias Busse Version 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;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];//掉电变量nvolatile int sleepcounter =0; // Schlafzyklen mitzahlen// Display Variablenstatic const byte ASCII[][5] ={// ASCII Tabelle mit Fonts {0x00, 0x00, 0x00, 0x00, 0x00} // 20 ,{0x00, 0x00, 0x50f, 0x0f, 0x00 // 21 !,{0x00, 0x07, 0x00, 0x07, 0x00} // 22",{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #,{0x24, 0x2a, 0x2a,} // 24 $,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &,{0x00, 0x05, 0x00}, 0x03, 0x03 ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 ), {0x14, 0x08, 0x3e, { 0x14, } 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, 0x30, {0x3e, {0x30} 0x7f, 0x40, 0x00} // 31 1,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2,{0x21, 0x41, 0x45, 0x4b, 0x31}, {0x33, {0x49, {018} 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, 0x19, {0x29} , 0x36, 0x36, 0x00, 0x00} // 3a :,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b;,{0x08, 0x14, 0x22, 0x401, } 0x40, // 1x4 , 0x14, 0x14, 0x14} // 3d =,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e>,{0x02, 0x01, 0x51, 0x09, 0x06}, {0x39, // 3x9 , 0x41, 0x3e} // 40 @,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B,{0x4e, 0x4e} , 0x22} // 43 C,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E,{0x7f, 0x09, 0x09 } // 46 F,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H,{0x00, 0x41, 0x7f, 0x7f, / / 49 I,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K,{0x7f, 0x40, 0x40, 0x40, 0x40, 0x40, L,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N,{0x3e, 0x41, 0x41, 0x3e, } {0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R,{0x46, 0x499, x3, 0 // 53 S,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U,{0x1f, 0x20, 0x10}, // x 0 56 V,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X,{0x07, 0x08, 0x70, 0x70, 0x70, 0x70 ,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [,{0x02, 0x04, 0x08, 0x20}, {0x20} 0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ],{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^,{0x40, 0x40, 0x40, 0x40, {0x40, {0x40} 0x01, 0x02, 0x04, 0x00} // 60 `,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a,{0x7f, 0x48, 0x44, 0x44, 0x38,}0{ 6x38,}0 0x44, 0x44, 0x20} // 63 c,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d,{0x38, 0x54, 0x54, 0x54, 0x18} // 605,{0x7f, {0} 0x01, 0x02} // 66 f,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h,{0x40,0x40, 0 0x00} // 69 i,{0x20, 0x40 , 0x44, 0x3d, 0x00} // 6a j ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k,{0x00, 0x41, 0x7f, 0x40, 0x00, {0x7f, {0x7c, // 6c , 0x04, 0x78} // 6d m,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o, {0x14, {0x14} , 0x08} // 70 p,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r,{0x48, 0x54, 0x54 } // 73 s,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u,{0x1c, 0x20, / 0x10 / 76 v,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x,{0x0c, 0x50, 0x50, 0x50, 0x50, 0x3c} y,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {,{0x00, 0x00, 0x7f, } 0x00} // {0x00, 0x41, 0x36, 0x08, 0x00} // 7d },{0x10, 0x08, 0x08, 0x10, 0x08} // 7e <,{0x78, 0x46, 0x41, 0x786}; // #定义 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=eepromAdresse -(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); // 温度 ausgeben LcdXY(8,5); LcdWriteString("温度"); LcdXY(43,5); LcdWriteString(dtostrf(t,4,1,tstring)); LcdXY(73,5); LcdWriteString("C"); eepromAdresse +=4;如果(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.1247.47. .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 Version 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 Tabelle oben for(int i =0; i <5; i++) LcdWriteData(ASCII[character - 0x20][i]);液晶写入数据(0x00); }void LcdWriteCmd(byte cmd){ // Kommando 显示发送 digitalWrite(DC, LOW); //DC 引脚为低电平用于命令 digitalWrite(CE, LOW); shiftOut(DIN, CLK, MSBFIRST, cmd); //传输串行数据digitalWrite(CE, HIGH);}void LcdWriteData(byte cmd){ // 显示发送的日期digitalWrite(DC, HIGH); //DC引脚为高数据digitalWrite(CE, LOW); shiftOut(DIN, CLK, MSBFIRST, cmd); //传输串行数据digitalWrite(CE, HIGH);}void LcdClearScreen() { // Bildschirm leeren for(int i=0; i <504; i++) LcdWriteData(0x00);}void LcdClearLine(int line) { // Zeile leeren LcdXY(0, line); for(int i=0; i <84; i++) LcdWriteData(0x00);}void LcdXY(int x, int y) { // 一个 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 =((long)ut - ac6) * ac5>> 15; //温度 berechnen 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.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));延迟(压力等待时间[过采样设置]);无符号字符 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);} 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()) {} // 警告 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()) {} // 警告 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; // 看门狗中断 einschalten MCUSR =MCUSR &B11110111;} ISR(WDT_vect) { sleepcounter ++; // Schlafzyklen mitzahlen}

示意图


制造工艺

  1. Kazoo
  2. 构建没有跳线的 Arduino 面包板
  3. Giftduino - 完美的 Arduino 礼品盒
  4. BME280 Nextion Display 上的温度、湿度和压力
  5. Arduino Powered Weather Balloon Datalogger
  6. $10 便携式 Arduino 气象站 (AWS)
  7. eDOT - 基于 Arduino 的精密时钟和气象站
  8. ThingSpeak Arduino 气象站
  9. 物联网压力传感器:MKR GSM + Arduino Cloud + Google Sheets
  10. Arduino 气象站
  11. Arduino Arcade LEGO 游戏盒
  12. Arduino Barometer