How to use millis instead of delay on Arduino for independent time intervals for two output pins

I wanted to use millis for the code below but stuck in between . can anyone help to change the given code to millis? Code here:

``````    void set(){
digitalWrite(on, HIGH);   // turn the motor on (HIGH is the voltage level)
delay(1500);
digitalWrite(on, LOW);
delay(ont);               //waits for given time
digitalWrite(off, HIGH );    // stop the motor
delay(500);
digitalWrite(off, LOW );
delay(offt);                  //wait for different
``````
• See arduino.cc/en/tutorial/BlinkWithoutDelay I see four different things. Use a counter from 0...3 and adjust the interval for each of the four situations. Can you give that a try and show a working sketch (so we can try your sketch). Do you have different pins for turning the motor on and off?
– Jot
Jan 31 '19 at 7:48

Here is the code for changing pin value without delay. Read it and try it.

``````#define on 2
#define off 3

//delay times
const unsigned int ont = {1500,  500};
const unsigned int offt = {500, 300};

//last millis
unsigned long last_tm_on = 0;
unsigned long last_tm_off = 0;

//position
byte pos_on = 0;
byte pos_off = 0;

void setup(){
pinMode(on, OUTPUT);
pinMode(off, OUTPUT);
}

void loop(){
if(millis() - last_tm_on >= ont[pos_on]){   //check if millis() - last millis() is bigger than wanted time
last_tm_on = millis();   //save last millis()
if(pos_on == 0) digitalWrite(on, HIGH);
if(pos_on == 1) digitalWrite(on, LOW);

if(pos_on > 1) pos_on = 0;   //check max position
}

if(millis() - last_tm_off >= offt[pos_off]){
last_tm_off = millis();
if(pos_off == 0) digitalWrite(off, HIGH);   // turn the motor on (HIGH is the voltage level)
if(pos_off == 1) digitalWrite(off, LOW);

pos_off ++;
if(pos_off > 1) pos_off = 0;
}
}
``````
• Matej, there is only one motor and you have two independent software timers with millis.
– Jot
Jan 31 '19 at 20:38
• @Jot I thought, that on is one motor and off second. Lol Jan 31 '19 at 20:41