Go Down

Topic: ciclare in background (Read 7767 times) previous topic - next topic

zioTonino



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

leo72

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.

zioTonino

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

leo72


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

Ma che RTC è?

zioTonino

è 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)

leo72

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

brunello22

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


zioTonino


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


:)

leo72

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?

zioTonino


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

leo72

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:

zioTonino

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

zioTonino


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

brunello22

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 ?

zioTonino

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








Go Up