Rain Data Calculation

  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.