//Подключаем библиотеки
#include <Wire.h>
#include <OLED_I2C.h>
#include "DHT.h"
#include <BH1750.h>
//Создаем объекты
OLED myOLED(SDA, SCL, 8);
DHT dht;
BH1750 lightMeter;
//Подключаем шрифты
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
//Объявляем переменные
float humidity[100];
int count = 0;
void setup()
{
myOLED.begin();
myOLED.setFont(SmallFont);
dht.setup(4);
lightMeter.begin();
}
void loop()
{
for (int i = 99; i > 0; i--)//Циклом сдвигаем массив на единицу
{ //делать кольцевой массив лень
humidity[i] = humidity[i - 1];
}
humidity[0] = dht.getHumidity();//Меряем влажность
if (count < 100) count++; //Сколько атуальных значений в массиве
//для исключения нулей при включении
myOLED.clrScr();//Очистили буфер дисплея
myOLED.setFont(MediumNumbers);//Выбради шрифт
myOLED.printNumF(humidity[0], 1, RIGHT, 0, '.', 4);//Написали сверху справа влажность
myOLED.printNumF(dht.getTemperature(), 1, LEFT, 0, '.', 4);//А слева температуру
//Нарисовали рамочку графика
myOLED.drawLine(0, 18, 127, 18);
myOLED.drawLine(0, 18, 0, 63);
myOLED.drawLine(127, 18, 127, 63);
myOLED.drawLine(0, 63, 127, 63);
//Нашли минимум и максимум на графике
int minHum = humidity[0];
int maxHum = humidity[0] + 1;
for (int i = 1; i < count; i++)
{
minHum = min(minHum, humidity[i]);
maxHum = max(maxHum, humidity[i] + 1);
}
//Написали их на шкале справа
myOLED.setFont(SmallFont);
myOLED.printNumI(lightMeter.readLightLevel(), CENTER, 0);
myOLED.printNumI(maxHum, 107, 20, 3);
myOLED.printNumI(minHum, 107, 55, 3);
//Нарисовали саму шкалу
myOLED.drawLine(103, 62, 103, 20);
myOLED.drawLine(103, 61, 108, 61);
myOLED.drawLine(103, 20, 108, 20);
//И деления на ней
int j = 10; //шаг делений 10%
if (maxHum - minHum < 50) j = 5; //или 5% если размах графика меньше
if (maxHum - minHum < 11) j = 1; //или 1% если совсем маленький
for (int i = 0; i <= 100; i += j) //перебираем все возможные значения процентов
{
if (i > minHum && i < maxHum) //но рисуем только если они в диапазоне графика
{
int y = map(i, minHum, maxHum, 61, 20); //определяем положение штриха по вертикали
if (i % 10 == 0) myOLED.drawLine(103, y, 107, y); //если это штрих для десяткков, то длинный
else myOLED.drawLine(103, y, 105, y);//иначе короткий
}
}
//Нарисовали график
for (int i = 0; i < count; i++)
{
int y = map(humidity[i] * 10, minHum * 10, maxHum * 10, 61, 20);
myOLED.drawLine(101 - i, 62, 101 - i, y);
}
//Вывели данные из буфера на дисплей
myOLED.update();
//Ждем следующего измерения
delay(dht.getMinimumSamplingPeriod());
//delay(60000);
}