stazione meteo particolare

perche i sensori li volevo mettere ad una distanza di circa 2 metri in modo da avere un riscontro migliore.
lo scatolotto sara' nel terrazzo coperto.
pannello fotovoltaico e sensore temp li voglio portare verso il tetto

.... ma pensare di remotizzare e mettere un piccolo Arduino Pro Mini remoto che è collegato direttamente ai sensori digitali e comunica in seriale (dove hai molti meno problemi di distanza) con l'Arduino principale?

Un Pro Mini oggi lo trovi a pochi US$ sia a 5V che 3.3V ... :wink:

Guglielmo

1 Like

emh... inizia a diventare troppo complicato :smiley: non saprei farlo
ad esser capace avrei voluto metter tutto senza display sul tetto e controllarlo via app dal cell, ma è troppo per me che non ho mai studiato programmazione in vita mia :smiley:

il pro mini in effetti ce l'ho gia a casa ma non sono mai riuscito a programmarlo (ho il programmatore usb anche) sara' difettoso...

lucavigna:
il pro mini in effetti ce l'ho gia a casa ma non sono mai riuscito a programmarlo (ho il programmatore usb anche)

Strano ... ne uso tantissimi e mai avuto problemi ... ::slight_smile:

Eventualmente apri un thread dedicato (così non inquiniamo questo), spiegando bene come cerchi di programmarli e i problemi che incontri :wink:

Guglielmo

al momento vorrei iniziare a montar tutto cosi, parto dalla visualizzazione sul display dei dati dei sensori, poi al salvataggio anche su sd.
e cosi termino diciamo il programma base. poi una volta funzionante vedo se riesco a capirci di wifi ecc

lucavigna:
al momento vorrei iniziare a montar tutto cosi, parto dalla visualizzazione sul display dei dati dei sensori, poi al salvataggio anche su sd.
e cosi termino diciamo il programma base. poi una volta funzionante vedo se riesco a capirci di wifi ecc

Secondo me se fai così ti rendi la vita difficile, se segui il consiglio di Guglielmo e affronti il problema che già hai prima di iniziare con il resto e che, avendolo già più o meno affrontato, sei più "nel tuo" eviti di trovarti nella spiacevole situazione "Ho fatto il 90% e devo rifare tutto perché non posso riadattare il codice alle nuove esigenze" capita spessissimo.
Se fossi io a doverlo affrontare inizierei dal programmare un blink sulla pro mini, poi metterei in comunicazione seriale pro mini e uno e solo allora andrei avanti con gli altri sensori/display/ecc.

fabpolli:
Se fossi io a doverlo affrontare inizierei dal programmare un blink sulla pro mini, poi metterei in comunicazione seriale pro mini e uno e solo allora andrei avanti con gli altri sensori/display/ecc.

ammesso che riesca a programmare il pro mini con il semplice blink, poi come lo metto in comunicazione con la uno?

lucavigna:
ammesso che riesca a programmare il pro mini con il semplice blink, poi come lo metto in comunicazione con la uno?

Una cosa alla volta e comunque con una bella SoftwareSerial su entrambe, la seriale poi potrà diventare "automagicamente" un RS485 con semplici adattatori senza dover ritoccare il codice ad esempio.
Impara a programmare il pro mini con il codice d'esempio blink, poi dal pro mini via software serial mandi ogni secondo un carattere alla uno la quale accenderà o spegnerà il led integrato al pin 13, se vuoi "complicare" e "divertirti" usi un pulsante sulla pro mini e se premuto accedni il led sulla uno altrimeni lo spegni

ok. vediamo intanto se riesco a programmarlo perchè qualcosa ricordo che non andava.
perche avevo caricato sulla nano un software che mi faceva scattare un rele alla ricezione di un forte suono (con il sensore suono) quindi una volta andava.
pero' non ricordo se era la mini o avevo una nano che non riuscivo nemmeno da usb.
la uno compatibile mi deve ancora arrivare (ordinata oggi dalla cina :D)

se poi va, vado a leggermi qualche post sulla SoftwareSerial e scopiazzo qualche codice :smiley:

La SoftwareSerial è semplicemente una libreria che ti permette di creare una porta seriale aggiuntiva gestita via software, quindi ... hai poco da scopiazzare, ha gli stessi metodi della Serial e si usa allo stesso modo :slight_smile:

Unico suggerimento, per ragioni di compatibilità sulle varie board, si consiglia di usare come pin per RX il 10 e come pin per il TX il 11 (... se disponibili).

Guglielmo

mi sa che metto un attimo in standby il progetto!
sono riuscito a recuperare 3 Bellissime guide a nastro (con cinghia dentata) per realizzare un dolly per timelapse!
quindi probabilmente appena mi arriva il materiale lo metto in stanby se queste guide riesco ad utilizzarle! :smiley: yeah! è una cosa che volevo fare da anni ma mi son sempre fermato x il costo di tali oggetti

nel frattempo mi è arrivato il sensore e ho potuto testarlo
se non metto una resistenza tra il positivo e il giallo del sensore non va
ho messo una 4.6k ohm alcuni dicon di mettere una 10k...cosa cambia? da quel che ho visto io nulla...

Il sensore e' alimentato, con 3 fili ? ... se si, probabilmente ha semplicemente un'uscita open-collector, quindi la resistenza di pull-up la devi mettere tu esterna ... non cambia molto come valore, da 4K7 a 10K in genere va bene un po tutto ...

si, positivo negativo e segnale (giallo)
mettendo una resistenza tra segnalee positivo funziona e anche bene! :smiley:
appena mi arrivano altri componenti provo anche quelli e decido il da farsi

sono andato un po avanti, recuperando vecchi progetti e prove che avevo fatto per data ora temp e umidita con dht11
ho raggruppato tutto e questo è il risultato
ora devo leggere come fare per scrivere i dati su scheda sd! la vedo gia dura!

quello che non capisco come fare nonostante credo sia banale, è far scrivere ogni tot minuti su monitor seriale le varie cose.
cosi com'è ora ho un delay di "100" ma se metto "10000" non mi compare piu su lcd

//PROGETTO ARDUINO TEMPERATURA 


#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
#include <DHT.h>
#include <DallasTemperature.h>
#include <OneWire.h> // dichiarazione di utilizzo della libreria OneWire.h
 #include <RTClib.h>
 
    char buffer1[20];
    char buffer2[20];
    RTC_DS1307 RTC;
    
// definisco a quali pin è connesso il display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // indirizzo 0x27 seriale del i2c 

#define LED_PIN 13

// definisco il pin del sensore DHT-11
#define DHTPIN 8


// definisco il tipo di sensore
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

#define ONE_WIRE_BUS 2 // assegna il valore 2 al nome ONE_WIRE_BUS

OneWire oneWire(ONE_WIRE_BUS); // associa alla porta 2 (valore di ONE_WIRE_BUS) il
// canale dati dei sensori

DallasTemperature sensors(&oneWire); //trasferisce alle routine della libreria DallasTemperature
// il controllo delle funzioni OneWire

#include <DallasTemperature.h> // dichiarazione di utilizzo della libreria DallasTemperature.h




void setup(void) {
  
//imposta il pin come uscita PER POI SPEGNERE IL LED
pinMode(LED_PIN, OUTPUT);


Serial.begin(9600); // inizializza la porta seriale per l'utilizzo del monitor seriale 
sensors.begin(); // inizializza i sensori
lcd.begin(20, 4); //imposta il tipo di display
Wire.begin();
RTC.begin();

// AGGIUSTA L'ORA
 if (! RTC.isrunning()) {
   RTC.adjust(DateTime(__DATE__, __TIME__));
      }

}


  
   


void loop(void)
{
  
 
  
 //---------------------------- OROLOGIO -------------------- 
 
 //    statepin = digitalRead (setpin);
    //  if (statepin == LOW)
    //  {
    //    RTC.adjust(DateTime(__DATE__, __TIME__));
   //   }
      DateTime now = RTC.now();

      sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
      lcd.setCursor(0, 0);
      lcd.print( buffer1 );
      sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
      lcd.setCursor(9, 0);
      lcd.print( buffer2 );
 
 Serial.println( buffer1 ); //scrive ora su monitor seriale
 Serial.println( buffer2 ); //scrive giorni su monitor seriale
 Serial.println(sensors.getTempCByIndex(0)); // scrive temp con cavo  su monitor seriale
 Serial.println(dht.readTemperature()); //scrive temp 1 su monitor seriale
 Serial.println(dht.readHumidity()); //scrive temp 2 su monitor seriale
 
 delay(100);
  
 // -----------------  SENSORE CON CAVO  -------------------------
 
  sensors.requestTemperatures(); // invia ai sensori la richiesta di misurare la temperatura
  
  //delay (1000); // attende tot secondi prima di verificare nuovamente la temperatura
    
  lcd.setCursor(0, 1); // posiziona il cursore 
  lcd.print ("Temperatura1");
  lcd.setCursor(13, 1);
  lcd.print (sensors.getTempCByIndex(0)); // espone il livello sul display lcd
  lcd.setCursor(18, 1); // 
  lcd.print ("c");
  lcd.setCursor(19, 1); // 
  lcd.write(B11011111); //Simbolo de graus celsius
  
 
 

//---------------------- TEMPERATURA UMIDITA INTERNA ----------------------
int t = dht.readTemperature();
int h = dht.readHumidity();

lcd.setCursor(0, 2);
lcd.print("Temperatura2");
lcd.setCursor(16, 2);
lcd.write("c");
lcd.write(B11011111); //Simbolo de graus celsius
lcd.setCursor(13, 2);
lcd.print(t);

lcd.setCursor(0, 3);
lcd.print("Umidita'");
lcd.setCursor(16, 3);
lcd.print("%");
lcd.setCursor(13, 3);
lcd.print(h);








//spegne led pin 13 di default acceso
digitalWrite(LED_PIN, LOW);



}

ho un piccolo problema!
c'è qualche buon'anima che mi controlla lo sketch? lo ringrazierei molto!
in pratica riesco a visualizzare su display :
temp e umidita del dht11, temperatura del sensore cablato, data e ora..
in piu riesco a scrivere un log file su sd ogni minuto .
solo che l'orologio a display sbarella...ogni tot salta 1 secondo...

ecco il codice che ho compilato

//PROGETTO ARDUINO TEMPERATURA 


#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
#include <DHT.h>
#include <DallasTemperature.h>
#include <OneWire.h> // dichiarazione di utilizzo della libreria OneWire.h
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>  

    char buffer1[20];
    char buffer2[20];
    RTC_DS1307 RTC;
    
// definisco a quali pin è connesso il display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // indirizzo 0x27 seriale del i2c 

#define LED_PIN 13

// definisco il pin del sensore DHT-11
#define DHTPIN 8

// definisco il tipo di sensore
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

const int chipSelect = 10;            //CS pin of your shield
File Logfile;                        //Name of the file

#define ONE_WIRE_BUS 2 // assegna il valore 2 al nome ONE_WIRE_BUS

OneWire oneWire(ONE_WIRE_BUS); // associa alla porta 2 (valore di ONE_WIRE_BUS) il
// canale dati dei sensori

DallasTemperature sensors(&oneWire); //trasferisce alle routine della libreria DallasTemperature
// il controllo delle funzioni OneWire

#include <DallasTemperature.h> // dichiarazione di utilizzo della libreria DallasTemperature.h




void setup(void) {
  
  
Serial.begin(9600); // inizializza la porta seriale per l'utilizzo del monitor seriale 
sensors.begin(); // inizializza i sensori
lcd.begin(20, 4); //imposta il tipo di display
Wire.begin();
RTC.begin();
dht.begin();
SD.begin(chipSelect);

  // -----------------AGGIUSTA L'ORA
    {
        RTC.adjust(DateTime(__DATE__, __TIME__));
      } 
  
  
pinMode(10 , OUTPUT);           //PIN SD ADAFRUI
  
//imposta il pin come uscita PER POI SPEGNERE IL LED
pinMode(LED_PIN, OUTPUT);






Logfile=SD.open("Logfile.csv",FILE_WRITE);                //Will open and will write once just for headers
Logfile.println("  Date    Time    Humidity   Temp");     //Print headers (not saved yet)     
Logfile.close();                                          //Print saved

}



   


void loop(void)
{

  sensors.requestTemperatures(); // invia ai sensori la richiesta di misurare la temperatura
  
int t = dht.readTemperature();
int h = dht.readHumidity();

 
DateTime now = RTC.now();                        
 if(now.second()==0){            //scrittura ogni minuto                
//----------------------------------------------------------------------------------------   if(now.minute()==0 && now.second()==0){   //imposta l'ora di lasso temporale
  
Logfile=SD.open("Logfile.csv",FILE_WRITE);       //Will open and will write date

now =RTC.now();

Logfile.print(now.year(), DEC);                //scrive anno
Logfile.print("/");                            //scrive /
Logfile.print(now.month(), DEC);               //scrive mese
Logfile.print("/");                            //scrive /
Logfile.print(now.day(), DEC);                 //scrive giorno
Logfile.print(" ");                            //spazio
Logfile.print(now.hour(), DEC);                //scrive ore
Logfile.print(":");                            //scrive :
Logfile.print(now.minute(), DEC);              //scrive minuti
Logfile.print(":");                            //scrive ;
Logfile.print(now.second(), DEC);              //scrive secondi
Logfile.print("  ");                           //spazio

Logfile.print(h);                               //scrive dati umidita'
Logfile.print("%");                             //scrive %
Logfile.print("  ");                            //spazio
Logfile.print(t);                               //scrive dati temperatura
Logfile.print("C");                            //scrive C
Logfile.print("  ");                            //spazio
Logfile.print(sensors.getTempCByIndex(0));     //scrive dati temperatura
Logfile.print("C");                            //scrive C
Logfile.println();                             //passa ad una nuona linea
Logfile.print("  ");  
Logfile.close();  


//Print saved

Serial.print(h);                               //Print humidity(not saved yet)
Serial.print("%");                             //Print simbol
Serial.print("  ");                            //Space between data
Serial.print(t);                               //Print temperature
Serial.print("°C");                            //Print simbol
Serial.println(); 

 
 
 
 
 
 
 }

//----------------------------------------------------------------------------------------- if(now.minute()==30 && now.second()==0){                 //imposta la mezz'ora

delay(1000); 

 //---------------------------- OROLOGIO SU DISPLAY LCD 20x4-------------------- 

 
 
    // statepin = digitalRead (setpin);
  //   if (statepin == LOW)
     
  //  DateTime now = RTC.now();

   sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
   lcd.setCursor(0, 0);
   lcd.print( buffer1 );
   sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
   lcd.setCursor(9, 0);
   lcd.print( buffer2 );
      

  
 // -----------------  SU LCD SENSORE CON CAVO  -------------------------
 

    
  lcd.setCursor(0, 1); // posiziona il cursore 
  lcd.print ("Temperatura1");
  lcd.setCursor(13, 1);
  lcd.print (sensors.getTempCByIndex(0)); // espone il livello sul display lcd
  lcd.setCursor(18, 1); // 
  lcd.print ("c");
  lcd.setCursor(19, 1); // 
  lcd.write(B11011111); //Simbolo de graus celsius
  


//---------------------- SU LCD TEMPERATURA UMIDITA INTERNA ----------------------

lcd.setCursor(0, 2);
lcd.print("Temperatura2");
lcd.setCursor(16, 2);
lcd.write("c");
lcd.write(B11011111); //Simbolo de graus celsius
lcd.setCursor(13, 2);
lcd.print(t);

lcd.setCursor(0, 3);
lcd.print("Umidita'");
lcd.setCursor(16, 3);
lcd.print("%");
lcd.setCursor(13, 3);
lcd.print(h);








//spegne led pin 13 di default acceso
digitalWrite(LED_PIN, LOW);




 


//delay(1000);                                    //One data per second

}

delay(1000);

forzi una pausa di 1s. l'esecuzione del loop, quindi, dura 1s + il tempo di esecuzione di tutte le altre istruzioni.
E quindi è normale che ogni tanto salti un secondo, inoltre, in questo modo, dovresti avere anche un refresh dei secondi più lento di 1s. e per la precisione di 1s + tempo di esecuzione di tutte le altre istruzioni del loop.

Ti torna?

allora prima sbarellava x quel motivo.
adesso avevo gia fatto delle modifiche e ho impostato cosi ...lo sto testando. i secondi ogni tanto rallentano ma non li perde. ho 20 secondi di differenza dal pc e li mantiene.
secondo te è tutto giusto o si deve migliorare qualcosa?

//PROGETTO ARDUINO TEMPERATURA 


#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
#include <DHT.h>
#include <DallasTemperature.h>
#include <OneWire.h> // dichiarazione di utilizzo della libreria OneWire.h
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>  

    char buffer1[20];
    char buffer2[20];
    RTC_DS1307 RTC;
    
// definisco a quali pin è connesso il display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // indirizzo 0x27 seriale del i2c 

#define LED_PIN 13

// definisco il pin del sensore DHT-11
#define DHTPIN 8

// definisco il tipo di sensore
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

const int chipSelect = 10;            //CS pin of your shield
File Logfile;                        //Name of the file

#define ONE_WIRE_BUS 2 // assegna il valore 2 al nome ONE_WIRE_BUS

OneWire oneWire(ONE_WIRE_BUS); // associa alla porta 2 (valore di ONE_WIRE_BUS) il
// canale dati dei sensori

DallasTemperature sensors(&oneWire); //trasferisce alle routine della libreria DallasTemperature
// il controllo delle funzioni OneWire

#include <DallasTemperature.h> // dichiarazione di utilizzo della libreria DallasTemperature.h




void setup(void) {
  
  
Serial.begin(9600); // inizializza la porta seriale per l'utilizzo del monitor seriale 
sensors.begin(); // inizializza i sensori
lcd.begin(20, 4); //imposta il tipo di display
Wire.begin();
RTC.begin();
dht.begin();
SD.begin(chipSelect);

  // -----------------AGGIUSTA L'ORA
    {
        RTC.adjust(DateTime(__DATE__, __TIME__));
      } 
  
  
pinMode(10 , OUTPUT);           //PIN SD ADAFRUI
  
//imposta il pin come uscita PER POI SPEGNERE IL LED
pinMode(LED_PIN, OUTPUT);






Logfile=SD.open("Logfile.csv",FILE_WRITE);                //Will open and will write once just for headers
//Logfile.println("  Date    Time    Humidity   Temp");     //Print headers (not saved yet)     
Logfile.close();                                          //Print saved

}



   


void loop(void)
{

sensors.requestTemperatures(); // invia ai sensori la richiesta di misurare la temperatura
  
int t = dht.readTemperature();
int h = dht.readHumidity();

 
DateTime now = RTC.now();                        
 if(now.second()==0){            //scrittura ogni minuto                
//----------------------------------------------------------------------------------------   if(now.minute()==0 && now.second()==0){   //imposta l'ora di lasso temporale
  
Logfile=SD.open("Logfile.csv",FILE_WRITE);       //Will open and will write date

now =RTC.now();

Logfile.print(now.day(), DEC);                 //scrive giorno
Logfile.print("/");                            //scrive /
Logfile.print(now.month(), DEC);               //scrive mese
Logfile.print("/");                            //scrive /
Logfile.print(now.year(), DEC);                //scrive anno
Logfile.print(" ");                            //spazio

Logfile.print(now.hour(), DEC);                //scrive ore
Logfile.print(":");                            //scrive :
Logfile.print(now.minute(), DEC);              //scrive minuti
//Logfile.print(":");                            //scrive ;
//Logfile.print(now.second(), DEC);              //scrive secondi
Logfile.print("  ");                           //spazio

Logfile.print("Temp. int.");                            //scrive 
Logfile.print(t);                               //scrive dati temperatura
Logfile.print("C");                            //scrive C
Logfile.print("  ");                           //spazio
Logfile.print("Temp. ext.");                            //scrive 
Logfile.print(sensors.getTempCByIndex(0));     //scrive dati temperatura
Logfile.print("C");                            //scrive C

Logfile.print("  ");                            //spazio
Logfile.print("umidita");                            //scrive :
Logfile.print(h);                               //scrive dati umidita'
Logfile.print("%");                             //scrive %



Logfile.println();                             //passa ad una nuona linea
Logfile.close();  


//Print saved


 
 
 
 
 
 
 }

//----------------------------------------------------------------------------------------- if(now.minute()==30 && now.second()==0){                 //imposta la mezz'ora

//delay(1000); 

 //---------------------------- OROLOGIO SU DISPLAY LCD 20x4-------------------- 

 
 
    // statepin = digitalRead (setpin);
  //   if (statepin == LOW)
     
  //  DateTime now = RTC.now();

   sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
   lcd.setCursor(0, 0);
   lcd.print( buffer1 );
   sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
   lcd.setCursor(9, 0);
   lcd.print( buffer2 );
      

  
 // -----------------  SU LCD SENSORE CON CAVO  -------------------------
 

    
  lcd.setCursor(0, 1); // posiziona il cursore 
  lcd.print ("Temperatura1");
  lcd.setCursor(13, 1);
  lcd.print (sensors.getTempCByIndex(0)); // espone il livello sul display lcd
  lcd.setCursor(18, 1); // 
  lcd.print ("c");
  lcd.setCursor(19, 1); // 
  lcd.write(B11011111); //Simbolo de graus celsius
  


//---------------------- SU LCD TEMPERATURA UMIDITA INTERNA ----------------------

lcd.setCursor(0, 2);
lcd.print("Temperatura2");
lcd.setCursor(16, 2);
lcd.write("c");
lcd.write(B11011111); //Simbolo de graus celsius
lcd.setCursor(13, 2);
lcd.print(t);

lcd.setCursor(0, 3);
lcd.print("Umidita'");
lcd.setCursor(16, 3);
lcd.print("%");
lcd.setCursor(13, 3);
lcd.print(h);








//spegne led pin 13 di default acceso
digitalWrite(LED_PIN, LOW);


 




}

questo invece è il file che si genera, sto cercando di modificarlo un po (con poco successo ahahah) :

Ma con questo codice ti scrive una sola riga al minuto?
è così lento a fare un singolo giro del loop?
Perchè con

if(now.second()==0){

se riesce a fare più giri in un solo secondo li stampa tutti.
Se un singolo loop lo fa in meno di un secondo prima o poi te ne stampa almeno due.
Non ho ancora provato a fare scritture su SD per cui non so esattamente quanto lento sia...

maubarzi:
Ma con questo codice ti scrive una sola riga al minuto?
è così lento a fare un singolo giro del loop?
Perchè con

if(now.second()==0){

se riesce a fare più giri in un solo secondo li stampa tutti.
Se un singolo loop lo fa in meno di un secondo prima o poi te ne stampa almeno due.
Non ho ancora provato a fare scritture su SD per cui non so esattamente quanto lento sia...

si cosi facendo mi scrive 1 riga sola.
ho provato a lasciarlo in funzione per un ora e mezza e ne ha sempre fatti 1 al secondo.
ma poi impostero' una memorizzazione su sd ogni mezz'ora-

sinceramente è il primo che programmo e la parte di codice l'ho scopiazzata cercando di capirla e integrarla nel codice che avevo fatto per i sensori.
infattiho avuto difficolta nel tenere l'orologio aggiornato (mi si incasinava con la scrittura)
sono ancora alle prime armi con la programmazione :smiley: