Assorbimento in sleep_power_down dovuto alla seriale
buongiorno tutti.
come da titolo chiedo un vostro consiglio riguardo 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 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 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 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 170ua. non sono riuscito in nessuna maniera 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 2 conduttori ma non si spiega.
questo è il codice del programma.
apparte questa pecca ed altre cose minori gira abbastanza bene se può essere utile qualcuno.
grazie tutti.
come da titolo chiedo un vostro consiglio riguardo 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 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 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 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 170ua. non sono riuscito in nessuna maniera 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 2 conduttori ma non si spiega.
code: [select]
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 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 pir off
radio.write( datatosend, sizeof(datatosend) );
radio.powerdown(); //spengi il tx
funzionesleep(); //richiama la funzionesleep e manda il micro dormire.
}
else
{
datatosend[0] = 101; // inizia col caricare l'identificativo nel payload che andremo 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 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 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 moduli
}
questo è il codice del programma.
apparte questa pecca ed altre cose minori gira abbastanza bene se può essere utile qualcuno.
grazie 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 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 sinistra).
grazie.
guglielmo
... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (in basso 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 sinistra).
grazie.
guglielmo
Arduino Forum > International > Italiano > Software (Moderator: leo72) > Assorbimento in sleep_power_down dovuto alla seriale
arduino
Comments
Post a Comment