Wetterstation

Mit dem Sensor BME280, einem Arduino Mega und einem 320 x 480 Pixel Display kann eine Wetterstation gebastelt werden. Angezeigt werden die Verläufe von Luftdruck, Luftfeuchtigkeit und Temperatur der letzten 36 Stunden. Dadurch erkennt man beim Blick auf das Display nicht nur die momentanen Werte, sondern kann auch abschätzen, wie sich das Wetter in den nächsten Stunden entwickeln wird.

  

 


Arduino-Code:

/*
  Hardware connections:
  BME280 -> Arduino
  GND -> GND
  Vin -> 5V
  SDA -> pin 20
  SCL -> pin 21
*/

#include <UTFT.h>

// Declare which fonts we will be using
extern uint8_t SmallFont[];

UTFT myGLCD(CTE32HR,38,39,40,41);

int xPos, yPos;           // Abtastposition
int value;                // Grauwert
int i, j;                 // Zählvariable

float pressure[350];      // Luftdruck
float temperature[350];   // Temperatur
float humidity[350];      // Luftfeuchtigkeit

unsigned long time_alt, time_neu, time_next;  // Integer zwischen 0 und 4.294.967.295 

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C




// ====================================
// ===                              ===
// ===            SETUP             ===
// ===                              ===
// ====================================

void setup()
   {
    Serial.begin(9600);
    while(!Serial);    // time to get serial running
    Serial.println(F("BME280 test"));

    unsigned status;
    
    // default settings
    // (you can also pass in a Wire library object like &Wire2)
    status = bme.begin();  
    
    if (!status)
       {
        Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
        Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
        Serial.print("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
        Serial.print("   ID of 0x56-0x58 represents a BMP 280,\n");
        Serial.print("        ID of 0x60 represents a BME 280.\n");
        Serial.print("        ID of 0x61 represents a BME 680.\n");
        while (1);
       }

    time_alt = millis();

    time_next = time_alt + 360000;

    //Serial.println(time_next);
    
    delay(10);

    

    // Setup the LCD
    myGLCD.InitLCD();
    myGLCD.setFont(SmallFont);    
    myGLCD.clrScr();

    for (i = 0; i <= 349; i++)
       {
        humidity[i] = -66;
        pressure[i] = -66;
        temperature[i] = -66;
       }

   

    myGLCD.clrScr();
    myGLCD.setColor(255, 255, 255);
    myGLCD.print("Wetterstation - stoppi", 150, 1);
    myGLCD.setColor(255, 255, 255);
    myGLCD.drawLine(50,290,430,290);
    myGLCD.drawLine(50,20,50,290);
    myGLCD.drawLine(430,20,430,290);
        
    myGLCD.setColor(255, 0, 0);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.drawCircle(20,2,2);
    myGLCD.print("C", 26, 1);
    myGLCD.setColor(0, 255, 0);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.print("%rh", 65, 1);
    myGLCD.setColor(0, 0, 255);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.print("mbar", 430, 1);
    myGLCD.setColor(255, 255, 255);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.print("h", 440, 300);
                    
    myGLCD.setColor(255, 255, 255);
    myGLCD.drawLine(45,290,55,290);
    myGLCD.drawLine(45,245,55,245);
    myGLCD.drawLine(45,200,55,200);
    myGLCD.drawLine(45,155,55,155);
    myGLCD.drawLine(45,110,55,110);
    myGLCD.drawLine(45,65,55,65);
    myGLCD.drawLine(45,20,55,20);
                
    myGLCD.drawLine(430,290,435,290);
    myGLCD.drawLine(430,245,435,245);
    myGLCD.drawLine(430,200,435,200);
    myGLCD.drawLine(430,155,435,155);
    myGLCD.drawLine(430,110,435,110);
    myGLCD.drawLine(430,65,435,65);
    myGLCD.drawLine(430,20,435,20);

    myGLCD.drawLine(430,290,430,295);
    myGLCD.drawLine(390,290,390,295);
    myGLCD.drawLine(350,290,350,295);
    myGLCD.drawLine(310,290,310,295);
    myGLCD.drawLine(270,290,270,295);
    myGLCD.drawLine(230,290,230,295);
    myGLCD.drawLine(190,290,190,295);
    myGLCD.drawLine(150,290,150,295);
    myGLCD.drawLine(110,290,110,295);
    
    myGLCD.setColor(255, 0, 0);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.printNumI(-20,20,285);
    myGLCD.printNumI(-10,20,240);
    myGLCD.printNumI(0,35,195);
    myGLCD.printNumI(10,25,150);
    myGLCD.printNumI(20,25,105);
    myGLCD.printNumI(30,25,60);
    myGLCD.printNumI(40,25,15);
            
    myGLCD.setColor(0, 255, 0);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.printNumI(20,60,285);
    myGLCD.printNumI(30,60,240);
    myGLCD.printNumI(40,60,195);
    myGLCD.printNumI(50,60,150);
    myGLCD.printNumI(60,60,105);
    myGLCD.printNumI(70,60,60);
    myGLCD.printNumI(80,60,15);

    myGLCD.setColor(0, 0, 255);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.printNumI(955,440,285);
    myGLCD.printNumI(960,440,240);
    myGLCD.printNumI(965,440,195);
    myGLCD.printNumI(970,440,150);
    myGLCD.printNumI(975,440,105);
    myGLCD.printNumI(980,440,60);
    myGLCD.printNumI(985,440,15);

    myGLCD.setColor(255, 255, 255);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.printNumI(0,428,300);
    myGLCD.printNumI(-4,385,300);
    myGLCD.printNumI(-8,345,300);
    myGLCD.printNumI(-12,300,300);
    myGLCD.printNumI(-16,260,300);
    myGLCD.printNumI(-20,220,300);
    myGLCD.printNumI(-24,180,300);
    myGLCD.printNumI(-28,140,300);
    myGLCD.printNumI(-32,100,300);
    /*
    for (i = 0; i <= 349; i++)
        {
         myGLCD.setColor(255,0,0);
         myGLCD.drawPixel(81 + i, 300 - humidity[i]);
        }
    */

    j = 0;
    
   }




// ====================================
// ===                              ===
// ===        HAUPTSCHLEIFE         ===
// ===                              ===
// ====================================

void loop()
   {    
    time_neu = millis();

    if(time_neu < time_alt)    // millis-Überlauf
       {
        //time_alt = 0;

        time_next = 0 + 360000;
       }

    if(time_neu > time_next && time_next >= 360000)   // neue Messung nach 6 Minuten
       {
        myGLCD.clrScr();
        myGLCD.setColor(255, 255, 255);
        myGLCD.print("Wetterstation - stoppi", 150, 1);
        myGLCD.setColor(255, 255, 255);
        myGLCD.drawLine(50,290,430,290);
        myGLCD.drawLine(50,20,50,290);
        myGLCD.drawLine(430,20,430,290);
        
        myGLCD.setColor(255, 0, 0);
        myGLCD.setBackColor(0, 0, 0);
        myGLCD.drawCircle(20,2,2);
        myGLCD.print("C", 26, 1);
        myGLCD.setColor(0, 255, 0);
        myGLCD.setBackColor(0, 0, 0);
        myGLCD.print("%rh", 65, 1);
        myGLCD.setColor(0, 0, 255);
        myGLCD.setBackColor(0, 0, 0);
        myGLCD.print("mbar", 430, 1);
        myGLCD.setColor(255, 255, 255);
        myGLCD.setBackColor(0, 0, 0);
        myGLCD.print("h", 440, 300);
                
        myGLCD.setColor(255, 255, 255);
        myGLCD.drawLine(45,290,55,290);
        myGLCD.drawLine(45,245,55,245);
        myGLCD.drawLine(45,200,55,200);
        myGLCD.drawLine(45,155,55,155);
        myGLCD.drawLine(45,110,55,110);
        myGLCD.drawLine(45,65,55,65);
        myGLCD.drawLine(45,20,55,20);
                
        myGLCD.drawLine(430,290,435,290);
        myGLCD.drawLine(430,245,435,245);
        myGLCD.drawLine(430,200,435,200);
        myGLCD.drawLine(430,155,435,155);
        myGLCD.drawLine(430,110,435,110);
        myGLCD.drawLine(430,65,435,65);
        myGLCD.drawLine(430,20,435,20);

        myGLCD.drawLine(430,290,430,295);
        myGLCD.drawLine(390,290,390,295);
        myGLCD.drawLine(350,290,350,295);
        myGLCD.drawLine(310,290,310,295);
        myGLCD.drawLine(270,290,270,295);
        myGLCD.drawLine(230,290,230,295);
        myGLCD.drawLine(190,290,190,295);
        myGLCD.drawLine(150,290,150,295);
        myGLCD.drawLine(110,290,110,295);
        
        myGLCD.setColor(255, 0, 0);
        myGLCD.setBackColor(0, 0, 0);
        myGLCD.printNumI(-20,20,285);
        myGLCD.printNumI(-10,20,240);
        myGLCD.printNumI(0,35,195);
        myGLCD.printNumI(10,25,150);
        myGLCD.printNumI(20,25,105);
        myGLCD.printNumI(30,25,60);
        myGLCD.printNumI(40,25,15);
        
        myGLCD.setColor(0, 255, 0);
        myGLCD.setBackColor(0, 0, 0);
        myGLCD.printNumI(20,60,285);
        myGLCD.printNumI(30,60,240);
        myGLCD.printNumI(40,60,195);
        myGLCD.printNumI(50,60,150);
        myGLCD.printNumI(60,60,105);
        myGLCD.printNumI(70,60,60);
        myGLCD.printNumI(80,60,15);

        myGLCD.setColor(0, 0, 255);
        myGLCD.setBackColor(0, 0, 0);
        myGLCD.printNumI(955,440,285);
        myGLCD.printNumI(960,440,240);
        myGLCD.printNumI(965,440,195);
        myGLCD.printNumI(970,440,150);
        myGLCD.printNumI(975,440,105);
        myGLCD.printNumI(980,440,60);
        myGLCD.printNumI(985,440,15);
        
        myGLCD.setColor(255, 255, 255);
        myGLCD.setBackColor(0, 0, 0);
        myGLCD.printNumI(0,428,300);
        myGLCD.printNumI(-4,385,300);
        myGLCD.printNumI(-8,345,300);
        myGLCD.printNumI(-12,300,300);
        myGLCD.printNumI(-16,260,300);
        myGLCD.printNumI(-20,220,300);
        myGLCD.printNumI(-24,180,300);
        myGLCD.printNumI(-28,140,300);
        myGLCD.printNumI(-32,100,300);

        
        for (i = 0; i <= 348; i++)
           {
            humidity[i] = humidity[i+1];
            pressure[i] = pressure[i+1];
            temperature[i] = temperature[i+1];                        
           }

       
        humidity[349] = bme.readHumidity();
        Serial.print("Humidity: ");
        Serial.print(humidity[349], 0);

        pressure[349] = bme.readPressure() / 100.0;
        Serial.print(" Pressure: ");
        Serial.print(pressure[349], 0);

        Serial.print(" Alt: ");
        Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA), 1);

        temperature[349] = bme.readTemperature();
        Serial.print(" Temp: ");
        Serial.print(temperature[349], 1);

        Serial.println();
        

        //humidity[349] = random(100);

        /*
        temperature[349] = -5 + 10 * sin(2 * 3.1415926535 * j / 40);
        humidity[349] = 70 + 10 * sin(2 * 3.1415926535 * j / 60);
        pressure[349] = 950 + 10 * sin(2 * 3.1415926535 * j / 80);
                
        j = j + 1;
        */

        for (i = 0; i <= 348; i++)
           {
            if (humidity[i] != -66)
               {
                myGLCD.setColor(255,0,0);
                //myGLCD.drawPixel(81 + i, -4.5 * temperature[i] + 200);
                myGLCD.drawLine(81+i,-4.5 * temperature[i] + 200,81+i+1,-4.5 * temperature[i+1] + 200);
                myGLCD.setColor(0,255,0);
                //myGLCD.drawPixel(81 + i, -4.5 * humidity[i] + 380);
                myGLCD.drawLine(81+i,-4.5 * humidity[i] + 380,81+i+1,-4.5 * humidity[i+1] + 380);
                myGLCD.setColor(0,0,255);
                //myGLCD.drawPixel(81 + i, -4.5 * pressure[i] + 4430);
                myGLCD.drawLine(81+i,-9.0 * pressure[i] + 8885,81+i+1,-9.0 * pressure[i+1] + 8885);                
               }
           }
        
        
        Serial.print("6 Minuten abgelaufen ");
        Serial.println(time_next);

        time_next = time_next + 360000;

            
       }
    
    time_alt = time_neu;

    delay(10);
   
   }