Pages: 1 [2]   Go Down
Author Topic: Primo programma accensioni luci  (Read 1749 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Penso di avere risolto in questo modo i due programmi il primo con delay e il secondo con millis funzionano perfettamente uguali.
Praticamente nel programma con delay ho ad un certo punto del programma:
Code:
delay (500); //faccio fermare il programma per mezzo secondo.

Con millis delay (500); è stato sostituito con:
Code:
if (currentMillis - previousMillis > interva1) //Se lo Stato attuale - Stato precedente > intervallo
      {
        previousMillis = currentMillis; // Stato precedente = Stato attuale

delay (500); va espresso dopo il digitalWrite mentre il programma con millis() va espresso prima del digitalWrite.
Programma delay
Code:
const int Pulsantepin = 2;
const int Utilizzatorepin = 3;

int Statopulsante;
int Statoutilizzatore;

void setup ()
{

  Serial.begin(9600);
  pinMode (Pulsantepin, INPUT); 
  pinMode (Utilizzatorepin, OUTPUT);

void loop ()

  Statopulsante = digitalRead (Pulsantepin); 
  Statoutilizzatore = digitalRead (Utilizzatorepin); 
  if (Statopulsante==HIGH)
    if (Statoutilizzatore==HIGH)
    {
      Statoutilizzatore=LOW;
      digitalWrite (Utilizzatorepin, Statoutilizzatore);
      delay(500); //aspetta mezzo secondo
    }
    else
    {
      Statoutilizzatore=HIGH;
      digitalWrite (Utilizzatorepin, Statoutilizzatore);
      delay(500); //aspetta mezzo secondo
    }
}
Programma con millis()
Code:
const int Pulsantepin = 2;
const int Utilizzatorepin = 3;
unsigned long previousMillis = 0; //Variabile globale Precedente millis
unsigned long interva1 = 500; // Variabile globale intervallo posto a mezzo secondo

int Statopulsante;
int Statoutilizzatore;

void setup ()
{
  Serial.begin(9600);
  pinMode (Pulsantepin, INPUT);
  pinMode (Utilizzatorepin, OUTPUT);

void loop ()
{
  unsigned long currentMillis = millis ();  //Variabile Stato attuale di millis
  Statopulsante = digitalRead (Pulsantepin);
  Statoutilizzatore = digitalRead (Utilizzatorepin);
  if (Statopulsante==HIGH)
    if (Statoutilizzatore==HIGH)
    {
      if (currentMillis - previousMillis > interva1) //Se lo Stato attuale - Stato precedente > intervallo
      {
        previousMillis = currentMillis; // Stato precedente = Stato attuale
        Statoutilizzatore=LOW;
        digitalWrite (Utilizzatorepin, Statoutilizzatore);
      }
    }
    else
    {
      if (currentMillis - previousMillis > interva1) //Se lo Stato attuale - Stato precedente > intervallo
      {
        previousMillis = currentMillis; // Stato precedente = Stato attuale
        Statoutilizzatore=HIGH;
        digitalWrite (Utilizzatorepin, Statoutilizzatore); 
      } 
    }
}
La prima cosa che ho notato facendo la verifica è che il programma con delay è più pesante di quello con milli() ed avrei pensato al contrario.
Mi sembrava di avere letto che millis() è più pesante.

Domande

1) Millis salva in una variabile dei dati dopo tanto tempo posso avere problemi di spazio ed in particolare se uso millis per molte accensioni?
2) Millis salva i dati per 50 gg mi sembra di avere letto e poi si azzera. Quando si azzera cosa succede? Nel momento che si azzera l' utente dell' impianto che vuole accendere e spegnere le sue luci cosa nota un mal funzionamento? Si trova tutte le luci spente per esempio?

Ho provato l' ultimo programma che mi hai mandato con delay sotto la lettura del pin digitalRead.
Mi sembra meno reattivo di quello che ho scritto cioè il led non si accende perfettamente ad ogno pressione del pulsante.
Prova anche tu. Carica il programma con delay che ti ho postato. Subito dopo prova quello che hai postato tu e guarda la differenza.
Il prossimo programma sarà una accensione temporizzata di 10 secondi e una accensione passo-passo normale per vedere se millis mi ha risolto il problema.
Ciao.
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 40
Posts: 3432
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Domande

1) Millis salva in una variabile dei dati dopo tanto tempo posso avere problemi di spazio ed in particolare se uso millis per molte accensioni?
2) Millis salva i dati per 50 gg mi sembra di avere letto e poi si azzera. Quando si azzera cosa succede? Nel momento che si azzera l' utente

evidentemente non hai letto il Reply #7 di Leo
Logged

no comment

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22966
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La prima cosa che ho notato facendo la verifica è che il programma con delay è più pesante di quello con milli() ed avrei pensato al contrario.
Mi sembrava di avere letto che millis() è più pesante.
Delay è una funzione un pò più complessa di millis: millis restituisce solo il valore di un contatore, delay esegue un ciclo di attesa.
Probabilmente i byte in più stanno qui.

Quote
Domande

1) Millis salva in una variabile dei dati dopo tanto tempo posso avere problemi di spazio ed in particolare se uso millis per molte accensioni?
No, millis è una funzione che legge una variabile interna e che ne restituisce il valore. Il problema di "spazio" è solo legato alla memoria Flash che contiene il tuo programma (nel caso di millis).

Quote
2) Millis salva i dati per 50 gg mi sembra di avere letto e poi si azzera. Quando si azzera cosa succede? Nel momento che si azzera l' utente dell' impianto che vuole accendere e spegnere le sue luci cosa nota un mal funzionamento? Si trova tutte le luci spente per esempio?
Stai usando il secondo metodo del mio articolo, quel metodo è esente dall'overflow di millis per cui non devi preoccupartente. L'overflow è gestito senza problemi per cui a te non interessa se il contatore che millis legge riparte da zero, il controllo per come l'hai usato non soffre di questo problema.
Quote
500 ms sono tanti, troppi per un debounce.
Ne bastano 50.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22966
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

evidentemente non hai letto il Reply #7 di Leo
Avevo scritto un poema, quando ho visto il tuo reply l'ho spedito lo stesso  smiley-razz
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Con 50 ms il programma non funziona cioè il led non si accende bene con la pressione del pulsante.
Ho eseguito il programma con una accensione temporizzata e una accensione a relè passo-passo senza l' uso di delay funziona tutto bene.
Code:
const int Pulsantepin1 = 2;
const int Pulsantepin2 = 3;
const int Utilizzatorepin1 = 4;
const int Utilizzatorepin2 = 5;
unsigned long previousMillis1 = 0; //Variabile globale Precedente millis
unsigned long interva1 = 10000; // Variabile globale intervallo posto a mezzo secondo
unsigned long previousMillis2 = 0; //Variabile globale Precedente millis
unsigned long interva2 = 200;
unsigned int counter = 0;

int Statopulsante1;
int Statopulsante2;
int Statoutilizzatore1;
int Statoutilizzatore2;

void setup ()
{
  Serial.begin(9600);
  pinMode (Pulsantepin1, INPUT);
  pinMode (Pulsantepin2, INPUT);
  pinMode (Utilizzatorepin1, OUTPUT);
  pinMode (Utilizzatorepin2, OUTPUT);

void loop ()
{
  unsigned long currentMillis = millis ();
  Statopulsante1 = digitalRead (Pulsantepin1);
  Statopulsante2 = digitalRead (Pulsantepin2);
  Statoutilizzatore1 = digitalRead (Utilizzatorepin1);
  Statoutilizzatore2 = digitalRead (Utilizzatorepin2);
  // ACCENSIONE 1 TEMPORIZZATA
  if (Statopulsante1==HIGH)
  {
    Statoutilizzatore1=HIGH;
    digitalWrite (Utilizzatorepin1, Statoutilizzatore1);
  } 
  else if (Statopulsante1==LOW)
  {
    if (currentMillis - previousMillis1 > interva1)
    {
      previousMillis1 = currentMillis;
      Statoutilizzatore1=LOW;
      digitalWrite (Utilizzatorepin1, Statoutilizzatore1); 
    }
  }
  // ACCENSIONE 2
  if (Statopulsante2==HIGH)
    if (Statoutilizzatore2==HIGH)
    {
      if (currentMillis - previousMillis2 > interva2)
      {
        previousMillis2 = currentMillis;
        Statoutilizzatore2=LOW;
        digitalWrite (Utilizzatorepin2, Statoutilizzatore2);
      }
    }
    else
    {
      if (currentMillis - previousMillis2 > interva2)
      {
        previousMillis2 = currentMillis;
        Statoutilizzatore2=HIGH;
        digitalWrite (Utilizzatorepin2, Statoutilizzatore2);
      }
    }
}


Se avete consigli e suggerimenti sul programma sono tutto orecchie.
Logged

Pages: 1 [2]   Go Up
Jump to: