Which is better millis() or timer?
It depends on your need:

1. No other activities / main power

If during those 30 minutes (I guess), the MCU does not have to do anything else (except maybe handling some short interrupts), than you can use a delay. You can use this if your power source is an adapter, but you waste a lot.


Advantage: Easy to program
Disadvantage: Power will continue to be used.


2. No other activities / battery

If you have the same conditions as above, but using a battery, than as Juraj mention, use the sleep functionality of the Arduino. You need an (external) real time clock or other circuitry to activate the wakeup signal after 30 minutes.


Advantage: Very less power used during the 30 minute delay
Disadvantage: Slightly more programming


3. Other activities

If you want to do now (or later) other code to be executed during the 30 minute wait, use millis(). For example, when you want to extend your project using other libraries that needs a faster than 30 minute response.


Advantage: You can do other tasks meanwhile
Disadvantage: More power usage, slightly more programming