#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "driver/ledc.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define BUTTON_PIN_INCREASE 12
#define BUTTON_PIN_DECREASE 13
int picoTiempo = 500; // Tiempo del pico en milisegundos
int ceroTiempo = 500; // Tiempo en cero en milisegundos
const int pwmChannel = 0;
const int freq = 5000; // Frecuencia PWM inicial
const int resolution = 8;
void setup() {
pinMode(BUTTON_PIN_INCREASE, INPUT_PULLUP);
pinMode(BUTTON_PIN_DECREASE, INPUT_PULLUP);
// Inicialización de la pantalla
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("No se pudo iniciar la pantalla OLED"));
for(;;);
}
display.clearDisplay();
// Configuración del PWM
ledcSetup(pwmChannel, freq, resolution);
ledcAttachPin(14, pwmChannel); // Pin 14 para la señal de salida
Serial.begin(115200);
}
void loop() {
// Ajuste del tiempo de pico y cero con botones
if (digitalRead(BUTTON_PIN_INCREASE) == LOW) {
picoTiempo += 100;
ceroTiempo += 100;
}
if (digitalRead(BUTTON_PIN_DECREASE) == LOW) {
picoTiempo = max(100, picoTiempo - 100);
ceroTiempo = max(100, ceroTiempo - 100);
}
// Generar señal triangular
for (int i = 0; i < 256; i++) {
ledcWrite(pwmChannel, i); // Generar pico triangular
delay(picoTiempo / 256); // Control del tiempo del pico
}
ledcWrite(pwmChannel, 0); // Valor cero
delay(ceroTiempo);
// Mostrar datos en la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Frecuencia (Hz):");
display.setCursor(0, 10);
display.println(1000 / (picoTiempo + ceroTiempo));
display.setCursor(0, 20);
display.println("Pico tiempo (ms):");
display.setCursor(0, 30);
display.println(picoTiempo);
display.setCursor(0, 40);
display.println("Cero tiempo (ms):");
display.setCursor(0, 50);
display.println(ceroTiempo);
// Dibujar gráfico de onda
display.drawLine(10, 60, 60, 30, SSD1306_WHITE); // Pico
display.drawLine(60, 30, 100, 60, SSD1306_WHITE); // Cero
display.display();
delay(100);
}