Go Down

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

dalubar



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.

leo72

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

zioTonino

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

Go Up