Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino Nano Wetterstation: Sensor-Kit & OLED-Display

Komponenten und Zubehör

Benötigte Werkzeuge

Software

Projektüberblick

Eine lokale Wetterstation ohne Internetzugang: Misst Luftdruck, Temperatur, Luftfeuchte, UV-Index (bei Fenstermontage) und zeigt Uhrzeit, Datum, Wochentag an. Alle Daten auf einem 0,96″ OLED-Display in 4 Seiten mit 5 s Wechselintervall.

Arduino Nano Wetterstation: Sensor-Kit & OLED-Display
Arduino Nano Wetterstation: Sensor-Kit & OLED-Display
Arduino Nano Wetterstation: Sensor-Kit & OLED-Display
Arduino Nano Wetterstation: Sensor-Kit & OLED-Display
Arduino Nano Wetterstation: Sensor-Kit & OLED-Display
Arduino Nano Wetterstation: Sensor-Kit & OLED-Display
Arduino Nano Wetterstation: Sensor-Kit & OLED-Display
Arduino Nano Wetterstation: Sensor-Kit & OLED-Display

Schritt 1: Gehäuse drucken

Arduino Nano Wetterstation: Sensor-Kit & OLED-Display
Arduino Nano Wetterstation: Sensor-Kit & OLED-Display

STL-Datei im Projekt enthalten. Grünes PLA, 20 % Infill, Supports, 70 mm/s auf Ender 3.

Schritt 2: BMP280 (SPI-Modus)

Verdrahtung: CS→D10, SDA(MOSI)→D11, SDO(MISO)→D12, SCK→D13.

Bibliothek: Adafruit_BMP280. Initialisierung im setup(), Auslesen im loop() mit bmp.readPressure() (Pa → /100 = hPa), bmp.readTemperature(), bmp.readAltitude(1005.47) (lokalen Mittelwert-Druck in hPa einsetzen).

Schritt 3: DS3231 RTC (I2C)

Verdrahtung: SCL→A5, SDA→A4.

Zeit einmalig mit DS3231_set.ino (Bibliotheks-Beispiel) stellen. Bibliothek DS3231.h, Wochentag per switch über clock.getDoW() (1=Samstag … 7=Freitag).

Schritt 4: DHT11

Data-Pin → D2. Bibliothek DHT.h, dht.readHumidity().

Schritt 5: GUVA-S12SD UV-Sensor

Analogausgang (kalibrierte Spannung proportional zu UV-Intensität, 240–370 nm). An A0 anschließen.

float sensorValue = analogRead(A0);
float sensorVoltage = sensorValue / 1024.0 * 5.0;
int UV_index = sensorVoltage / 0.1;  // 0,1 V pro UV-Index-Stufe

Schritt 6: OLED-Display (I2C, 128×64, SSD1306)

SCK→A5, SDA→A4 (gemeinsamer I2C-Bus mit RTC & BMP280).

Bibliotheken: Adafruit_GFX.h, Adafruit_SSD1306.h, Fonts FreeSans9pt7b, FreeMonoBoldOblique12pt7b. Bitmaps für Icons (Rahmen, Sonne, etc.) im Flash (PROGMEM).

Anzeigeschleife: 4 Seiten (Zeit, Druck/Höhe, Temp/Feuchte, UV-Index), je 5 s, display.clearDisplay() + Neuaufbau.

Kompletter Code

#include <Wire.h> #include <SPI.h> #include <Adafruit_BMP280.h> #include <DS3231.h> #include <DHT.h>
#include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Fonts/FreeSans9pt7b.h> #include <Fonts/FreeMonoBoldOblique12pt7b.h>
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define BMP_SCK 13 #define BMP_MISO 12 #define BMP_MOSI 11 #define BMP_CS 10
DS3231 clock; bool century=false, h12Flag, pmFlag;
Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
#define DHTPIN 2 #define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// PROGMEM Bitmaps frame0, frame1, frame2 ... (siehe Original)

void setup() {
  Serial.begin(57600);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 failed")); }
  Wire.begin(); dht.begin();
  if(!bmp.begin()) { Serial.println(F("Problem.bmp")); while(1) delay(10); }
  // Startbildschirm
  display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1);
  display.setCursor(0,9); display.setFont(&FreeSans9pt7b); display.println("**** LOCAL ****");
  display.setCursor(0,38); display.setFont(&FreeMonoBoldOblique12pt7b); display.println("wather");
  display.setCursor(27,58); display.println("Station"); display.display(); delay(2000);
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, Adafruit_BMP280::SAMPLING_X2,
                  Adafruit_BMP280::SAMPLING_X16, Adafruit_BMP280::FILTER_X16,
                  Adafruit_BMP280::STANDBY_MS_500);
}

void loop() {
  // Seite 1: Zeit
  display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1);
  display.setCursor(13,15); display.setFont(&FreeMonoBoldOblique12pt7b);
  display.print(clock.getHour(h12Flag,pmFlag)); display.setCursor(38,15); display.println(":");
  display.setCursor(50,15); display.println(clock.getMinute());
  display.setCursor(70,15); display.println(pmFlag?" PM":" AM ");
  display.setFont(&FreeSans9pt7b); display.setCursor(20,60); display.println(clock.getDate());
  display.setCursor(40,60); display.println("/"); display.setCursor(46,60); display.println(clock.getMonth(century));
  display.setCursor(65,60); display.println("/"); display.setCursor(70,60); display.println("20");
  display.setCursor(90,60); display.println(clock.getYear());
  display.setCursor(30,30); display.setFont(&FreeSans9pt7b);
  switch(clock.getDoW()){ case 1:display.println("Saturday");break; case 2:display.println("Sunday");break;
    case 3:display.println("Monday");break; case 4:display.println("Tuesday");break;
    case 5:display.println("Wednesday");break; case 6:display.println("Thursday");break;
    case 7:display.println("Friday");break; }
  display.display(); delay(5000);

  // Seite 2: Druck & Höhe
  display.clearDisplay(); display.drawBitmap(0,0,frame0,40,40,1);
  display.setFont(&FreeSans9pt7b); display.setCursor(41,28); display.println(bmp.readPressure()/100);
  display.setCursor(110,28); display.setFont(); display.println("hPa");
  display.setCursor(0,55); display.setFont(&FreeSans9pt7b); display.println("Altitude:");
  display.setCursor(65,62); display.println(bmp.readAltitude(1005.47)); display.setCursor(113,62); display.println("m");
  display.display(); delay(5000);

  // Seite 3: Temp & Feuchte
  display.clearDisplay(); display.setFont(&FreeMonoBoldOblique12pt7b);
  display.drawBitmap(0,5,frame1,40,51,1);
  display.setCursor(35,30); display.print(bmp.readTemperature());
  display.setFont(&FreeSans9pt7b); display.setCursor(102,28); display.println(" *"); display.setCursor(110,31); display.println(" C");
  display.setFont(); display.setCursor(66,45); display.println("RH :");
  byte RH = dht.readHumidity(); display.setCursor(95,45); display.println(RH); display.setCursor(110,45); display.println("%");
  display.drawBitmap(0,56,frame2,135,15,1); display.display(); delay(5000);

  // Seite 4: UV-Index
  display.clearDisplay();
  float sensorValue = analogRead(A0);
  float sensorVoltage = sensorValue / 1024.0 * 5.0;
  int UV_index = sensorVoltage / 0.1;
  display.setFont(&FreeSans9pt7b); display.setCursor(0,15); display.print(" UV INDEX ");
  display.setCursor(58,45); display.println(UV_index); display.display(); delay(5000);
}

Schaltplan

Arduino Nano Wetterstation: Sensor-Kit & OLED-Display

Herstellungsprozess

  1. DIY Solar-betriebene Wetterstation mit Raspberry Pi
  2. Outdoor-Wetterstation mit Raspberry Pi 2 & ADS-WS1 bauen
  3. Raspberry Pi Wetterstation bauen, die tägliche Wetterdaten per E-Mail sendet
  4. Fortgeschrittene Wetterstation v2.0: Echtzeit Temperatur, Druck, Feuchte & Höhe Monitoring
  5. Arduino-gesteuerte 6-Shot-Getränkemischstation – Bauen Sie Ihren eigenen Cocktail-Automaten
  6. Multi-Position Temperatursensor-System für Smart-Home-Integration
  7. Hochleistungs-Datenlogger für Arduino-Wetterballons
  8. Tragbare Arduino-Wetterstation für 10$ bauen (Nano, DHT22, BMP180 & LCD)
  9. Wetterstation mit Arduino & ThingSpeak IoT (DHT11 + ESP8266)
  10. WiFi-Wetterstation mit ESP8266 & DHT22 – Daten zu ThingSpeak