Programación pantalla OLED con varios sensores

Hola! Estoy realizando un proyecto con una pantalla OLED SH1106. La idea principal es que con un pulsador se cambie lo que muestra la pantalla, y en este caso, a modo de ejemplo, tengo conectado un potenciómetro, un DHT11 y un contador, entonces al oprimir el pulsador la pantalla cambia mostrando la medida de cada elemento.
El problema que tengo, es que al momento de cambiar entre pantallas, se muestra la última medición que realiza al entrar al "if", y no actualiza la pantalla en tiempo real (cosa que si he logrado si es que no están dentro de un if). Si cambio las pantallas y vuelvo al comienzo se actualiza el dato, así que estos están midiendo lo que deberían, pero no los actualizan en la pantalla.

Les comparto el código para ver si me pueden guiar con esto:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
#include <DHT.h>
#include <DHT_U.h>

#define OLED_RESET     4 
Adafruit_SH1106 oled(OLED_RESET);

int POT = A0;
int VALOR = 0;
int PULSADOR = 4;
int SENSOR = 2;
int TEMPERATURA;
int HUMEDAD;
int VAR = 0;
int ESTADOACTUAL = 1;
int ESTADOANTERIOR = 1;

DHT dht(SENSOR, DHT11);

void setup() {
  
  oled.clearDisplay();
  Serial.begin(9600);
  oled.begin(SH1106_SWITCHCAPVCC, 0x3C);
  oled.setTextColor(WHITE);           
  oled.setCursor(34, 0);               
  oled.setTextSize(2);                
  oled.print("SMART");
  oled.setCursor(34, 20);          
  oled.setTextSize(2);                
  oled.print("GREEN");
  oled.setCursor(12, 38);            
  oled.setTextSize(2);                
  oled.print("SOLUTIONS");
  oled.display();
  delay(2000);
  oled.clearDisplay();
  
  
  dht.begin();
}

void loop() {
  
  ESTADOACTUAL = digitalRead(PULSADOR);
  if((ESTADOACTUAL == 1 && ESTADOANTERIOR == 0)){
    VAR++;
    Serial.println(VAR);
    delay(200);
    if(VAR == 1){
      VALOR = analogRead(POT);
      oled.clearDisplay();
      oled.setCursor(20,0);
      oled.setTextSize(1);
      oled.print("Potenciometro");
      oled.setCursor(35, 30);
      oled.setTextSize(3);
      oled.println(VALOR);
      delay(500);
      oled.display();
    }
    else if(VAR == 2){
      oled.clearDisplay();
      TEMPERATURA = dht.readTemperature();
      HUMEDAD = dht.readHumidity();
      oled.setCursor(2,0);
      oled.setTextSize(1);
      oled.print("Temperatura");
      oled.setCursor(10, 12);
      oled.setTextSize(2);
      oled.print(TEMPERATURA);
      oled.setCursor(38,12);
      oled.setTextSize(2);
      oled.print("C");

      oled.setCursor(78,0);
      oled.setTextSize(1);
      oled.print("Humedad");
      oled.setCursor(82, 12);
      oled.setTextSize(2);
      oled.print(HUMEDAD);
      oled.setCursor(110,12);
      oled.setTextSize(2);
      oled.print("%");
      
      delay(500);
      oled.display();
    }
    else{
      oled.clearDisplay();
      oled.setTextColor(WHITE);        
      oled.setCursor(0, 0);          
      oled.setTextSize(1);                
      oled.print("HOLA, HAN PASADO:");
      oled.setCursor(10,30);
      oled.setTextSize(2);
      oled.print(millis()/1000);           
      oled.print("seg.");
      oled.display();
    }
  }
  else if(VAR >= 3){
      VAR = 0;
      delay(200);
    }
  delay(20);
  ESTADOANTERIOR = ESTADOACTUAL;
}

Moderador:
Bienvenido al Foro Arduino en Español.
Por favor, lee las Normas del foro y edita tu código usando etiquetas de código.
Ve a edición, luego selecciona todo el error que has publicado, lo cortas y click en </>



El error esta en el else luego del if(var==2)
Luego de esto, cualquier var que no sea 1 o 2 cae en esa condición y jamas en var>=3
Asi que alguna esta mal.

Otro error menor o tal vez no tanto, es que borras Oled antes de inicializarlo.
Mira como dejé el programa, no se si se ajusta a lo que quieres porque tomé una decisión con el tema else y tal vez no sea la que quieras.

#include <Arduino.h>

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
#include <DHT.h>
#include <DHT_U.h>

#define OLED_RESET 4
Adafruit_SH1106 oled(OLED_RESET);

int pot = A0;
int valor = 0;
int pulsador = 4;
int sensor = 2;
int temperatura;
int humedad;
int var = 0;
int estadoActual = 1;
int estadoAnterior = 1;

DHT dht(sensor, DHT11);

void setup() {

  Serial.begin(9600);
  oled.begin(SH1106_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextColor(WHITE);
  oled.setCursor(34, 0);
  oled.setTextSize(2);
  oled.print("SMART");
  oled.setCursor(34, 20);
  oled.setTextSize(2);
  oled.print("GREEN");
  oled.setCursor(12, 38);
  oled.setTextSize(2);
  oled.print("SOLUTIONS");
  oled.display();
  delay(2000);
  oled.clearDisplay();
  dht.begin();
}

void loop() {

  estadoActual = digitalRead(pulsador);
  if (estadoActual == 1 && estadoAnterior == 0){
      var++;
      Serial.println(var);
      delay(200);
      switch (var) {
        case 1:
                valor = analogRead(pot);
                oled.clearDisplay();
                oled.setCursor(20,0);
                oled.setTextSize(1);
                oled.print("potenciometro");
                oled.setCursor(35, 30);
                oled.setTextSize(3);
                oled.println(valor);
                delay(500);
                oled.display();
                break;
        case 2: 
                oled.clearDisplay();
                temperatura = dht.readTemperature();
                humedad = dht.readHumidity();
                oled.setCursor(2,0);
                oled.setTextSize(1);
                oled.print("temperatura");
                oled.setCursor(10, 12);
                oled.setTextSize(2);
                oled.print(temperatura);
                oled.setCursor(38,12);
                oled.setTextSize(2);
                oled.print("C");

                oled.setCursor(78,0);
                oled.setTextSize(1);
                oled.print("humedad");
                oled.setCursor(82, 12);
                oled.setTextSize(2);
                oled.print(humedad);
                oled.setCursor(110,12);
                oled.setTextSize(2);
                oled.print("%");

                delay(500);
                oled.display();
                break;
        case 3:
                oled.clearDisplay();
                oled.setTextColor(WHITE);        
                oled.setCursor(0, 0);          
                oled.setTextSize(1);                
                oled.print("HOLA, HAN PASADO:");
                oled.setCursor(10,30);
                oled.setTextSize(2);
                oled.print(millis()/1000);           
                oled.print("seg.");
                oled.display();
       default: var = 0;
                delay(200);
                break;
    }
    estadoAnterior = estadoActual;
  }
}

Para mejorar:
Por cierto, dos cosas, intenta usar identación al colocar un programa y no uses mayúsculas para las variables. Las mayúsculas se usan para las constantes.

1 Like

Antes que nada, por favor, edita tu post y pon el código de acuerdo a las Normas del foro, es para tu beneficio.

El principal problema es que haces todo dentro del if() donde detectas el flanco de subida del pin (o sea cuando detectas la pulsación). Lógicamente no vuelve a entrar al if() hasta que haya otra pulsación, por lo tanto no refresca la información.

Además, a mi entender, están mal planteadas las comparaciones.

Mientras editas tu post, yo voy pensando las correcciones a tu código.

Saludos

1 Like

Probé el código, pero no cambia la pantalla al oprimir el pulsador. Gracias.

Efectivamente era esto, así que deje separado el if que contaba las pulsaciones de los que cambiaban las pantallas (utilizando el mismo código que hice) y resultó. Gracias.

Muy bien!
Esa es la solución que te iba a sugerir.

Respecto al else donde muestras el tiempo, coincido con @Surbyte en que no está bien planteado (aunque puede que te funcione).
Sería un detalle a corregir.

Saludos

1 Like

Buenas, en el caso de llegar al último case, ¿Se puede devolver inmediatamente al primero? Ya que al oprimir por 4ta vez el pulsador se queda con la última imagen guardada, y con el siguiente pulso recién vuelve al primero.

default actúa como lo que no esta contemplado en 1, 2, o 3, úsalo como gustes, que vuelva a 1 o genera una pantalla intermedia.

1 Like