Fusione due sketch

Ciao a tutti,

Il mio progetto finale è di controllare un’acquario e l’ambiente dove si trova.
So che ci sono tanti post sugli acquari ma voglio imparare così sono partito da 0.

Per il momento procedo a piccoli passi perché sono un principiante e non ho nessuna nozione di elettronica ne di programmazione quindi cerco online sketch che potrebbero fare a mio caso e li modifico come meglio… riesco… :slight_smile:

Per il momento ho combinato due sketch che avevo recuperato e modificato e avrei voluto il vostro parere sul risultato finale, e avrei anche un paio di domande da farvi per migliorarlo.

So che per voi saranno piccolezze ma per me il risultato ottenuto finora è una grande cosa!

I due sensori che ho collegato sono :

  • DHT11, che presto sostituirò per un DHT22 più preciso
  • DS18B20 waterproof

Allora qui lo sketch

#include <dht11.h> //For DHT11
dht11 DHT;
#define DHT11_PIN 8 //DHT11 Signal pin on digital 8

#include <OneWire.h>  //For DS18B20
int DS18B20_Pin = 2; //DS18B20 Signal pin on digital 2

//Temperature chip i/o
OneWire ds(DS18B20_Pin); // on digital pin 2

void setup(){
  Serial.begin(9600); 
  //Serial.println("DHT TEST PROGRAM "); //DHT11
  //Serial.print("LIBRARY VERSION: ");
  //Serial.println(DHT11LIB_VERSION);
  Serial.println();
  //Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}
 
void loop(){
  int chk;                                 //Start DHT11
  Serial.print("Umidita dentro casa : \t % ");
  
  chk = DHT.read(DHT11_PIN);               // READ DATA DHT11
  switch (chk){
    case DHTLIB_OK:  
                //Serial.print("OK,\t % "); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
  }
 // DISPLAT DATA
  Serial.println(DHT.humidity,1);
  Serial.print("Temp. dentro casa : \t C ");
  Serial.println(DHT.temperature,1);
 
  //delay(1000);                             //End DHT11
  
  
 float temperature = getTemp();           //Start DS18B20
 Serial.print("Temp. acqua :              ");
 Serial.print(temperature);
 Serial.println(" C");
 Serial.println(" ");
 
 delay(1000); //just here to slow down the output so it is easier to read
 
}


float getTemp(){
 //returns the temperature from one DS18S20 in DEG Celsius

 byte data[12];
 byte addr[8];

 if ( !ds.search(addr)) {
   //no more sensors on chain, reset search
   ds.reset_search();
   return -1000;
 }

 if ( OneWire::crc8( addr, 7) != addr[7]) {
   Serial.println("CRC is not valid!");
   return -1000;
 }

 if ( addr[0] != 0x10 && addr[0] != 0x28) {
   Serial.print("Device is not recognized");
   return -1000;
 }

 ds.reset();
 ds.select(addr);
 ds.write(0x44,1); // start conversion, with parasite power on at the end

 byte present = ds.reset();
 ds.select(addr);  
 ds.write(0xBE); // Read Scratchpad

 
 for (int i = 0; i < 9; i++) { // we need 9 bytes
  data[i] = ds.read();
 }
 
 ds.reset_search();
 
 byte MSB = data[1];
 byte LSB = data[0];

 float tempRead = ((MSB << 8) | LSB); //using two's compliment
 float TemperatureSum = tempRead / 16;
 
 return TemperatureSum;                       //End DS18B20
 
}

Non riesco ad inserire le immagini all’interno del messaggio ma solamente come allegato.
Se vedete gli allegati potete vedere il mio wiring.

Nell’altro allegato “Serial”, vorrei chiedere se qualcuno sa spiegarmi come fare per avere i segni di % e C (Celsius) dopo i numeri e non prima.

Altra domanda, come faccio per avere i decimali dove non ci sono?

Grazie in anticipo per il vostro prezioso aiuto.

Serial.png

per ottenere i decimali dovresti dichiarare le variabili come float (e non come int) e moltiplicare il valore finale per 1.0 per posticipare l'unità di misura ti basta aggiungere un: Serial.println(" C"); o Serial.println(" %"); (secondo i casi) dopo la riga che ti stampa il valore, una volta che ti esce puoi eliminare il simbolo dalla riga attuale, p.es.: Serial.print("Umidita dentro casa : \t % "); diventa: Serial.print("Umidita dentro casa : \t ");

Grazie per il tuo aiuto Michele.

Ho provato a cambiare in float ma mi da un errore, non basta sostituire l’uno per l’altro?
Se vedi l’allegato vedi l’errore che mi viene fuori, scusa non riesco a inserire una foto nel messaggio.

Quel che dice @Michele NON è riferito a far diventare float la “chk”

Se questa

Serial.println(DHT.humidity,1);

non stampa i decimali, forzala:

Serial.println((float)DHT.humidity,1);

oppure passa da una variabile float:

float hum=DHT.humidity;
Serial.println(hum,1);

La libreria che uso è la DHT versione 0.4.1 scaricata qui : https://github.com/adafruit/DHT-sensor-library

Ho provato entrambe le tue suggestioni :

non stampa i decimali, forzala: Code: Serial.println((float)DHT.humidity,1); oppure passa da una variabile float: Code: float hum=DHT.humidity; Serial.println(hum,1);

Purtroppo se mi da un decimale questo non funziona.

Nel senso, dove prima avevo 46% di umidità, adesso ho 46,0 mi scrive un decimale ma non è "attivo". Hai un idea perché?

Probabilmente, perchè il DHT11 non dà decimali. Io ho un DHT22 e quello son sicuro li da.

Ho capito. Niente allora.

Avevo in previsione l'acquisto di un DHT22 da quando ho scoperto che è più preciso (naturalmente queste così si scoprono sempre dopo!), appena lo ordinerò farò la prova allora.

Grazie mille per il tuo aiuto.

I tutorial migliori sono quelli di Adafruit (LadyAda) secondo me: https://learn.adafruit.com/dht/overview

Scusa Michele,

per posticipare l’unità di misura ti basta aggiungere un:
Serial.println(" C"); o Serial.println(" %"); (secondo i casi)
dopo la riga che ti stampa il valore, una volta che ti esce puoi eliminare il simbolo dalla riga attuale, p.es.:
Serial.print("Umidita dentro casa : \t % ");
diventa:
Serial.print("Umidita dentro casa : \t ");

Ho provato a fare come mi hai detto per posticipare il simbolo dopo i numeri, ma me li mette sempre prima e mi manda il numero alla riga successiva, come puoi vedere in allegato.

void loop(){
  int chk;                                 //Start DHT11
  Serial.print("Umidita dentro casa : \t ");
  Serial.println(" %");

Hai un altra idea?
O forse ho sbagliato qualcosa?

Schermata 2014-08-21 alle 16.16.39.png

Scusa, ma questo pezzo lo fa come vuoi tu, giusto?

Serial.print("Temp. acqua :              ");
Serial.print(temperature);
Serial.println(" C");

Allora perchè non modifichi il precedente:

  Serial.print("Umidita dentro casa : \t % ");
  Serial.println(DHT.humidity,1);
  Serial.print("Temp. dentro casa : \t C ");
  Serial.println(DHT.temperature,1);

per renderlo simile? ;)

P.S. porta quella frase "umidita..." dopo quegli if, nun se pò vedè un pezzo sopra e il resto sotto!!!

Oh yeah!
era una cazzata eppure mi sembrava impossibile riuscirci da solo, ma con i tuoi suggerimenti ho fatto!
Grazie mille!!!

Adesso il mio sketch assimila a questo :

#include <dht11.h> //For DHT11
dht11 DHT;
#define DHT11_PIN 8 //DHT11 Signal pin on digital 8

#include <OneWire.h>  //For DS18B20
int DS18B20_Pin = 2; //DS18B20 Signal pin on digital 2

//Temperature chip i/o
OneWire ds(DS18B20_Pin); // on digital pin 2

void setup(){
  Serial.begin(9600); 
  //Serial.println("DHT TEST PROGRAM "); //DHT11
  //Serial.print("LIBRARY VERSION: ");
  //Serial.println(DHT11LIB_VERSION);
  Serial.println();
  //Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}
 
void loop(){
  int chk;                                 //Start DHT11
  
  chk = DHT.read(DHT11_PIN);               // READ DATA DHT11
  switch (chk){
    case DHTLIB_OK:  
                //Serial.print("OK,\t % "); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
  }
 // DISPLAT DATA
  Serial.print("Umidita dentro casa : \t ");
  Serial.print(DHT.humidity,1);
  Serial.println(" %");
  
  Serial.print("Temp. dentro casa : \t ");
  Serial.print(DHT.temperature,1);
  Serial.println(" C");
 
  //delay(1000);                             //End DHT11
  
  
 float temperature = getTemp();           //Start DS18B20
 Serial.print("Temp. acqua :            ");
 Serial.print(temperature);
 Serial.println(" C");
 Serial.println(" ");
 
 delay(1000); //just here to slow down the output so it is easier to read
 
}


float getTemp(){
 //returns the temperature from one DS18S20 in DEG Celsius

 byte data[12];
 byte addr[8];

 if ( !ds.search(addr)) {
   //no more sensors on chain, reset search
   ds.reset_search();
   return -1000;
 }

 if ( OneWire::crc8( addr, 7) != addr[7]) {
   Serial.println("CRC is not valid!");
   return -1000;
 }

 if ( addr[0] != 0x10 && addr[0] != 0x28) {
   Serial.print("Device is not recognized");
   return -1000;
 }

 ds.reset();
 ds.select(addr);
 ds.write(0x44,1); // start conversion, with parasite power on at the end

 byte present = ds.reset();
 ds.select(addr);  
 ds.write(0xBE); // Read Scratchpad

 
 for (int i = 0; i < 9; i++) { // we need 9 bytes
  data[i] = ds.read();
 }
 
 ds.reset_search();
 
 byte MSB = data[1];
 byte LSB = data[0];

 float tempRead = ((MSB << 8) | LSB); //using two's compliment
 float TemperatureSum = tempRead / 16;
 
 return TemperatureSum;                       //End DS18B20
 
}

Ci sono ancora tanti passaggi che ho lasciato come commenti che non sono altro che parti che ho isolato dagli sketch che ho preso in rete ma non ho le palle di cancellarli non sapendo se un domani mi serviranno.
So che rende il mio sketch meno leggibile ma sono un principiante e le cose le scopro man mano facendo, non vorrei cancellare ora qualcosa che non saprei rifare domani ecco…

Se hai altri suggerimenti per migliorare il mio sketch non esitare sono alle prime armi ogni consiglio o critica sarà ben venuta!!

Schermata 2014-08-21 alle 16.56.41.png

Figurati. Di nulla. Sarebbe altresì meglio portare quelle stampe dei due valori dentro al case

case DHTLIB_OK:

dove hai l'okay. Se il dht non viene letto è inutile stamparne i valori.

Scusami tanto, non ho capito come devo procedere :blush:

#include <dht11.h> //For DHT11
#include <OneWire.h>  //For DS18B20

const byte DHT11_PIN=8;           //DHT11 Signal pin on digital 8
const byte DS18B20_Pin = 2;       //DS18B20 Signal pin on digital 2
           
dht11 DHT;
OneWire ds(DS18B20_Pin); // on digital pin 2
float temperature;
int chk;                      

void setup()
{
  delay(1000);  // sempre meglio mettere qui un delay
  Serial.begin(9600); 
  Serial.println();
}
 
void loop()
{
  chk = DHT.read(DHT11_PIN);               // READ DATA DHT11
  switch (chk)
  {
    case DHTLIB_OK:           //Serial.print("OK,\t % "); 
         // DISPLAY DATA
         Serial.print("Umidita dentro casa : \t ");
         Serial.print(DHT.humidity,1);
         Serial.println(" %");  
         Serial.print("Temp. dentro casa : \t ");
         Serial.print(DHT.temperature,1);
         Serial.println(" C");
         break;
    case DHTLIB_ERROR_CHECKSUM: 
         Serial.print("Checksum error,\t"); 
         break;
    case DHTLIB_ERROR_TIMEOUT: 
         Serial.print("Time out error,\t"); 
         break;
    default: 
         Serial.print("Unknown error,\t"); 
         break;
  }
  //delay(1000);                             //End DHT11
  temperature = getTemp();           //Start DS18B20
  Serial.print("Temp. acqua :            ");
  Serial.print(temperature);
  Serial.println(" C");
  Serial.println(" ");
  delay(1000); //just here to slow down the output so it is easier to read
}

float getTemp()     
{  //returns the temperature from one DS18S20 in DEG Celsius
... questa rimane invariata
}

E le graffe aperte non sono una cosa da nascondere, anzi io le metto in evidenza su riga successiva incolonnate con le rispettive graffe chiuse. Gli editor di programmi seri addirittura data una graffa ti evidenziano quella corrispettiva.

Ok, ho modificato seguendo le tue indicazioni, penso che sia più leggibile adesso, cosa ne dici?

#include <dht11.h>                       //For DHT11
#define DHT11_PIN 8                      //DHT11 Signal pin on digital 8
#include <OneWire.h>                     //For DS18B20

dht11 DHT;
int chk;                                 //For DHT11
int DS18B20_Pin = 2;                     //DS18B20 Signal pin on digital 2
OneWire ds(DS18B20_Pin);                 // on digital pin 2
float temperature = getTemp();           //For DS18B20


void setup()
{
  Serial.begin(9600); 
  //Serial.println("DHT TEST PROGRAM "); //DHT11
  //Serial.print("LIBRARY VERSION: ");
  //Serial.println(DHT11LIB_VERSION);
  Serial.println();
  //Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}
 
void loop()
{
                                           //Start DHT11
  chk = DHT.read(DHT11_PIN);               // READ DATA DHT11
  switch (chk){
    case DHTLIB_OK:  
                //Serial.print("OK,\t "); 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
  }
 // DISPLAT DATA
  Serial.print("Umidita dentro casa : \t ");
  Serial.print(DHT.humidity,1);
  Serial.println(" %");
  
  Serial.print("Temp. dentro casa : \t ");
  Serial.print(DHT.temperature,1);
  Serial.println(" C");                      //End DHT11
  
 Serial.print("Temp. acqua :            ");  //Start DS18B20
 Serial.print(temperature);
 Serial.println(" C");
 Serial.println(" ");
 
 delay(1000);                                 //just here to slow down the output so it is easier to read
 
}


float getTemp()
{
 //returns the temperature from one DS18S20 in DEG Celsius
 byte data[12];
 byte addr[8];

 if ( !ds.search(addr)) 
 {
   //no more sensors on chain, reset search
   ds.reset_search();
   return -1000;
 }

 if ( OneWire::crc8( addr, 7) != addr[7]) 
 {
   Serial.println("CRC is not valid!");
   return -1000;
 }

 if ( addr[0] != 0x10 && addr[0] != 0x28) 
 {
   Serial.print("Device is not recognized");
   return -1000;
 }

 ds.reset();
 ds.select(addr);
 ds.write(0x44,1); // start conversion, with parasite power on at the end

 byte present = ds.reset();
 ds.select(addr);  
 ds.write(0xBE); // Read Scratchpad

 
 for (int i = 0; i < 9; i++)  // we need 9 bytes
 {
  data[i] = ds.read();
 }
 
 ds.reset_search();
 
 byte MSB = data[1];
 byte LSB = data[0];

 float tempRead = ((MSB << 8) | LSB); //using two's compliment
 float TemperatureSum = tempRead / 16;
 
 return TemperatureSum;                       //End DS18B20

Bene alcune cose ma Male altre. Hai spostato non solo la variabile temperature ma anche l'assegnazione relativa. Poi la stampa di umidità e temperatura non è sotto nel case di okay dal sensore. Prova a confrontare il mio con il tuo.

Ok penso di esserci adesso :

#include <dht11.h>                         //For DHT11
#include <OneWire.h>                       //For DS18B20

const byte DHT11_PIN = 8;                  //DHT11 Signal pin on digital 8
const byte DS18B20_Pin = 2;                //DS18B20 Signal pin on digital 2

dht11 DHT;
OneWire ds(DS18B20_Pin);                  // on digital pin 2
float temperature;                        //For DS18B20
int chk;                                  //For DHT11


void setup()
{
  Serial.begin(9600); 
  //Serial.println("DHT TEST PROGRAM ");   //DHT11
  //Serial.print("LIBRARY VERSION: ");
  //Serial.println(DHT11LIB_VERSION);
  Serial.println();
  //Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}
 
void loop()
{
                                           //Start DHT11
  chk = DHT.read(DHT11_PIN);               // READ DATA DHT11
  switch (chk){
    case DHTLIB_OK:  
                 //Serial.print("OK,\t ");
                  Serial.print("Umidita dentro casa : \t ");   // DISPLAT DATA
                  Serial.print(DHT.humidity,1);
                  Serial.println(" %");
  
                  Serial.print("Temp. dentro casa : \t ");
                  Serial.print(DHT.temperature,1);
                  Serial.println(" C");                 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
  }                                      //End DHT11
 
 
 float temperature = getTemp();           //Start DS18B20
 Serial.print("Temp. acqua :            ");
 Serial.print(temperature);
 Serial.println(" C");
 Serial.println(" ");
 
 delay(1000);                             //just to slow down the output it's easier to read
 
}


float getTemp()
{
 //returns the temperature from one DS18S20 in DEG Celsius
 byte data[12];
 byte addr[8];

 if ( !ds.search(addr)) 
 {
   //no more sensors on chain, reset search
   ds.reset_search();
   return -1000;
 }

 if ( OneWire::crc8( addr, 7) != addr[7]) 
 {
   Serial.println("CRC is not valid!");
   return -1000;
 }

 if ( addr[0] != 0x10 && addr[0] != 0x28) 
 {
   Serial.print("Device is not recognized");
   return -1000;
 }

 ds.reset();
 ds.select(addr);
 ds.write(0x44,1);                           // start conversion, with parasite power on at the end

 byte present = ds.reset();
 ds.select(addr);  
 ds.write(0xBE); // Read Scratchpad

 
 for (int i = 0; i < 9; i++)                  // we need 9 bytes
 {
  data[i] = ds.read();
 }
 
 ds.reset_search();
 
 byte MSB = data[1];
 byte LSB = data[0];

 float tempRead = ((MSB << 8) | LSB);         //using two's compliment
 float TemperatureSum = tempRead / 16;
 
 return TemperatureSum;                       //End DS18B20
 
}

Meglio cosi?

Però avrei una domanda :

  • hai cambiato per const byte, perché?

Wado: Però avrei una domanda : - hai cambiato per const byte, perché?

Piccolezza. Quei numeri sono piccoli, i numeri per indicare i pin non superano di certo 255, valore massimo per un byte (0-255) quindi un int è sprecato (0-65535 senza segno o -32768+32767)

Capito.

Grazie mille a te e a Michele per il tempo dedicato mi oggi, ho fatto più di quanto pensasi di fare!