Controllo Serra (split da Controllo ventola 5v)

ciao a tutti,
sto realizzando una serra automatizzata per l’esame ma ho un problema con il programma. in questo programma si dovvrebbero accendere delle ventole quindi passando nello stato on sotto una certa temperatura ma cio non avviene sul display rimanendo sempre sullo stato off
potreste risolvermi questo problema? vi posto lo sketch completo

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
int umidita=A0;
int luce=A2;  
const int POMPA=3;
const int VENTOLE=2;
const int LUCE=5;
int val_Adc = 0;
int tempPin = A3;
float tempC;
void setup(){ 
pinMode(umidita, INPUT);
pinMode(POMPA, OUTPUT);
pinMode(LUCE, OUTPUT);
pinMode(VENTOLE, OUTPUT);
lcd.begin(20,4); 
lcd.clear();
lcd.backlight ();
}

void loop(){  
tempC = analogRead(A3);
tempC = (5.0 * tempC * 100.0)/1024;
lcd.setCursor(0,0);  
lcd.print("Umidita': "); 
lcd.setCursor(10,0);
lcd.print (analogRead(A0)); 
lcd.setCursor(14,0);
lcd.print("%");
lcd.setCursor(0,1); 
lcd.print("Luce: "); 
lcd.setCursor(6,1);
lcd.print(analogRead(A2));
lcd.setCursor(10,1);
lcd.print ("lux");
lcd.setCursor(0,2);
lcd.print("Temp serra: ");  
lcd.setCursor(12,2);
lcd.print(tempC);
lcd.setCursor(17,2);
lcd.print("C");
lcd.setCursor(0,3); 
lcd.print("Ventola: ");



if (analogRead(A0)>100) {
digitalWrite (POMPA, LOW); 
if (analogRead(A0)<700)
digitalWrite(POMPA, HIGH); 
} 
if (analogRead(A2)<300) {
digitalWrite (LUCE, HIGH); 
if (analogRead(A2)<30)
digitalWrite(LUCE, LOW);
}  
if (analogRead(A3) >= 24) {
digitalWrite (VENTOLE,HIGH);
if (analogRead(A3) <= 22);
digitalWrite(VENTOLE,LOW);
}
if (VENTOLE == HIGH) {
lcd.setCursor(9,3);
lcd.print("ON");
}
else
(VENTOLE == LOW);{
lcd.setCursor(9,3);
lcd.print("OFF"); 
}
delay(1000); 

}

@Daniele9722: essendo il tuo primo post, ti chiederei cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO

… poi, in conformità al suddetto regolamento, punto 7, devi editare (in basso a destra del post, bottone More → Modify) il tuo post e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Infine … ti eri collegato ad un vecchio thread di ben QUATTRO ANNI FA … :o :o :o
… ho provveduto io a separare la tua domanda creando un nuovo thread.

Guglielmo

Un pin lo devi leggere con digitalread(), solo il nome della variabile ti da il valore 2 della variabile VENTOLE:

if ( digitalRead(VENTOLE) == HIGH) {

Quindi nel tuo if precedente ti chiedevi se 2==1 perchè HIGH è una costante che vale 1
P.S. per i pin usa byte const byte VENTOLE=2;

grazie mille per la risposta ma ora e sorto un altro problem perche le ventole mi rimangono sempre accese e non so perche i rilevamento della luce non mi funziona. potresti aiutarmi?

if (analogRead(A3) >= 24) {
    digitalWrite (VENTOLE, HIGH);
    if (analogRead(A3) <= 22);
    digitalWrite(VENTOLE, LOW);
  }

Dato che vuoi controllare le ventole in base alla temperatura, forse è meglio se fai

if (tempC >= 24) {
    digitalWrite (VENTOLE, HIGH);
    if (tempC <= 22);
    digitalWrite(VENTOLE, LOW);
  }

@Daniele9722: Non mi piace riscrivere le cose ... quindi ti chiedo un ultima volta di fare quanto scritto QUI !!!

Guglielmo

Non funziona lo stesso non so perche non passa ne allo stato on e le ventole e pompa rimangono sempre accesi. Ho problema anche con il rilevamento dei lux. Adopero tensione a 12 volt con un alimentatore,per la rilevazione della luce adopero una fotoresistenza

@Daniele9722: … prima che veramente io prenda e blocchi questo thread mi spieghi cosa c’è di poco chiaro nelle mie parole:

in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More → Modify) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra) …

… visto che non lo stai facendo ? ? ?

Guglielmo

Io sto facendo una cosa molto simile alla tua per l'esame,ho finito con arduino adesso ho ordinato raspberry per gestire il tutto anche da remoto.

ma per la rilevazione della luce c'è bisogno di fare un calcolo appure basta collegare l'ingresso con una resistenza e va in automatico? io non riesco a rilevarla

lo fatto ma non va lo stesso

che resistenza hai usato ?

Ho risolto grazie però la temperatura rileva tutto ma non mi attiva quando messo nel programma rimangono sempre accese

posta lo sketch aggiornato

eccolo

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
int umidita=A0;
const int POMPA=8;
int luce = A1; 
const int LUCE=5;
int tempPin = A3;
const int VENTOLE=2;
float tempC;


void setup(){
  pinMode (umidita, INPUT);
  pinMode(POMPA, OUTPUT);
  pinMode(LUCE, OUTPUT);
  pinMode(luce, INPUT);
  pinMode(VENTOLE, OUTPUT);
  pinMode(tempPin, INPUT);
  
  lcd.begin(20,4); 
  lcd.clear();
  lcd.backlight ();
}

void loop(){  
  lcd.setCursor(0,0);  
  lcd.print("Umidita': "); 
  lcd.setCursor(10,0);
  lcd.print (analogRead(A0)); 
  lcd.setCursor(14,0);
  lcd.print("%");
  
   if (analogRead(A0)>100) {
    digitalWrite (POMPA, LOW); 
   if (analogRead(A0)<700)
    digitalWrite(POMPA, HIGH); 
   } 
 
   lcd.setCursor(0,1); 
  lcd.print("Luce: "); 
  lcd.setCursor(6,1);
  lcd.print(analogRead(A1));
  lcd.setCursor(10,1);
  lcd.print ("lux");
  
   if (analogRead(A1)<300) {
    digitalWrite (LUCE, HIGH); 
   if (analogRead(A1)>400)
    digitalWrite(LUCE, LOW);
   }
   
    tempC = analogRead(A3);
    tempC = (5.0 * tempC * 100.0)/1024;
   lcd.setCursor(0,2);
   lcd.print("Temp serra: ");  
   lcd.setCursor(12,2);
   lcd.print(tempC);
   lcd.setCursor(17,2);
   lcd.print("C");
   lcd.setCursor(0,3); 
   lcd.print("Ventole: ");
   
   if (tempC>25) {
    digitalWrite (VENTOLE, HIGH);
   if (tempC<22);
    digitalWrite(VENTOLE, LOW);
   }
   
   if (digitalRead(VENTOLE) == HIGH) {
     lcd.setCursor(9,3);
   lcd.print("ON");
   }
   else
    (digitalRead(VENTOLE) == LOW);{
     lcd.setCursor(9,3);
   lcd.print("OFF"); 
      }
   
   delay(1000); 
}

fai dei controlli astrusi
prendiamo come esempio la temperatura

if (tempC > 25) {
    digitalWrite (VENTOLE, HIGH);
    if (tempC < 22);
    digitalWrite(VENTOLE, LOW);
  }

nel 1° if. Se è > 25 Gradi accendi le ventole
poi nel 2° if se è < 22 Gradi, spegni le ventole
peccato che nel 2° if non c’entri mai, visto che è sottoposto alla prima condizione

if (tempC > 25.0 ) {
    digitalWrite (VENTOLE, HIGH);
   }
if (tempC < 22.0 ) {
    digitalWrite(VENTOLE, LOW);
  }

lo stesso per altri confronti

quindi come devo fare per avere quelle condizioni?

Ma @Brunello ti ha scritto la soluzione :o
Probabilmente non hai capito bene l’uso delle graffe. Ti consiglio un testo sul C, prova a cercare “Programmare Arduino Tiziana Marsella” è un pdf gratis scritto da una prof.

Quando scrivi:

  if (tempC>25) {
    digitalWrite (VENTOLE, HIGH);
  if (tempC<22);
    digitalWrite(VENTOLE, LOW);
   }

secondo me non hai capito che in questo modo anche il secondo if è DENTRO al primo if. Al C non frega nulla su che riga scrivi. Guarda le graffe. Per vederlo meglio usa CTRL+T dentro l’IDE.
Come ti ha spiegato @Brunello

A si grazie ora ho coretto ma il problema rimane ed anche le ventole mi segna che sta sempre allo stato off.
Le ventole girano continuamente