attachInterrupt(digitalPinToInterrupt(interruptPin), rainTrigger, FALLING);
...
void rainTrigger() {
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
Don't ever use delay() inside an interrupt. Yes it works, but that pretty much destroys any other interrupts, including the one that keeps track of millis() for you.
The rain trigger interrupt should turn the LED on, then increment the counter and set the timer. Then the main loop can look at the timer to see if it must turn the LED off
void loop() {
if(millis() - last_interrupt_time > 100) digitalWrite(13,LOW); //turn off the LED that flashes for each rain trigger
if (currentMillis - previousMillis2 >= interval2) {
previousMillis2 = currentMillis;
You realize that sometimes you can skip a millisecond? The delay above is one cause but it can even occur in a correctly-written program. So previousMillis2 ends up 'late' by 1 millisecond, or maybe more. Instead of updating it to the current (late) time, just add interval2 to it. That way the next event won't slip even later.