Coração em um osciloscópio

Postado em 18/10/2026

No modo XY, o osciloscópio deixa de mostrar o sinal ao longo do tempo: um canal controla a posição horizontal do traço e o outro, a vertical. Se gerarmos as duas tensões certas, dá para desenhar qualquer coisa na tela. Aqui vou mostrar como desenhar um coração usando um ESP32.

Material

Ligações

Código

Utilizando o Arduino IDE:

#include <Arduino.h>

constexpr uint8_t PIN_X = 25;
constexpr uint8_t PIN_Y = 26;

struct Point { uint8_t x, y; };

constexpr int N = 100;
Point shape[N];

void drawLine(int x0, int y0, int x1, int y1) {
  int steps = max(abs(x1 - x0), abs(y1 - y0)) / 2 + 1;
  for (int i = 0; i <= steps; i++) {
    dacWrite(PIN_X, x0 + (x1 - x0) * i / steps);
    dacWrite(PIN_Y, y0 + (y1 - y0) * i / steps);
  }
}

void setup() {
  for (int i = 0; i < N; i++) {
    float t = 2 * PI * i / N;
    float s = sinf(t);
    float x = 16 * s * s * s;
    float y = 13 * cosf(t) - 5 * cosf(2 * t) - 2 * cosf(3 * t) - cosf(4 * t);
    shape[i].x = lroundf(128 + 5.5f * x);
    shape[i].y = lroundf(128 + 5.5f * (y + 2.5f));
  }
}

void loop() {
  for (int i = 0; i < N; i++) {
    const Point &a = shape[i];
    const Point &b = shape[(i + 1) % N];
    drawLine(a.x, a.y, b.x, b.y);
  }
}

O coração vem de uma equação paramétrica conhecida, com t indo de 0 a 2\pi:

\begin{aligned} x(t) &= 16\operatorname{sen}^3(t) \\ y(t) &= 13\cos(t) - 5\cos(2t) - 2\cos(3t) - \cos(4t) \end{aligned}

No setup(), calculo 100 pontos dessa curva e os ajusto para a faixa do DAC, que é de 8 bits (0 a 255, ou 0 a ~3,3 V). No loop(), o drawLine() liga cada ponto ao próximo com valores intermediários, para o traço sair contínuo em vez de pontilhado. Como isso se repete muitas vezes por segundo, a figura parece parada na tela.

Configurando o osciloscópio

Resultado

ESP32:

Ajustes