Aggiungere lo sleep su Attiny85

Ciao a tutti e un grande grazie a chi mi aiuta, sono alla fine di un mio piccolo circuito che per voi sembrerà una cavolata per me è la soluzione di mille problemi, ho finalmente trovato che far un circuito switch con un pulsante piezo e attiny85 che mi risolva il problema che qualsiasi altro circuito aveva e cioè che quando il pulsante prendeva un colpo accidentale si accendeva o si spegneva (on/off), con questo sketch non succede, però ho un altro problema visto che il tutto va montato e funziona a batterie volevo che attiny85 andasse in sleep quando era spento per portare i consumi al minimo possibile e cercando ho inserito lo sleep ma sicuramente sbaglio qualche cosa, perché adesso con lo sleep mi consuma di più, per favore mi dite cosa sbaglio grazie

#include <avr/sleep.h>

const int led = 0;
const int button = 1;
int led_state = LOW;

// Button states and debounce
int buttonState = 0;
int lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;

void PowerDown () {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  ADCSRA &= ~(1<<ADEN);       // Turn off ADC to save power
  sleep_enable();
  sleep_cpu();
}

void setup() {
  pinMode(led, OUTPUT);
  pinMode(button, INPUT_PULLUP);
}

void loop() {
  int reading = digitalRead(button);
  if (reading != lastButtonState)
    lastDebounceTime = millis();

  if ((millis() - lastDebounceTime) > 25) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == LOW) {
        led_state = !led_state;
      }
    }
  }

  lastButtonState = reading;

  digitalWrite(led, led_state);
}

mi pare strano che nessuno sappia darmi una mano

Vedo che hai creato una routine PowerDown(), ma poi non la richiami mai.

Ti sei dimenticato di postare qualche parte di codice?

GianlucaB:
Vedo che hai creato una routine PowerDown(), ma poi non la richiami mai.

Ti sei dimenticato di postare qualche parte di codice?

no quello è tutto il codice, dimmi cosa ho dimenticato grazie

lidas:
no quello è tutto il codice, dimmi cosa ho dimenticato grazie

Cosa non Ti é chiaro?

Ciao Uwe

Quello che devo aggiungerei

Devi chiamare PowerDown quando deve intervenire lo sleep.

#define tempo_di_spegnimento 120000 // 2*60*1000 = 2 minuti in millisecondi.

void loop()
{
...
if(millis()-lastDebounceTime>tempo_di_spegnimento) PowerDown();
}

Scusate ma non ho capito

Devi mandarlo in sleep quando lo ritieni opportuno…

Ovvero anche se metti la funzione PowerDown() con tutte quelle righe dentro, se nel programma poi non chiami la funzione, non serve a nulla.
Nella loop() da qualche parte, devi richiamare la funzione, ovvero devi avere una riga PowerDown();
Ma ti suggeriscono di richiamarla in base ad un timer

Ma comunque mi pare strano basti quello. Lo mandi in sleep ma quando lo risvegli ?
Qui in questo tutorial oltre ad andare in sleep, il chip viene risvegliato ogni tot tempo con l'uso di watchdog: Sleep Modes on ATTiny85 – Renewable Energy Innovation

Dovrei poterlo risvegliare ogni volta che premo il pulsante

Con l'interrupt

È una settimana che provo e riprovo senza riuscire, adesso sono al punto che avrei bisogno di provare una cosa più dettagliata, non c’è nessuna buonanima che prende quel codice che ho messo io e me lo modifica come andrebbe sempre per favore

Nessuno ha la voglia di dare una mano

Google: Arduino sleep interrupt

Non ho mai utilizzato la funzione sleep, ma come avrai capito, dopo aver creato la procedura per mettere il processore in sleep, è necessario creare anche un altra procedura per risvegliare il processore.

Il risveglio avviene tramite interrupt, ovvero un segnale su un pin dedicato, attenzione che ci sono pin dedicati, ogni processore ha i suoi pin di interrupt dedicati.
Quando il pin prescelto per l’interrupt va alto, o basso, o cambia il suo stato, si scatena l’interrupt, e quindi viene eseguita la relativa routine di interrupt, dove metterai il comando per disabilitare lo sleep, e tutte le istruzioni che ti servono.

Purtroppo leggendo in giro il tuo attiny85 non ha l’interrupt integrato, però vedo che esiste una libreria da integrare per utilizzare interrupts anche sul attiny85.

Segui questa guida.

Uh?... Ha 6 PinChangeINTerrupt, di cui uno è anche INT 0!...

Ho provato a caricare questo, do tensione il led lampeggia poi va in sleep

#include <avr/sleep.h>    // Sleep Modes
#include <avr/power.h>

const byte LED = 3;  // pin 2
const byte SWITCH = 4; // pin 3 / PCINT4

ISR (PCINT0_vect)
{
// do something interesting here
}

void setup ()
  {
  pinMode (LED, OUTPUT);
  pinMode (SWITCH, INPUT);
  digitalWrite (SWITCH, HIGH);  // internal pull-up
 
  // pin change interrupt (example for D4)
  PCMSK  |= bit (PCINT4);  // want pin D4 / pin 3
  GIFR   |= bit (PCIF);    // clear any outstanding interrupts
  GIMSK  |= bit (PCIE);    // enable pin change interrupts
 
  }  // end of setup

void loop ()
  {
  digitalWrite (LED, HIGH);
  delay (500);
  digitalWrite (LED, LOW);
  delay (500);
  goToSleep ();
  }  // end of loop
 
 
void goToSleep ()
  {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  ADCSRA = 0;            // turn off ADC
  power_all_disable ();  // power off ADC, Timer 0 and 1, serial interface
  sleep_enable();
  sleep_cpu();                             
  sleep_disable();   
  power_all_enable();    // power everything back on
  }  // end of goToSleep /code]

come faccio e inserire l'atra parte cioè quella con il bounce e che vada in sleep solo quando il led è spento, questa è l'altra parte come si integrano assieme

const int led = 0;
const int button = 1;
int led_state = LOW;

// Button states and debounce
int buttonState = 0;
int lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;

void setup() {
  pinMode(led, OUTPUT);
  pinMode(button, INPUT_PULLUP);
}

void loop() {
  int reading = digitalRead(button);
  if (reading != lastButtonState)
    lastDebounceTime = millis();

  if ((millis() - lastDebounceTime) > 50) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == LOW) {
        led_state = !led_state;
      }
    }
  }

  lastButtonState = reading;

  digitalWrite(led, led_state);
}

Nessun sa aiutarmi