Pages: 1 [2] 3 4 ... 72   Go Down
Author Topic: swRTC  (Read 72135 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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  smiley-wink

il trucco è che non è c, ma c++, insomma la tua non è una libreria ma una classe 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.
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...
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Tuscany
Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Fantastica soluzione, a quel paese il mio rtc hw!!!! smiley-grin
Logged

Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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);
    }
}

Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-cry
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La posizione della parentesi non è influente, può stare sulla stessa riga dell'if oppure sotto, è una questione stilistica. Io preferisco sulla riga ma tanti la mettono sotto perché si allinea con quella di chiusura.
Logged


Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La posizione della parentesi non è influente, può stare sulla stessa riga dell'if oppure sotto, è una questione stilistica. Io preferisco sulla riga ma tanti la mettono sotto perché si allinea con quella di chiusura.

ci son diventato scemo, se la parentesi era sotto, il codice non andava come avrebbe dovuto...
mi incasino + con le parentesi che con il resto smiley-sweat
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 527
Posts: 12345
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
bene, anzi male, vedo che mi è venuto un altro attacco di calimerite acuta se, per prendere in cosiderazione il mio discorso, lo ha dovuto ribadire lesto smiley-cry smiley-cry
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Michele Michele...  smiley-grin
Ti avevo già risposto.

Tu chiedi:
Quote
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?

Io rispondo:
Quote
La libreria così com'è funziona con clock a 1/8/16 MHz. Come detto, è precisa se si usa un quarzo esterno.
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 527
Posts: 12345
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì, sì, l'ho capito dopo aver premuto il clic del mouse smiley-red
Mi era sfuggito il particolare oscillatore interno/oscillatore esterno, quindi parlando di quarzi pensavo a quello specifico, ma giustamente a doverlo mettere tanto vale usare quello per il micro.
A questo punto conviene prevedere una batteria "bottone" backup per il solo micro (tipo quella dell'RTC, al limite anche il condensatorone invece della batteria) quando non è alimentato, e si risolve anche la perdita di data, tanto sappiamo che messo in sleep non consuma una pitocchia.
Ma l'RTC specifico come funziona? è un banale generatore di impulsi precisi o ha un calendario settabile e poi se la vede lui? Ne ho diversi e di diversi tipi ma non li ho mai usati.
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Un "vero" RTC (DS1397, PCF8563, ecc) è un'implementazione hardware di ciò che ho fatto io in software. Il micro ha dei registri interni in cui memorizza ore, minuti, secondi, giorno, mese, anno che incrementa ad intervalli regolari, scanditi dal suo clock. Ovviamente anche questo in caso di assenza di alimentazione si resetta e va reimpostato. Una volta impostata l'ora, se non succedono problemi, l'RTCva per la sua strada.

La scelta del quarzo a 32768 non è casuale, dato che con un prescaler a 128 ed un contatore ad 8 bit (2^8=256) si ha un colpo di clock esattamente ogni secondo, dato che 32768/128=256 e 256/256=1.
Logged


0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10449
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho dato un'occhiata allo schema equivalente del quarzo http://en.wikipedia.org/wiki/Crystal_oscillator
quindi se da una parte gli dai 5v, dall'altra avrai un'impulso ogni tot in base alla frequenza.
Ora se leo72 anzichè usare l'interrupt sul timer lo usasse su un pin, e anzichè aumentare un secondo ogni interrupt lo facesse ogni 32768, avremmo un'RTC perfetto, con arduino che può lavorare a qualsiasi frequenza > 32768(direi almeno 100kHz), al costo di un misero pin.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sarebbe da studiare. Anche in previsione dell'uso su un Attiny85, che è un DIL8 come gli RTC più comuni. Sarebbe carino avere un RTC che faccia anche qualcosa in più di contare l'ora  smiley-grin
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 527
Posts: 12345
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sarebbe da studiare. Anche in previsione dell'uso su un Attiny85, che è un DIL8 come gli RTC più comuni. Sarebbe carino avere un RTC che faccia anche qualcosa in più di contare l'ora  smiley-grin
il solito aguzzino, li spremi come limoni sti tiny, quando ti vedono cominciano a muovere i pin tipo millepiedi, ma dove vanno, con 8 scarpe di metallo? smiley-sad-blue
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Pages: 1 [2] 3 4 ... 72   Go Up
Jump to: