#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define GRAPH_HEIGHT 30
#define GRAPH_WIDTH SCREEN_WIDTH
#define GRAPH_X 0
#define GRAPH_Y (SCREEN_HEIGHT - GRAPH_HEIGHT - 20)

#define DATA_POINTS 1440 // Количество точек за сутки

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified();

float pressureData[DATA_POINTS]; // Массив для хранения данных о давлении
int index = 0;                    // Индекс для заполнения массива

void setup() {
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
 
  if (!bmp.begin()) {
    Serial.println("Не удалось найти датчик BMP180!");
    while (1);
  }
}

void loop() {
  sensors_event_t event;
  bmp.getEvent(&event);
 
  if (event.pressure) {
    display.clearDisplay();
   
    // Конвертируем давление в мм рт. ст.
    float pressureInMmHg = event.pressure * 0.750062;
    pressureData[index] = pressureInMmHg; // Сохраняем данные о давлении в массив
    index = (index + 1) % DATA_POINTS; // Циклический индекс

    // Рисуем график
    drawGraph(pressureData, GRAPH_Y, SSD1306_WHITE);

    // Выводим текстовые данные
    display.setCursor(40, 0);
    //display.print("Давл.: ");
    display.print((int) pressureInMmHg);
    display.println(" mmHg");

    display.display();
  }

  delay(60000); // Обновляем данные каждую минуту
}

void drawGraph(float* data, int y, uint16_t color) {
  // Очищаем предыдущий график
  display.fillRect(GRAPH_X, y, GRAPH_WIDTH, GRAPH_HEIGHT, SSD1306_BLACK);

  for (int x = 0; x < DATA_POINTS - 1; x++) {
    // Нормализуем данные в диапазоне 730-770 мм рт. ст.
    int y1 = map(data[x], 730, 770, y + GRAPH_HEIGHT, y);
    int y2 = map(data[x + 1], 730, 770, y + GRAPH_HEIGHT, y);
   
    // Проверяем, чтобы y1 и y2 были в допустимых границах
    if (y1 >= y && y1 <= y + GRAPH_HEIGHT && y2 >= y && y2 <= y + GRAPH_HEIGHT) {
      display.drawLine(x, y1, x + 1, y2, color);
    }
  }
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
BMP180Breakout
chip1:VCC
chip1:GND
chip1:SCL
chip1:SDA
oled1:GND
oled1:VCC
oled1:SCL
oled1:SDA