#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
// Pines sensores
const int pinLuz = 32;
const int pinTemp = 33;
// Pines ultrasonido
const int trigPin = 26;
const int echoPin = 18;
// Configuración pantalla
const int ancho = 128;
const int alto = 64;
const int RST = -1;
Adafruit_SSD1306 pantalla(ancho, alto, &Wire, RST);
// Tiempos de muestreo
unsigned long tAn = 0;
unsigned long intervalo = 500; // cada medio segundo
// Variables para el ultrasonido
unsigned long tiempoTrig = 0;
bool trigEnviado = false;
unsigned long echoStart = 0;
unsigned long echoEnd = 0;
float distancia = -1;
void setup() {
Serial.begin(115200);
Serial.println("Lectura de 3 sensores con pantalla OLED (sin delay)");
// Pines ultrasonido
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Inicializamos pantalla en dirección 0x3C
Wire.begin(21, 22); // SDA=21, SCL=22
if (!pantalla.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("No se detecta pantalla...");
for (;;); // Bucle infinito
}
pantalla.setTextSize(1);
pantalla.setTextColor(WHITE);
pantalla.clearDisplay();
pantalla.display();
}
void loop() {
unsigned long tAct = millis();
// ---- Leer ultrasonido sin delay ----
medirUltrasonido();
// ---- Lecturas periódicas ----
if (tAct - tAn > intervalo) {
tAn = tAct;
// Leer sensores
float luz = leerLuz(analogRead(pinLuz));
float temp = leerTemp(analogRead(pinTemp));
float dist = distancia; // valor calculado en medirUltrasonido()
// Mostrar en Serial
Serial.print("Luz: "); Serial.print(luz); Serial.print("% ");
Serial.print("Temp: "); Serial.print(temp); Serial.print(" C ");
Serial.print("Dist: "); Serial.print(dist); Serial.println(" cm");
// Mostrar en pantalla
pantalla.clearDisplay();
pantalla.setCursor(0, 0);
pantalla.println("Sensores:");
pantalla.setCursor(0, 16);
pantalla.print("Luz: "); pantalla.print(luz, 1); pantalla.println("%");
pantalla.setCursor(0, 32);
pantalla.print("Temp: "); pantalla.print(temp, 1); pantalla.println("C");
pantalla.setCursor(0, 48);
pantalla.print("Dist: "); pantalla.print(dist, 1); pantalla.println("cm");
pantalla.display();
}
}
// ---- Funciones de sensores ----
float leerLuz(int lectura) {
float res = (4095 - lectura) * (100.0 / (4095 - 610.0));
if (res < 0) res = 0.0;
if (res > 100) res = 100.0;
return res;
}
float leerTemp(int lectura) {
float res = (4095 - lectura) * (100.0 / (4095 - 610.0));
if (res < 0) res = 0.0;
if (res > 100) res = 100.0;
return res;
}
// ---- Ultrasonido sin delay ----
void medirUltrasonido() {
unsigned long ahora = micros();
if (!trigEnviado) {
// Enviar pulso de 10us sin delay
digitalWrite(trigPin, HIGH);
if (tiempoTrig == 0) tiempoTrig = ahora;
if (ahora - tiempoTrig >= 10) {
digitalWrite(trigPin, LOW);
trigEnviado = true;
tiempoTrig = 0;
}
} else {
// Medir pulso en Echo
if (digitalRead(echoPin) == HIGH && echoStart == 0) {
echoStart = ahora;
}
if (digitalRead(echoPin) == LOW && echoStart > 0 && echoEnd == 0) {
echoEnd = ahora;
unsigned long duracion = echoEnd - echoStart;
distancia = duracion * 0.034 / 2.0; // cm
if (distancia > 400) distancia = -1; // fuera de rango
// Reset para siguiente ciclo
echoStart = 0;
echoEnd = 0;
trigEnviado = false;
}
}
}