Go Down

Topic: SOLUCIONADO problema "limpiando" la pantalla de un display (Read 5069 times) previous topic - next topic

adefco00

Buenas!!!

Soy absolutamente novato en Arduino o la programación y me estoy volviendo un poco loco. Estoy haciendo un proyecto de sensor de humedad y temperatura, que saque los datos por una pantalla OLED  SSD1306 y que abra un relé cuando se supere un determinado rango de humedad (el tema del pelé todavía no lo he introducido)

De momento he logrado sacar la información a la pantalla y poner un led que se ilumine con cada lectura y un sensor de luz que mida la luz ambiental. El caso es que me gustaría que cuando la luz ambiental estuviera debajo de un determinado rango el OLED se apagara (es para instalarlo en un trastero y así ahorra consumo), pero no soy capaz...

concretamente el programa "peta" a esta altura:

 //medimos la luz ambiental
    sensorluzvalor = analogRead(sensorluz);
    if (sensorluzvalor<300){
      display.clearDisplay();
      return;

porque vuelve al comienzo del void loop() pero no "limpia" el display. Simplemente se queda con la última medición en pantalla. ¿qué estoy pasando por alto? adjunto todo el código a ver si alguien me puede ayudar...

Code: [Select]
/1. LIBRERIAS
#include "DHT.h"
#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // MODELO DHT 22  (AM2302)

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH  16
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);

//2. VARIABLES
//2.1. ESTATICAS
  float h ; //% de humedad
  float t ; //% de temperatura
  const int led = 3;
  const int sensorluz = A0;
  float sensorluzvalor = 0;
 
//2.2. DINAMICAS


//3. SETUP
void setup() {

  Serial.begin(9600);
  Serial.println("BIENVENIDO. INICIALIZANDO");
  display.begin(SSD1306_SWITCHCAPVCC); //generamos 3,3v para el oled
  dht.begin();

  //inicializamos el PIN del LED testigo de la medicion
  pinMode(led,OUTPUT);

 
  // Clear the buffer.
  display.clearDisplay();
 
    // text display tests
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Mallo Electronics");
  display.println();
  display.setTextSize(2);
  display.println("INICIANDO MEDICION");
  display.setTextSize(1);
  display.println();
  display.print("H&T v1.0");
  display.display();
  delay(2000);
}

//4. LOOP
void loop() {
 
 //guardamos las mediciones
    float h = dht.readHumidity();
  // Read temperature as Celsius
    float t = dht.readTemperature();
    float f = dht.readTemperature(true);
 
 
  // Chequear error de lectura y reintento de loop.
    if (isnan(h) || isnan(t) || isnan(f)) {
    digitalWrite(led,LOW);
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.println("ERROR");
    display.setTextSize(2);
    display.print("DE SENSOR");
    Serial.println("Error de lectura en el sensor");
    return;
  }
   
   //medimos la luz ambiental
    sensorluzvalor = analogRead(sensorluz);
    if (sensorluzvalor<300){
      display.clearDisplay();
      return;
    }
   
    // encendemos el LED
    digitalWrite(led,HIGH);
   
    // Lanzamos lecturas al display
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("TEMPERATURA:  ");
  display.print(t);
  display.println("C");
  display.println();
  display.println();
  display.setTextSize(2);
  display.print(h);
  display.println("%");
  display.setTextSize(1);
  display.println();
  display.println();
  display.print("LUX:");
  display.print((sensorluzvalor/1023)*100);
  display.print("  RELE:");
  display.println("OFF");
  display.display();
 
    // Imprimimos en Serial
   
  Serial.print("Humedad: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print("SensorLuz: ");
  Serial.print((sensorluzvalor/1023)*100);
  Serial.println("%");

  // apagamos el LED
  digitalWrite(led,LOW);
 
    // Establecemos 2 segundos de espera antes de la de la lectura
    delay(2000);
}




Gracias!!!

flatron

Hola, yo con OLED aun no he trabajado, me estoy pegando con una normal.... no sobrara el return? realmente no devuelves ningún valor. Te aviso que yo también soy novato :D
Un saludo.

adefco00

La verdad es que no lo sé... probé sin el "return" y simplemente continúa con las lecturas. Sigue sin limpiar el display.

Además me ocurre lo mismo con la lectura de errores del sensor:

  // Chequear error de lectura y reintento de loop.
    if (isnan(h) || isnan(t) || isnan(f)) {
    digitalWrite(led,LOW);
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.println("ERROR");
    display.setTextSize(2);
    display.print("DE SENSOR");
    Serial.println("Error de lectura en el sensor");
    return;

cuando no detecta un valor correcto del sensor (desconecto un cable, por ejemplo) me lanza al monitor serial el mensaje de error pero ignora las instrucciones de lanzarlo también al display....

surbyte

Tu error es confundir limpiar pantalla con apagar OLED, nada tiene que ver una cosa con la otra.
Cuando cae el brillo borras pantalla y nada mas.
Para hacer lo que quieres tendrias que tener un transistor que comande la energia del OLED. Entonces cuando estas por debajo de 300 le decis al transistor que apague y por encima que funcione.


adefco00

Gracias!!! voy a sumergirme en el apasionante mundo de los transistores a ver qué saco...(de momento me suena bastante a chino, pero voy poco a poco)  :D

gracias!

flatron

surbyte, al hacer lo que dices luego no dará problemas al encenderlo (que no lo reconozca el arduino)
Yo en los tft cuando he desconectado la alimentación y la conecto de nuevo la pantalla se queda en blanco.

surbyte

Tienes razón pero eso ocurre porque no respestas el proceso de inicializacion del display el que debe volver a hacerse.
Yo solo le dije como apagar el display, que es lo que el pedía, los problemas involucrados por hacerlo corre por cuenta del que lo intente.
si miras la librería verás que hay una secuencia inicial. Lo recuerndo de cuando todo esto lo tenia que hacer paso a paso mirando la hoja de datos del LCD y su controlador .

Lo correcto es apagar el Backlight no la alimentación del LCD.

esto sería lo apropiado, no se que correspondencia de pines tiene con el OLED

ive been using digital pin to turn on the backlight:

i
Code: [Select]
int backLight = 13;    // pin 13 controla el backlight

void setup()
{
lcd.begin(16,2);
 pinMode(backLight, OUTPUT);
 digitalWrite(backLight, HIGH); // prende el backlight. Reemplace HIGH por LOW para apagarlo.

flatron

No creo que lo encuentre un oled no tiene backlight.... o con esa idea nos lo venden. Pues yo creía que el inicializar el display solo se podía hacer una vez...

surbyte

#8
Dec 06, 2014, 03:56 pm Last Edit: Dec 06, 2014, 05:15 pm by surbyte
Bueno entonces porque no postea un OLED tipico para ver que podemos hacer

Tiene mucha coherencia lo que dices

Que es el pin DC? ANdo con pocas ganas de buscar en GOOGLE que es lo que predico

flatron

Lo del pin DC tampoco lo he mirado yo pero supongo que se utiliza porque lo tiene conectado por SPI como el TFT... es una suposición y como en cierta frase de una película "la suposición es la madre de los metepatas"

surbyte

Y tuve que buscarlo yo.
Es D/C Data/Command Control



No es lo que buscaba pero develado el misterio del pin.

adefco00

Solucionado!! No me hizo falta apagar el display. El problema era que para que la pantalla OLED ejecute la instrucción hay que cerrar el bloque con

display.display()

Si no, no "manda" las instrucciones que hayas dado.

Asì que, de momento, solucionado. Muchas gracias a todos/as!!!

surbyte

bien edita el título y agrega SOLUCIONADO.

adefco00

Buenas! disculpa la torpeza pero estoy dandole vueltas al foro para editar el título y no soy capaz...

surbyte

#14
Dec 15, 2014, 10:54 pm Last Edit: Dec 15, 2014, 10:54 pm by surbyte
pero es simple, solo tu tienes la capacidad de ir al primer mensaje de este mismo POST y veras que el título esta en una ventana y es EDITABLE.


Go Up