verifica Sketch Per serra automatica con arduino

Ciao a tutti

non essendo un esperto di scrittura di programmi su arduino spero che possiate darmi una mano su questo sketch

la serra ha un sensore di temperatura , umidita terreno , una fotoresistenza

mentre per gli output ha : una elettrovalvola per irrigazione(rinominato ACQUA),ventole per "cambio d'aria"(VENTOLE)

e uso della fotoresistenza(LUCE) per attivare l'elettrovalvola se la temperatura si alza

l' unico problema è che non sapendo come va fatto il codice per ' lcd ho provato a copiarlo da altri

progetti trovati sul web..

sull ' lcd dovrei far visualizzare i dati della temperatura umidità e luminosità

questo è lo sketch:

include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  

int umidita=A0;
int luce=A2;
int temperatura=A3;
const int ACQUA=6;
const int VENTOLE=7;
const int LUCE=8;

const int LCD= (12, 11, 5, 4, 3, 2);

int val_Adc = 0;
float temp = 0;

void setup(){  
 Serial.begin(9600);
 
 pinMode(umidita, INPUT);
 pinMode(ACQUA, OUTPUT);
 pinMode(VENTOLE, OUTPUT);
 pinMode(LUCE,OUTPUT);
 lcd.begin(16, 2); 
 lcd.setCursor(0, 0); 
 lcd.print("Temperatura:"); 
  
}

 void loop(){        
  Serial.print("valore:");
  Serial.println( umidita );
  Serial.println("Valore Soglia: ");
  Serial.println( umidita ) ;
     lcd.setCursor(0, 1);
  lcd.println("Temp");
  lcd.println("");
  lcd.println (analogRead(A3));
  lcd.println("");
  
  lcd.println("umidita");
  lcd.println("");
  lcd.println(analogRead(A0));
  lcd.println("");
  
  lcd.println("Luce");
  lcd.println("");
  lcd.println(analogRead(A2));
  lcd.println("");
  
delay(0);
      if (analogRead(A0)>100) {
   digitalWrite (ACQUA, LOW);
      if (analogRead(A0)<700)
   digitalWrite(ACQUA, HIGH); 
      if (analogRead(A3)<1100){
   digitalWrite (VENTOLE, HIGH);
      if (analogRead(A3)<600)
   digitalWrite(VENTOLE, LOW);
      if (analogRead(A2)<300) {
   digitalWrite (LUCE, HIGH);
      if (analogRead(A2)<30)
   digitalWrite(LUCE, LOW);   
}  
}
}
}

grazie per eventuali correzioni

Ti ri-invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

L' Lcd ha due righe di 16 caratteri quindi non ci puoi scrivere sopra un romanzo. Non serve la println e a maggior ragione sono inutili le varie lcd.println(""). La prima riga è la 0, la seconda la 1.

Questo o lo fai così:

 lcd.setCursor(0, 1);   // posizione 0=colonna 1=riga
 lcd.print("Temp");
 lcd.print(" ");   // uno spazio 
 lcd.print(analogRead(pinTEMP));    // pin come da dichiarazione che ti ho indicato sotto

oppure usi per bene la setCursor

 lcd.setCursor(0, 1);   // posizione 0=colonna 1=riga
 lcd.print("Temp");     // 4 caratteri 
 lcd.setCursor(0, 6);   // posizione 0+4+1+1=colonna 1=riga
 lcd.print(analogRead(pinTEMP));

Nell'IDE usa CTRL+T che mette meglio il codice.

Consiglio, TUTTI i pin dichiarali con const byte e metti un pre-nome:

const byte pinACQUA=6;
const byte pinLUCE=A2;
const byte pinTEMP=A3;

Questo non ha senso e non serve:

const int LCD= (12, 11, 5, 4, 3, 2);

OK Grazie mille per l'aiuto faccio subito la presentazione

posto lo sketch modificato qui sotto grazie ciao

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int UMIDITA = A0;
int FOTOR = A2;
int TEMP = A3;
const byte ACQUA = 6;
const byte VENTOLE = 7;
const byte LUCE = 8;


int val_Adc = 0;
float temp = 0;

void setup() {
Serial.begin(9600);

pinMode(UMIDITA, INPUT);
pinMode(FOTOR, INPUT);
pinMode(TEMP, INPUT);
pinMode(ACQUA, OUTPUT);
pinMode(VENTOLE, OUTPUT);
pinMode(LUCE, OUTPUT);

lcd.begin(16, 2);


lcd.print("Temp:");
lcd.print(" ");
lcd.print(analogRead(A3));

lcd.print("Umidita:");
lcd.print(" ");
lcd.print(analogRead(A0));

lcd.print("luce");
lcd.print(" ");
lcd.print(analogRead(A2));
}

void loop() {


delay(0);

if (analogRead(A0) > 100) {
  digitalWrite (ACQUA, LOW);
  if (analogRead(A0) < 700)
    digitalWrite(ACQUA, HIGH);
  if (analogRead(A3) < 1100) {
    digitalWrite (VENTOLE, HIGH);
    if (analogRead(A3) < 600)
      digitalWrite(VENTOLE, LOW);
    if (analogRead(A2) < 300) {
      digitalWrite (LUCE, HIGH);
      if (analogRead(A2) < 30)
        digitalWrite(LUCE, LOW);

    }
  }
}
}

[code][/code]

@alessandroMariani : Ti è stato già detto che il codice, in conformità al REGOLAMENTO, punto 7, DEVE essere racchiuso tra i tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Edita sia il tuo primo post che quest'ultimo e correggi. GRAZIE.

Guglielmo

Boh, ti dico bianco e scrivi nero. :o

  1. Hai spostato tutta la parte di scrittura su lcd in setup() che viene fatto SOLO 1 volta. Perchè ? dove ti ho scritto di spostarlo dalla loop() ?
  2. Ti ho scritto di usare la setCursor e le hai tolte tutte.
  3. CTRL+T te l'ho indicato per vedere come l'IDE ti indenta quegli ultimi if, che di sicuro sono messi male perchè uno dentro l'altro

Qualcosa del tipo:

#include <LiquidCrystal.h>
#include <Wire.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const byte pinUMIDITA = A0;
const byte pinFOTOR = A2;
const byte pinTEMP = A3;
const byte pinACQUA = 6;
const byte pinVENTOLE = 7;
const byte pinLUCE = 8;

int val_Adc = 0;
float temp = 0;
int valTemp,valFoto,valUmid;

void setup() {
  Serial.begin(9600);
  pinMode(pinUMIDITA, INPUT);
  pinMode(pinFOTOR,   INPUT);
  pinMode(pinTEMP,    INPUT);
  pinMode(pinACQUA,   OUTPUT);
  pinMode(pinVENTOLE, OUTPUT);
  pinMode(pinLUCE,    OUTPUT);
  lcd.begin(16, 2);
}

void loop() {
  valTemp=analogRead(pinTEMP);
  valFoto=analogRead(pinFOTOR);
  valUmid=analogRead(pinUMIDITA);
  lcd.setCursor(0,0);   // riga 0 
  lcd.print("Temp: "); 
  lcd.print(valTemp);
  lcd.print(" Luce: ");
  lcd.print(valFoto);
  lcd.setCursor(0,1);   // riga 1
  lcd.print("Umidita:");
  lcd.print(" ");
  lcd.print(valUmid);
  delay(0);   // a che serve ?? boh
  if(valUmid > 100) 
  { digitalWrite(pinACQUA, LOW);
  } else if(valUmid<700)
  { digitalWrite(pinACQUA, HIGH);
  }
  if (valTemp<1100) 
  { digitalWrite(pinVENTOLE, HIGH);
  } else if(valTemp<600)
  { digitalWrite(pinVENTOLE, LOW);
  }
  if (valFoto<300) 
  { digitalWrite(pinLUCE, HIGH);
  } else if(valFoto<30)
  { digitalWrite(pinLUCE, LOW);
  }
}

grazie mille per il tuo aiuto come ho detto sono alle prime armi con arduino e questo è uno dei progetti che provo a fare scrivendo da me il programma :confused:

ti ringrazio sei stato davvero molto utile! :slight_smile: :slight_smile:

Io ti consiglio di leggere un buon libro di programmazione in C.
Prova a cercare "Programmare Arduino Tiziana Marsella", è un pdf free scritto da una prof. , può essere d'aiuto.

P.S. non sono sicuro tu stia leggendo bene i tuoi sensori di temperatura ed umidità.
Che sensori sono ? La fotoresistenza leggi il valore analogico ma di solito i sensori umidità e temperatura non sono così semplici da leggere.

Certo prendo in considerazione L' IDEA nell acquisto di un libro per la programmazione in modo da imparare a scrivere programmi propri.

come sensore di luce " fotoresistenza "che è : LDR 5528

Come sensore per umidità terreno : http://www.ebay.it/itm/111318048566

e come sensore di temperatura : DHT11

Il sensore DHT11 non lo leggi come analogico ma usa la libraria DHT di Adafruit

ok Grazie quindi ora dovrei cambiare tutto ciò che equivale al sensore di temperatura che dovrebbe essere cosi
da #define DHTPIN 1 (di cui 1 sta per il pin da me scelto )e
a const byte pinTEMP = 1; mettere lo stesso pin di#define DHTPIN 1 ;

#include <DHT.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#define DHTPIN 1
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const byte pinUMIDITA = A0;
const byte pinFOTOR = A2;
const byte pinACQUA = 6;
const byte pinVENTOLE = 7;
const byte pinLUCE = 8;
const byte pinTEMP = 1;

int val_Adc = 0;
float temp = 0;
int valTemp, valFoto, valUmid;

void setup() {
  Serial.begin(9600);
  pinMode(pinUMIDITA, INPUT);
  pinMode(pinFOTOR,   INPUT);
  pinMode(pinTEMP,    INPUT);
  pinMode(pinACQUA,   OUTPUT);
  pinMode(pinVENTOLE, OUTPUT);
  pinMode(pinLUCE,    OUTPUT);

  lcd.begin(16, 2);
  
}


void loop() {
  int t = dht.readTemperature();

  valTemp = analogRead(pinTEMP);
  valFoto = analogRead(pinFOTOR);
  valUmid = analogRead(pinUMIDITA);

  lcd.setCursor(0,0);  
  lcd.print("Temp: "); 
  lcd.print(valTemp);
  lcd.print(" Luce: ");
  lcd.print(valFoto);
  lcd.setCursor(0,1);   
  lcd.print("Umidita:");
  lcd.print(" ");
  lcd.print(valUmid);
  
  delay(0);

  if (valUmid > 100)
  { digitalWrite(pinACQUA, LOW);
  } else if (valUmid < 700)
  { digitalWrite(pinACQUA, HIGH);
  }
  if (valTemp < 1100)
  { digitalWrite(pinVENTOLE, HIGH);
  } else if (valTemp < 600)
  { digitalWrite(pinVENTOLE, LOW);
  }
  if (valFoto < 300)
  { digitalWrite(pinLUCE, HIGH);
  } else if (valFoto < 30)
  { digitalWrite(pinLUCE, LOW);
  }
}