#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define ADC_PIN 34
#define NUM_SAMPLES 20
#define X0 15
#define Y0 16
#define GRAPH_WIDTH 113 //SCREEN_WIDTH-X0
float voltageSamples[NUM_SAMPLES];
float voltageHistory[GRAPH_WIDTH];
int sampleIndex = 0;
int historyIndex = 0;
void setup() {
Serial.begin(115200);
// initialize OLED display with I2C address 0x3C
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("failed to start SSD1306 OLED"));
while (1);
}
//delay(2000); // wait two seconds for initializing
display.clearDisplay(); // clear display
display.setTextSize(1); // set text size
display.setTextColor(WHITE); // set text color
}
void loop() {
static unsigned long lastSampleTime = 0, lastAverageTime = 0;
unsigned long currentTime = millis();
if (currentTime - lastSampleTime >= 50) { // 20 samples per second
lastSampleTime = currentTime;
voltageSamples[sampleIndex] = analogRead(ADC_PIN) * (3.3 / 4095.0); // Convert ADC value to voltage
sampleIndex = (sampleIndex + 1) % NUM_SAMPLES;
//}
//if (currentTime - lastAverageTime >= 1000) { // 1 sample per second //va muy lento
// lastAverageTime = currentTime;
float averageVoltage = 0; //calcula la media de 20 valores
for (int i = 0; i < NUM_SAMPLES; i++) {
averageVoltage += voltageSamples[i];
}
averageVoltage /= NUM_SAMPLES;
voltageHistory[historyIndex] = averageVoltage;
historyIndex = (historyIndex + 1) % GRAPH_WIDTH;
display.clearDisplay();
display.setCursor(0, 0);
display.print("Voltaje: " + String(averageVoltage, 2) + " V");
//dibuja eje X y Y
display.drawLine(0, SCREEN_HEIGHT-7 , SCREEN_WIDTH-1 , SCREEN_HEIGHT-7, WHITE);
display.drawLine(X0, SCREEN_HEIGHT-7, X0, Y0, WHITE);
// Draw graph, margen izq 25, margen superior 16, margen inferior 7
for (int x = 0; x < GRAPH_WIDTH; x++) {
int index = (historyIndex + x) % GRAPH_WIDTH;
int y = map(voltageHistory[index] * 100, 0, 330, SCREEN_HEIGHT-7, Y0);
display.drawPixel(x+X0, y, SSD1306_WHITE);
}
display.display();
}
}