#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <driver/dac.h>
#include <math.h>
// Configuración del OLED
#define SCREEN_WIDTH 128 // Ancho de pantalla OLED
#define SCREEN_HEIGHT 64 // Altura de pantalla OLED
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Configuración de los pines DAC
#define DAC1_PIN 25
#define DAC2_PIN 26
// Parámetros para las señales
const int resolution = 128; // Resolución ajustada para el display OLED (más puntos)
const float frequency = 15; // Frecuencia de la señal en Hz (ajustado para 2 ciclos)
const int amplitude = 30; // Amplitud ajustada para el display OLED
const int offset = 32; // Offset para centrar la señal en OLED
const int period = 1000 / frequency; // Periodo de la señal en ms
void setup() {
// Configurar la pantalla OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Dirección I2C 0x3C
Serial.println(F("Fallo en la inicialización del OLED"));
for (;;); // Detener el programa si falla el OLED
}
display.clearDisplay();
// Configurar los pines DAC
dac_output_enable(DAC_CHANNEL_1); // GPIO25
dac_output_enable(DAC_CHANNEL_2); // GPIO26
}
// Función para generar y mostrar una señal triangular
void displayTriangleWave() {
display.clearDisplay();
int cycles = 2; // Número de ciclos a mostrar
for (int i = 0; i < resolution; i++) {
float phase = (float)(i % (resolution / cycles)) / (resolution / cycles); // Fase de la señal (0 a 1) ajustada para ciclos
int value;
// Calcular valor de la señal triangular
if (phase < 0.5) {
value = offset + (2 * amplitude * phase); // Fase ascendente
} else {
value = offset + (2 * amplitude * (1 - phase)); // Fase descendente
}
display.drawPixel(i * (SCREEN_WIDTH / resolution), SCREEN_HEIGHT - value, WHITE);
}
display.display();
delay(period);
}
void loop() {
// Generar y mostrar la señal triangular en el OLED
displayTriangleWave();
}