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);
}
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.
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
-
Quando lo alimenti
-
Quando esegue il servo.attach()