ciclare in background

dalubar:
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 :sweat_smile:

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

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

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.

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...

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.

zioTonino:
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.

leo72:
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...

zioTonino:
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.

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

Eh, i menu non sono semplici.

si ma a compilare ci mette 30 secondi .. non 4 minuti!

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.

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"?

Certo che puoi, invece di mettere un TIME ci metti l'orario che vuoi.

e come? non riesco a capire il formato con cui inserirli sia il time che la data..

Guarda il formato che accetta la chiamata che imposta l'orario della libreria che stai usando.

Pare quasi che tu non ci scriva proprio sul DS1307.
Che libreria stai usando ?

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....

// 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

brunello:
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".

si si, l'avevo messo fuori ...
ma non so perchè mi dava 4 minuti di scarto!
adesso va molto meglio!

:wink:

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

    // 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);
      }
      
    }

risolto! :slight_smile:
stò rinco dal caldo! avevo attaccato l'uscita del pin 10 direttamente al piedino del relè bypassando il transistor :stuck_out_tongue:

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!
:astonished:
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??

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

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