millis() resets every time I open the Serial Monitor

Then disable the autoreset while doing this - put a 10uf cap (or anything around there - exact value isn't critical) between reset and ground. Note that you need to remove that in order to upload new sketch - autoreset is used for that.