servo motore

salve avrei un problema in quanto vorrei attivare il servomotore quando si attivano le ventole e farlo ruotare di 90 gradi mentre quando si spengono vorrei tornasse nella posizione iniziale.posto il mio codice:

 #include <dht11.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
dht11 DHT11;

#define DHT11PIN 9
//#define tempPin 0
int sensorvalue;
float umiditaterra;
    //int tempC  ;   
int relepompaacqua=7;
int releventole=5;
int relephon=6;
Servo motor;
int pos = 0; 
void setup() {
   pinMode(relepompaacqua ,OUTPUT);
  digitalWrite(relepompaacqua, HIGH);
  digitalWrite(releventole, HIGH);
   pinMode(releventole ,OUTPUT);
  digitalWrite(relephon, HIGH);
   pinMode(relephon ,OUTPUT);
   motor.attach(4);
  //pinMode(tempPin,INPUT);
  lcd.begin(20,4);         // initialize the lcd for 20 chars 4 lines, turn on backlight
  lcd.backlight();
  Serial.begin(9600);
}

void loop()  
 {


 int ciao= DHT11.read(DHT11PIN);
  
  lcd.setCursor(0,0);
  lcd.print("-tempdht11=      ");
  lcd.print((float)DHT11.temperature,0);
  lcd.print("C");

  lcd.setCursor(0,1);
  lcd.print("-umidita'=       ");
  lcd.print((float)DHT11.humidity,0);
  lcd.print("%");
                                   
  
   
 sensorvalue=analogRead(2);
 umiditaterra =map(sensorvalue,365,1023,100,0);
 lcd.setCursor(0,2);
 lcd.print("-um terreno=   ");
lcd.print(umiditaterra);

 
  // lcd.setCursor(0,3);                                     
  //tempC = analogRead(tempPin);           //lettura valore del sensore
  //tempC =tempC*500/1024;   //conversione del dato analogico in temperatura(tempc/1024.0)*5000
  //lcd.print(" -templm35=");
  //lcd.print(tempC); 
  //lcd.print("C");
  //delay(500);
if(umiditaterra < 60)
  {
  digitalWrite(relepompaacqua,LOW);
  }
  else
  {
  digitalWrite(relepompaacqua,HIGH);
   }
if(DHT11.humidity > 50)
  {
     digitalWrite(releventole,LOW);
  }
  else
   {
     digitalWrite(releventole,HIGH);
   }
if(DHT11.temperature <15)
   {
    digitalWrite(relephon,LOW);
   }
   else
   {
    digitalWrite(relephon,HIGH);
   }

if(releventole==LOW)
  {
     for(pos = 0; pos <= 90; pos += 1)        
        {
         motor.write(pos); // indirizza il perno alla posizione desiderata, memorizzata in 'pos'
         delay(15); // attende 15ms per consentire al servomotore di raggiungere la posizione
        }    
  }
    else{
          }


 

 
 delay(1000);
}

Colzadanicola:

    else{

}

vuoto?

se non si mette l'else non funziona? era solo una prova per vedere quando sono attive le ventole si apre il portellone.

Non è che non funziona, semplicemente non fa nulla.

if = se questa condizione è vera allora fai questo;
else = se la precedente condizione è falsa invece fai quest'altro;

Quindi se dici che il relay delle ventole è attivo e le ventole girano (if) allora fa il giro di 90°, mentre se il relay delle ventole è inattivo, il servo torna in posizione zero (else);

si ma io l'ho fatto senza else solo per provarlo,ho fatto in modo che il relè 2 fosse attivo,quindi il motore doveva fare qualcosa,invece non si è mosso.
o sbaglio?

Lo sketch esempio "Sweep" funziona correttamente? Stai alimentando il servo esternamente o stai utilizzando la 5V di Arduino?

Edit: in void setup sarebbe meglio prima dichiarare i relay come OUTPUT e POI metterli rispettivamente in HIGH o in LOW a seconda della necessità in avvio;

mi sembra quello che ho fatto.no?comunque ho provato sia a alimentarli esternamente che internamente e funzionano;ho provato senza un if solo per una prova.

Mi correggo,senza else

Quando fai questo
if ( releventole == LOW )
è come se facessi if ( 5 == LOW )
5 e non lettura del pin 5

if (digitalRead (releventole) == LOW )

e abbassa quel delay(15);

Ok bè infatti che stupido.quando sono a casa provo .grazie

quando faccio partire il programma il servo compie una rotazione di 30 gradi e poi torna nella pos iniziale,poi funziona correttamente come l'ho impostato nel programma.
codice:

#include <dht11.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
dht11 DHT11;

#define DHT11PIN 9
//#define tempPin 0
int sensorvalue;
float umiditaterra;
    //int tempC  ;   
int relepompaacqua=7;
int releventole=5;
int relephon=6;
Servo motor;
int pos ; 
void setup() {
   pinMode(relepompaacqua ,OUTPUT);
  digitalWrite(relepompaacqua, HIGH);
  digitalWrite(releventole, HIGH);
   pinMode(releventole ,OUTPUT);
  digitalWrite(relephon, HIGH);
   pinMode(relephon ,OUTPUT);
   motor.attach(4);
  //pinMode(tempPin,INPUT);
  lcd.begin(20,4);         // initialize the lcd for 20 chars 4 lines, turn on backlight
  lcd.backlight();
  Serial.begin(9600);
}

void loop()  
 {


 int ciao= DHT11.read(DHT11PIN);
  
  lcd.setCursor(0,0);
  lcd.print("-tempdht11=      ");
  lcd.print((float)DHT11.temperature,0);
  lcd.print("C");

  lcd.setCursor(0,1);
  lcd.print("-umidita'=       ");
  lcd.print((float)DHT11.humidity,0);
  lcd.print("%");
                                   
  
   
 sensorvalue=analogRead(2);
 umiditaterra =map(sensorvalue,365,1023,100,0);
 lcd.setCursor(0,2);
 lcd.print("-um terreno=   ");
lcd.print(umiditaterra);

 
  // lcd.setCursor(0,3);                                     
  //tempC = analogRead(tempPin);           //lettura valore del sensore
  //tempC =tempC*500/1024;   //conversione del dato analogico in temperatura(tempc/1024.0)*5000
  //lcd.print(" -templm35=");
  //lcd.print(tempC); 
  //lcd.print("C");
  //delay(500);
if(umiditaterra < 60)
  {
  digitalWrite(relepompaacqua,LOW);
  }
  else
  {
  digitalWrite(relepompaacqua,HIGH);
   }
if(DHT11.humidity > 50)
  {
     digitalWrite(releventole,LOW);
  }
  else
   {
     digitalWrite(releventole,HIGH);
   }
if(DHT11.temperature <15)
   {
    digitalWrite(relephon,LOW);
   }
   else
   {
    digitalWrite(relephon,HIGH);
   }

if(digitalRead(releventole)==LOW)
  {
     for(pos = 0; pos <= 90; pos += 1)        
        {
         motor.write(pos=90); // indirizza il perno alla posizione desiderata, memorizzata in 'pos'
         delay(10); // attende 15ms per consentire al servomotore di raggiungere la posizione
        }    
  }
    else{     for(pos = 0; pos <= 0; pos += 1)        
        {
         motor.write(pos=1); // indirizza il perno alla posizione desiderata, memorizzata in 'pos'
         delay(10); // attende 15ms per consentire al servomotore di raggiungere la posizione
        }    
          }


 

 
 delay(2000);
}

come faccio a eliminare la rotazione che fa il servo a inizio programma?

se tu che ce lo mandi

else{     for(pos = 0; pos <= 0; pos += 1)        
        {
         motor.write(pos=1); // indirizza il perno alla posizione desiderata, memorizzata in 'pos'
         delay(10); // attende 15ms per consentire al servomotore di raggiungere la posizione
        }    
          }

Quindi per farlo tornare alla posizione iniziale tolgo nell'else =1 e lascio pos?

ora che lo guardo meglio, noto le incongruenze

perche' scrivi motor.write(pos=90) in un ciclo for ?
o scrivi motor.write(pos) e mantieni il ciclo di for, o togli il ciclo e scrivi direttamente motor.write(90)

idem nell'else

Quindi nella condizione vera metto motor.write(90) e nell'else motor.write()?

if (digitalRead(releventole) == LOW)
  {
    motor.write(90);
  }
  else   {
    motor.write(1);
  }

Ma esegue comunque una piccola rotazione iniziale,io devo aprire uno sportello,quindi quando sono attive le ventole il motorino si deve aprire di 90 e quando sono spente si deve chiudere.

la piccola rotazione iniziale la esegue perche
1)quando arriva all'IF di controllo, visto che il relè è HIGH esegue la ELSE

  1. Quando lo alimenti

  2. Quando esegue il servo.attach()

Quindi cosa posso fare?