Oscillatore con durata TON e TOFF variabile per stazione metereologica

Salve a tutti vorrei realizzare un oscillatore che funzioni con un alimentazione di 5V e che abbia a un tempo di TON di 1 secondo e di TOFF di 2 ore, mi servirebbe per collegarlo all'arduino, per gestire la modalità sleep attraverso un interrupt, scusatemi non vi ho spiegato cosa ho intenzione di fare!! l'idea è quella di realizzare una mini stazione metereologica alimentata con pannello solare regolatore e batteria e di inviare attraverso un router wireless i dati su un pc che ha sua volta li inserisce in un db mysql e da lì, porte spalancate alla fantasia.

Sensori: umidità e temperatura DHT22
luminostà TEMT6000
pressione BMP085
Board: Arduino uno
Shield: Ethernet
Router: non ancora deciso
Pannello solare: non ancora deciso
Batteria: non ancora deciso

Ieri ho tirato un pochino di craniate al monitor per far funzionare il DHT22, gli altri sensori non li ho ancora provati e nemmeno la parte della rete, comunque ritorniamo al problema odierno asd :slight_smile: ....
Il clock sta 2 ore giu, dopo va su per un 1 secondo , appena va su con un interrupt catturo l'evento e risveglio arduino dalla modalita sleepp , rilevo i dati dai sensori li invio al server, il server risponde all'arduino e rivà in sleep. e cosi il ciclo continua, dovrebbe essere di tipo astabile dunque.

Problema principale, non so quale circuito usare per realizzare questo oscillatore, ho googlato parecchio ma nella mia inesperienza nel campo dell'elettronica non sono riuscito a carpire ciò che mi serviva, ho trovato solo la configurazione NE555 che dimensionandolo noto che i componenti assolutamente non vanno bene, sono troppo grossi come valore, avete delle idee in merito vi ringrazio molto.

Ciao intanto ti rispondo poi se mi capita qualche schema te lo posto.
Il 555 va bene per generare tempi non troppo lunghi insieme a quello devi usare dei contatori in cascata ad esempio CD4017 o altri (conta fino a 10) di modo che il 555 conta 1s,vai al 4017 e avrai in uscita 10s,vai ad un altro 4017 e avrai in uscita 100s.
Usalo solo come concetto per renderti l'idea di come si può arrivare a ciò che ti serve.

non male come ide affatto, cerco qualche contatore, intanto continuo con la ricerca degli oscillatori grazie!!

Guarda anche questohttp://elettronica.plcforum.it/index.php?/topic/7605-ne555-astabile/
La proposta sta nel CD4060,e qui il datasheethttp://www.datasheetcatalog.net/it/datasheets_pdf/C/D/4/0/CD4060.shtml
Se hai bisogno di precisione puoi anche usare un quarzo.

Per queste cose il CD4060 è perfetto!
Utilizzandolo anche da solo con qualche componente esterno e un paio di calcoli sui divisori si risolve il problema di certo :slight_smile:

scusate, ma sicuri che una soluzione del genere consumi meno di arduino in sleep con solo un timer acceso? (mi pare che sia il 2° tipo di sleep su 3)

Grazie a tutti ora guardo il Datasheet, la domanda di Lesto effettivamente mi imprime il dubbio, chi consumerà di più?
Arduino e tutto il resto acceso o il CD4060 con arduino in sleep, mi è venuta un altra idea, invece che mandarlo in sleep se gli togliessi proprio alimentazione con un relè ad esempio che dite è fattibile o è un idea stupida?

l'arduino messo ai minimi storici consuma 1 ua, ma comunque disabilitando I2C e robe simili, arrivi ad un rispettabilissimo 239ua...

http://www.sparkfun.com/tutorials/309

Madosca ho visto le foto sembra una centrale nucleare :cold_sweat:

Abbandono pure subito questa strada (555, oscillatore esterno, etc..) se vuoi fare qualcosa di efficiente dal punto di vista energetico.

La cosa più efficace è mandare in sleep profondo il micro lasciando solamente il watchdog attivo (è alimentato tramite un clock interno dedicato a basso consumo, consuma meno di un timer), lo sleep profondo può durare col watchdog massimo 8 secondi dopodichè si incrementa una variabile e si rimanda a nanna se non si è raggiunto il valore desiderato per raggiungere le due ore.

Ciao

uhmm chissà chi vince, watchdog + sleep pesante o timer + sleep leggero...
tutto dipende dal consumo in fase di reset

Per mandarlo in sleep profondo ai qualche link? quello postato prima è un po' setoloso come dire.... :disappointed_relieved:

Trovato qualcosa di interessante:

http://www.engblaze.com/hush-little-microprocessor-avr-and-arduino-sleep-mode-basics/

cavolo sarà una lunga nottata.....

timer ed interrupts :slight_smile: http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/

Sembra difficile ma alla fine (dopo che lo si è imparato) sembra veramente banale.
Ecco un buon link: Embedded Systems: Sleeping Arduino - Part 5 Wake Up Via The Watchdog Timer
Il primo link che hai postato serve per fare il reset col watchdog, a noi al momento interessa solamente usare il watchdog come timer

Ti spiego brevemente io alcune cose che sicuramente è meglio del link :slight_smile:

Allora, esistono due registri, WDTCSR (Watchdog timer Control Register) che è usato per configurare il time out e la modalità operativa e il registro MCUSR (MCU Status Register) usato per dire la causa dell'ultimo reset, come ad esempio un brown-out, un watchdog reset, etc.
E' importante però seguire una procedura precisa per impostare questi registri per evitare risultati inattesi, bisogna disabilitare gli interrupt, ecco un esempio:

void setupWatchdog(byte wdp0, byte wdp1, byte wdp2, byte wdp3) {
  // WDTCSR - Watchdog timer Control Register, used for configuring the time-out, mode of operation, etc.
  // MCUSR - MCU Status Register, used to tell the cause of the last reset, such as brown-out reset, watchdog reset, etc.
  // NOTE: for security reasons, there is a timed sequence for clearing the WDE and changing the time-out configuration.
  // If you don't use this sequence properly, you'll get unexpected results.
  cli(); //disable global interrupts
  wdt_reset();
  MCUSR &= ~(1<<WDRF);  // Clear the reset flag  
  // In order to change WDE or the prescaler, we need to set WDCE (This will allow updates for 4 clock cycles)
  WDTCSR |= (1<<WDCE) | (1<<WDE);  // Set WD_ChangeEnable and WD_resetEnable to alter the register  
  WDTCSR = wdp0<<WDP0 | wdp1<<WDP1 | wdp2<<WDP2 | wdp3<<WDP3;    // set new watchdog timeout value    
  WDTCSR |= _BV(WDIE);  // Enable the WD interrupt (note no reset)  
  sei(); //enable global interrupts
}

In questo codice è usata l'istruzione un pò strana _BV ma coi commenti dovrebbe essere abbastanza "capibile"
E' importante per far funzionare il WD implementare una funzione Interrupt Service come questa di esempio

volatile boolean f_wdt=1;
// Watchdog Interrupt Service / is executed when  watchdog timed out
ISR(WDT_vect) {
 f_wdt=1;  // set global flag
}

Infine il codice per mandare a nanna il micro

void Sleep()
{
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    // Set sleep enable (SE) bit:
    sleep_enable(); 
    // Put the device to sleep:
    sleep_mode(); // ZZZ....
    // Upon waking up, sketch continues from this point.
    sleep_disable();
}

// Funziona da chiamare per mandare in Sleep per un secondo il micro
void sleepSecond()
{
    setupWatchdog(0,1,1,0);
    Sleep();
}

Magari apro un nuovo topic e ti spiego meglio più tardi, ora devo scappare
Ciao

ma quindi il watchdog non resetta per forza, ma si può sfruttare l'ISR senza resettare'

Grazie ancora a tutti !!!

ma quindi il watchdog non resetta per forza, ma si può sfruttare l'ISR senza resettare'

domandina l'ISR è un servizio giusto? ma come funziona?

se non ho capito male è il servizio avviato dall'interrupt di fine watchdog?

il quale setta il flag f_wdt=1; // set global flag

dalla libreria interrupt.h
ora ho capito come funziona la funzione ISR.

http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html#gad28590624d422cdf30d626e0a506255f

Posto che magari serve a tutti :slight_smile:

le ISR sono funzioni di interrupt, nelle prime aree di memoria c'è una tabella di puntatori alle varie ISR possibili. gli indirizzi di queste aree di memoria sono prefissate nell'architettura del micro
Quando avviene un interrupt, esso preleva il puntatore a funzione nella sua area di memoria, ed avvia la funzione corrispondente (notare chè è esattamente come una chiamata a funzione, si salva lo stato in stack etc.. etc..)

La stessa cosa la fanno anche le CPU moderne, e l'interrupt rimane contestuale al programma che stava in CPU al momento del lancio dell'interrupt... ma quì le cose si complicano un poco :slight_smile:

se ti interessa la cosa, si tratta si architettura di sistemi, e ti spiega come passare dal mero 0/1 ad avere un sistema funzionante in grado di svolgere semplici operazioni (che poi il programmatore utilizza per crearne di più complesse)

allora! non capisco la riga

MCUSR &= ~(1<<WDRF);

l'operatore &= che significato ha?

non vorrei sbagliare ma sembra che setti il 3 bit WDRF del registro MCUSR, guardando il datasheets questo bit viene settato se accade un reset del watchdog e viene resettato se viene messo il flag a zero o dal power-on reset, il commento difatti dice clear the reset flag ma perche quell'uno e quell'operatore ?