Se sei già registrato           oppure    

Orario: 13/05/2024 05:07:57  

 

Energia Alternativa ed Energia Fai Da Te > Arduino

VISUALIZZA L'ALBUM

Pagine: (10)   1   [2]   3   4   5   6   7   8   9   10    (Ultimo Msg)


Controllo termocamino
FinePagina

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 15/05/2017 18:52:41

esatto... prova !



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 15/05/2017 18:55:23

Comunque in questi giorni mi arriva arduino mega cosi inizio a testare, il mio ho fatto un errore da principante,lo stavo alimentanto con l'alimentatore del pc e ho confuso il cavo rosso con quello giallo e ha dio arduino...



---------------
Non è impossibile se è fattibile!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 15/05/2017 19:04:31

Un'altra cosa Bellaeli quando hai tempo se mi controlli questa parte di codice

case 1: //se stato è 1 (acceso)
      if(Tfumi<allTempFumi){ // verifica se le condizioni sono vere procedo con:
       t9.setText("ON");
       digitalWrite(accenditore,HIGH);
       if(millis()-timeraccenditore > 300000){ //se sono trascorsi 3 minuti
       digitalWrite(accenditore,LOW);
    }
     pwmfumi =map(temph2o, 0, 100, 0, 255);
     percentuale = map(pwmfumi, 0, 255, 0, 100);
     digitalWrite(circolatore,HIGH);
     digitalWrite(ventola,HIGH);
     analogWrite(aspiratore,pwmfumi);
     
     if (temph2o<txh2o){
       Tcoclea=10000;
     }else{
       Tcoclea=30000;
     }
     
     if (millis() -  timercoclea > Tcoclea ){
        timercoclea = millis();  //Tiene in memoria l'ultima accensione

        if (Vcoclea == LOW)
             Vcoclea = HIGH;
        else
             Vcoclea = LOW;

        digitalWrite(coclea, Vcoclea);
     }
    break;

Ricapitolando voglio che quando l'interruttore è on(stato=1) l'accenditore si accende per 3 minuti e poi si deve spegnere fino al prossimo (stato=1).

La coclea voglio che deve stare 1 minuto accesa e un 1 minuto spenta se la temperatura rilevata e >= a quella impostata e 3 minuti accesa e un 3 minuto spento se la temperatura rilevata e < di quella impostata.

ps. ora i minuti sono messi ha caso li dovrò impostare correttamente una volta acceso il termo per capire le tempistiche esatte



---------------
Non è impossibile se è fattibile!

 

Biomass

Avatar
PetaWatt


Gruppo:Utente
Messaggi:19097

Stato:



Inviato il: 15/05/2017 19:35:23

si i minuti sono a caso

devi lavorare in secondi



---------------
Instagram: real_biomass
Youtube: Biomass Cippomix
stufapellet.forumcommunity.net
W il cippatino

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 15/05/2017 19:44:18

Ciao Bio si si intanto vorrei solo impostare il codice i settaggi li faccio quando è tutto assemblato.

CITAZIONE

devi lavorare in secondi

Ok lo tengo bene a mente..



---------------
Non è impossibile se è fattibile!

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 15/05/2017 20:53:14

CITAZIONE (dani9191, 15/05/2017 19:04:31 ) Discussione.php?214614&2#MSG17

Un'altra cosa Bellaeli quando hai tempo se mi controlli questa parte di codice

Ricapitolando voglio che quando l'interruttore è on(stato=1) l'accenditore si accende per 3 minuti e poi si deve spegnere fino al prossimo (stato=1).

La coclea voglio che deve stare 1 minuto accesa e un 1 minuto spenta se la temperatura rilevata e >= a quella impostata e 3 minuti accesa e un 3 minuto spento se la temperatura rilevata e < di quella impostata.

No.. direi che non ci siamo per niente...

Non puoi mettere in sequenza 2 istruzioni come queste:
...
digitalWrite(accenditore,HIGH);
if(qualcosa)
digitalWrite(accenditore,LOW);
...

Quelle istruzioni sono dentro un ciclo, vuol dire che vengono eseguite svariate volte al secondo, vuol dire che se quel "qualcosa" è vero l'accenditore farà ON e OFF svariate volte al secondo...
Devi usare dei meccanismi per cui l'accenditore verrà messo o a ON o a OFF, non puoi prima accenderlo e se non va bene lo spegni !!!

I millisecondi sono millesimi di secondo, ovvero prendi 1 secondo e lo dividi in mille parti.
Dal seconndo in poi devi ragionare su base sessagesimale, ovvero i secondi arrivano a 60 !
Quindi 3 minuti sono 180 secondi ovvero 180.000 ms !
Così come 1 minuto sono 60 secondi, ovvero 60.000 ms !
Occhio a questi dettagli altrimenti non funziona nulla e non capisci il perchè...

Tutte le volte che vuoi capire quanto tempo è trascorso per un'azione devi prima ricordare di memorizzare il valore di millis() la prima volta e solo dopo puoi calcolare la differenza... a te sembra sfuggire questo importante dettaglio !

Altra cosa, millis() ogni circa 50 giorni si resetta e riparte da 0, essendo una stufa devi gestire la cosa, non puoi fare a caso altrimenti avrai risultati inattesi !

Molte variabili non so a cosa servono, così come ho dubbi su alcune istruzioni, ma ci provo...


...
unsigned long VarMillis = 0;
unsigned long OldStartAccenditore = 0;
unsigned long DeltaRestartMillis = 0;
boolean PrimoCicloON = true;
...



**********************************************************************************************************



case 0:                                               //se stato è 0 (spento)
   ...
   ...
   PrimoCicloON = true;
   ...
   break;



**********************************************************************************************************




case 1:                                               // se stato è 1 (acceso)
   if(Tfumi < allTempFumi)                            // verifica se le condizioni sono vere procedo con:
   {
      t9.setText("ON");
      VarMillis = millis();

      if(PrimoCicloON)                                // se è la prima volta che entro nello stato ON
      {
         PrimoCicloON = false;
         OldStartAccenditore = VarMillis;
         DeltaRestartMillis = 0;
      }

      if(OldStartAccenditore > VarMillis)             // se millis si resetta (dopo circa 50 gg)
      {
         DeltaRestartMillis = 4294967295 - OldStartAccenditore;
         OldStartAccenditore = 0;
      }

      if(VarMillis + DeltaRestartMillis - OldStartAccenditore < 180000)    // se non sono trascorsi 3 minuti
      {
         digitalWrite(accenditore, HIGH);
      }
      else
      {
         digitalWrite(accenditore, LOW);
      }

   }
   pwmfumi = map(temph2o, 0, 100, 0, 255);
   percentuale = map(pwmfumi, 0, 255, 0, 100);
   digitalWrite(circolatore,HIGH);
   digitalWrite(ventola,HIGH);
   analogWrite(aspiratore,pwmfumi);
     
   if (temph2o < txh2o)
   {
      Tcoclea = 60000;
   }
   else
   {
      Tcoclea = 180000;
   }



   ***************************************************************************************************************
   Questa parte di codice è errata, ma ora devo andare, ricontrollala tu sulla base di come ho operato sopra, ok ?  
   ***************************************************************************************************************

   if (millis() -  timercoclea > Tcoclea )
   {
      timercoclea = millis();                          // Tiene in memoria l'ultima accensione

      if (Vcoclea == LOW)
      {
         Vcoclea = HIGH;
      }
      else
      {
         Vcoclea = LOW;
      }

      digitalWrite(coclea, Vcoclea);
   }
   break;




Ovviamente anche ciò che ho scritto io è da testare e può contenere errori, ma concettualmente è più corretto del tuo...

Elix



Modificato da BellaEli - 15/05/2017, 20:57:59


---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 16/05/2017 07:32:00

Grazie Bellaeli un ottima base per partire.
Ma 4294967295 corrispondo a 50gg?



---------------
Non è impossibile se è fattibile!

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 16/05/2017 10:41:12

Mi aspettavo una domanda su quella parte di codice... e se non l'avessi fatta sarebbe stato un brutto segno !

Quando scrivi un codice devi sempre conoscere i limiti di ogni variabile, istruzione, funzione, etc.
Tutto ciò che ti serve lo trovi in https://www.arduino.cc/ -> Learning -> Reference.

Questa le indicazioni del comando millis():

Description:
Returns the number of milliseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 50 days.

Parameters
Number of milliseconds since the program started (unsigned long)

Note:
Please note that the return value for millis() is an unsigned long, logic errors may occur if a programmer tries to do arithmetic with smaller data types such as int's. Even signed long may encounter errors as its maximum value is half that of its unsigned counterpart.


Quindi la funzione restituisce il numero di millisecondi da quando arduino è stato acceso.
Tale numero va da 0 al limite di unsigned long e impiega circa 50 giorni.
Arrivato al massimo riparte da 0.
Operazioni matematiche con numeri in formato diverso restituiscono risultati inattesi...


Ma a quanto arriva un unsigned long ??? Cerchiamolo:

Description
Unsigned long variables are extended size variables for number storage, and store 32 bits (4 bytes). Unlike standard longs unsigned longs won't store negative numbers, making their range from 0 to 4,294,967,295 (2^32 - 1).


Quindi quel 4.294.967.295 è il valore massimo che una variabile unsigned long può raggiungere, corrisponde a 4.294.967.295 millisecondi ovvero 4.294.967,3 secondi, ovvero 49 giorni, 17 Ore, 2 Minuti, 47 secondi e circa 3 decimi.

Ora è un po' più chiaro ? E mi spieghi perchè ho inserito questa istruzione:

DeltaRestartMillis = 4294967295 - OldStartAccenditore;

???

Elix



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 16/05/2017 12:34:20

Con te devo stare attendo che mi prendi a trabocchetto


CITAZIONE

Ora è un po' più chiaro ? E mi spieghi perchè ho inserito questa istruzione:

DeltaRestartMillis = 4294967295 - OldStartAccenditore;

???

Elix


La parte unsigned long abbastanza, per l'istruzione un po meno,ma ci provo a ragionare del resto siamo qui per imparare e condividere.
Partiamo da capo cercando di capire cosa sono intanto le variabile usati.
VarMillis dovrebbe servire per memorizzare il tempo trascorso;
OldStartAccenditore dovrebbe servire per conteggiare il tempo trascorso da quando l'accenditore è acceso.
DeltaRestartMillis dovrebbe servire per compensare l'azzeramento dei 50gg trascorsi;

Quindi l'istruzione :
DeltaRestartMillis = 4294967295 - OldStartAccenditore;
se OldStartAccenditore ha superato VarMillis (quindi sono trascorsi i 50gg è de ritornato a 0)sottraggo OldStartAccenditore da 4294967295 e dovrebbe ritornare tutto a 0.
è piu o meno giusto?



---------------
Non è impossibile se è fattibile!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 16/05/2017 13:35:28

Per la coclea posso utilizzare la stessa variabile VarMillis per tenere il conteggio o ne devo creare un'altra dedicata?



---------------
Non è impossibile se è fattibile!

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 16/05/2017 13:38:25


CITAZIONE

...è piu o meno giusto?

Non so... hai scritto in modo che non capisca se hai capito...

VarMillis è +/- uguale a millis(), tuttavia io preferisco memorizzare il valore in una variabile in modo che se devo fare vari if su millis() tale valore resta invariato ad ogni if...

Per capire, ipotizziamo che millis() sta quasi al suo massimo, ovvero al valore 4.....94 (su 4.....95) e che eseguo queste due istruzioni utilizzando millis():


if(OldStartAccenditore > millis())
...

if(millis() - OldStartAccenditore < 180000)

E' un evento raro ma potrebbe capitare e allora il primo if sarà falso, il secondo, invece, restituirà un risultato inatteso poichè nel frattempo millis() è tornato a 0

Memorizzando il valore di millis() in una variabile saremo certi che anche se facessimo 100 controlli in sequenza quel valore sarà fisso, non ci saranno sorprese !


Per capire come gestisco il reset facciamo un esempio, ipotizziamo che millis vada da 0 a 10 per poi ripartire, ipotizziamo che OldStartAccenditore sta a 8 e che noi dobbiamo cambiare lo stato quando sono trascorsi 5 ms



VarMillis    DeltaRestartMillis    OldStartAccenditore    (VarMil + DeltaRest - OldStart)
 8           0                     8                      0
 9           0                     8                      1
10           0                     8                      2
 0           3                     0                      3
 1           3                     0                      4
 2           3                     0                      5
 3           3                     0                      6
 4           3                     0                      7
 5           3                     0                      8
 6           3                     0                      9
 7           3                     0                      10



Come puoi vedere dalla tabella con questo escamotage nonostante VarMillis e OldStartAccenditore si azzeri il risultato del calcolo è un numero che cresce da 0 a x in maniera corretta, proprio come vogliamo noi...

Ora è un po' più chiaro ? O avevi capito già da prima ?

Elix



Modificato da BellaEli - 16/05/2017, 13:43:03


---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 16/05/2017 14:21:52


CITAZIONE

Ora è un po' più chiaro ? O avevi capito già da prima ?

A questo punto ti dico che non avevo capito niente o per lo meno avevo solo intuito un piu o meno.

Vediamo ora se ho afferato il discorso,la tebella è utilissima.
Questa istruzione

if(OldStartAccenditore > VarMillis)
{
DeltaRestartMillis = 4294967295 - OldStartAccenditore;
OldStartAccenditore = 0;
}
diciamo che è solo per emergenza nel caso arduino per un motivo ho per un'altro da i numeri, ma se per ipotesi OldStartAccenditore fosse minore di VarMillis cosa succede?
quello che non riesco ad afferrare è questo, se noi con questa istruzione ad ogni ciclo gli stiamo dicendo che OldStartAccenditore = VarMillis; anche se si resetta VarMillis dovrebbe restare sempre uguale a OldStartAccenditore o sbaglio?

Mettiamo al caso che(OldStartAccenditore > VarMillis) arduino eseguirà questa istruzione 10 - OldStartAccenditore(ipozziamo che è 6)=4:
Quindi avrò 0+4-0=4; ora ipotizziamo che il numero 8 corrisponde hai nostri 3 minuti.

if(0 + 4 - 0 < 8) // se non sono trascorsi 3 minuti
{
digitalWrite(accenditore, HIGH);
}
else
{
digitalWrite(accenditore, LOW);
}
da 4 per arrivare a 8 mancano 4 quindi l'accenditore rimarrà acceso 1.5minuti e no 3 minuti.O sto sbagliando qualcosa.?



---------------
Non è impossibile se è fattibile!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 16/05/2017 14:25:37

Oio ioi sono piu confuso di prima



---------------
Non è impossibile se è fattibile!

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 16/05/2017 14:47:55


CITAZIONE

Oio ioi sono piu confuso di prima

Direi di si... non c'hai capito un ...

CITAZIONE
diciamo che è solo per emergenza nel caso arduino per un motivo ho per un'altro da i numeri

Faccine/eek.gif Faccine/eek.gif Faccine/eek.gif Faccine/eek.gif
Assolutamente no !!! Non è per emergenza, è per gestire il reset del valore di millis()
La funzione millis() restituisce un valore che parte da 0 (quando accendo arduino) e arriva a 4.294.967.295 per poi riniziare da 0.
Il controllo "if(OldStartAccenditore > VarMillis)" serve per gestire questo caso !

CITAZIONE
ma se per ipotesi OldStartAccenditore fosse minore di VarMillis cosa succede?

Questa cosa non può mai accadere salvo quando si resetta millis().

Infatti, quando lo stato è a 1 (case 1), solo la prima volta, verranno eseguite queste istruzioni:


      if(PrimoCicloON)                                // se è la prima volta che entro nello stato ON
      {
         PrimoCicloON = false;
         OldStartAccenditore = VarMillis;
         DeltaRestartMillis = 0;
      }


Nota che una volta entrati nell'if la variabile PrimoCicloON viene messa a false, quindi al passaggio successivo non si entrerà nel ciclo... giusto ???

E allora la prima volta mettiamo OldStartAccenditore = millis() ma le volte successive millis() aumenta sempre, non può mai accadere che OldStartAccenditore sarà maggiore di millis() tranne quando si resetta. Giusto ?


CITAZIONE
se noi con questa istruzione ad ogni ciclo gli stiamo dicendo che OldStartAccenditore = VarMillis

No, no e no ! Come scritto sopra solo la prima volta lo diciamo, dopo di che OldStartAccenditore resta invariata fino a quando non passiamo a "case 0" dove verranno resettate le varie variabili...

CITAZIONE
da 4 per arrivare a 8 mancano 4 quindi l'accenditore rimarrà acceso 1.5minuti e no 3 minuti.O sto sbagliando qualcosa.?

Tutto dipende da quando si è partiti...
Cioè se OldStartAccenditore sta a 6 vuol dire che con millis() si è partiti da 6 quindi per arrivare a 10 e resettare millis() sono già trascorsi 4 (ovvero 1,5 minuti).

Vai vai... studia, domanda, sperimenta, solo così puoi imparare !

Elix



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!

 

dani9191

Avatar
GigaWatt


Gruppo:Utente
Messaggi:780

Stato:



Inviato il: 16/05/2017 15:52:01

Intanto ti ringrazio per il tempo che mi stai dedicando!
Ma in questo momento mi sto sentendo stupido
Restiamo con la scala da 1 a 10 e il numero 8 che corrisponde a 3minuti cosi è piu semplice.

CITAZIONE

Nota che una volta entrati nell'if la variabile PrimoCicloON viene messa a false, quindi al passaggio successivo non si entrerà nel ciclo... giusto ???

Questo dettaglio importantissimo non lo stavo considerando.
Allora io porto lo stato ha on
primoCicloOn passa a falso;
OldStartAccenditore diventa uguale a ValMillis(che puo essere 0 fino a 10);
DeltaRestartMillis diventa 0;
Bene fin qua ci siamo.
Subito dopo OldStartAccenditore sarà uguale a VarMillis,quindi questa istruzione
if(OldStartAccenditore > VarMillis)
{
DeltaRestartMillis = 4294967295 - OldStartAccenditore;
OldStartAccenditore = 0;
}
verrà ignorata.

Si passa a quest'altra istruzione
if(VarMillis + DeltaRestartMillis - OldStartAccenditore < 8)
Ipotizziamo (6+0-6<8)
quindi il risultato sarà 0 e accende l'accenditore contando da 0 fino a 8 e fin qua ci siamo l'accenditore è stato acceso per 3 minuti..

E qui la parte che purtroppo ancora non riesco a comprendere:
durante tutto il ciclo fino alla prossima accensione VarMillis andra avanti e OldStartAccenditore rimarrà a 6 fino alla prossima accensione che diventerà di nuovo uguale a VarMillis. Giusto?

Torniamo un'attimo ha questa benedetta istruzione

if(OldStartAccenditore > VarMillis)
{
DeltaRestartMillis = 4294967295 - OldStartAccenditore;
OldStartAccenditore = 0;
}
VarMillis ha raggiunto 10 e si riparte da 0,ma OldStartAccenditore è rimasto a 6. Quindi gli stiamo dicendo che DeltaRestartMillis deve essere il risultato di 10-6 è diventerà 4,mentre OldStartAccenditore lo riportiamo a 0.

Il risultato ora sarà (0+4-0<8), quindi saranno passati gia 4(1,5minuti) e l'accenditore resterà acceso solo altri 4(1,5minuti), ma noi pero vogliamo che l'accenditore resti acceso per 8(3minuti)..

Dimmi almeno che sono sulla giusta stradaFaccine/Smileys_0006.gif



---------------
Non è impossibile se è fattibile!

 
 InizioPagina
 

Pagine: (10)   1   [2]   3   4   5   6   7   8   9   10    (Ultimo Msg)

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum