swRTC

Grazie Leo72 (e Lesto) per il contributo.
Ho proprio l'occasione di provarlo!

mi associo con i ringraziamenti, ora da bravo impedito provo e vedo che riesco a fare :sweat_smile:

ho ordinato dei ds1307 ma per molte delle applicazioni mi basterebbe avere le 24h, quindi sembra perfetta!!!!

if (((year % 4) == 0) && ((year % 100) != 0) or ((year % 400) == 0))

funziona lo stesso, quindi figo...ma era voluto? ho visto che nel resto del codice avete usato le classiche || come operando or

Complimenti per l'uso dei timer (per me sono ancora un semi arabo) e anche per il supporto a diverse frequenze di clock :slight_smile:

l'unico peccato è che resettando Arduino si perde l'ora, altrimenti sarebbe un perfetto sostituto degli RTC!

leo!!! dovevi farla 1 mese fa cosi' risparmiavo i soldi dei ds1307!!! XD

e' perfetta per quello che mi serve, ovvero una mangiatoia per i pesci, a me basta che segni ore e minuti, ora devo solo integrare le accensioni alle ore che voglio e che capisca come inserire piu' allarmi a vari tempi :wink:

complimenti! molto utile!!

Altri micro e frequenze saranno aggiunti in seguito.

per caso avete intenzione di fare anche quella per gli attiny85? :smiley: :smiley:

@Federico:
no, effettivamente no.... e la cosa buffa è che non mi ha neanche segnalato l'errore il compilatore... boh..
Ora lo correggo.
PS sul reset:
purtroppo è una implementazione SW per cui ha i suoi limiti.

@reizel:
metti una serie di if e fai un controllo sulle ore e sui minuti.

if ((orarioHH1==rtc.getHours()) && (orario1MM==rtc.getSeconds()) { sfamaipesci(); }
if ((orarioHH2==rtc.getHours()) && (orario2MM==rtc.getSeconds()) { sfamaipesci(); }

ecc...

@alexdb:
vorrei per i tiny84/85, e magari mettere anche altre frequenze (4 e 20 MHz)

[EDIT]
ho rimesso online la versione con l'or "giusto (||) :wink:

@Federico:
no, effettivamente no.... e la cosa buffa è che non mi ha neanche segnalato l'errore il compilatore... boh..

si, sono rimasto stupito anch'io...i tanti misteri del wiring :stuck_out_tongue_closed_eyes:

PS sul reset:
purtroppo è una implementazione SW per cui ha i suoi limiti.

Si si, ne sono consapevole, però sono rimasto affascinato dall'uso dei timer e quindi da come risulta leggera la libreria :smiley:

secondo me sono stai DEFINEiti and or e not, per rendere il linguaggio più user-friendly (mai capitato di mettere una & o | sola?)

comunque io ho solo risolto un problemino di come far parlare la funzione di interrupt con la libreria, il resto è tutta farina del sacco di leo :slight_smile:

anche per me :grin:

se si stratta solo di una mancanza di corrente/reset limitato, si potrebbe salvare l'ora in eeprom, ma con una scrittura al secondo non credo che abbia una lunga vita.

Grande Leo XD XD XD XD
Una sola curiosità: su qualche Topic lamentavi l'imprecisione dei timer, mi pare, a causa della nota imprecisione del quarzo esterno; questa libreria potrebbe essere associata all'uso del quarzo "orologi" da 32,768KHz?

una prova terra terra per implementare un allarme
lcd 16x2
l'rtc parte alle 12:00:00
alle 12:01:00 accende un led
leo, sai che ti amerei se fossi una donna, o se tu fossi una donna, senti, segnatelo, nella prossima vita me la chiedi e io te la do, vorrei rinascere donna (anche se... lesbica...)... per dirti quanto apprezzo questo tuo lavoro!!!!!!!!!! :stuck_out_tongue_closed_eyes:

#include <swRTC.h>
swRTC rtc;
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int motordx = 9;
const int motorsx = 8;

void setup() {
    delay(2000);
    rtc.stopRTC();
    rtc.setTime(12,00,00);
    rtc.startRTC();

    lcd.begin(16, 2);
    
    pinMode(motordx, OUTPUT);      
    pinMode(motorsx, OUTPUT);
}

void loop() {
  lcd.setCursor(5, 0);
  lcd.print(rtc.getHours(), DEC);
  lcd.print(":");
  lcd.print(rtc.getMinutes(), DEC);
  lcd.print(":");
  lcd.print(rtc.getSeconds(), DEC);
  lcd.print("  ");
  if ((12==rtc.getHours()) && (1==rtc.getMinutes()) && (0==rtc.getSeconds())) { 
  digitalWrite(motordx, HIGH);
  delay(5000);
  digitalWrite(motordx, LOW);
  delay(100);
  digitalWrite(motorsx, HIGH);
  delay(5000);
  digitalWrite(motorsx, LOW);
  }
  }

@lesto:
sei troppo buono. Tu sei una CIMA relativamente al C, mi sono accorto quanto io poco conosca questo linguaggio.
Per contro riesco a cavarmela perché con tanti anni di programmazione alle spalle, la logica per risolvere certi problemi ormai ce l'ho nel DNA :wink:

@Mike:
mi lamentavo dell'imprecisione dei contatori relativamente agli oscillatori interni. Ovviamente l'RTC software ha una certa precisione SOLO se si usa un quarzo esterno, anche per clock inferiori ai 16 MHz dell'Arduino. Parlando dell'Arduino, esso ha un oscillatore esterno al posto del quarzo che era presente sulla 2009. Forse quest'ultima scheda potrebbe avere una precisione maggiore rispetto alla UNO. Da verificare.

@reizel:
se io fossi nato donna, non sarei qui con voi ma a farla fruttare come si deve.... $) $)

Leo....
Complimenti :slight_smile:
la proverò non appena torno a casa :slight_smile:

leo72:
@Mike:
mi lamentavo dell'imprecisione dei contatori relativamente agli oscillatori interni. Ovviamente l'RTC software ha una certa precisione SOLO se si usa un quarzo esterno, anche per clock inferiori ai 16 MHz dell'Arduino. Parlando dell'Arduino, esso ha un oscillatore esterno al posto del quarzo che era presente sulla 2009. Forse quest'ultima scheda potrebbe avere una precisione maggiore rispetto alla UNO. Da verificare.

Quindi il timer che stai usando è già predisposto per il quarzo dedicato? Cioè carico la tua libreria e collego il quarzo orologio ai pin predisposti e funziona?

@reizel:
se io fossi nato donna, non sarei qui con voi ma a farla fruttare come si deve.... $) $)

finitela entrambi di fare le zoccole :grin:
@ reizel: finalmente è chiaro che quello sballonzolamento continuo è un tuo desiderio di trasformazione fisica, ho sentito che a Casablanca fanno miracoli, in ogni caso alla larga da me ]:smiley: o almeno dalle mie spalle :smiley:

La libreria così com'è funziona con clock a 1/8/16 MHz. Come detto, è precisa se si usa un quarzo esterno. Quindi se la carichi su una Arduino, 2009 o UNO che sia (coi dubbi espressi per l'oscillatore esterno di quest'ultima) va senza problemi. Su un micro in standalone è meglio usare un quarzo esterno, anche se si sta usando il micro a bassa frequenza.

leo72:
@lesto:
sei troppo buono. Tu sei una CIMA relativamente al C, mi sono accorto quanto io poco conosca questo linguaggio.
Per contro riesco a cavarmela perché con tanti anni di programmazione alle spalle, la logica per risolvere certi problemi ormai ce l'ho nel DNA :wink:

il trucco è che non è c, ma c++, insomma la tua non è una libreria ma una classe :slight_smile:

leo72:
La libreria così com'è funziona con clock a 1/8/16 MHz. Come detto, è precisa se si usa un quarzo esterno. Quindi se la carichi su una Arduino, 2009 o UNO che sia (coi dubbi espressi per l'oscillatore esterno di quest'ultima) va senza problemi. Su un micro in standalone è meglio usare un quarzo esterno, anche se si sta usando il micro a bassa frequenza.

la cosa più fica da fare, secondo me, sarebbe l'opzione per usare 2 pin a scelta come input per un quarzo esterno da 32,768KHz, però non so come funzionino...

Beh, allora si torna a quello che avevo detto in un altro thread, ossia che usando il modulo RTC puoi collegare un quarzo da 32768 Hz esterno.
Ci studierò sopra.

Fantastica soluzione, a quel paese il mio rtc hw!!!! :smiley:

azz, in 2 ore il topic e' andato a in seconda pagina! scrivo per riportarlo in alto visto che e' utilissimo.

allora ho fatto il codice della mia mangiatoia per pesci usando l' swrtc di leo, ora son segnati 9 allarmi che corrispondono a 9 pasti giornalieri

problema: vorrei poter decidere quanti pasti distribuire, ho un rotary switch binario da 0 a 9 collegato su A1-2-3-4 come posso integrare questo tipo di selezione nel codice? ovvero 1 pasto/giorno 2pasti/giorno ... 9 pasti/giorno mi serve uno spunto, non so come fare...

#include <swRTC.h>
swRTC rtc;
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int motordx = 9;
const int motorsx = 8;
const int finecorsadx = 7; 
const int finecorsasx = 6; 
const int bit1 = A1;
const int bit2 = A2;
const int bit3 = A3; 
const int bit4 = A4; 
  int avvio = 0; 
  int valavvio = 0;
  int valfinecorsadx = 0;
  int valfinecorsasx = 0;

void setup() {
    delay(2000);
    rtc.stopRTC();
    rtc.setTime(20,00,30);
    rtc.startRTC();

    lcd.begin(16, 2);
    
    pinMode(motordx, OUTPUT);      
    pinMode(motorsx, OUTPUT);
    
    pinMode(finecorsadx, INPUT); 
    pinMode(finecorsasx, INPUT); 
}

void loop() {
  lcd.setCursor(5, 0);
  lcd.print(rtc.getHours(), DEC);
  lcd.print(":");
  lcd.print(rtc.getMinutes(), DEC);
  lcd.print(":");
  lcd.print(rtc.getSeconds(), DEC);
  lcd.print("  ");
  
  if ((6==rtc.getHours()) && (30==rtc.getMinutes()) && (0==rtc.getSeconds())) { 
    (avvio = 1);
    }  
  
  if ((8==rtc.getHours()) && (0==rtc.getMinutes()) && (0==rtc.getSeconds())) {
    (avvio = 1);
    }
  
  if ((9==rtc.getHours()) && (30==rtc.getMinutes()) && (0==rtc.getSeconds())) {
    (avvio = 1);
    }
  
  if ((11==rtc.getHours()) && (0==rtc.getMinutes()) && (0==rtc.getSeconds())) {
    (avvio = 1);
    }  
  
  if ((12==rtc.getHours()) && (30==rtc.getMinutes()) && (0==rtc.getSeconds())) {
    (avvio = 1);
    }
  
  if ((14==rtc.getHours()) && (0==rtc.getMinutes()) && (0==rtc.getSeconds())) {
    (avvio = 1);
    }
    
  if ((15==rtc.getHours()) && (30==rtc.getMinutes()) && (0==rtc.getSeconds())) {
    (avvio = 1);
    }  
  
  if ((17==rtc.getHours()) && (0==rtc.getMinutes()) && (0==rtc.getSeconds())) {
    (avvio = 1);
    }
  
  if ((18==rtc.getHours()) && (30==rtc.getMinutes()) && (0==rtc.getSeconds())) {
    (avvio = 1);
    }  
    
    valavvio = avvio;
    
    if (valavvio == 1){ 
    avvio = 0;
    digitalWrite(motordx, HIGH);
    }

    valfinecorsadx = digitalRead(finecorsadx);
    
    if (valfinecorsadx == HIGH){
    digitalWrite(motordx, LOW);
    delay(50);
    digitalWrite(motorsx, HIGH);
    }
    
    valfinecorsasx = digitalRead(finecorsasx);
    
    if (valfinecorsasx == HIGH){
    digitalWrite(motorsx, LOW);
    }
}

Spiega per bene.
Vuoi scegliere quanti pasti distribuire durante il giorno?

Beh, non è difficile. Prepari un array di 9 celle in cui metti l'orario della distribuzione dei 9 pasti e poi scegli la distribuzione dei pasti con l'encoder a rotazione.

Magari avrai:
orariPasti = {6, 8, 10, 12, 14, 16, 18, 20, 22} (è un esempio)
1 solo pasto: orariPasti[3] (le 12)
2 pasti: orariPasti[2] e orariPasti[5] (10 e 16)
3 pasti: (10, 16, 20 )
ecc...

tnx leo, domani vedo di implementare il tuo suggerimento nel codice, ci son certamente molti modi per fare la cosa ma senza un suggerimento non so proprio da cosa partire, poi faccio errori stupidi perche' non so programmare

tipo son impazzito con un semplice if perche' scrivevo:
if (valavvio == 1)
{
avvio = 0;
digitalWrite(motordx, HIGH);
}
invece di:
if (valavvio == 1){
avvio = 0;
digitalWrite(motordx, HIGH);
}
mi serve un corso di parentesi =(