Allora ho fatto tutt'e tre le prove ma il risultato no cambia
Qui www.michelemenniti.it/VHD/Elettronica/Sleep1.jpg la foto della prova SU Arduino 2009, con il tuo code, ho provato anche a disattivare la pull-up e, ovviamente, la riattivazione, in modo da mandarlo a dormire per sempre, ma non cambia nulla.
Invece ho fatto la prova che ti dicevo (disabilitare le periferiche oltre allo sleep). Questo il code:
// **** INCLUDES *****
#include <avr/sleep.h>
#include <avr/power.h>
// ***** CONSTANT *****
#define MAX_PIN_COUNT 22 // Digital IO 0-13, Analog A0-A7
void setup()
{
uint8_t pin;
// Put all pins into output mode and low state
for (pin = 0; pin < MAX_PIN_COUNT; pin++)
{
pinMode(pin,OUTPUT);
digitalWrite(pin,LOW);
}
// Set sleep mode
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
// Enable sleep mode
sleep_enable();
// Disable ADC, must be done before calling
// power_all_disable() as to disable ADC,
// clock is required
// Refer to datasheet page 45
ADCSRA &= ~(1 << ADEN);
// Disable all peripheral power
power_all_disable();
// Enter sleep mode
sleep_mode();
}
void loop()
{
// Zzz...
}
e questo il risultato nelle stesse condizioni hardware:
www.michelemenniti.it/VHD/Elettronica/Sleep2.jpg cioè 18µA invece di 90-100µA; oltretutto questo link, da cui ho preso il code
dice chiaramente di aver ottenuto un consumo di 2,1-2,4µA con questa microboard stand alone a 8MHz, quindi forse la differenza ci sta con i miei 18µA (16 a 3,6V sempre a 16MHz).
A questo punto temo davvero che tu sia riuscito in un'impresa unica, per cui ora sarebbe utile che qualcuno di buona volontà facesse la stessa prova per vedere i risultati.
Nel frattempo vorrei capire come dare a questo code la stessa organizzazione del tuo, visto che questo chiude tutto e se ne va a dormire; invece a me serve proprio di mandarlo a nanna richiamando una funzione quando dico io. Inoltre ho sempre il problema del contatto NC che comunque mi consumerebbe tanto, quindi dovrei impostare una logica diversa in considerazione del fatto che il sensore nella maggior parte dei casi è in posizione NC e ogni tanto capiterà in NA.
Risolti questi problemi col software io sarei a posto (al di là del dubbio che mi rode su questa cosa) in quanto una batteria di 1200mAh con un consumo che è quasi sempre di una paio di µA in teoria mi dura un tempo che va molto oltre la durata stessa della batteria, in termini di autoscarica, quindi lo scopo è raggiunto!
EDIT: aggiungo l'ulteriore prova, lo stesso sketch caricato su un chip impostato a 1MHz o 8MHz in stand alone ora misura 0,0-0,1µA oscillanti, è la risoluzione minima del mio multimetro, quindi penso proprio che finalmente siamo nel "campo" dei nanoA (mettendo un qualsiasi pin a 5V mediante una R il consumo sale subito, segno che è vivo...). Quindi l'unico dubbio che mi viene è: non è che la tua libreria sleep integra anche questi altri comandi, io uso quella originale fornita con la 0022.
Grazie ancora.
EDIT_2: dopo 1 miliardo di prove sono giunto alla conclusione che è sufficiente aggiungere al tuo code la SOLA riga:
ADCSRA &= ~(1 << ADEN);
per portare il consumo a "0" (per dire alcuni nA), quindi ora il mio circuito in sleep mode consuma "0" oppure 100µA in base alla posizione del sensore, ma mi sono reso conto che la durata di NC e NA nella rotazione si equivalgono quindi è inutile invertire la logica.
Allora il problema di questo topic è risolto, il chip ora a riposo consuma corrente nell'ordine dei nA. Ora ne apro un altro per risolvere il problema del sensore, topic al quale sei UFFICIALMENTE invitato!
Grazie astrobeed, alla fine ce l'abbiamo fatta, devo naturalmente ringraziare anche ypkdani, Marco Benini, Leo72 e tutti coloro che sono intervenuti fornendomi indicazioni per risolvere il problema!
EDIT_3: ho risolto mettendo una pull-up esterna da 180K, lo so che è eccessiva ma riesce comunque ad evitarmi il loop del sensore ed il consumo scende a soli 20µA, ho provato con 4 diversi chip e nessuno mi ha dato problemi.