Percentuale tapparella

Buonasera, Quello che vorrei fare è un conteggio tapparella. Mi spiego meglio: La tapparella ha un TEMPO TOTALE di 5 secondi per chiudersi/aprirsi del tutto, io pero la fermo a 3 secondi. Ora la tapparella ha una percentuale di chiusura pari quasi al 50 %, questa percentuale vorrei farla apparire poi su un display. Avrei pensato alla funziona millis, in modo tale che il programma non si blocchi. Grazie

Setti una variabile per capire che stai azionando la tapparella. se quella variabile è vera esegui il pezzo di codice che conta il tempo con millis() e stampi su display la % Non ho capito però come 3 secondi sono il 50% su 5 secondi.

CIao nid e grazie per la risposta. Fino alla variabile ci sono , il problema è come contare il tempo con millis :confused: Avevo scritto quasi pari al 50 % :)

Gunstr94: Fino alla variabile ci sono , il problema è come contare il tempo con millis :confused:

millis() è una funzione che ti ritorna sempre il passare del tempo in millisecondi.

Tu la leggi e sai il tempo INIZIALE a cui l'hai letta, per ogni successiva lettura fai (nuova_lettura - lettura_INIZIALE) e sai quanti millisecondi sono passati ;)

Guglielmo

... aggiungo che questo tuo è un sistema "barbaro" :D e molto poco affidabile; inoltre, se ti va via la corrente ... ti sei perso a che punto era la tua tapparella ::)

Guglielmo

P.S.: Per inciso, occhio a mettere le mani sulle tapparelle; ti rammento il REGOLAMENTO, punto 15.3 ... mi raccomando ...

ci siamo quasi :)

E invece posso fare che una volta che arduino "riprende vita" la tapparella si abbassa del tutto in modo tale che sta al 100%

gpb cosa mi consigi di fare?

Gunstr94:
gpb cosa mi consigi di fare?

In che senso ? ? ? Per quale argomento ?

Guglielmo

Hai detto che il mio sistema è poco affidabile, quindi cosa mi consiglia di fare?

Ah ... mah, ad esempio potresti far montare, da un installatore autorizzato, un "potenziometro lineare multigiri" di precisione solidale con l'asse di avvolgimento della tapparella.

Una volta fatta una calibrazione (tutta chiusa, tutta aperta) In qualsiasi momento, leggendo la "resistenza" puoi avere un'indicazione della posizione ::)

Al limite, ogni tot, puoi anche prevedere una auto-ricalibrazione automatica ed avere sempre una buona precisione.

Guglielmo

Preferisco più una cosa " made by me" :)

Gunstr94: Preferisco più una cosa " made by me" :)

... per me ... basta che qui NON scrivi nulla in violazione al punto 15.3 del regolamento e poi nessun problema :D :D :D

Guglielmo

gpb01: ... per me ... basta che qui NON scrivi nulla in violazione al punto 15.3 del regolamento e poi nessun problema :D :D :D

Guglielmo

Ovvio nessun problema.

Ritornarno al discroso, ho provato a creare un codice:

#define ledPin 13 
#define temptotale 5000  
int value = LOW; 
int tempoacceso = millis ();
int tempopassato = 0; 
long tempiniziale = 0;  
#define BUTTON 7 
int  val = 0; 
void setup()
{
  Serial.begin (9600);
  pinMode(ledPin, OUTPUT);  //Impostiamo il led come output
    pinMode(BUTTON, INPUT);
   
}

void loop()
{
  val = digitalRead(BUTTON);

  if(val == HIGH){
     tempoacceso = millis();  
  }
   tempopassato = temptotale - tempoacceso ;
   Serial.print  (tempopassato);
  
  
  }

L'unico problema mi da in loop 5000 e se premo il pulsante il risultato sempre in loop

NO, non hai capito come usare millis() ... paragonala ad un orologio ...

tu quando guardi l'orologio la prima volta ? Quando INIZI il movimento delle tapparella e poi continui a guardarlo e calcoli quanto tempo è passato (dall'INIZIO del movimento), durante il movimento. Quando è passato il tempo voluto, fermi la tapparella ...

Devi fare così come faresti guardando l'orologio ;)

Più chiaro così ?

Guglielmo

mmmm, cosi?

#define ledPin 13 
#define temptotale 5000  
int value = LOW; 
int tempoacceso = millis ();
int tempopassato = 0; 
long tempiniziale = 0;  
#define BUTTON 7 
int  val = 0; 
void setup()
{
  Serial.begin (9600);
  pinMode(ledPin, OUTPUT);  //Impostiamo il led come output
    pinMode(BUTTON, INPUT);
   
}

void loop()
{
  val = digitalRead(BUTTON);

  if(val == HIGH){
     tempoacceso = millis();  
  }
  
   Serial.print  (tempoacceso);
  
  
  }
  1. millis() ritorna degli "unsigned long" (32 bit) quindi TUTTE le variabili che conengono il tempo devono essere "unsigned long"

  2. hai una sistema di "debouncing" HW sui bottoni? Perché non vedo alcun "debouncing" SW

  3. SI, leggi il tempo iniziale quando premi il bottone di salita/discesa e poi devi continuare a fare la differenza per sapere quanto tempo è passato

Guglielmo

cosi?

#define ledPin 13 
#define temptotale 5000  
int value = LOW; 
unsigned long tempoacceso = millis ();
unsigned long tempopassato = 0; 
unsigned long tempiniziale = 0;  
#define BUTTON 7 
int  val = 0; 
void setup()
{
  Serial.begin (9600);
  pinMode(ledPin, OUTPUT);  //Impostiamo il led come output
    pinMode(BUTTON, INPUT);
   
}

void loop()
{
  val = digitalRead(BUTTON);

  if(val == HIGH){
     tempoacceso = millis();  
  }
  
  tempopassato = temptotale - tempoacceso ;
   Serial.print  (tempopassato);
  
  
  }

... ti ricordo che il setup() viene eseguito UNA sola volta, mentre il loop() in continuazione, quindi ... cosa pretendi da questa riga? :

tempopassato = temptotale - tempoacceso ;

... visto che tempototale NON lo aggiorna nessuno nel loop() ::)

E poi ... perché sprecare una variabile (tempototale) quando puoi semplicemente fare la differenza direttamente con millis() ?

Guglielmo

Ragiona ...

  1. sei nel loop()
  2. ti accorgi che è stato premuto il pulsante, ti segni l'ora a cui è stato premuto
  3. continui a girare nel loop() e vedi che il pulsante è sempre premuto
  4. allora fai la differenza tra l'ora attuale e quella in cui lo hai iniziato a premere
  5. quando tale differenza supera il valore voluto, fermi il tutto
  6. aspetti che il pulsante venga rilasciato prima di accettare un nuovo tempo iniziale

Guglielmo

Si ma la tapparella non si deve fermare a un tempo voluto, la fermo io e in base alla differenza che ci sta mi deve segnare la percentuale.