Yet Another Tutorial On Timing With millis()/micros()

Your code fires early as millis approaches the wrap.

Assume the current value of millis is 4294967195.

  snapshot_time = millis();
  snapshot_time = 4294967195;

The first if is false (millis and snapshot_time are equal).

The second if becomes this...

if (millis() > snapshot_time + 150)
if (4294967195 > 4294967195 + 150)
if (4294967195 > 49)

...which is true. Yet 150 milliseconds has not elapsed.

This problem has been analyzed to death. I suggest you stick with what has been shown to work reliably (subtraction to calculate elapsed time).