Mirko Pavleski
Published © GPL3+

Arduino matrix scrolling weather station and Clock with BME

How to make a scrolling weather station that displays the temperature, air humidity and relative atmospheric pressure, and Time

BeginnerFull instructions provided5,307
Arduino matrix scrolling weather station and Clock with BME

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1
DS3231M - ±5ppm, I2C Real-Time Clock
Maxim Integrated DS3231M - ±5ppm, I2C Real-Time Clock
×1
Gravity: I2C BME280 Environmental Sensor
DFRobot Gravity: I2C BME280 Environmental Sensor
×1
Led dot matrix display with MAX7219 controller, Red
×7

Software apps and online services

Arduino IDE
Arduino IDE

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
Solder Wire, Lead Free
Solder Wire, Lead Free

Story

Read more

Schematics

Schematic diagram

Code

Arduino Code

Arduino
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <Adafruit_BME280.h>
#include "RTClib.h"

RTC_DS1307 rtc; 

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

Adafruit_BME280 bme280;
int mm; 

int pinCS = 10; // Uno or Duemilanove DIN 11 (MOSI) CLK 13 (SCK)
int numberOfHorizontalDisplays = 7;
int numberOfVerticalDisplays = 1; 

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String tape = "";
int wait = 25; // speed

int spacer = 2; // Character spacing (points)
int width = 5 + spacer; // Font width 5 pixels

String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB7; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

String Serial_Read() {
  unsigned char c; // variable port for reading series
  String Serial_string = ""; // Forming from a character string
  while (Serial.available() > 0) { // If there are symbols in the series
    c = Serial.read(); // We read a symbol
    //Serial.print(c,HEX); Serial.print(" "); Serial.print(c);
    if (c == '\n') {  //If this is a string of lines
          return Serial_string; // We return the line
    }
    if (c == 0xB8) c = c - 0x01; 
    if (c >= 0xBF && c <= 0xFF) c = c - 0x01;
    Serial_string = Serial_string + String(char(c)); //Add symbol to line
  }
  return Serial_string; 
}
String chas;
String myn;
//String mesyc = "";

void setup() {
  
  Serial.begin(9600);
  Serial.println(F("bme280"));
  //==================================== hours
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running, let's set the time!");
    // When time needs to be set on a new device, or after a power loss, the
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
 //====================================
  while (!bme280.begin(BME280_ADDRESS - 1)) {
    Serial.println(F("Could not find a valid bme280 sensor, check wiring!"));
    delay(2000);
  }
  
 
  
  matrix.setIntensity(3); // Use a value between 0 and 15 for brightness
  matrix.setRotation(matrix.getRotation()+0); //1 - 90  2 - 180   3 - 270
 //a=a+1;
}
void loop() {
  DateTime now = rtc.now();
  float temperature = bme280.readTemperature();
  float pressure = bme280.readPressure()/100.0F;
  float altitude = bme280.readAltitude(1013.2);
  float humidity = bme280.readHumidity();
  pressure = pressure + 78.5  ;   //Relative pressure for 700m above sea level, comment this row for relative atmospheric pressure
 //======================================= correction digit time zero before the number
 chas ="";
 myn = "";
 if (now.hour() < 10) {
chas = '0';
}

if (now.minute() < 10) {
myn = ('0');
}

//=======================================
 tape = utf8rus((String)+daysOfTheWeek[now.dayOfTheWeek()]+"     Time  "+chas +now.hour()+":"+myn+now.minute()+" h    Temperature = "+temperature +" degree C   Humidity = " + humidity +  " %    Pressure = "+ pressure +" Hpa");
  if (Serial.available()){
    tape=Serial_Read();
  } 
  for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) 
       {
    matrix.fillScreen(LOW);

    int letter = i / width; // number of symbols displayed on a matrix
    
    int y = (matrix.width() - 1) - i % width;  
    int x = (matrix.height() - 8) / 2; 

    while ( y + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(y, x, tape[letter], HIGH, LOW,1);
      }
      letter--;
      y -= width;
    }
    matrix.write(); // Send a picture for display
    delay(wait);
  }
}

Credits

Mirko Pavleski

Mirko Pavleski

150 projects • 1283 followers

Comments