Problema lcd 16x2 con dht11 e slitta sd

Ciao a tutti, sono nuovo sul forum e colgo l'occasione per presentarmi.
Ho costruito un programma che mi monitori temperatura ed umidità attraverso il dht11 e che me la stampi sul lcd 16x2, sul monitor seriale e su un file di testo su una SD.
come slitta SD compresa di RTC usa una dollatek x-502.
il programma si compila senza nessun errore e va alla perfezione se non fosse per il display, che fa visualizzare solo ciò che è scritto nel setup. Appena entro nel loop il display si accende tutto con i numeri 3.
Premetto che non ho utilizzato il collegamento i2c e che se è possibile vorrei non utilizzarlo poichè non arriverei con i tempi in quanto dovrei acquistarlo su internet.
spero che qualcuno di voi possa aiutarmi, vi lascio a seguire lo sketch;

#include <LiquidCrystal.h>  //libreria del display LCD
#include <dht11.h>  //libreria del sensore temperatura ed umidità
#include <SD.h> //libreria per la SD
#include <SPI.h> //libreria per la SD
#include "RTClib.h" //libreria RTC (real time clock)
#define DHT11_PIN A3 // definizione del sensore sul pin analogico A3
dht11 DHT; //definizione del tipo di sensore dht utilizzato
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //dichiarazione pin del display
RTC_DS1307 rtc; //definizione del tipo di sensore RTC utilizzato
DateTime now;
const int chipSelect = 10; //riferito alla slitta SD
File file;
int temp = 0; //variabile che ospita il valore della temperatura
int um = 0; //variabile che ospita il valore dell'umidità
int temp_min = 0; //variabile che ospita il valore della temperatura min. registrata
int um_min = 0; // variabile che ospita il valore dell'umidità min. registrata
int temp_max = 0; //variabile che ospita il valore della temperatura max. registrata
int um_max = 0; //variabile che ospita il valore dell'umidità min. registrata
int c1, c2; //variabili iniziali per umidità min. e temperatura min.
char set [7][4] = { "Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"}; //array che contiene al suo interno i giorni della settimana


void setup() {
  //inizializzazione del display con prima scritta
  lcd.begin(16, 2); //inizializzazione del display. Il display LCD usato è un 16x2
  Serial.begin(9600); //apertura della porta seriale alla velocità di 9600kb
  lcd.setCursor(0, 0); //prima scritta all'avvio di arduino, riga 0 colonna 0
  lcd.print(" Stazione meteo ");
  lcd.setCursor(0, 1); //seconda scritta all'avvio di arduino, riga 1 colonna 0
  lcd.print("   Classe 5^B ");
  delay(2000); //delay di 2000ms prima che il programma esegui il loop


  //verifica rtc
  if (!rtc.begin()) {
    Serial.println("Errore RTC");
    return;
  }
  if (!rtc.isrunning()) {
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }


  // verifica SD
  if (!SD.begin(10)) {
    Serial.println ("Errore SD");
    return;
  }
  Serial.println ("Inizializazione SD");
  if (SD.exists ("example.txt")) {
    SD.remove ("example.txt");
  }
  file = SD.open ("example.txt", FILE_WRITE);
  file.write ("Benvenuti nella stazione meteorologica");
  file.close();

}

void loop() {
  lcd.clear(); //pulizia dello schermo
  int lett = DHT.read(DHT11_PIN); //abilito lettura dht11
  temp = DHT.temperature; //la variabile temp sarà uguale alla temperatura registrata dal sensore
  um = DHT.humidity; //la variabile um sarà uguale alla umidità registrata dal sensore
  //stampo valori sul display lcd
  lcd.setCursor(0, 0);
  lcd.print("Umidita' : "); //stampa la frase umidità alla riga 0 e colonna 0
  lcd.print(DHT.humidity); //stampa il valore che il sensore ha immagazzinato nella variabile um
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("Temperat.: ");  //stampa la frase Temperat alla riga 1 e colonna 0
  lcd.print(DHT.temperature); //stampa il valore che il sensore ha immagazzinato nella variabile temp
  lcd.print((char)223); //stampa il simbolo del centigrado
  lcd.print("C");
  delay(3000); //delay prima di visualizzare a schermo temp,um max e min
  //riempio  variabili um_min e tem_min per la misura iniziale
  //concatenazione di if per stabilire la temperatura e l'umidità massima e minima
  if (c1 == 0) {
    um_min = um;
  }
  if (c2 == 0) {
    temp_min = temp;
  }

  if (temp > temp_max) {
    temp_max = temp;
  }

  if (um > um_max) {
    um_max = um;
  }

  if (um_min >= um) {
    um_min = um;
    c1++;
  }

  if (temp_min >= temp) {
    temp_min = temp;
    c2++;
  }
  //stampo statistiche: um_max, um_min, temp_max, temp_min
  //la sintassi utilizzata è la stessa di quella adoperata per stampare la temperatura e l'umidità istantanee
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Umid. max.: ");
  lcd.print(um_max);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("Temp. max.: ");
  lcd.print(temp_max);
  lcd.print((char)223);
  lcd.print("C");
  delay(3000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Umid. min.: ");
  lcd.print(um_min);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("Temp. min.: ");
  lcd.print(temp_min);
  lcd.print((char)223);
  lcd.print("C");
  delay(3000);


  //scrittura su monitor seriale
  DateTime now = rtc.now();
  if (mytimer(57000)) {
    Serial.print(now.year(), DEC);
    Serial.print("/");
    Serial.print(now.month(), DEC);
    Serial.print("/");
    Serial.print(now.day(), DEC);
    Serial.print("(");
    Serial.print(set[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(":");
    Serial.print(now.minute(), DEC);
    Serial.print(":");
    Serial.print(now.second(), DEC);
    Serial.print(" Temperatura:");
    Serial.print(DHT.temperature);
    Serial.print("^");
    Serial.print("C");
    Serial.print(" Umidita':");
    Serial.print(DHT.humidity);
    Serial.print("%");
    Serial.println();
  }


  //scrittura su sd
  if (mytimer2(57000)) {
    file = SD.open ("example.txt", FILE_WRITE);
    file.print(now.year(), DEC);
    file.print("/");
    file.print(now.month(), DEC);
    file.print("/");
    file.print(now.day(), DEC);
    file.print("(");
    file.print(set[now.dayOfTheWeek()]);
    file.print(") ");
    file.print(now.hour(), DEC);
    file.print(":");
    file.print(now.minute(), DEC);
    file.print(":");
    file.print(now.second(), DEC);
    file.print(" Temperatura:");
    file.print(DHT.temperature);
    file.print("^");
    file.print("C");
    file.print(" Umidita':");
    file.print(DHT.humidity);
    file.print("%");
    file.println();
    file.close();
  }

}

//funzione per il timer della scrittura sulla seriale
int mytimer (int timer1) {
  static unsigned long t1, ddt;
  int ret = 0;
  ddt = millis() - t1;
  if (ddt >= 57000) {
    t1 = millis();
    ret = 1;
  }
  return ret;
}

//funzione per il timer della scrittura su sd
int mytimer2 (int timer2) {
  static unsigned long t2, ddt;
  int ret = 0;
  ddt = millis() - t2;
  if (ddt >= 57000) {
    t2 = millis();
    ret = 1;
  }
  return ret;
}

Buonasera,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO

... poi, in conformità al suddetto regolamento, punto 7, cortesemente edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice.

Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE). Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nel rispetto del citato regolamento nessuno ti risponderà (eventuali risposte verrebbero cancellate), quindi ti consiglio di fare il tutto al più presto. :wink:

la scheda SD usa i pin 13,12,11 (SPI)

Si infatti ho risolto spostando i pin 11/12 del display ai pin 6/7

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.