Un aiuto con il Display TM1637?

Ciao, sono Edoardo.
Non so quale codice inserire per far funzionare il Display TM1637 che mi mostri la temperatura e umidità. Mi potete dare una mano? (dovrei usare il DHT1 visto che ne ho 2). So che il codice è parecchio incasinato ma avrei solo bisogno delle stringhe per far funzionare il display

#include "DHT.h"
#include "TM1637Display.h"
const int limite = 1000;                  // limite del sistema
#define DHT1PIN 6
#define DHT2PIN 5
#define DHT1TYPE DHT11 // DHT 11
#define DHT2TYPE DHT11 // DHT 11
DHT dht1(DHT1PIN, DHT1TYPE);
DHT dht2(DHT2PIN, DHT2TYPE);
#define CLK 3
#define DIO 4
TM1637Display display(CLK, DIO);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() 
{
  {
display.setBrightness(0x0f);
}
 pinMode (9, OUTPUT);              // direzione del pin buzzer di allarme
 pinMode (12, OUTPUT);            // direzione del pin led ROSSO (allarme)(gas)
 pinMode (7, OUTPUT);            // direzione del pin led Arancione (pre-allarme)
 pinMode (8, OUTPUT);           // direzione del pin led VERDE (acceso)
 pinMode (13, OUTPUT);         //direzione del pin 
 pinMode (2, OUTPUT);         // direzione del pin led ROSSO (allarme) (termometro)
 pinMode (11, OUTPUT); 
 pinMode (1, OUTPUT);
 pinMode (A5, OUTPUT);
 pinMode (A4, OUTPUT);
 pinMode (A3, OUTPUT);
 Serial.begin (9600);        // avvio del monitor seriale
 Serial.println("DATI!");
 dht1.begin();
 dht2.begin();
}
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop()

 {
 int gas = analogRead(A0);            // rilevo il valore dal pin A0
 Serial.println(gas);                // stampo su monitor seriale

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 if (gas > 0) 
 {
   digitalWrite(8, HIGH);          // accende il LED BLU
 }

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 if ((gas >= 0) && (gas <= 100))  // Se il sensore rileva un valore compreso tra 0 e 100... 
 {  
   digitalWrite(1, HIGH);          // accende il LED VERDE
 }
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 if ((gas >= 100) && (gas <= 350))  // Se il sensore rileva un valore compreso tra 200 e 350... 
 {
   digitalWrite(7, HIGH);    // accende il LED ARANCIONE
   delay(500);              // aspetta un secondo  
   digitalWrite(7, LOW);   // spegne il LED  ARANCIONE
   delay(500);            // aspetta un secondo  
 }
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 if (gas > 350)                 // se il gas supera il limite...
 {            
   digitalWrite(12, HIGH);    // accende il LED ROSSO
   delay(500);               // aspetta un secondo  
   digitalWrite(12, LOW);   // spegne il LED  ROSSO
   delay(500);             // aspetta un secondo  

  }

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  if (gas > 350)                // se il gas supera il limite...
 {           
   tone(9,400,1000);          // Accende buzzer di allarme
   delay(1000);              // Aspetta un secondo (cambia nota)
   tone(9,650,1000);        // Accende buzzer di allarme
   delay(1000);            // Aspetta un secondo (cambia nota)
 }
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 else
 { 
   digitalWrite(12, LOW);  // altrimenti non fa nulla
 }
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 delay(3000);
 float h1 = dht1.readHumidity();
 float t1 = dht1.readTemperature();

  if (isnan(t1) || isnan(h1))
 {
  Serial.println("Failed to read from DHT #1");
 } 
 else {
 Serial.print("Umidità 1: ");
 Serial.print(h1);
 Serial.print(" %\t");
 Serial.print("Temperatura 1: ");
 Serial.print(t1);
 Serial.println(" C");float t1 = dht1.readTemperature();
 }

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 delay(2000);
 float h2 = dht2.readHumidity();
 float t2 = dht2.readTemperature();
 if (isnan(t2) || isnan(h2)) 
 {
 Serial.println("Failed to read from DHT #2");
 }
 else {
 Serial.print("Umidità 2: ");
 Serial.print(h2);
 Serial.print(" %\t");
 Serial.print("Temperatura 2: ");
 Serial.print(t2);
 Serial.println(" C");
 }

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 {
  display.showNumberDec(("t1"), false, 2,2);

 }

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if (t1 >= 35 )  
  {
    digitalWrite(2, HIGH);     // accende il LED ROSSO
    delay(500);               // aspetta un secondo  
    digitalWrite(2, LOW);    // spegne il LED ROSSO
    delay(500);             // aspetta un secondo  
  }
   // if (t1 <= 0 )  
  //{
   // digitalWrite(11, HIGH);    // accende il LED ROSSO
   //  delay(500);               // aspetta un secondo  
  // digitalWrite(11, LOW);   // spegne il LED ROSSO
  // delay(500);             // aspetta un secondo  
  //}

   if ((t1 >= 0) && (t1 <= 30))  //TEMPERATURA NORMALE
  {
    digitalWrite(11, HIGH);    // accende il LED VERDE
  }

  if (t1 >= 34)  
  {
    digitalWrite(11, LOW);    // spegne il LED VERDE
  }

 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 if ((t2 >= 0) && (t2 <= 30))  ///TEMPERATURA NORMALE
 {
    digitalWrite(13, HIGH);    // accende il LED 
 }

   if (t2 >= 34)  
  {
    digitalWrite(13, LOW);    // spegne il LED VERDE
  }
  
    if (t2 >= 35 )  
  {
    digitalWrite(A5, HIGH);     // accende il LED ROSSO
    delay(500);               // aspetta un secondo  
    digitalWrite(A5, LOW);    // spegne il LED ROSSO
    delay(500);             // aspetta un secondo  
  }
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 if (h1 >= 80 )  //UMIDITA'
 {
    digitalWrite(A4, HIGH);     // accende il LED 
    delay(500);               // aspetta un secondo  
    digitalWrite(A4, LOW);    // spegne il LED 
    delay(500);             // aspetta un secondo  
  }

 if (h2 >= 80 ) //UMIDITA'
 {
    digitalWrite(A3, HIGH);     // accende il LED 
    delay(500);               // aspetta un secondo  
    digitalWrite(A3, LOW);    // spegne il LED 
    delay(500);             // aspetta un secondo  
  }


}









A parte la pessima indentazione e le inutili graffe sparse qua e là, in questa riga credo ci sia un errore.
Compila questo codice?
Perché credo che il primo argomento debba essere la variabile t1 e non la stringa t1...
Se metti i doppi apici indichi una stringa costante. Toglili e già che ci sei togli anche la parentesi tonde che messe in quel modo non servono a nulla.

Edit: osti, non ti sei presentato... Corri a farlo altrimenti ci caziano entrambi.

ok, provo grazie. Dove mi dovrei presentare?

Qui

Ora funziona tutto, grazie infinite. Per caso sai aiutarmi anche nel far cambiare il display sull'umidità? (h1).

Ps: mi sono presentato

Bene, cazziatone evitato.

L'istruzione è la stessa, devi solo cambiare il primo argomento e mettere la variabile dell'umidità.
Sono da cell e non ho capito tutto lo sketch, però vedo che da qualche parte scrivi l'umidità sulla seriale. Puoi provare a mettere lì anche la stampa su display.

si ma più che altro non so come comporre il codice. tipo:

display.showNumberDec(t1, false, 2,2);
delay (10000)
display.showNumberDec(h1, false, 2,2);

Ho provato così ma non funziona

Cosa intendi con non funziona?
Scritto così dovrebbe visualizzare la temperatura, aspettare 10 secondi e poi visualizzare l'umidità.
Poi continua con le istruzioni successive e arrivato a fine loop() ricomincia.

Eh non so, così com'è scritto non me lo prende, domani provo a rivedere. Oltretutto, non centra con il display, ho tutti i led che non seguono il delay che gli imposto ma sono tutti molto più lenti e alcuni ogni volta che i termometri mandano l'impulso, calano di intensità e poi si ristabilizzano
(Grazie ancora)

Primo consiglio: indenta bene il codice perché, anche se non so se sia questo il caso (perdonami, il codice è faticoso da capire), ma spesso gli errori sono dovuti a parti di codice che si pensa vengano eseguiti ed invece vengono saltati, o viceversa, a causa di graffe male indentate.
Nell'IDE premi Ctrl-T e te lo fa lui e posta qui il codice "leggibile" e soprattutto che sia sempre l'ultimo corrispondente a quello che stai riportando come problema (e da quel momento cerca di mantenere quel tipo di indentazione).

Secondo consiglio: dire solo che "non me lo prende" non basta, devi descrivere meglio cosa succede. Il compilatore dà errore immagino, ma quale? Puoi (anzi dovresti) fare copia/incolla del testo dell'errore?

Quando avrai indentato il codice e risolto il problema del display vediamo anche questa cosa, ma ricorda che i delay() bloccano l'esecuzione, quindi se tu quando mostri i dati poi aspetti 10 secondi con un delay, per 10 secondi non succede nient'altro. Se devi fare contemporaneamente (in realtà "molto velocemente") più cose, devi imparare ad usare la funzione millis(). Ma lo vedremo dopo.

Grazie dei consigli. Nel pomeriggio mando l'errore

OK, il problema era il punto e virgola. (si sono un po' stupido) Il tutto ora funziona solo che il delay del termometro mi rallenta veramente tanto tutto (il rilevatore di gas dovrebbe essere immediato mentre la temperatura più lenta e il display ancora di più) . Mando un nuovo codice visto che ho cambiato idea sul progetto. Magari sai aiutarmi. Inoltre sul display mi piacerebbe mettere la C di gradi e la U per umidità. Sai indicarmi come? Grazie infinite

#include "DHT.h"
#include "TM1637Display.h"
const int limite = 1000;
#define DHT1PIN 6
#define DHT1TYPE DHT11
DHT dht1(DHT1PIN, DHT1TYPE);
#define CLK 3
#define DIO 4
TM1637Display display(CLK, DIO);

///////////////////////////////////////////////////

void setup() {
  display.setBrightness(0x0f);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  Serial.begin(9600);
  Serial.println("DATI!");
  dht1.begin();
}

///////////////////////////////////////////////////

void loop() {
  int gas = analogRead(A0);
  Serial.println(gas);

  if (gas > 350)  // se il gas supera il limite...
  {
    tone(7, 400, 1000);  // Accende buzzer di allarme
    delay(1000);         // Aspetta un secondo (cambia nota)
    tone(7, 650, 1000);  // Accende buzzer di allarme
    delay(1000);         // Aspetta un secondo (cambia nota)
  }

  ///////////////////////////////////////////////////

  delay(2000);
  float h1 = dht1.readHumidity();
  float t1 = dht1.readTemperature();

  if (isnan(t1) || isnan(h1)) {
    Serial.println("Failed to read from DHT #1");
  } else {
    Serial.print("Umidità 1: ");
    Serial.print(h1);
    Serial.print(" %\t");
    Serial.print("Temperatura 1: ");
    Serial.print(t1);
    Serial.println(" C");
    float t1 = dht1.readTemperature();
  }

  {
    display.showNumberDec(t1, false, 2, 2);
    delay(3000);
    display.showNumberDec(h1, false, 2, 2);
  }
}

Ora è molto più comprensibile (poiché ben indentato), come vedi ci sono due parentesi di troppo. Il compilatore li accetta poiché è lecito creare un blocco di codice non legato ad alcun comando.

Blocchi di codice come quello evidenziato sono usati da programmatori esperti e per adesso è bene non introdurre blocchi di codice a caso.

Il delay è usato ampiamente negli esempi e si è portati a pensare che sia funzionale ma non lo è. Come puoi verificare tu stesso il delay ha comportamento non desiderato nelle applicazioni pratiche.
Per temporizzare l'esecuzione di codice si usa la funzione millis().

Ciao.

Come dicevo, se vuoi poter fare cose "quasi" in contemporanea, devi evitare di usare i delay() perché sono bloccanti, ed usare la funzione millis() insieme all'implementazione di una "macchina a stati finiti" ossia devi quantomeno creare delle variabili globali che ti danno lo stato di un certo elemento (es. il buzzer di allarme) con i relativi tempi, e quindi nel loop() lasciare andare il ciclo senza usare alcun delay().

Ti faccio un esempio, l'ho scritto al volo quindi non è detto che funzioni subito, ma cerca di capire quello che ho fatto:

#include "DHT.h"
#include "TM1637Display.h"
const int limite = 1000;
#define DHT1PIN 6
#define DHT1TYPE DHT11
DHT dht1(DHT1PIN, DHT1TYPE);
#define CLK 3
#define DIO 4
TM1637Display display(CLK, DIO);

void setup() {
  display.setBrightness(0x0f);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  Serial.begin(9600);
  Serial.println("DATI!");
  dht1.begin();
  analogRead(A0); // Fare sempre una lettura a vuoto
}

byte GasStatus = 0; // 0=ok, 1=allarme 1, 2= allarme 2
unsigned long timerGas = 0; // Timer (valore di millis) per cambio tono
byte DispStatus = 0; // 0=temperatura, 1=umidità
unsigned long timerDisplay = 0; // Timer (valore di millis) per cambio display

void loop() {
  int gas = analogRead(A0);
  Serial.println(gas);

  if (gas > 350)  // se il gas supera il limite
  { // attiva l'allarme, se non è già attivo
    if (GasStatus == 0) {
      GasStatus = 1;
      timerGas = millis();
    }
  }

  if (GasStatus > 0) {
    // Allarme attivo!
    if (GasStatus == 1 && millis()-timerGas > 1000) {
      tone(7, 400, 1000);  // Accende buzzer di allarme
      timerGas = millis();
    }
    if (GasStatus == 1 && millis()-timerGas > 1000) {
      tone(7, 400, 1000);  // Accende buzzer di allarme
      timerGas = millis();
    }
  }
    
  float h1 = dht1.readHumidity();
  float t1 = dht1.readTemperature();
  if (isnan(t1) || isnan(h1)) {
    Serial.println("Failed to read from DHT #1");
  } else {
    Serial.print("Umidità 1: ");
    Serial.print(h1);
    Serial.print(" %\t");
    Serial.print("Temperatura 1: ");
    Serial.print(t1);
    Serial.println(" C");
  }

  if (DispStatus == 0 && millis()-timerDisplay > 3000) {
    display.showNumberDec(t1, false, 2, 2);
    DispStatus = 1;
    timerDisplay = millis();
  }

  if (DispStatus == 1 && millis()-timerDisplay > 3000) {
    display.showNumberDec(h1, false, 2, 2);
    DispStatus = 0;
    timerDisplay = millis();
  }
}

Per quanto riguarda il simbolo, mi spiace ma non avendo io mai avuto a che fare con quel display non so dirti.

ahh ok ok, ora provo e vedo. Grazie di tutto

Ok grazie

Oppure:

uint32_t t_visualizza;

void visualizza()
  {
  if (!DispStatus) // DispStatus==0:
    {
    display.showNumberDec(t1, false, 2, 2);
    DispStatus = 1;
    }
  else // DispStatus==1:
    {
    display.showNumberDec(h1, false, 2, 2);
    DispStatus = 0;
    }
  }

void loop()
  {
  // ...
  if(millis()-t_visualizza>2999)
    {
    t_visualizza=millis();
    visualizza();
    }
  // ...
  }

O ancora:

bool dispTemp=true; // false=umidità.
uint32_t t_visualizza;

void visualizza()
  {
  if (dispTemp) 
    {
    display.showNumberDec(t1, false, 2, 2);
    }
  else
    {
    display.showNumberDec(h1, false, 2, 2);
    }
  }

void loop()
  {
  // ...
  if(millis()-t_visualizza>2999)
    {
    t_visualizza=millis();
    visualizza();
    dispTemp=!dispTemp;
    }
  // ...
  }

L'unica cosa è che il buzzer suona sempre

Per quello potresti usare una variabile che costantemente alterna fra true e false:

uint32_t t_bip_bip;
bool bip_bip=true;

loop:
if(millis()-t_bip_bip>999) {t_bip_bip=millis(); bip_bip=!bip_bip;}

if(gas>350 && bip_bip) digitalWrite(buzzerPin, HIGH);
else digitalWrite(buzzerPin, LOW);

Vedo, però, che tu hai usato una capsula passiva... tone() andrebbe attivato solo all'inizio di ogni secondo di suono, quindi serve un'altra variabile che memorizzi lo stato precedente di bip_bip e attivi tone() quando passa da false a true e attivi noTone() quando passa da true e false.

Grazie, ma sto utilizzando le modifiche fatte da @docdoc e il buzzer mi rimane sempre attivo. Devo capire come impostarlo che sotto ad un certo livello di gas (350) non suoni più.