Go Down

Topic: Uso di millis() per iniziare (Read 2520 times) previous topic - next topic

astrobeed


La sintassi del linguaggio presente in "Reference" cita come tipi /unsigned) int e (unsigned) long  :P XD X


Si ma wiring non è C puro, contiene varie deleghe alla sintassi standard, però il sistema è realizzato in modo da poter scrivere codice anche C ANSI, e non fosse così sarebbe impossibile superare i limiti di Arduino imposti da wiring, quindi non è un errore scrivere "long int" o solo "long".
Scientia potentia est

dr4gone

Ehi !! Molto interessanti queste considerazioni sull'ottimizzazione del codice per risparmiare preziosi byte..
Il problema è che per ottimizzare un codice prima bisogna farlo funzionare  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green: :smiley-mr-green: e questo non funziona!!! :D

Quindi mi sono permesso di scrivere un piccolissimo sketch che simula la cosa completamente, in modo tale che se avete tempo mi potreste aiutare ad uscirne fuori salvaguardando la mia salute mentale...

Se aprite il serial monitor e scrivete H (maiuscolo) parte lo sketch, mi sono permesso di mettere anche dei Serial.println che secondo me sono impportanti per capire quale sia il problema, che secondo me è proprio questo: fa il confronto poco dopo e non aspetta i 600 ms..!!

Tempo iniziale
1168
Tempo incrementato
1768
tempo per il confronto
1226

Code: [Select]

int ins_val;
unsigned long contatore;
boolean stato;

void setup()
{
pinMode(6, OUTPUT);
stato = true;
Serial.begin(9600);

}

void loop()
{
if (Serial.available() > 0) {
 ins_val = Serial.read();
if (ins_val == 'H') {
 if(stato == true) {
          contatore = millis() + 600;
          digitalWrite(6, HIGH);
          stato = false;
          Serial.println("Tempo iniziale");
          Serial.println(millis());
          Serial.println("Tempo incrementato");
          Serial.println(contatore);
       }
   }

if (contatore < millis())
           {
           digitalWrite(6, LOW);
           stato = false;
       }
Serial.println("tempo dopo il confronto");
Serial.println(millis());
 }
}


Quindi se avreste la pazienza di aiutarmi proprio con questo esempio pratico sarebbe cosa gradita :D

astrobeed

Ecco il tuo programma modificato in modo che funzioni, non ho fatto altro che seguire la traccia che ti avevo scritto, ho modificato il pin out per usare il led di Arduino, così ha un riscontro visivo immediato senza dover collegare nulla.

Code: [Select]

int ins_val;
unsigned long contatore;
boolean stato;

void setup()
{
pinMode(13, OUTPUT);
stato = true;
Serial.begin(9600);
contatore = 0;
}

void loop()
{
if (Serial.available() > 0)
  {
   ins_val = Serial.read();
   if (ins_val == 'H') stato = true;
  }   
 
if(stato == true)
  {
   contatore = millis() + 1000;
   digitalWrite(13, HIGH);
   stato = false;
   Serial.println("Tempo iniziale");
   Serial.println(millis());
  }

if (contatore < millis() & contatore > 0)
  {
   digitalWrite(13, LOW);
   stato = false;
   Serial.println("tempo dopo il confronto");
   Serial.println(millis());
   contatore = 0;
  }
}
Scientia potentia est

dr4gone

Grazie mille, gli ho dato un'occhiata veloce perchè ora non posso provarlo.
Stasera quando rientro lo proverò sicuramente..

Tanto per capire cosa hai fatto:
Hai aggiunto questa condizione all' if:  & contatore > 0 (ed è questo il punto chiave, la sua assenza faceva si che non scattasse mai il LOW) giusto?
E poi hai resettato le variabili contatore e stato.
Alla fine mi è mancato lo spunto finale per arrivarci da solo!
GRAZIE MILLE  ;)

astrobeed


Hai aggiunto questa condizione all' if:  & contatore > 0 (ed è questo il punto chiave, la sua assenza faceva si che non scattasse mai il LOW) giusto?


No, la seconda condizione serve solo per evitare che una volta scaduto il tempo venga sempre eseguita la if, la condizione risulterebbe sempre vera.
Guardati attentamente la traccia che ho scritto qualche post indietro, è la stessa cosa del programma solo scritta in modo più semplice e comprensibile.
Scientia potentia est

dr4gone

Grazie dell'aiuto. Funziona egregiamente con la seriale..

Il problema è che quando cerco di adattarlo ad una web interface, usando lo stessa logica non riesco a farlo andare, Sbaglierò qualcosa sicuramente, perchè non va mai LOW.

Il codice funzionante per agire da seriale è questo :
Code: [Select]

int ins_val;
unsigned long contatore;
boolean stato;

void setup()
{
pinMode(6, OUTPUT);
Serial.begin(9600);
contatore = 0;
stato = false;
}

void loop()
{
if (Serial.available() > 0)
  {
   ins_val = Serial.read();
//--------------------INS EVENTO DI TRIGGER--------------------------------   
   if (ins_val == 'H') stato = true;
  }   
//---------------PUSLSANTE---------------- 
if(stato == true)
  {
   contatore = millis() + 600;
   digitalWrite(6, HIGH);
   stato = false;
  }

if (contatore < millis() & contatore > 0)
  {
   digitalWrite(6, LOW);
   stato = false;
   contatore = 0;
  }
//----------------------------------------- 
  }


L'uscita resta sempre alta con questo codice (non funzionante) per Ethernet shield
Code: [Select]

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Indirizzo MAC
byte ip[] = { 192, 168, 1, 100 }; // ip in lan
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Server server(80); //porta server

String readString; //string
unsigned long contatore;
boolean stato;

void setup(){
Ethernet.begin(mac, ip, subnet);
Serial.begin(9600);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
stato = false;
contatore = 0;
}

void loop(){
Client client = server.available();
if (client) {
  boolean currentLineIsBlank = true;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
        readString.concat(c);
      if (c == '\n' && currentLineIsBlank) {
         Serial.print(readString);
//--------------------INS EVENTO DI TRIGGER--------------------------------       
        if(readString.startsWith("GET /porta1")) stato = true;{
//---------------------------PUSLSANTE----------------
       if (stato == true)
       {
           contatore = millis() + 600;
           digitalWrite(6, HIGH);
           stato = false;
          }
         
         if (contatore < millis() & contatore > 0)
          {
           digitalWrite(6, LOW);
           contatore = 0;
          }
        }
        //-----------------------------------------
       
        // INIZIO DICHIARAZIONE PAGINA HTML
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        client.print("<html><body>");
        client.println("PORTA1");
        client.println("<a href='/porta1'>APRI</a></h2>");
        //Resetto "String" per la prossima lettura
        readString="";
        //Fermo il client
        client.stop();
         }
       }
     }
   }
}



Non riesco a capire dove sta l'inghippo, ma evidentemente c'è  :smiley-mr-green:

Suggerimenti?

Go Up