Arduino Forum

International => Italiano => Generale => Topic started by: zioTonino on Jun 14, 2012, 10:02 pm

Title: ciclare in background
Post by: zioTonino on Jun 14, 2012, 10:02 pm
salve a tutti,

vorrei sapere se con Arduino esiste la possibilità, ad esempio, di continuare a far lampeggiare un led piuttosto che il backcolor di un display metre si esegue dell'altro codice.


grazie
Title: Re: ciclare in background
Post by: dalubar on Jun 14, 2012, 10:05 pm
Certo, a tal proposito questo link potrebbe esserti illuminante:
http://arduino.cc/en/Tutorial/BlinkWithoutDelay (http://arduino.cc/en/Tutorial/BlinkWithoutDelay)
Title: Re: ciclare in background
Post by: leo72 on Jun 14, 2012, 10:06 pm
Ci sono 2 metodi.
Il primo è quello più semplice e prevede l'uso di schedulare delle azioni a determinati intervalli semplicemente usando la funzione millis(). Per comprendere meglio il concetto, esamina l'esempio BlinkWithoutDelay: lì trovi 1 azione schedulata ogni 1000 ms, il lampeggio di un led, ma il concetto si può estendere ed applicare ad altri dispositivi.

L'altro metodo, più complesso e che prevede una conoscenza maggiore del microcontrollore, prevede di creare o riusare un simil sistema operativo real timer (RTOS) a cui affidare dei compiti da eseguire ad intervalli programmati.
Title: Re: ciclare in background
Post by: dalubar on Jun 14, 2012, 10:11 pm
Un'altro metodo, meno complesso rispetto al RTOS, è quello di sfruttare gli interrupt di un timer interno per eseguire codice a intervalli regolari. Ad esempio potresti mettere la logica del programma dentro il loop() e inserire il lampeggio del led dentro una chiamata interrupt.

(Hey Leo...vedo che ci siamo quasi ;))
Title: Re: ciclare in background
Post by: menniti on Jun 14, 2012, 10:14 pm

Ci sono 2 metodi.
Il primo è quello più semplice e prevede l'uso di schedulare delle azioni a determinati intervalli semplicemente usando la funzione millis(). Per comprendere meglio il concetto, esamina l'esempio BlinkWithoutDelay: lì trovi 1 azione schedulata ogni 1000 ms, il lampeggio di un led, ma il concetto si può estendere ed applicare ad altri dispositivi.

L'altro metodo, più complesso e che prevede una conoscenza maggiore del microcontrollore, prevede di creare o riusare un simil sistema operativo real timer (RTOS) a cui affidare dei compiti da eseguire ad intervalli programmati.

oooh LLeo, stasera ti si tiene a parlare, così si festeggia, maremma diecimila! :D
Title: Re: ciclare in background
Post by: leo72 on Jun 14, 2012, 10:17 pm

Un'altro metodo, meno complesso rispetto al RTOS, è quello di sfruttare gli interrupt di un timer interno per eseguire codice a intervalli regolari. Ad esempio potresti mettere la logica del programma dentro il loop() e inserire il lampeggio del led dentro una chiamata interrupt.

Volevo inserirlo anche io. Però è bene sempre specificare che le operazioni da inserire negli interrupt devono essere poco impegnative in termini di risorse altrimenti si rischia di bloccare eccessivamente l'esecuzione del programma principale, e che non richiedano l'intervento di funzioni esterne pilotate da altri interrupt: il caso più semplice è l'impossibilità all'interno di un interrupt di usare la millis, ad esempio, per via del fatto che tale funzione è agganciata ad un altro interrupt. E la chiamata ad un interrupt disattiva gli altri interrupt.

Quote

(Hey Leo...vedo che ci siamo quasi ;))

Uh oh....  :)
Title: Re: ciclare in background
Post by: dalubar on Jun 14, 2012, 10:22 pm
Quote
oooh LLeo, stasera ti si tiene a parlare, così si festeggia, maremma diecimila! smiley-grin

Mike, ci penso io  XD

Quote

Però è bene sempre specificare che le operazioni da inserire negli interrupt devono essere poco impegnative in termini di risorse altrimenti si rischia di bloccare eccessivamente l'esecuzione del programma principale, e che non richiedano l'intervento di funzioni esterne pilotate da altri interrupt: il caso più semplice è l'impossibilità all'interno di un interrupt di usare la millis, ad esempio, per via del fatto che tale funzione è agganciata ad un altro interrupt. E la chiamata ad un interrupt disattiva gli altri interrupt.

Infatti ho specificato che poteva usare una funzione molto semplice come il lampeggio che non è impegnativa in termini di risorse.
E' vero che non si può usare la millis() ma come abbiamo visto ormai la delayMicroseconds() è stata ampiamente "sdoganata" e ho notato che viene usata anche da sviluppatori "seri" dentro le interrupt services  XD
Title: Re: ciclare in background
Post by: leo72 on Jun 14, 2012, 10:25 pm


Ci sono 2 metodi.
Il primo è quello più semplice e prevede l'uso di schedulare delle azioni a determinati intervalli semplicemente usando la funzione millis(). Per comprendere meglio il concetto, esamina l'esempio BlinkWithoutDelay: lì trovi 1 azione schedulata ogni 1000 ms, il lampeggio di un led, ma il concetto si può estendere ed applicare ad altri dispositivi.

L'altro metodo, più complesso e che prevede una conoscenza maggiore del microcontrollore, prevede di creare o riusare un simil sistema operativo real timer (RTOS) a cui affidare dei compiti da eseguire ad intervalli programmati.

oooh LLeo, stasera ti si tiene a parlare, così si festeggia, maremma diecimila! :D

Se mi chiamano in causa, come posso non rispondere?  :smiley-yell:
Title: Re: ciclare in background
Post by: leo72 on Jun 14, 2012, 10:27 pm

Quote
oooh LLeo, stasera ti si tiene a parlare, così si festeggia, maremma diecimila! smiley-grin

Mike, ci penso io  XD

Bravo bravo  ;)

Quote

Però è bene sempre specificare che le operazioni da inserire negli interrupt devono essere poco impegnative in termini di risorse altrimenti si rischia di bloccare eccessivamente l'esecuzione del programma principale, e che non richiedano l'intervento di funzioni esterne pilotate da altri interrupt: il caso più semplice è l'impossibilità all'interno di un interrupt di usare la millis, ad esempio, per via del fatto che tale funzione è agganciata ad un altro interrupt. E la chiamata ad un interrupt disattiva gli altri interrupt.

Infatti ho specificato che poteva usare una funzione molto semplice come il lampeggio che non è impegnativa in termini di risorse.
E' vero che non si può usare la millis() ma come abbiamo visto ormai la delayMicroseconds() è stata ampiamente "sdoganata" e ho notato che viene usata anche da sviluppatori "seri" dentro le interrupt services  XD
[/quote]
Vero, però se uno non sa dei problemi di millis all'interno di interrupt immagino che non abbia le conoscenze per sapere che delayMicroseconds non è invece affetta da questo problema.
Title: Re: ciclare in background
Post by: dalubar on Jun 14, 2012, 10:28 pm
Bene, detto questo...Mike stai pronto con la bottiglia  :D
Title: Re: ciclare in background
Post by: dalubar on Jun 14, 2012, 10:31 pm
Già 10K!???
Beh, congratulazioni "Shannon member"  :)
Title: Re: ciclare in background
Post by: menniti on Jun 14, 2012, 10:32 pm
AUGURI!!! (http://www.google.it/imgres?imgurl=http://4.bp.blogspot.com/_B3BBwfUO1HQ/TEXHcRhAfTI/AAAAAAAABjo/sQfUhp9FMhA/s1600/823092champagne.jpg&imgrefurl=http://montesantacroce.blogspot.com/2010/07/champagne.html&h=768&w=1024&sz=221&tbnid=01Kh5uZS7BV58M:&tbnh=113&tbnw=151&prev=/search%3Fq%3Dchampagne%26tbm%3Disch%26tbo%3Du&zoom=1&q=champagne&usg=__kPpI_dhT8CNwCGShNlHWwKP47vU=&docid=ciZ4W0e0q8TnDM&hl=it&sa=X&ei=G0raT-zmC86AhQfwnISbBA&ved=0CI4BEPUBMAc&dur=1093)
Title: Re: ciclare in background
Post by: dalubar on Jun 14, 2012, 10:36 pm
Quote

Mike stai pronto con la bottiglia

Detto...fatto! :D
Title: Re: ciclare in background
Post by: menniti on Jun 14, 2012, 10:37 pm

Quote

Mike stai pronto con la bottiglia

Detto...fatto! :D

ti sembro il tipo che si tira indietro per una bottiglia di champagne?  :smiley-mr-green:
Title: Re: ciclare in background
Post by: dalubar on Jun 14, 2012, 10:43 pm

ti sembro il tipo che si tira indietro per una bottiglia di champagne?  :smiley-mr-green:

Me ne guarderei bene dal pensarlo.  :)
Leo, nel frattempo sarà andato a festeggiare con gli amici XD
Title: Re: ciclare in background
Post by: menniti on Jun 14, 2012, 10:52 pm


ti sembro il tipo che si tira indietro per una bottiglia di champagne?  :smiley-mr-green:

Me ne guarderei bene dal pensarlo.  :)
Leo, nel frattempo sarà andato a festeggiare con gli amici XD

sarà crollato per lo stress :smiley-sweat:

ehi, io ho passato quota 6000, si festeggia tutti stasera :D
Title: Re: ciclare in background
Post by: leo72 on Jun 14, 2012, 10:58 pm
Non me ne ero neanche accorto perché i 10K li ho passati rispondendo in un altro thread  XD XD XD
Title: Re: ciclare in background
Post by: dalubar on Jun 14, 2012, 11:03 pm
Quote
ehi, io ho passato quota 6000, si festeggia tutti stasera

Auguri anche a te, Mike... 6000 post sono anch'essi un traguardo di tutto rispetto.  ;)
Title: Re: ciclare in background
Post by: menniti on Jun 14, 2012, 11:04 pm

Quote
ehi, io ho passato quota 6000, si festeggia tutti stasera

Auguri anche a te, Mike... 6000 post sono anch'essi un traguardo di tutto rispetto.  ;)

già 16000 minchiate in due sembrano un clock espresso in KHz :D
Title: Re: ciclare in background
Post by: leo72 on Jun 14, 2012, 11:04 pm


Quote
ehi, io ho passato quota 6000, si festeggia tutti stasera

Auguri anche a te, Mike... 6000 post sono anch'essi un traguardo di tutto rispetto.  ;)

già 16000 minchiate in due sembrano un clock espresso in KHz :D

SUPER ROTFL  :smiley-yell: :smiley-yell:
Title: Re: ciclare in background
Post by: dalubar on Jun 14, 2012, 11:09 pm
Bellissima questa! XD XD

Chissà cosa starà pensando l'autore del Topic, che si è visto trasformare una semplice domanda in un comitato dei festeggiamenti "pro veterani" del forum  :smiley-sweat:
Title: Re: ciclare in background
Post by: brunello22 on Jun 14, 2012, 11:14 pm
E' qui la festa ???
Title: Re: ciclare in background
Post by: menniti on Jun 14, 2012, 11:24 pm

Bellissima questa! XD XD

Chissà cosa starà pensando l'autore del Topic, che si è visto trasformare una semplice domanda in un comitato dei festeggiamenti "pro veterani" del forum  :smiley-sweat:

beh, i suggerimenti li ha avuti, poi non è più tornato e ha lasciato la porta aperta :D

@ brunello: no, ci siamo spostati sul Topic onorario aperto da Uwe per Leo :D
Title: Re: ciclare in background
Post by: zioTonino on Jun 15, 2012, 09:08 am

Bellissima questa! XD XD

Chissà cosa starà pensando l'autore del Topic, che si è visto trasformare una semplice domanda in un comitato dei festeggiamenti "pro veterani" del forum  :smiley-sweat:


aahuaauhahu :) come vi siete permessi di festeggiare in casa mia in mia assenza??!  :) :)


ad ogni modo, ho provato la tecnica che mi avete suggerito e ho una domanda:
la funzione millis() sicuramente non è adatta al funzionamento "in continuo" perchè se l'apparecchio è acceso 24h su 24h prima o poi andrà in overflow! pensate sia possibile utilizzare a tale scopo l'rtc (ds1307) che ho collegato all'arduino?
tra le altre cose non so perchè ma l'rtc (adafruit) mi porta sempre 4 minuti di ritardo rispetto al pc, anche subito dopo averlo impostato con apposita funzione! come è possibile?

e un'altra cosa:
ho preso anche un display, sempre dell'adafuit (cod. 417), munito di pulsantiera  e vorrei creare un menù constestuale navigabile per settare, eventualmente, l'ora o piuttosto modificare dei valori: ovviamente vorrei , mentre interagisco, che tutto il resto funzioni (controllo pulsanti, sonde, pwm dei led...) pensate sia fattibile?

thanks
Title: Re: ciclare in background
Post by: leo72 on Jun 15, 2012, 09:22 am
La funzione millis() fa in overflow dopo 49,7 giorni. Se hai un RTC esterno puoi semplicemente leggere i secondi e fare un ciclo basato sul cambio di questi. L'intervallo di 1s ti basta?

4 minuti fissi oppure uno scarto che poi cresce? Mi spiego, se imposti l'ora, vedi subito che ci sono 4 minuti di scarto ma poi restano 4 minuti anche dopo 1 giorno oppure lentamente lo scarto aumenta?

Il menu contestuale è sicuramente fattibile ma non è facile da scrivere: non so se sei alle prime armi. Ti conviene vedere se loro hanno un esempio e poi elaborare il tuo partendo da quello.
Title: Re: ciclare in background
Post by: zioTonino on Jun 15, 2012, 10:27 am
lo scarto sembra costante: non ho fatto misure precise! c'è qualche misura che posso fare per accorgermi se guadagna secondi?

per il menu contestuale non hanno esempi, quindi se mi potessi consigliare qualcosa te ne sarei grato!

il millis() l'ho sostituito con un confronto tra abs(now.second()-prev)>=1
e dovrebbe andare bene sempre e cmq...
Title: Re: ciclare in background
Post by: leo72 on Jun 15, 2012, 11:50 am
Stiamo parlando di un orario impostato tramite un'interfaccia oppure dello sketch compilato con le costanti __DATE__ e __TIME__?
Queste prendono semplicemente l'orario di sistema e lo memorizzano nello sketch. Se resettassi il tuo circuito fra 1 mese, ripartirebbe con l'orario e la data in cui hai compilato il programma.

Di esempi ce ne sono diversi. Io ho questo shield:
http://www.nuelectronics.com/estore/index.php?main_page=product_info&cPath=1&products_id=12
Nella pagina puoi scaricare uno ZIP contenente la libreria ed uno sketch di esempio, dovrebbe fare al caso tuo.
Title: Re: ciclare in background
Post by: leo72 on Jun 15, 2012, 11:52 am

il millis() l'ho sostituito con un confronto tra abs(now.second()-prev)>=1
e dovrebbe andare bene sempre e cmq...

Puoi fare un semplice

if (now.second()!=prev) {
  prev=now.second();
  ....
}
Se devi misurare solo 1 secondo, a te basta sapere che i secondi sono cambiati.
Title: Re: ciclare in background
Post by: zioTonino on Jun 17, 2012, 03:32 pm

Stiamo parlando di un orario impostato tramite un'interfaccia oppure dello sketch compilato con le costanti __DATE__ e __TIME__?
Queste prendono semplicemente l'orario di sistema e lo memorizzano nello sketch. Se resettassi il tuo circuito fra 1 mese, ripartirebbe con l'orario e la data in cui hai compilato il programma.

Di esempi ce ne sono diversi. Io ho questo shield:
http://www.nuelectronics.com/estore/index.php?main_page=product_info&cPath=1&products_id=12
Nella pagina puoi scaricare uno ZIP contenente la libreria ed uno sketch di esempio, dovrebbe fare al caso tuo.


ciao, vado con le costanti date e time!
per il menu grazie... ma sembra molto più complesso di quel che pensavo...
Title: Re: ciclare in background
Post by: leo72 on Jun 17, 2012, 04:32 pm

ciao, vado con le costanti date e time!

Quindi non fai altro che memorizzare nello sketch l'orario del computer al momento della compilazione. E' normale che resettando l'Arduino lo sketch riparta con l'orario preimpostato.

Quote

per il menu grazie... ma sembra molto più complesso di quel che pensavo...

Eh, i menu non sono semplici.
Title: Re: ciclare in background
Post by: zioTonino on Jun 17, 2012, 05:40 pm
si ma a compilare ci mette 30 secondi .. non 4 minuti!
Title: Re: ciclare in background
Post by: leo72 on Jun 17, 2012, 05:41 pm
E allora ricontrolla il tuo codice per vedere se alteri tu l'orario da qualche parte. Di più non so dirti. __DATE__ e __TIME__ prendono l'orario dal tuo sistema.
Title: Re: ciclare in background
Post by: zioTonino on Jun 17, 2012, 06:02 pm
ho rincontrollato ma rimane 4 minuti! -.-"

potrei inserirlo io al posto di utilizzare le costanti? se si come?

per i menu, non esiste qualche esepio più "semplice"?
Title: Re: ciclare in background
Post by: leo72 on Jun 17, 2012, 10:50 pm
Certo che puoi, invece di mettere un __TIME__ ci metti l'orario che vuoi.
Title: Re: ciclare in background
Post by: zioTonino on Jun 18, 2012, 12:09 am
e come? non riesco a capire il formato con cui inserirli sia il time che la data..
Title: Re: ciclare in background
Post by: leo72 on Jun 18, 2012, 12:26 am
Guarda il formato che accetta la chiamata che imposta l'orario della libreria che stai usando.
Title: Re: ciclare in background
Post by: brunello22 on Jun 18, 2012, 01:45 am
Pare quasi che tu non ci scriva proprio sul DS1307.
Che libreria stai usando ?
Title: Re: ciclare in background
Post by: brunello22 on Jun 18, 2012, 02:14 am
Scusa, ma non conosco il tuo grado di preparazione e non vorrei offendere, ma mi e' sorto un dubbio...
Dato le lo hai preso da ADA e ho visto un tuo post al riguardo, usi questo sketch di esempio....

Code: [Select]

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

void setup () {
    Serial.begin(57600);
    Wire.begin();
    RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
    }

void loop () {
   


il comando RTC.adjust(DateTime(yy,mm,dd,hh,mm,ss));  si trova all'interno dell' IF e non te lo eseguira' mai.
O gli togli l'alimentazione e poi sfili la batteria e la reinserisci ...
o sposti l' RTC.adjust  fuori dall'IF






Title: Re: ciclare in background
Post by: leo72 on Jun 18, 2012, 10:09 am

il comando RTC.adjust(DateTime(yy,mm,dd,hh,mm,ss));  si trova all'interno dell' IF e non te lo eseguira' mai.
O gli togli l'alimentazione e poi sfili la batteria e la reinserisci ...
o sposti l' RTC.adjust  fuori dall'IF

Allora spieghiamo meglio  ;). Quell'if serve a controllare se l'RTC sta lavorando. In caso negativo reimposta l'orario, in caso affermativo non lo "tocca".
Title: Re: ciclare in background
Post by: zioTonino on Jun 18, 2012, 03:49 pm
si si, l'avevo messo fuori ...
ma non so perchè mi dava 4 minuti di scarto!
adesso va molto meglio!

;)


cmq Arduino è fenomenale... chi mi sa spiegare perchè nonostante l'lcd sia RED il relè, attaccato al pin 10 è su on??

Code: [Select]
    // if the LED is off turn it on and vice-versa:
    if (boa2 == LOW){

        lcd.setBacklight(RED);
        st = true;
        digitalWrite(10, LOW);
     }
    else { 
     
      if (boa1 == LOW) {
        lcd.setBacklight(GREEN);
        digitalWrite(10, LOW);
      }
      else{
        lcd.setBacklight(YELLOW);
        digitalWrite(10, HIGH);
      }
     
    }
Title: Re: ciclare in background
Post by: zioTonino on Jun 18, 2012, 03:56 pm
risolto! :)
stò rinco dal caldo! avevo attaccato l'uscita del pin 10 direttamente al piedino del relè bypassando il transistor :P
Title: Re: ciclare in background
Post by: zioTonino on Jun 19, 2012, 08:43 am
ragazzi scusatemi ma non capisco come si comporta l'rtc!

ieri ho spento il pc ma ho lasciato arduino attaccato e funzionante: erano le 18 circa; ieri sera son tornato che erano le 24 e il display segnava le 21!
:smiley-eek:
come diamine è possibile??

stamattina ho provato a staccare la batteria .... a rimetterla dopo 3 secondi ... dopo 1 minuto ... a lasciarlo senza batteria ma niente!
ogni volta riparte dalle 8.24! ho provato pure a fare reset dal pulsante su arduino!
la cosa strana è anche anche senza batteria riparte dalle 8.24! e sulla seriale mi dice "rtc ok"

c'è qualcosa che non va o sono io che mi sono rico??

Code: [Select]
if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__,__TIME__));
  }
 
else {
  Serial.println("RTC OK");
  }


grazie
Title: Re: ciclare in background
Post by: lestofante on Jun 19, 2012, 09:26 am
credo che prima di RTC.runnin() devi fare un RTC.begin() o qualcosa di simile
Title: Re: ciclare in background
Post by: leo72 on Jun 19, 2012, 11:14 am

credo che prima di RTC.runnin() devi fare un RTC.begin() o qualcosa di simile

Se la libreria è la RTClib, alllora bisogna inizializzare sia la Wire che la RTC.

@zioTonino:
puoi postare tutto il codice che stai usando? Quella funzione lo sappiamo a memoria cosa fa  :smiley-sweat:
Puoi postare lo schema del tuo circuito per capire se hai messo la batteria tampone, se tutto è collegato giusto ecc..?
Title: Re: ciclare in background
Post by: brunello22 on Jun 19, 2012, 01:57 pm
Leo mi ha tolto la tastiera dalle dita.....
Come diceva, se non posti lo sketch che REALMENTE stai usando e' difficile capire cosa puo' non andare
Title: Re: ciclare in background
Post by: zioTonino on Jun 20, 2012, 09:08 pm


credo che prima di RTC.runnin() devi fare un RTC.begin() o qualcosa di simile

Se la libreria è la RTClib, alllora bisogna inizializzare sia la Wire che la RTC.

@zioTonino:
puoi postare tutto il codice che stai usando? Quella funzione lo sappiamo a memoria cosa fa  :smiley-sweat:
Puoi postare lo schema del tuo circuito per capire se hai messo la batteria tampone, se tutto è collegato giusto ecc..?


allora, il codice è questo:

Code: [Select]
// include the library code:
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>
#include "RTClib.h"


// The shield uses the I2C SCL and SDA pins. On classic Arduinos
// this is Analog 4 and 5 so you can't use those for analogRead() anymore
// However, you can connect other I2C sensors to the I2C bus and share
// the I2C bus.
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();
RTC_DS1307 RTC;

// These #defines make it easy to set the backlight color
#define RED 0x1
#define YELLOW 0x3
#define GREEN 0x2
#define TEAL 0x6
#define BLUE 0x4
#define VIOLET 0x5
#define WHITE 0x7

void setup() {
  // Debugging output
  Serial.begin(9600);
 
  Wire.begin();
  RTC.begin();
   
   
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE,__TIME__));
}

  // set up the LCD's number of rows and columns:
  lcd.begin(16, 2);

}

uint8_t i=0;

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);

  DateTime now = RTC.now();

  uint8_t buttons = lcd.readButtons();

  lcd.setCursor(0,0);
  if(now.hour()<10) lcd.print("0");
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  if(now.minute()<10) lcd.print("0");
  lcd.print(now.minute(), DEC);
  lcd.print(':');
  if(now.second()<10) lcd.print("0");
  lcd.print(now.second(), DEC);
 
 
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    delay(1000);
   
}


non riesco a settare l'ora...non capisco come fermare l'rtc!
basta togliere la batteria o occorre staccare tutto il pcb??
anche togliendo la batteria e rimettendola sembra che rimanga in memoria il vecchio orario
Title: Re: ciclare in background
Post by: leo72 on Jun 20, 2012, 09:31 pm
Devi togliere la batteria E staccare l'alimentazione.

Ricordati comunque che con questo codice:
Code: [Select]

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE,__TIME__));
}

L'orologio viene sempre reimpostato alla data/ora di compilazione.
Title: Re: ciclare in background
Post by: zioTonino on Jun 20, 2012, 09:42 pm
e perchè anche senza batteria riprende da dove aveva lasciato?
Title: Re: ciclare in background
Post by: leo72 on Jun 20, 2012, 10:29 pm

e perchè anche senza batteria riprende da dove aveva lasciato?

Ma che RTC è?
Title: Re: ciclare in background
Post by: zioTonino on Jun 20, 2012, 10:58 pm
è l'art adafruit...

sono riuscito a settare l'ora in questo modo: ho impostato l'ora in manuale     

Code: [Select]
RTC.adjust(DateTime(20,6,12,21,52,00));

anticipando rispetto alla realtà, ho tolto la usb e la batteria, quindi rimesso la usb e inviato lo sketch; poi ho premuto il reset e messo la batteria

solo così è andato!

non so se sbaglio qualcosa o meno ...
tra l'altro se stacco la usb, al riattacco non mi riconosce la com3 ma solo com1 e devo "giocare" a togliere e mettere la usb (windows la vede la com3, arudino.exe no)
Title: Re: ciclare in background
Post by: leo72 on Jun 20, 2012, 11:19 pm
E l'Art Adafruit che RTC usa?

E comunque se rispedisci lo sketch, ti riprende l'orario della prima compilazione (IDE 1.0.1) o di quando hai rifatto l'upload (IDE 0022/23).

PS:
ma ti avevo detto di staccare batteria E alimentazione per resettare l'RTC  :P
Title: Re: ciclare in background
Post by: brunello22 on Jun 20, 2012, 11:30 pm
Comunque se mi davi retta e come ti dissi in uno dei primi post, tu avessi installato e usato la libreria time http://www.arduino.cc/playground/Code/Time (http://www.arduino.cc/playground/Code/Time)  che e' molto piu' completa di esempi, a quest'ora saresti un passo avanti.


e comunque se l'RTC lo hai impostato, basta. mica lo devi fare tutte le volte, altrimenti che RTC sarebbe

e sbagli la sintassi
Quote
RTC.adjust(DateTime(20,6,12,21,52,00));
deve essere
RTC.adjust(DateTime(12,6,20,21,52,00));

prima l'anno, poi il mese e poi il giorno

Title: Re: ciclare in background
Post by: zioTonino on Jun 21, 2012, 12:04 am

E l'Art Adafruit che RTC usa?


DS1307

Quote

E comunque se rispedisci lo sketch, ti riprende l'orario della prima compilazione (IDE 1.0.1) o di quando hai rifatto l'upload (IDE 0022/23).


non mi mandare male ma cosa sono IDE 1.0.1 o IDE 0022/23??
(se ha a che fare con la versione di Arduino ho la UNo rev3.)


Quote

PS:
ma ti avevo detto di staccare batteria E alimentazione per resettare l'RTC  :P


si è ok, ogni volta ricomincia. ma come faccio a settarlo con un orario più prossimo possibile a quello "reale"?
se carico lo sketch arduino deve essere acceso e quindi anche l'rtc è acceso! per riavviare l'rtc devo, dopo aver inviato lo sketch, disalimentare e togliere la batteria e poi rimettere la batteria e rialimentare!



Comunque se mi davi retta e come ti dissi in uno dei primi post, tu avessi installato e usato la libreria time http://www.arduino.cc/playground/Code/Time (http://www.arduino.cc/playground/Code/Time)  che e' molto piu' completa di esempi, a quest'ora saresti un passo avanti.

e comunque se l'RTC lo hai impostato, basta. mica lo devi fare tutte le volte, altrimenti che RTC sarebbe

e sbagli la sintassi
Quote
RTC.adjust(DateTime(20,6,12,21,52,00));
deve essere
RTC.adjust(DateTime(12,6,20,21,52,00));

prima l'anno, poi il mese e poi il giorno


hai ragione, domani provo a trovare quella libreria....


:)
Title: Re: ciclare in background
Post by: leo72 on Jun 21, 2012, 12:12 am
1) il DS1307 perde i dati se stacchi l'alimentazione e la batteria, per cui riparte da zero oppure dall'orario a cui hai compilato il tuo sketch
2) IDE 1.0.1 e IDE 0022/23 sono le versioni dell'ambiente di sviluppo (IDE in inglese), che è diverso dalla versione della scheda che hai
3) non ho capito se hai capito questo punto: quando scolleghi l'alimentazione, l'Arduino non è che perde il programma registrato in memoria. Non devi ricaricarlo sopra tutte le volte. Se questa operazione la fai per rimettere l'orario, ti chiedo allora: ma l'hardware che stai usando non ha un'interfaccia utente con la quale poter interagire con l'utente e poter rimettere così l'orario a runtime?
Title: Re: ciclare in background
Post by: zioTonino on Jun 21, 2012, 12:17 am

1) il DS1307 perde i dati se stacchi l'alimentazione e la batteria, per cui riparte da zero oppure dall'orario a cui hai compilato il tuo sketch
2) IDE 1.0.1 e IDE 0022/23 sono le versioni dell'ambiente di sviluppo (IDE in inglese), che è diverso dalla versione della scheda che hai
3) non ho capito se hai capito questo punto: quando scolleghi l'alimentazione, l'Arduino non è che perde il programma registrato in memoria. Non devi ricaricarlo sopra tutte le volte. Se questa operazione la fai per rimettere l'orario, ti chiedo allora: ma l'hardware che stai usando non ha un'interfaccia utente con la quale poter interagire con l'utente e poter rimettere così l'orario a runtime?


2. ho la IDE Arduino 1.0.1
3. si è chiaro che non perde lo sketch ma l'operazione la faccio per rimettere l'orario: ho il display con la pulsantiera (adafruit 714).. ma non ho capito come comandare l'rtc...
Title: Re: ciclare in background
Post by: leo72 on Jun 21, 2012, 12:25 am
Devi usare i metodi della libreria allegata. Lo hai già fatto quando hai usato il metodo RTC.adjust(). Devi crearti il codice per gestire il menu di inserimento dei dati e non so se questo è nelle tue capacità (senza offese) ma, visto che ti sei arenato su questo genere di problemi, ho timore di no, giusto?  :smiley-sweat:
Title: Re: ciclare in background
Post by: zioTonino on Jun 21, 2012, 10:35 am
:smiley-sad-blue:
=(

ho cercato degli esempi di menu per il mio display ma nemmeno l'adafruit li ha, perchè è nuovo come modello :(

cmq, per il momento, potrei modificare l'orario tramite il solo premere dei pulsanti?
tra l'altro, ho dato un'occhiata alla libreria ma non capisco come fare per settare l'orario (sto usando la libreria adafruit)

mi dareste una "zampa"?  :)
Title: Re: ciclare in background
Post by: zioTonino on Jun 21, 2012, 05:10 pm

Comunque se mi davi retta e come ti dissi in uno dei primi post, tu avessi installato e usato la libreria time http://www.arduino.cc/playground/Code/Time (http://www.arduino.cc/playground/Code/Time)  che e' molto piu' completa di esempi, a quest'ora saresti un passo avanti.


ho provato a scaricare la libreria time.zip e l'ho installata nella cartella C:\Users\Antonio\Desktop\arduino-1.0.1
quindi ho avviato arduino.exe

adesso premendo i tasti sono ingrado di modificare l'ora e i minuti con un codice del genere:

Code: [Select]
      setTime(hour(), minute()+1,second(), day(), month(), year());

che ne pensate?
per i menu posso spulciare qualche libreria?
Title: Re: ciclare in background
Post by: brunello22 on Jun 21, 2012, 07:03 pm
Quote

adesso premendo i tasti sono ingrado di modificare l'ora e i minuti


quindi un menu' lo hai gia', se premendo i pulsanti sei riuscito  settare l'orologio.
Dovresti ampliare quello secondo le tue esigenze.

Gia', quali sono le esigenze ?
Title: Re: ciclare in background
Post by: zioTonino on Jun 21, 2012, 07:54 pm
no, non ho un menu, ho semplicemete associato quel codice alla pressione di un pulsante.
tra l'altro se disalimento perde l'impostazione...

dovrei (vorrei) utilizzare questo progetto per automatizzare l'acquario di casa; le cose che vorrei fare sono abbastanza semplici:
1. controllare il livello dell'acqua tramite galleggianti e relè
2. controllare in pwm la plafoniera a led (richiede associazione a un rtc)
3. misurare la temperatura e controllare le ventole di raffreddamento

il problema è che a parte il punto 3., che non ho ancora avuto modo di provare, tutto il resto è "quasi fatto", nel senso che sono riuscito a fare quasi tutto quello che volevo: le boe e il relè li gestisco bene e il pwm (su led di prova) sembra andare benone!
resta il problema di creare un menu sull'lcd in modo tale che, anche se sono nel menu, cmq lui esegue in backgroud tutto il resto: se sono nel menu a modificare il pwm, ad es, e nel frattempo è partita la pompa (comandata dalle boe) Arduino deve accorgersene e,  raggiunto il livello, fermare la pompa! anche se io sono nel menu!
tra le altre cose il menu mi serve per impostare l'ora (eventualmente modificarla e farla rimanere tale anche dopo un eventuale salto di corrente) e fare accendere/ spegnere, in modo separato dalla programmazione giornaliera, i led.

Non credo sia una cosa trascendentale... anche se, partendo da zero, è ovviamente difficile ...







Title: Re: ciclare in background
Post by: dalubar on Jun 21, 2012, 10:46 pm


e perchè anche senza batteria riprende da dove aveva lasciato?

Ma che RTC è?

Lo so che è strano ma devo dire che anch'io ho riscontrato un comportamento simile. Il 1307 senza batteria tampone quando è disalimentato e poi rialimentato nel giro di breve tempo RIPRENDE il tempo da quando è stata tolta l'alimentazione: ore, minuti e secondi compresi.
Credo che succeda (ma è una mia opinione) perchè a causa del bassissimo consumo del dispositivo, la capacità interna riesca a mantenere attiva la memoria dei registri ancora per qualche minuto, fermando però il clock.
Se si aspetta una 10na di minuti, però, l'RTC si resetta.
Title: Re: ciclare in background
Post by: leo72 on Jun 21, 2012, 10:54 pm
Perché no
D'altronde si tratta di pochi byte da tenere sotto tensione, forse ce la fa davvero.
Title: Re: ciclare in background
Post by: zioTonino on Jun 22, 2012, 12:24 am
allora :)

basandomi su un menu proposto sul sito coagula.com ho messo insieme, con qualche modifica, questo codice:

Code: [Select]

#include <MenuBackend.h>    //MenuBackend library - copyright by Alexander Brevig
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>
#include "RTClib.h"

Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();

RTC_DS1307 RTC;

long lastEnterDebounceTime = 0;  // the last time the output pin was toggled
long lastEscDebounceTime = 0;  // the last time the output pin was toggled
long lastLeftDebounceTime = 0;  // the last time the output pin was toggled
long lastRightDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 500;    // the debounce time

uint8_t buttons;

//Menu variables
MenuBackend menu = MenuBackend(menuUsed,menuChanged);
//initialize menuitems
MenuItem menu1Item1 = MenuItem("Item1");
MenuItem menuItem1SubItem1 = MenuItem("Item1SubItem1");
MenuItem menuItem1SubItem2 = MenuItem("Item1SubItem2");
MenuItem menu1Item2 = MenuItem("Item2");
MenuItem menuItem2SubItem1 = MenuItem("Item2SubItem1");
MenuItem menuItem2SubItem2 = MenuItem("Item2SubItem2");
MenuItem menuItem3SubItem3 = MenuItem("Item2SubItem3");
MenuItem menu1Item3 = MenuItem("Item3");


void setup()
{
  RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

  lcd.begin(16, 2);

  //configure menu
  menu.getRoot().add(menu1Item1);
  menu1Item1.addRight(menu1Item2).addRight(menu1Item3);
  menu1Item1.add(menuItem1SubItem1).addRight(menuItem1SubItem2);
  menu1Item2.add(menuItem2SubItem1).addRight(menuItem2SubItem2).addRight(menuItem3SubItem3);
  menu.toRoot();






void loop()
{
  DateTime now = RTC.now();

  lcd.setCursor(0,0);
  lcd.print(now.hour());
  lcd.print(':');
  lcd.print(now.minute());
  lcd.print(':');
  lcd.print(now.second());

  buttons = lcd.readButtons();

  navigateMenus();  //in some situations I want to use the button for other purpose (eg. to change some settings)

} //loop()...


void menuChanged(MenuChangeEvent changed){

  MenuItem newMenuItem=changed.to; //get the destination menu

  lcd.setCursor(0,1); //set the start position for lcd printing to the second row

  if(newMenuItem.getName()==menu.getRoot()){
    lcd.print("Main Menu       ");
  }
  else if(newMenuItem.getName()=="Item1"){
    lcd.print("modifica ora           ");
  }
  else if(newMenuItem.getName()=="Item1SubItem1"){
    lcd.print("Item1SubItem1");
  }
  else if(newMenuItem.getName()=="Item1SubItem2"){
    lcd.print("Item1SubItem2   ");
  }
  else if(newMenuItem.getName()=="Item2"){
    lcd.print("Item2           ");
  }
  else if(newMenuItem.getName()=="Item2SubItem1"){
    lcd.print("Item2SubItem1   ");
  }
  else if(newMenuItem.getName()=="Item2SubItem2"){
    lcd.print("Item2SubItem2   ");
  }
  else if(newMenuItem.getName()=="Item2SubItem3"){
    lcd.print("Item2SubItem3   ");
  }
  else if(newMenuItem.getName()=="Item3"){
    lcd.print("Item3           ");
  }
}

void menuUsed(MenuUseEvent used){
  lcd.setCursor(0,0); 
  lcd.print("You used        ");
  lcd.setCursor(0,1);
  lcd.print(used.item.getName());
  delay(3000);  //delay to allow message reading
  lcd.setCursor(0,0); 
  lcd.print("www.coagula.org");
  menu.toRoot();  //back to Main
}




void navigateMenus() {
  MenuItem currentMenu=menu.getCurrent();

  switch (buttons){
  case BUTTON_DOWN:
    if(!(currentMenu.moveDown())){  //if the current menu has a child and has been pressed enter then menu navigate to item below
      menu.use();
    }
    else{  //otherwise, if menu has no child and has been pressed enter the current menu is used
      menu.moveDown();
    }
    break;
  case BUTTON_SELECT:
    menu.toRoot();  //back to main
    break;
  case BUTTON_RIGHT:
    menu.moveRight();
    break;     
  case BUTTON_LEFT:
    menu.moveLeft();
    break;     
  }

  buttons=0; //reset the lastButtonPushed variable
}




ora devo capire come "entrare" nei menu per fargli fare qualcosa..
:)