Go Down

Topic: Termometro datalogger con pantalla oled (Read 397 times) previous topic - next topic

pin_y_pon

Feb 23, 2019, 10:21 am Last Edit: Feb 23, 2019, 10:57 am by pin_y_pon
Buenas.
El proyecto es sencillo. Se trata de leer un sensor de temperatura/humedad (DHT22), mostrar los datos en un display oled de 0,96 " (I2C) , y guardarlos en una tarjeta sd utilizando un lector (ICSP).

Puedo leer el sensor y mostrar los datos en pantalla.
También tengo otro código que muestra la temperatura por el monitor serie y lo guarda en la SD.

El problema es que no consigo unir los dos códigos. No se si es un problema de incompatibilidad de pines o de falta de alimentación.
Ya intente cambiar los pines digitales, y alimento todo con el conector USB de la arduino leonardo.


Incluyo el diagrama de conexiones y código.

Este código muestra la temperatura en el display





Code: [Select]

// Esta version muestra temperatura y humedad
// En el display y en monitor serie



#include <SD.h> //Libreria del lector de tarjeta
File logFile;
#include <SPI.h> //Libreria para bus SPI
#include "DHT.h" //libreria sensor temp/Humedad DHT
#include <DHT_U.h>
#include <Adafruit_GFX.h> //librerias display
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Wire.h>



#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

#define SCREEN_WIDTH 128 // OLED display ancho, en pixels
#define SCREEN_HEIGHT 64 // OLED display altura

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


const int DHTPin = 13;     // pin digital del sensor

DHT dht(DHTPin, DHTTYPE);
//RTC_DS3231 rtc;
void setup() {


  Serial.begin(9600);
  delay(2000);



  Serial.println("DHTxx test!");
  dht.begin();


  Serial.begin(9600);
  Serial.print("Iniciando SD ...");
  if (!SD.begin(4)) {
    Serial.println("No se pudo inicializar");
    return;
  }
  Serial.println("inicializacion exitosa");

 
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }
  display.display();
  delay(2000); // pausa

  // limpiamos el buffer
  display.clearDisplay();

  display.clearDisplay();

  display.setTextSize(2);             // tama�o fuente
  display.setTextColor(WHITE);        // color
  display.setCursor(0, 4);            // Start at top-left corner

  display.println(F("Termometro V1"));

  display.display();
  delay(2000); // Pause for 2 seconds

 
}

void loop() {
  // pausa entre lecturas
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("No se puede leer el sensor!");
    return;
  }


  Serial.print("Humedad: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.println("");


  // muestra datos en pantalla
 

  display.clearDisplay();
  display.display();


  display.setTextSize(2);             // tama�o del texto
  display.setTextColor(WHITE);        // color
  display.setCursor(0, 0);           
  display.print("T: ");
  display.print(t);
  display.println();
  display.println();
  display.print("H: ");
  display.print(h);
  display.println();

  display.display();
  delay(200);
}



Este otro lee el sensor y guarda los datos en la sd
Code: [Select]

// Este lee el sensor y guarda los datos en la tarjeta sd



#include <SPI.h>
#include <SD.h>

//librerias del sensor
#include <DHT.h>
#include <DHT_U.h>

#include <Wire.h>
// librerias display
#include <Adafruit_SSD1306.h>
#include <splash.h>

#include <Adafruit_GFX.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>


#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
// defines display
#define SCREEN_WIDTH 128 // OLED display ancho, en pixels
#define SCREEN_HEIGHT 64 // OLED display altura

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
File dataFile;
//File dataFile;
const int DHTPin = 12;     // pin digital del sensor

DHT dht(DHTPin, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  if (!SD.begin(4)) {
    Serial.println("Falta tarjeta");
    // don't do anything more:
    while (1);
  }
  Serial.println("Iniciado correctamente.");


  dht.begin();


}

void loop() {
  // Pausa entre lecturas
  delay(2000);
 
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("Error leyendo el sensor!");
    return;
  }

 
  delay(200); // Pause for 2 seconds

  // Comienza guardar datos en sd
 
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // abre el archivo y guarda datos
  if (dataFile) {
    dataFile.print("Temp = ");
    dataFile.print(t);
    dataFile.print(" - Humed = ");
    dataFile.print(h);
    dataFile.println();
    dataFile.close();
    // print to the serial port too:
    Serial.print("Temp : ");
    Serial.print(t);
    Serial.print(" Humed : ");
    Serial.print(h);
    Serial.println();
  }
  // mensaje de error si no se puede abrir el archivo
  else {
    Serial.println("error abriendo datalog.txt");
  }


}






surbyte

No puedes postear un problema de software en la Sección Proyectos.

Hilo movido.

cescbit

buenas, yo tengo lo mismo hecho con 11 sondas T1 ds18b20, shield rtc y sd y sonda de presión. todo al final con la lcd, no se porqué (creo que era por incompatibilidad en las salidas) la tft oled me daba muchos probelmas. en breve subo código en proyectos.

pin_y_pon

Mi intención es ponerle también un RTC y otro sensor para la presión , pero hasta que no salga de este problema con el monitor, no voy a implementar nuevas cosas

ymirvk

Hace poco hice este logger para controlar el armario donde fermenta la cerveza jejjeje. No tiene display, pero lleva la sd y el rto, como base te puede ayudar.

Code: [Select]

#include <SPI.h>
#include <SD.h>
#include <DS3231.h>
#include <DHT.h>

#define DHTPIN 7
#define DHTTYPE DHT22   

int chipSelect = 4;

// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  dht.begin();

  Serial.print("Initializing SD card...");
    SD.begin(chipSelect);
/*
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }*/
  Serial.println("card initialized.");

  // Initialize the rtc object
  rtc.begin();
    // The following lines can be uncommented to set the date and time
  rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAY
  rtc.setTime(20, 3, 0);     // Set the time to 12:00:00 (24hr format)
  rtc.setDate(6, 2, 2019);   // Set the date to January 1st, 2014
}

void loop() {
  // Wait a few seconds between measurements.
  delay(300000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.print(rtc.getDateStr()); //Store date on SD card
    dataFile.print(","); //Move to next column using a ","

    dataFile.print(rtc.getTimeStr()); //Store date on SD card
    dataFile.print(","); //Move to next column using a ","

    dataFile.print(t);
    dataFile.print(" ºC,");
    dataFile.print(h);
    dataFile.print(" %HR");
    dataFile.println();
    dataFile.close();

    Serial.print("Temp: ");     // print temp/humid to serial monitor
    Serial.print(t);
    Serial.print("c - Humid: ");
    Serial.print(h);
    Serial.println("%");
    // print to the serial port too:
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }
}

pin_y_pon

Muchas gracias por el aporte. Intentaré solucionar el problema del display antes de meterme con el RTC, porque sino se me va la cosa de las manos. Un saludo.

surbyte

No comprendo porque se ponen a trabajar con estas cosas sin tener conocimientos básicos de electrónica!!

EL RTC usa I2C para eso tiene pines especiales a tal efecto. En el UNO son A4 y A5. y su librería, etc etc.
El OLED también es I2C según esto

Code: [Select]
Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)

pero como RTC y OLED tienen diferentes direcciones no hay problema. Ambos conectados a A4 y A5.

La SD usa SPI, eso es reservar 11, 12 y 14 ademas del pin 10 para las conexiones.

Luego veo que usas pin 13 para el DHT22 y ahi tu error. Usa cualquier pin que no comprometa los dispositivos anteriores, por ejemplo del 2 al 8.


Go Up