Assorbimento in sleep_power_down dovuto alla seriale

Buongiorno a tutti.
come da titolo chiedo un vostro consiglio riguardo a un anomalia che ho riscontrato nel mio progetto.

Sto costruendo un sistema di antintrusione con vari trasmettitori sparsi per la casa che attraverso l NRF24 spediscono ad una base ricevente i dati relativi ad un pir e ad un contatto porta presenti sullo stesso modulo trasmettitore.

Per preservare la batteria ho optato per un Atmega328 standalone su una piccola scheda con clock interno ad 8 mhz(quindi senza quarzo) alimentato a 3.3v tramite una batteria gh14500

Il software se non rileva movimenti e le porte sono chiuse manda il micro in sleep e si risveglia solo se triggerato da uno dei 2 interrupt. INT0 e INT1 associati a PIR e Contatto reed spedendo poi lo stato alla ricevente.

Durante le prove mi sono accorto che finche alimentavo il micro con la 3.3 dell arduino 1 tutto funzionava bene. Se non veniva rilevato nessun segnale il micro andava in sleep e l assorbimento era quello da specifica intorno ai 30uA
Se provavo ad alimentarlo con la batteria del mio modulo durante lo sleep l assorbimento saliva fino a 170uA. Non sono riuscito in nessuna maniera a capire il motivo di questo fenomeno.
Mi sono successivamente accorto che anche se alimentato con la 3.3 di arduino il micro assorbiva 170uA se disconnettevo RX e TX.
Appena li riconnettevo l assorbimento scendeva di nuovo ai valori di data sheet. ho provato con pullup,pulldown settando RX e TX attivi alti e bassi ma non cambia niente.

Se disconnetto dal micro (che ricordo essere cablato insieme ai suoi accessori su una schedina millefori)
RX e TX ho questo incremento di assorbimento. Stavo pensando potesse essere il fatto che rimangano appesi i 2 conduttori ma non si spiega.

void setup()  
{
 while(!Serial); //Lascia caricare la seriale
 Serial.begin(115200); // le comunicazioni su seriale vanno utilizzate il meno possibile perche danno problemi in fase di risveglio. in operativo disabilitare tutto.
 pinMode(ContactWake, INPUT_PULLUP);
 pinMode(PIRWake,INPUT);
 pinMode (PIRpin, INPUT);
 pinMode (ContactPin, INPUT);
 pinMode (PinBatt, INPUT);
 radio.begin();
 radio.openWritingPipe(pipe);
 radio.setPALevel(RF24_PA_MAX); 

}


void loop()


{ 

 if (digitalRead(PIRWake) == LOW && digitalRead (ContactWake) == LOW) // Se il pin contatto è Basso (il che vuol dire che il contatto è chiuso e lo sta portando verso massa)
                                                                   // ed il pin PIR è basso (il pir non rileva nessun movimento)
   {
   datatosend[0] = 101; // inizia col caricare l'identificativo nel payload che andremo a spedire (payload0)
   datatosend[1] =  4;// carica sul payload 1 (quello del contatto) il valore 4 (porta chiusa)
   datatosend[2] = printVolts();     // carico il valore di tensione della batteria dentro il payload2  
   datatosend[3] =  2; // Carico sul payload del pir il valore 2 che corrisponde a PIR OFF
   radio.write( datatosend, sizeof(datatosend) );
   radio.powerDown(); //Spengi il TX
   funzioneSleep(); //richiama la funzioneSleep e manda il micro a dormire.
   }
   
else

   {
   datatosend[0] = 101; // inizia col caricare l'identificativo nel payload che andremo a spedire (payload0)
   datatosend[2] = printVolts();     // carico il valore di tensione della batteria dentro il payload2  
   antiintrusione();  //avvio la funzione antiintrusione
   }

} 


//////////////////////////////////// FUNZIONI////////////////////////////////////////
 
void antiintrusione() //La funzione principale del sistema. L'anti intrusione

{
 if (digitalRead (PIRpin) == HIGH)// NEl caso in cui il PIR rileva un movimento la sua uscita va alta. Quindi se la lettura digitale della variabile è alta...
                          
 {
   datatosend[3] = 1; //il dato da spedire diventa 1
   //Serial.print (datatosend[3]);  //stampa su seriale il messaggio che viene spedito
   //Serial.println (" --> PIR ON");
 }
 
   else //altrimenti..
 { 
   datatosend[3] = 2; //il messaggio da mandare diventa 2
  //Serial.print (datatosend[3]);
  //Serial.println (" --> PIR off");
 }
      
    
    if (digitalRead (ContactPin) == HIGH)//Se qualcuno apre la porta per entrare in casa il contatto si apre e non avendo piu il GND che tiene basso il livello la resistenza di pullup porta alto l ingresso
 {
   datatosend[1] = 3;
   //Serial.print (datatosend[1]);
   //Serial.println (" --> Contact OPEN");
 }
   else
 { datatosend[1] =  4;
  //Serial.print (datatosend[1]);
  //Serial.println (" --> Contact Closed");      
 }
               
radio.write (datatosend, sizeof(datatosend)) ; // finito il ciclo spedisco tutto all'RX

//Serial.println("Sent");
}







int printVolts() //Questa funzione permette di misurare la tensione di batteria attraverso il pin A0 del ATmega e siccome restituisce un valore integer sarà int

{
 pinMode (PinBatt, INPUT);
  int ValPinBatt = analogRead(PinBatt); //legge il valore dall ingresso Analogico A0
 
 
 //float voltage = 0; //inizializziamo a 0 la variabile voltage
  int  Vpin_perc = map (ValPinBatt, 0, 1023, 0, 333);
 //voltage = Vpin_perc / 100;  //converte il valore in una tensione vera. in pratica divide il voltaggio massimo per 1023 che sarebbero i bit di campionamento.
 //float voltage = ValPinBatt*(3.33 / 1023);
 
 //Serial.print ("voltage ");
 //Serial.println (voltage);
                               
 return (Vpin_perc) ;                            

 }

 void funzioneSleep(void)
{
 Serial.flush();
 Serial.end();
 
 byte adcsra_save = ADCSRA; // memorizzo lo stato del sottosistema ADC prima di disabilitarlo
  ADCSRA = 0; // disabilito il sottosistema ADC
  //power_all_disable();
 // set_sleep_mode(SLEEP_MODE_IDLE);       // tipo di modalità usata
 // set_sleep_mode(SLEEP_MODE_ADC);      // tipo di modalità usata
 // set_sleep_mode(SLEEP_MODE_PWR_SAVE); // tipo di modalità usata
 // set_sleep_mode(SLEEP_MODE_STANDBY);  // tipo di modalità usata
   set_sleep_mode(SLEEP_MODE_PWR_DOWN);    // tipo di modalità usata

 //noInterrupts();
 

 sleep_enable();  // abilito il bit sul registro MCUCR dell'AVR
   //power_adc_disable();
  // power_spi_disable();
// power_timer0_disable();
 //power_timer2_disable();
//power_twi_disable();


 attachInterrupt(0,INT0, RISING);
 attachInterrupt(1,INT1, RISING);

 interrupts();
 sleep_cpu();
 detachInterrupt(0);
   ADCSRA = adcsra_save;  // reimposto l adcsra come era impostato prima dello sleep
   power_all_enable ();   // riattivo tutti i moduli
}

Questo è il codice del programma.

apparte questa pecca ed altre cose minori gira abbastanza bene se può essere utile a qualcuno.

Grazie a tutti.

**>deejayr: **Prima di tutto, essendo questo il tuo primo post, nel rispetto del regolamento, ti chiedo di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il su citato REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Grazie.

Guglielmo

Ciao guglielmo. Ho provveduto a modificare il post ed ovviamente. Gia che c'ero ho pure aggiunto una graffa che mi ero mangiato durante il copia incolla e non permetteva la compilazione..

un saluto.

Damiano

aggiornamento di situazione.
Ho risbrogliato il circuito isolando tutti i collegamenti sensibili dalle alimentazioni ma il problema persiste.
sembra che qualcosa rimanga acceso dentro l AVR
Escludo ci sia qualcosa nei cablaggi.

non capisco ancora da dove possa arrivare questo assorbimento.

Ma i pin scollegati sono portati tramite una resistenza ad un potenziale definito o stanno per aria?
Ciao Uwe

ciao.

nell arduino i pin RX e TX sono in OL tra di loro e battono 10 Mega sia tra gnd e + Vcc
non dispongo di una resistenza così grande adesso ma ho provato con 1 mega e non funziona.
proverò ancora con le resistenze giuste.