Blink con millis() ma con stato LOW diverso

Buonasera

scusate la totale ignoranza, ma sto cercando di studiare la funzione millis() e proprio non riesco a raccapezzarmi, ho preso il semplicissimo esempio BlinkWithoutDelay presente negli esempi dell'IDE, ma vorrei modificare semplicemente lo stato LOW del pin

if (currentMillis - previousMillis >= 1000) {
    previousMillis = currentMillis;

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

   digitalWrite(ledPin, ledState);
}

proprio non riesco a capire come fare per tipo lasciarlo in HIGH per 1000ms e disattivarlo per 500ms

qualcuno può aiutarmi? o magari indirizzarmi su qualche guida?

Grazie in anticipo

prova a leggere qui...
http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

:blush: questo esempio anche mi tornerà utile :slight_smile: ma è per fare due operazioni contemporaneamente
io vorrei cambiare lo stato della stessa uscita tipo il classico Blink ma con uno stato OFF diverso da ON

tipo il codice in esempio

digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(500);              // wait for 500ms

ma puoi vederele come due operazioni "distinte" ;)..devi solo calcolare i tempi

a t = 0 accendi il led

a t = 0+ 500 spegni

a t = (0+500+1300) riaccendi e cosi via....

Praticamente vuoi sostituire la Funzione delay , con una tua funzione fatta utilizzando millis.

Creati una funzione nuova esterna al void loop ()

tipo f_delay che abbia un parametro di input che sono i millisecondi di attesa, e all'interno della quale gli fai fare un ciclo ripetitivo per la durata dei millisecondi da te impostati...

X Martinix : ho capito quello che intendi...

:disappointed_relieved: :disappointed_relieved: ma non riesco a metterlo in pratica, se provo ad utilizzare le due funzioni una per l'HIGH ed una per il LOW, il led resta sempre spento :disappointed_relieved: :disappointed_relieved:

X Xenox75 : utilizzare una funzione esterna con il delay mi riporta indietro, necessito della funzione millis per non bloccare il codice :confused:

Vuoi un tempo in cui rimane acceso (chiamiamolo ton) diverso dal tempo in cui rimane spento (chiamiamolo toff).
Devi definire due variabili unsigned long che chiamerai ton e toff alle quali assegni i millisecondi che ti servono.
Quindi se vuoi 1 secondo acceso e mezzo secondo spento fai
unsigned long ton = 1000;
unsigned long toff = 500;
ti appoggi ad una terza variabile interval che inizialmente metti come toff visto che all'inzio è spento
unsigned long interval = toff;
Queste sono variabili globali, quindi definite fuori dal loop e dal setup.
Dentro il loop metti ora la verifica if millis() - previousmillis > interval
se lo è, allora * se ledstatus==0 metti ledstatus = 1 ed interval = ton invece se ledstatus==1 metti ledstatus = 0 ed interval = toff

Ti ho dato solo dei suggerimenti, altrimenti ti avrei tolto il piacere di scrivere da te il codice.

EDIT: * ovviamente metti anche previousmillis = millis()

intendevo uan cosa del genere...

unsigned long T_corrente=0;
boolean stato =0;

void setup()
{
  delay (1000);
  pinMode(13, OUTPUT);
}

void loop()
{
  unsigned long tempo = millis();
  if (tempo - T_corrente > 2000 && stato ==0)
  {
    T_corrente = tempo;
    digitalWrite (13, HIGH);
    stato =1;
  }
  
  if (tempo - (T_corrente )>300 && stato ==1)
  {
    T_corrente = tempo;
    digitalWrite(13,LOW);
    stato =0;
  }
  
}

Non era cosi difficile....(se ce la faccio io a farlo ce la puo fare veramente chiunque) :slight_smile:

grazie martinix, sei stato gentilissimo :smiley: :smiley: :smiley: se non fosse stato per il codice giuro che non ci sarei mai arrivato...

GRAZIE MILLE :smiley: :smiley: :smiley:

prima di scrivertelo non lo sapevo fare nemmeno io ma con 10 minuti ( e non esagero) di "stdudio" e 2 o 3 prove..ne son uscito :stuck_out_tongue: