User
Data registr.: 20-04-2009 Residenza: Potenza
Messaggi: 934
| Citazione:
Originalmente inviato da aero330 Non voglio essere di certo pignolo ma ho cambiato qualcosina nel codice, per ottimizzarlo il più possibile, per quella che è la mia "povera" esperienza.
Non ho modificato il comportamento del progetto ma solo riscritto in una forma più corretta possibile  Visto che si parla anche di programmazione consiglio di farla bene fin da subito, per cui ho inserito i commenti ove necessario.
Non voglio passare per quello che se la tira perchè ne sa di più (anzi esattamente il contrario) ma mi piacerebbe trasmettere quello che imparato fin'ora. Codice: //Con l'aiuto di aero330 ed ElNonino, utenti di www.baronerosso.it
#include <Wire.h>
#include <DHT.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
// Generalmente quando ci sono delle costanti in gioco che non cambiano mai (come delle soglie, temperature di riferimento....) meglio definire delle
// "variabili particolari" chiamate "MACRO": queste non occupano memoria riducendo la "complessità" del codice (non entro nei dettagli).
// Tali MACRO sono quelle che iniziano con "#define".
// Esempio: scrivendo " #define PIPPO 3 " vuol dire che in qualsiasi parte del codice ogni volta viene richiamata la parola PIPPO, ad essa viene associato il numero costante 3
// E' buona regola definire le costanti in questo modo nel mondo della programmazione.
//----- Sensore -----
#define DHTPIN 8 // 8 è il pin di Arduino a cui collego il sensore di temperatura
#define DHTTYPE DHT11 // dht11 è il tipo di sensore che uso
#define MAX_TEMP 30 // soglia di temperatura (default 30)
#define MAX_HUM 60 // soglia di umidità (default 60)
#define RANGE 2 // ampiezza dell'isteresi. Brevemente: quando si controllano dei valori rispetto a delle soglie (come il caso della Temperatura>30°)
// in genere è meglio farlo non su un singolo valore ma su 2 distinti, altrimenti il motore (leggi ventola) potrebbe accendersi/spegnersi in continuazione
// perchè la temperatura oscilla repentinamente intorno ai 30°. Inserendo un controllo su due soglie distinte, ad esempio 30°+2 e 30°-2 si riesce a
// contenere questo fenomeno. Sia chiaro, non è necessario, ma potrebbe far comodo in futuro: se non ti interessa questa cosa metti semplicemente 0 al posto di 2
//----- Motore -----
#define MOTOR_PIN 7 // pin7 collegato al motore
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // connessione display (pin)
char buffer1[20];
char buffer2[20];
RTC_DS1307 RTC;
const int setpin = 6;
boolean statepin = false; //definendo una variabile booleana, meglio utilizzare treu/false anziché i numeri
int t;
int h;
int speed;
void setup() {
lcd.begin(16, 2); // imposto il tipo di display (colonne, righe)
lcd.setCursor(0,0);
pinMode (6, INPUT);
digitalWrite (6, HIGH);
pinMode (MOTOR_PIN, OUTPUT); // pin 7 collegato al motore
digitalWrite (MOTOR_PIN, LOW); // spengo il motore per sicurezza
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop() {
t = dht.readTemperature();
h = dht.readHumidity(); // posiziono il cursore alla colonna 12 e riga 0
lcd.print("Temperatura");
lcd.setCursor(0,1);
lcd.print("Umidita'");
lcd.setCursor(15,0);
lcd.print("C");
lcd.setCursor(15,1);
lcd.print("%");
lcd.setCursor(12, 0);
lcd.print(t);
lcd.setCursor(12, 1);
lcd.print(h);
delay(5000);
lcd.clear(); //pulisce tutto lo schermo e cursore in alto a sinistra (0,0)
statepin = digitalRead (setpin);
if (statepin == false)
{
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(0,1);
lcd.print( buffer2 );
delay(5000);
lcd.clear(); //Pulisco lo schermo e ricomincio da capo
// Adesso avviene il controllo della temperatura/umidità con le famose soglie distinte
if ( (t > MAX_TEMP+RANGE) && (h > MAX_HUM+RANGE) ){
speed = 255 ;
}
if ( (t < MAX_TEMP-RANGE) && (h < MAX_HUM-RANGE) ){
speed = 0 ;
}
analogWrite(MOTOR_PIN, speed);
} | Cavolo, è fin troppo quello che hai fatto e ti ringrazio del tempo dedicatomi da te come gli altri
Intanto sto cercando di studiare e mi sono trovato una decina di libri che esplicano solo progetti ma, credo che il migliore sia questo "arduino language reference" dove veramente ti spiega tutti i codici chiave che in un "normale" linguaggio C o C++, java ecc. non ci sono
Da quanto ho capito, il miglior modo per imparare è copiare e studiare i progetti creati da altri...
Intanto ti ringrazio di nuovo, mi studio il codice e poi nei prossimi giorni vi darò di nuovo fastidio per la costruzione di un braccio robot
__________________ FIUMI DI PENSIERI VAGANO NELLA MIA MENTE IGNORANDO LA PERCEZIONE DELLA REALTA' IMPOSTA |