S
S
something_go_wrong2020-11-25 23:53:12
Arduino
something_go_wrong, 2020-11-25 23:53:12

How to draw a graph using standard ssd1306 tools?

I want to understand how you can draw any graph, for example, a parabola on the ssd1306 display.

Answer the question

In order to leave comments, you need to log in

3 answer(s)
H
hint000, 2020-11-26
@hint000

The first answer in Google: https://habr.com/en/post/313490/

K
Konstantin Zaitsev, 2020-11-26
@KonstantineZ

I share my code for arduino with a humidity graph. I give the code as is, with all its shortcomings. The graph is automatically scaled, there are signed axes. It was written a long time ago, the libraries for the DHT22 sensor have been updated since then and the code does not compile, but the drawing should work.

Beware of raw code!
//Подключаем библиотеки
#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);
}

L
lonelymyp, 2020-11-28
@lonelymyp

The ssd1306 does not have standard graphing tools.
But you can always use one of the many graphic libraries, or draw it yourself, pixel by pixel.
In any case, the Internet is littered with examples and tutorials for this super popular controller.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question