Ciao a tutti ho delle piante e dato che fra poco farà freddo volevo fare una serra usando arduino, un sensore di temperatura uno di umidità del terreno e dei motori rs360sh che funzionano da irrigatore. Ho anche messo un display lcd per mostrarmi umidita e temperatura e fin qui tutto apposto, solo che il motore dovrebbe accendersi quando l'umidita è poca, invece si accende ma quando vuole e poi non si spegne piu quando l umidita torna giusta. Cosa devo fare?
Ciao ,
Dovresti almeno postare lo sketch e i links degli oggetti che intendi utilizzare
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int sensorPin=0;
int motorPin1=6;
int motorPin2=7;
void setup(){
lcd.begin(16,2);
pinMode(motorPin1,OUTPUT);
pinMode(motorPin2,OUTPUT);
lcd.print("tempC");
lcd.setCursor(0,1);
lcd.print("umid");
}
void loop(){
int reading=analogRead(sensorPin);
float voltage= reading * 5.0;
voltage /= 1024.0;
float temperatureC = (voltage-0.5)*100;
int sensorValue=analogRead(A1);
lcd.setCursor(7,0);
lcd.print(temperatureC);
lcd.setCursor(6,1);
lcd.print(sensorValue);
delay(10000);
if(sensorValue<1000){
digitalWrite(motorPin1,HIGH);
digitalWrite(motorPin2,HIGH);
delay(20000);
}
if(sensorValue>1000){
digitalWrite(motorPin1,LOW);
digitalWrite(motorPin2,LOW);
delay(20000);
}
}
I componenti sono tmp36, sensore di umidita terreno, display lcd 16×2, 2 motori pompa rs360sh
Il problema è che i motori non rispettano la sezione di codice con "if..."
[/code]
if (sensorValue < 1000) {
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
delay(20000);
if (sensorValue > 1000) {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
delay(20000);
}
Non e compilabile ,da un'occhiata veloce , manca una graffa dopo la prima IF,sicuro che sia giusto ?
Forse ha fatto male il copia incolla perché quando verifico se è giusto non da errori, comunque adesso non posso vedere perché non ho il pc, domani provo e vedo ma come codice dovrebbe funzionare giusto?
No sono sicuro che sul pc ci sia la graffa quindi li è apposto, ma il motore parte quando il valore e sopra 1000 e non sotto e poi non si spegne piu , il codice è semplice quindi non so perche non funziona
Esistono tre tipi di schede con sensore per umidità terreno: con uscita digitale, con uscita analogica e con entrambe.
Tu quale hai?
esatto volevo chiederti che scheda stai utilizzando per capire come va pilotata
@Bobo17: ti ricordo che 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).
Guglielmo
È quello con pin analogico, quello fatto con le 2 stanghette da inserire nella terra
>Bobo17: ... porto alla tua attenzione il mio post qua sopra, il #8 ...
... se continui a non rispettare il regolamento mi vedrò costretto di chidere il tuo thread !
Guglielmo
Bobo17:
No sono sicuro che sul pc ci sia la graffa quindi li è apposto, ma il motore parte quando il valore e sopra 1000 e non sotto e poi non si spegne piu , il codice è semplice quindi non so perche non funziona
Per cortesia edita il post precedente racchiuso dentro le tag code come ha detto il Moderatore.
Quindi posta nuovamente quello completo con tutte le graffe sempre racchiuso dentro le tag code.
il motore parte quando il valore e sopra 1000 e non sotto
Sotto i 1000 il motore lo stai pilotando con "HIGH"
if(sensorValue<1000){
digitalWrite(motorPin1,HIGH);
digitalWrite(motorPin2,HIGH);
delay(20000);
Sopra i 1000 il motore lo stai pilotando con "LOW"
if(sensorValue>1000){
digitalWrite(motorPin1,LOW);
digitalWrite(motorPin2,LOW);
delay(20000);}
Non hai detto che scheda stai utilizzando e al limite puoi stampare con serial monitor il valore di sensor value e verificare tu stesso se la condizione è VERA
Ammesso che 1000 sia il valore che leggi dall'ingresso analogico A1 (trigger) che deve far scattare il sistema di controllo, i valori sono troppo ravvicinati per ottenere un controllo efficiente.
Perciò devi inserire un valore di isteresi sufficiente, ad esempio 200, eliminando i delay.
if (sensorValue < 900) {
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
}
if (sensorValue > 1100) {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
}
Ho provato ma niente, forse ho sbagliato i collegamenti col motore, ho collegato delle batterie a un lato libero della breadboard, ho messo il negativo in comune con arduino, poi il negativo al motore e il positivo del motore a un diodo e a un pin digitale di arduino, non mi sembra di aver sbagliato
I motori con cosa li piloti?
Pin 6 di arduino al + del motore, diodo per non danneggiare il pin, negativo del motore a 4 batterie, con il negativo collegato alle 2 estremita della breadboard
Non puoi pilotare il motore direttamente poiché assorbe troppa corrente.
Speriamo che uscite digitali di Arduino non siano state danneggiate!
Devi usare un transistor oppure un MOSFET oppure un relè per pilotare la pompa.
Quindi è per quello che fa lo scemo o altro? Perché se lo faccio muovere con un delay senza if va...
Un motore di quel tipo assorbe come minimo 300mA a 5V, mentre le uscite digitali di Arduino erogano un massimo di 40mA.
E non puoi alimentarli con i 5V di Arduino poiché il regolatore interno al massimo eroga 500mA.
Ok allora, ho messo il transistor, il problema è sempre quello, anzi ho capito che il motore parte indipendentemente dall umidità e parte non appena si aggiorna la 1a volta lo schermo lcd, per poi non spegnersi più ... bho io non capisco, se voi sapete qualcosa ditemelo