Algunas cosas sobre los ATtiny: Los ATtiny13 y el los ATtiny25/45/85 se parecen pero no son lo mismo

Al recuperar el código deepsleep del proyecto del sensor de temperatura de hace unos años no funcionaba con el ATtiny85>. Resulta que los interruptores se denominan de forma diferente, es el caso de WDTIE (Watchdog Timer Interrupt Enable), que es el sexto bit de WDTCR (Watchdog Timer Control Register) en los ATtiny25/45/85, y sirve para activar el reloj del watchdog. En los ATtiny13 se llama WDTIE, y no es nada evidente.

Éste es el código corregido y ampliado para el sensor antiguo.

#include <avr/interrupt.h>
#include <avr/sleep.h>

// Pin 4 for MOSFET
int mosfet = 4;
int watchdog_counter = 0;

ISR(WDT_vect) {
  watchdog_counter++;
}

void getreadytosleep(){
  // Disable ADC
  ADCSRA &= ~(1<<ADEN);
  
  // Prescale timer
  // WDTCR |= (0<<WDP3 )|(0<<WDP2 )|(0<<WDP1)|(0<<WDP0) // 16ms
  // WDTCR |= (0<<WDP3 )|(0<<WDP2 )|(0<<WDP1)|(1<<WDP0) // 32ms
  // WDTCR |= (0<<WDP3 )|(0<<WDP2 )|(1<<WDP1)|(0<<WDP0) // 64ms
  // WDTCR |= (0<<WDP3 )|(0<<WDP2 )|(1<<WDP1)|(1<<WDP0) // 125ms
  // WDTCR |= (0<<WDP3 )|(1<<WDP2 )|(0<<WDP1)|(0<<WDP0) // 250ms
  // WDTCR |= (0<<WDP3 )|(1<<WDP2 )|(0<<WDP1)|(1<<WDP0) // 500ms
  // WDTCR |= (0<<WDP3 )|(1<<WDP2 )|(1<<WDP1)|(0<<WDP0) // 1s
  // WDTCR |= (0<<WDP3 )|(1<<WDP2 )|(1<<WDP1)|(1<<WDP0) // 2s
  // WDTCR |= (1<<WDP3 )|(0<<WDP2 )|(0<<WDP1)|(0<<WDP0) // 4s
  WDTCR |= (1<<WDP3 )|(0<<WDP2 )|(0<<WDP1)|(1<<WDP0); // 8s
  // Enable watchdog timer interrupts
  WDTCR |= (1<<WDTIE);
  WDTCR |= (0<<WDE);
  sei(); // Enable global interrupts
  // Use the Power Down sleep mode
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}

void setup() {
  getreadytosleep();
}
// the loop routine runs over and over again forever:
void loop() {
  sleep_mode();
  if(watchdog_counter > 225) {

    watchdog_counter = 0;

      pinMode(mosfet, OUTPUT);
      digitalWrite(mosfet, HIGH);   // switch the MOSFET
      delay(5000);               // wait for five a second
      digitalWrite(mosfet, LOW);
  }
}
ODE_PWR_DOWN);
}

void setup() {
  getreadytosleep();
}
// the loop routine runs over and over again forever:
void loop() {
  sleep_mode();
  if(watchdog_counter > 225) {

    watchdog_counter = 0;

      pinMode(mosfet, OUTPUT);
      digitalWrite(mosfet, HIGH);   // switch the MOSFET
      delay(5000);               // wait for five a second
      digitalWrite(mosfet, LOW);
  }
}