// Подключаем библиотеки для раблты с дисплеем NOKIA 5110
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// Номаре выводов Arduino для подключения димплея
#define PIN_5110_SCLK 3
#define PIN_5110_DIN  4
#define PIN_5110_DC   5
#define PIN_5110_CS   6
#define PIN_5110_RST  7

Adafruit_PCD8544 display = Adafruit_PCD8544(PIN_5110_SCLK, 
                                            PIN_5110_DIN, 
                                            PIN_5110_DC, 
                                            PIN_5110_CS, 
                                            PIN_5110_RST);

// Подключаем библиотеки для работы с датчиком BMP280
#include <Wire.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;

uint8_t pp[84]; // Массив значений атм. давления для вывода графика
uint8_t index = 0; // Текущий индекс (точка на графике)

void setup() {
  display.begin(); // Инициализация дисплея
  display.setContrast(45); // Настройка контрасности
  display.display(); // Подготовка к выводу изображения
  delay(2000);
  display.clearDisplay(); // Очистка дисплея

  bmp.begin(); // Инициализация датчика BMP280
  
  // Настройка режимоа работы датчика BMP280
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
                  Adafruit_BMP280::SAMPLING_X2,
                  Adafruit_BMP280::SAMPLING_X16,
                  Adafruit_BMP280::FILTER_X16,
                  Adafruit_BMP280::STANDBY_MS_500);

  // Заполняем массив графика нулевыми значениями
  for(uint8_t i = 0; i < 84; i++) pp[i] = 0;
}

void loop() {
  // Считываем и выводим показания температуры
  float t = bmp.readTemperature();
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print("t=");
  display.print(t);
  display.println("oC");

  // Считываем и выводим показания высоты
  float a = bmp.readAltitude(1005);
  display.setCursor(0, 8);
  display.print("h=");
  display.print(a);
  display.println("m");

  // Считываем и выводим показания атмосверного давления
  float p = bmp.readPressure();
  p = p * 0.00750062;
  display.setCursor(0, 16);
  display.print("p=");
  display.print(p);
  display.println("mmGh");  

  // Преобразуем показания для построения графика
  pp[index] = map(p, 730, 760, 0, 24);

  // Строим график
  index++;
  if(index > 83) {
    for(uint8_t i = 0; i < 84; i++) pp[i] = 0; 
    index = 0;
  }
  display.fillRoundRect(0, 24, 84, 24, 0, WHITE);
  for(uint8_t i = 0; i < 84; i++)
    display.drawLine(i, 48, i, 48 - pp[i], BLACK);
  display.display();
  delay(60000); // График будет обновляться 1 раз в минуту
  display.clearDisplay();
}
