Go Down

Topic: comandare un relè con pulsante e lm35 (Read 2083 times) previous topic - next topic

Claudio_FF

#15
Dec 10, 2018, 09:13 pm Last Edit: Dec 10, 2018, 09:18 pm by Claudio_FF
Questa è una logica *molto* più semplice. Prevede che inizialmente vi sia una variabile 'stato' inizializzata a zero, e una variabile 'manuale' inizializzata a false. Ad ogni pressione la variabile 'manuale' cambia di livello. Il relé è acceso se temperatura elevata oppure se manuale == true.

* * * * Una domanda ben posta è già mezza risposta * * * *

lupin89

#16
Dec 10, 2018, 11:04 pm Last Edit: Dec 10, 2018, 11:12 pm by lupin89
lo sketch l'ho fatto prima del post, grazie >Claudio_FF

Code: [Select]


#define BUTTON  7
#define RELEY   12
#define temPin  A0
int stato = 0;

float celsius = 0, farhenheit = 0; // temperature variables
float millivolts; //dichiarazione di variabile tensione (float è per i numeri con la virgola)
int sensor;

const int B_LED = 2;
const int V_LED = 3;

void setup() {
  pinMode(B_LED, OUTPUT);   //stato automatico
  pinMode(V_LED, OUTPUT);   //stato manuale
  pinMode(BUTTON, INPUT);   // imposta il pin digitale come input pulsante
  pinMode(RELEY, OUTPUT);   // imposta il pin digitale come output
  Serial.begin (9600);
}

void loop() {
  sensor = analogRead(temPin); //lettura valore del sensore LM35 messo sull'ingresso analogico A0
  millivolts = ( sensor / 1023.0) * 5000; //formula per ottenere la tensione di uscita dell'LM35 in millivolts
  celsius = millivolts / 10; // valore espresso in gradi Celsius (l'out del sensore è 10mv per grado)
  farhenheit = celsius * 1.8 + 32; // valore espresso in gradi Farhenheit
  Serial.println(sensor); //stampa su serial monitor del valore restituito dal conv. A/D a 10 bit di Arduino(da 0 a 1024)
  Serial.print(millivolts); //stampa su serial monitor del valore di tensione in millivolts
  Serial.println(" millivolts");
  Serial.print(celsius); Serial.println(" C"); // stampa su serial monitor del valore di temperatura in gradi Celsius
  Serial.print(farhenheit); Serial.println(" F"); //stampa su serial monitor del valore di temperatura in gradi Farhenheit

  // vnetola temperatura

  if (digitalRead(BUTTON) == HIGH) {
    stato = !stato;
    delay(200);
   }
  if (analogRead(farhenheit) > 90 and stato == LOW) {    // 41 corrisponde a 20°C
    digitalWrite(V_LED, LOW);
    digitalWrite(B_LED, HIGH);
    digitalWrite(RELEY, HIGH);
   
  }delay(500);
  if (analogRead(farhenheit) < 40){
    digitalWrite(B_LED, LOW);
     }
     if (stato == HIGH and (temPin) < 46) {
    digitalWrite(RELEY, stato);
    digitalWrite(V_LED, stato);
    digitalWrite(B_LED, 0);
   } else {
    digitalWrite(RELEY, stato);
    digitalWrite(V_LED, stato);
    digitalWrite(B_LED, 0);
   }
}

ok io sono arrivato sin qui, ad problemi sul valore della temperatura, se imposto 50° e la temperatura percepita dal sensore è nella fascia impostata il rele accende e spegne. grazie per l'aiuto



lupin89

non capisco: se inserisco /*...*/ tra //temp e la penultima graffa il pulsante funziona, le tolgo per far leggere al loop il resto il pulsante non lo legge :o  :o 
Code: [Select]


#define BUTTON 7
#define RELEY 12
#define TEMPIN A0

float celsius = 0, farhenheit = 0; // temperature variables
float millivolts; //dichiarazione di variabile tensione (float è per i numeri con la virgola)
int sensor;
int man = 0; //stato pulsante
int pul = 0; //valore lettura pulsante
int aut = 0; //stato temp
int val = 0; //valore lettura temp
void setup() {
  pinMode(RELEY, OUTPUT);
  pinMode(BUTTON, INPUT);
  Serial.begin(9600);
}

void loop() {


  sensor = analogRead(TEMPIN); //lettura valore del sensore LM35 messo sull'ingresso analogico A0
  millivolts = ( sensor / 1023.0) * 5000; //formula per ottenere la tensione di uscita dell'LM35 in millivolts
  celsius = millivolts / 10; // valore espresso in gradi Celsius (l'out del sensore è 10mv per grado)
  farhenheit = celsius * 1.8 + 32; // valore espresso in gradi Farhenheit
  Serial.println(sensor); //stampa su serial monitor del valore restituito dal conv. A/D a 10 bit di Arduino(da 0 a 1024)
  Serial.print(millivolts); //stampa su serial monitor del valore di tensione in millivolts
  Serial.println(" millivolts");
  Serial.print(celsius); Serial.println(" C"); // stampa su serial monitor del valore di temperatura in gradi Celsius
  Serial.print(farhenheit); Serial.println(" F");
  delay(500);

  if (digitalRead(BUTTON)) {
    pul = !pul;  // cambia stato pulsante
    delay(200);
  }
  if (pul == HIGH and man == 0) {
    digitalWrite (RELEY, HIGH);
  } else {
    digitalWrite (RELEY, LOW);
  }

  val = analogRead(TEMPIN);  //leggi temp
  if (val > 45) {
    (aut = !aut); // cambia stato lett temp
    if (aut == HIGH);
    digitalWrite (RELEY, HIGH);
  } else {
    digitalWrite(RELEY, LOW);
  }
}



ditemi qualcosa :'(
grazie a tutti per la pazienza

Claudio_FF

#18
Dec 13, 2018, 08:30 pm Last Edit: Dec 13, 2018, 08:33 pm by Claudio_FF
Non è che non lo legge. Continui a comandare lo stesso relé da due if diverse che fanno cose diverse, e la seconda annulla i comandi della prima.

Il relé va comandato in un solo punto, come da schema post #15.

Metto qua il codice (che segue lo schema #15) solo da completare...
Code: [Select]
//--------definizioni nomi di comodo

#define  BUTTON  7
#define  RELEY   12
#define  TEMPIN  A0

//--------variabili di lavoro permanenti

uint8_t stato = 0;
bool    manuale = false;

//--------

void setup()
{
    pinMode(BUTTON, INPUT);
    pinMode(RELEY, OUTPUT);
    Serial.begin (9600);
}

//--------

void loop()
{
    // lettura pulsante, alla pressione (HIGH) viene
    // variato lo stato della variabile manuale

    uint8_t lettura = digitalRead(BUTTON);

    if ((0 == stato) && (HIGH == lettura))      // se pressione
    {
        stato = 1;
        manuale = !manuale;
    }
    else if ((1 == stato) && (LOW == lettura))  // se rilascio
    {
        stato = 0;
    }

    // lettura temperatura e conversioni. NOTA: per aumentare
    // la precisione al valore 5000 va sostituito il valore
    // della Vcc letta con un preciso tester digitale quando il
    // circuito e` alimentato con l'alimentatore definitivo.

    uint16_t sensor = analogRead(TEMPIN);
    float millivolts = (float)sensor / 1023. * 5000.;
    float celsius = millivolts / 10.;
    float farhenheit = (celsius * 1.8) + 32.;

    Serial.println(sensor);
    Serial.print(millivolts);
    Serial.println(" millivolts");
    Serial.print(celsius);
    Serial.println(" C");
    Serial.print(farhenheit);
    Serial.println(" F");


    /* completare qui con la gestione relé */


    delay(200);  // Rallenta il loop a circa 5 cicli al secondo
                 // e agisce da debounce per il pulsante
}
* * * * Una domanda ben posta è già mezza risposta * * * *

Standardoil

ditemi qualcosa :'(
grazie a tutti per la pazienza
io qualcosa te lo ho detto, due volte
Non ci sarà una terza, adesso la palla è a te
Non presurrò più la buona fede di chi:
NON indenta, USA la classe String o NON esegue le ricerche
E di chi non risponde alle domande Tante volte è stato segnalato che è sbagliato, quindi NON sono in buona fede
Non bado a studenti, che copino altrove

lupin89

grazie mille >Claudio_FF 
sto leggendo , ma vorrei capire meglio l'uso di unint8_t, ho letto che è int(intero), senza segno, a 8 bit. Ecco 8 bit lo spazio di archiviazione, int <Integer è un modo per memorizzare numeri utilizzando 2 byte.
Il range di memorizzazione va quindi da -32768 a 32767 cioè da -215 a (215 -1).> (da Elementi base del linguaggio di programmazione di Arduino) . Lo ritrovo con uint16_t sensor=[..], capisco che è per avere più spazio per memorizzare la variabile di tipo intero e il sensore può misurare temperature negative quindi senza segno e non ci arrivo a capire il perché di questa soluzione sul pulsante. (o non ci ho capito nulla)

Seconda curiosità (1 == stato) è diverso (stato==1)?

lupin89

io qualcosa te lo ho detto, due volte
Non ci sarà una terza, adesso la palla è a te
non lo nego e ti ringrazio, il problema è la mancanza mia di informazioni su come compilare uno sketch. singolarmente funzionano solo che come mi è stato detto:
Non è che non lo legge. Continui a comandare lo stesso relé da due if diverse che fanno cose diverse, e la seconda annulla i comandi della prima.

Il relé va comandato in un solo punto,
lo sbaglio è sul dire a BUTTON che lui, ignoravo questa uint_8t (come ancora non capisco del perchè sul pulsante), non chiedo la terza.. ora sto capendo come strutturare determinate funzioni nel programma e credo che il prossimo post sara il risultato, grazie ancora :)

Claudio_FF

#22
Dec 13, 2018, 10:51 pm Last Edit: Dec 13, 2018, 10:53 pm by Claudio_FF
sto leggendo , ma vorrei capire meglio l'uso di unint8_t, ho letto che è int(intero), senza segno, a 8 bit.
Corrispondenze:




Quote
non ci arrivo a capire il perché di questa soluzione sul pulsante
Non ho capito la domanda.

Quote
Seconda curiosità (1 == stato) è diverso (stato==1)?
Ni, se scrivi giusto sono la stessa cosa, invece se dimentichi un uguale nel primo caso il compilatore lo segnala mentre nel secondo no.
* * * * Una domanda ben posta è già mezza risposta * * * *

lupin89

#23
Dec 13, 2018, 11:16 pm Last Edit: Dec 13, 2018, 11:19 pm by lupin89
Non ho capito la domanda.
Le variabili sono aree della memoria di Arduino e uint8, è stata utilizzata per le dimensioni del valore che si vuole memorizzare?
perché non si è usata un'altro tipo di variabile? tipo int.. scusa la poca chiarezza, ma sono alle prime armi, ho capito che queste int sono come contenitori, dove appunto inserisco un valore, che in base all'uso cambia. Ho cercato quindi di sfruttare lo stato 0 delle variabili "fisse" dove leggevano un dato x e valore x, procedendo con un cambio stato. Ovviamente non sono riuscito nell'intento perché nn ho assegnato le giuste variabili da comandare rele da un solo punto del programma.

Claudio_FF

#24
Dec 13, 2018, 11:28 pm Last Edit: Dec 13, 2018, 11:31 pm by Claudio_FF
Le variabili sono aree della memoria di Arduino e uint8, è stata utilizzata per le dimensioni del valore che si vuole memorizzare? perché non si è usata un'altro tipo di variabile? tipo int
Ho usato una 8 bit perché è sufficiente per contenere il valore, e senza segno perché non devo trattare numeri negativi. Potevo usare anche una 16, 32 o 64 bit, e anche con segno, funzionerebbe uguale, ma sarebbe sia uno "spreco" di spazio che di tempo elaborazione (in questo caso comunque del tutto irrilevanti). Per la lettura analogica invece serve una variabile da almeno 16 bit perché il valore massimo 1023 non ci sta in 8.
* * * * Una domanda ben posta è già mezza risposta * * * *

Datman

#25
Dec 14, 2018, 10:10 am Last Edit: Dec 14, 2018, 10:11 am by Datman
Attento: in C l'and logico si scrive &&!
Aggiungo che &, invece, è la moltiplicazione matematica binaria bit per bit tra due valori.
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

lupin89

#26
Dec 14, 2018, 07:00 pm Last Edit: Dec 14, 2018, 07:29 pm by lupin89
Ieri sera mi sono fatti certi filmoni e non riuscivo a capire cosa sbagliavo, oggi sono andato a vedere il diagramma postato prima ed è uscito solo solo:
Code: [Select]
if((1==manuale ) || (celsius>20)) {
  digitalWrite (RELEY, HIGH);
  } else {
    digitalWrite (RELEY, LOW);
    
  }

grazie infinite  :)

Go Up