#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define DHT_PIN 2
#define LIGHT_SENSOR_PIN A0
#define SOIL_MOISTURE_PIN A1

// Tablice przechowujące wcześniejsze odczyty
float previousTemperatures[10];

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
DHT dht(DHT_PIN, DHT11);

void setup()
{
    Serial.begin(9600);

    while (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
    {
        Serial.println("OLED Error");
        delay(1000);
    }

    display.clearDisplay();
    dht.begin();

    // Inicjalizacja tablicy wartościami temperatury
    float temperature = dht.readTemperature();
    for (int i = 0; i < 10; ++i)
    {
        previousTemperatures[i] = temperature;
    }
}

void loop()
{
    // Odczyt wilgotności gleby
    int soilMoisture = analogRead(SOIL_MOISTURE_PIN);
    // Konwersja wartości analogowej na procenty wilgotności
    soilMoisture = map(soilMoisture, 0, 1023, 0, 100);

    // Odczyt temperatury i wilgotności powietrza
    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();

    // Odczyt natężenia światła
    int lightIntensity = analogRead(LIGHT_SENSOR_PIN);
    // Konwersja wartości analogowej na procenty natężenia światła
    lightIntensity = map(lightIntensity, 0, 1023, 100, 0);

    // Zapisanie danych do tablicy. Przesunięcie wszystkich jej elementów
    for (int i = 1; i < 10; ++i)
    {
        previousTemperatures[i - 1] = previousTemperatures[i];
    }
    previousTemperatures[9] = temperature;

    // Analiza danych - sprawdzenie trendu temperatury
    float tempChange = 0.0f;
    for (int i = 1; i < 10; ++i)
    {
        tempChange += previousTemperatures[i] - previousTemperatures[i - 1];
    }

    tempChange /= 10.0f;

    // Wyświetlanie danych na ekranie OLED
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 0);
    display.print("Wilg. gleby: ");
    display.print(soilMoisture);
    display.println("%");
    display.print("Temperatura: ");
    display.print(temperature);
    display.println("C");
    display.print("     Zmiana: ");
    display.print(tempChange);
    display.println("C");
    display.print(" Wilgotnosc: ");
    display.print(humidity);
    display.println("%");
    display.print("    Swiatlo: ");
    display.print(lightIntensity);

    // Sprawdzenie warunków alarmowych
    if (soilMoisture < 30 || temperature > 30 || temperature < 5)
    {
        display.println("\n");
        display.println("       UWAGA!");
        display.println("   Sprawdz odczyty");
    }

    display.display();

    // Opóźnienie między odczytami danych
    delay(1000);
}