Serra automatizzata

Ciao ragazzi, vi posto il mio programma perche avrei un problema. Il problema sorto è che con l’aumentare della luce (con la rilevanza di arduino dei lux) mi aumenta anche la temperatura (usato un lm35). Non so perche avviene questo, se avete qualche consiglio su come risolverlo ve ne sarei grato.
Grazie a tutti :slight_smile:

#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=3;
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.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.0) {
    digitalWrite (POMPA,   LOW); 
   }
   if (analogRead(A0)<700.0) {
    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, LOW);
   }
   if (analogRead(A1)>400){
    digitalWrite(LUCE, HIGH);
   }
   
    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(18,2);
   lcd.print("C");
   lcd.setCursor(17,2);
   lcd.print((char)223); 
   lcd.setCursor(0,3); 
   lcd.print("Ventole: ");
   
  if (tempC >= 28.0 ) {
    digitalWrite (VENTOLE, LOW);
  }
  if (tempC <= 27.0 ) {
    digitalWrite(VENTOLE, HIGH);
  }
  if (digitalRead(VENTOLE) == LOW) {
    lcd.setCursor(9, 3);
    lcd.print("ON");
  }
  else {
    lcd.setCursor(9, 3);
    lcd.print("OFF");
  }

   delay(1000);
  lcd.clear(); 
}

Scusami: posti su hardware il codice... a tua opinione è un problema hardware del sensore che magari prendendo la luce si scalda oppure dobbiamo ricercare il problema nel software che ci hai postato? ...perchè così a lettura veloce sul software non vendo nulla di che... Sull'hardware mi verrebbe invece da chiederti oltre che dove hai posizionato l'lm35 anche le connessioni che hai usato nei vari sensori... sparo una cazzata: magari riesci per qualche motivo ad abbassare la tensione di riferimento ed il convertitore analogico/digitale va in sbattimento... anche se mi verrebbe più di pensare che effettivamente si scalda sto lm35... nero, magari posto vicino ad una lampada alogena... non so... Altra cosa... questa è un'informazione mia che a suo tempo avevo fatto un terraio... io la luce non sono mica riuscito a gestirla con il crepuscolare... quando accendevo la luce il crepuscolare la leggeva come giorno... toccato passare all'orologio... te come risolvi la cosa?

Il fatto che la lampadina per il momento Non ce quindi il sensore di temperatura non si riscalda proprio per niente… l’alimentazione la do con il computer a 5 volt per i sensori mentre per la ventola, pompa e lampadina a 12, però senza attaccando a 12 mi fa questo sbalzo che non so come riesce… sono un po ficcato perché questo progetto lo devo portare all’esame di stato… stava funzionando tutto ma ora è sorto questo problema
Secondo voi può essere un problema proprio del sensore? Altrimenti cosa potrei metterci in extremis per farlo funzionare correttemente? Avrei a disposizio anche un tmp36

ummm... ripeto... secondo me hai fatto del casino sulle uscite.... Dovresti postare uno schema dei collegamenti che hai fatto, come alimenti e delle resistenze che hai messo.

Esempio la luce... ci metti un fotoaccoppiatore per controllarla? un transistor? un mosfet? hai messo delle resistenze di carico sulle uscite? cacci un led con una resistenza (da quanti ohm?) e morta li?

Non credo sia il sensore perchè se a freddo legge giusto legge e basta...Ok sarebbe da leggere il sensore una decina di volte e fare una media per far un lavoro a regola d'arte ma la mia impressione è che stai per qualche motivo scaricando l'ira di Dio da un pin di output e questo ti sballa tutto. Il display per caso ti lampeggia la luce o qualcosa quando apri queste uscite?

Altra cosina: 5V di alimentazione, l'usb per intendersi, sono abbastanza limite nel senso che arduino (gran parte dei modelli) usa i 5V come tensione di riferimento.... quindi se per caso il tuo pc da 4.8V Arduino prende come tensione di rifermento 4.8 e fa delle misurazioni, quando poi passi ai 12Volt arduino taglia la tensione a 5.0volt con uno stabilizzatore e fa riferimento proprio a 5.0 creandoti delle differenze di misurazione... ma non dovrebbero essere molto importanti... Dicci anche di quanto sale sto termometro.

Ciao, le definizioni:

int umidita=A0;
const int POMPA=8;
int luce = A1; 
const int LUCE=5;
int tempPin = A3;
const int VENTOLE=3;

sarebbe meglio metterle così (in minuscolo così non ti dimentichi se era maiuscolo o minuscolo):

#define umidita A0
#define pompa 8
#define luceIn   A1 
#define  luceOut 5
#define  temPin A3
#define  ventole 3

e sotto puoi sostituire i nomi dei pin con le etichette

  lcd.setCursor(0,0); 
  lcd.print("Umidita': "); 
  lcd.setCursor(10,0);
  lcd.print (analogRead(umidita)); // <--------------    ESEMPIO
  lcd.setCursor(14,0);
  lcd.print("%");

così non utilizzi memoria per delle costanti e leggi meglio il codice. In oltre, se non erro,
int luce = A1; è sbagliato poichè cerchi di assegnare un valore esadecimale in maniera scorretta e non è il valore giusto per quel pin

Stefano

cam9500: In oltre, se non erro, int luce = A1; è sbagliato poichè cerchi di assegnare un valore esadecimale in maniera scorretta e non è il valore giusto per quel pin

NO, non è sbagliato perché NON è l'assegnazione di un valore esadecimale (0xA1 = 161) ma è il pin analogico A1 e quindi è giusto.

La giusta domanda è però (come da te segnalato) ... ... che definisce a fare variabili/costanti/define per i vari pin, se poi all'interno del programma continua a chiamarli direttamente ? :o

Guglielmo

Ok, quindi si può assegnare ad un intero il valore A1?
Non avendo mai utilizzato quel metodo non lo sapevo…

Stefano

Si dato che A1 rappresenta in verità un valore definito in pins_arduino.h ...

......
static const uint8_t A0 = 14;
static const uint8_t A1 = 15;
static const uint8_t A2 = 16;
static const uint8_t A3 = 17;
static const uint8_t A4 = 18;
static const uint8_t A5 = 19;
static const uint8_t A6 = 20;
static const uint8_t A7 = 21;
.....

... quindi è come avergli assegnato il valore 15 ;)

Guglielmo

Grazie Guglielmo, oltretutto l'avevi già segnalato in un altra discussione un mesetto fa ma mi ero completamente scordato.

Stefano

Allora io ho usato una fotoreistenza LDR DA 2-20Kohm e una reistenza in serie ad essa da 10kohm.

...uno schemino totale? sbagli quasi sicuramente i collegamenti.. devi fare una specie di partitore e leggere nel mezzo.

Ho collegato il + al piedino della fotoresistenza poi l'altro a uno della resistenza e quello della reistenza poi al -, in il segnale lo prendo tra il piedino della fotoresistenza e quello della resistenza

https://s-media-cache-ak0.pinimg.com/originals/67/19/34/671934c8c1d0fc083e0eec34c5e2fc13.png Guarda lo schema così ho collegato