ciclare in background

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

leo72:

lesto:
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 :sweat_smile:
Puoi postare lo schema del tuo circuito per capire se hai messo la batteria tampone, se tutto è collegato giusto ecc..?

allora, il codice è questo:

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

Devi togliere la batteria E staccare l'alimentazione.

Ricordati comunque che con questo codice:

  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.

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

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

Ma che RTC è?

è l'art adafruit...

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

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)

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

Comunque se mi davi retta e come ti dissi in uno dei primi post, tu avessi installato e usato la libreria time Arduino Playground - 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

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

leo72:
E l'Art Adafruit che RTC usa?

DS1307

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

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

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!

brunello:
Comunque se mi davi retta e come ti dissi in uno dei primi post, tu avessi installato e usato la libreria time Arduino Playground - 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

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

:slight_smile:

  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?

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?
  1. ho la IDE Arduino 1.0.1
  2. 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...

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

:disappointed_relieved:
=(

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

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

brunello:
Comunque se mi davi retta e come ti dissi in uno dei primi post, tu avessi installato e usato la libreria time Arduino Playground - 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:

      setTime(hour(), minute()+1,second(), day(), month(), year());

che ne pensate?
per i menu posso spulciare qualche libreria?

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 ?

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

leo72:

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

Perché no
D'altronde si tratta di pochi byte da tenere sotto tensione, forse ce la fa davvero.

allora :slight_smile:

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

#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..
:slight_smile: