Home
Accesso / Registrazione
 di 

Programmatore orario con Arduino DS1302

11 risposte [Ultimo post]
ritratto di fabiozinna
Offline
Titolo: User
Utente
Ultima visita:
12 settimane 3 giorni fa
Utente dal: 09/09/2013
Messaggi: 6
Utente PREMIUM

Dovrei realizzare un programmatore orario con arduino uno che ad una determinata ora mi attivi per alcuni secondi due uscite digitali. Ho trovato qualcosa per quanto riguarda il settaggio dell'RTC DS1302 con l'uso di un display ma ho qualche problema nel far interagire il sistema con l'orario scelto per l'attivazione delle uscite.

Potete aiutarmi?

Ringrazio in anticipo.

ritratto di Piero Boccadoro
Offline
Titolo: Moderator
Moderatore
Ultima visita:
1 settimana 4 giorni fa
Utente dal: 28/06/2011
Messaggi: 868
Utente PREMIUM
Dunque, tanto per iniziare,

Dunque, tanto per iniziare, alcune domande. Così ci capiamo meglio :)
Le uscite digitali sono di arduino, giusto?
Che devi comandare?
E che problemi hai?

ritratto di fabiozinna
Offline
Titolo: User
Utente
Ultima visita:
12 settimane 3 giorni fa
Utente dal: 09/09/2013
Messaggi: 6
Utente PREMIUM
Arduino DS1302

Si devo comandare due uscite digitali di arduino con RTCDS1302 e display 16x2.

Sto cercando di trovare un codice già pronto.

Per le uscite comando con due relè.

Puoi aiutarmi?

ritratto di Piero Boccadoro
Offline
Titolo: Moderator
Moderatore
Ultima visita:
1 settimana 4 giorni fa
Utente dal: 28/06/2011
Messaggi: 868
Utente PREMIUM
Spero proprio di sì. :) Ma

Spero proprio di sì. :)
Ma serviranno altre info :)
A che punto sei arrivato della tua realizzazione?
Hai già uno schematico? Ce lo fai vedere?
Hai già il codice? Lo puoi postare?

ritratto di fabiozinna
Offline
Titolo: User
Utente
Ultima visita:
12 settimane 3 giorni fa
Utente dal: 09/09/2013
Messaggi: 6
Utente PREMIUM
Risposta poco risposta

Il mio post cercava un aiuto sulla compilazione del codice o  quantomeno un'indicazione.

Le mie informazioni iniziali sul progetto penso siano chiare "un programmatore orario utilizzando un'uscita digitale arduino con modulo RTC DS1302".

Non che mi aspettassi dei miracoli ma chiedermi il codice quando appunto era proprio questa la mia richiesta ....

In mancanza ieri ho utilizzato qualcosa di pronto dalla libreria DS1302 con alcune modifiche .

Il problema principale è il mio kit  DS1302 il suo funzionamento è alquanto anomalo, almeno per me che è la prima volta che lo usavo .

Questo kit RTC si programma con una tensione di alimentazione di 5V e dopo funziona con un'alimentazione di 3,3V altrimenti ad ogni ciclo di clock fornisce due orari differenti.

Per correttezza fornisco il codice modificato:

 

// DS1302_LCD (C)2010 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// A quick demo of how to use my DS1302-library to make a quick
// clock using a DS1302 and a 16x2 LCD.
//
// I assume you know how to connect the DS1302 and LCD.
// DS1302:  CE pin    -> Arduino Digital 2
//          I/O pin   -> Arduino Digital 3
//          SCLK pin  -> Arduino Digital 4
// LCD:     DB7       -> Arduino Digital 6
//          DB6       -> Arduino Digital 7
//          DB5       -> Arduino Digital 8
//          DB4       -> Arduino Digital 9
//          E         -> Arduino Digital 10
//          RS        -> Arduino Digital 11

#include <LiquidCrystal.h>
#include <DS1302.h>

#define pin 5
// Init the DS1302

DS1302 rtc(2, 3, 4);

// Init the LCD
LiquidCrystal lcd(11, 10, 9, 8, 7, 6);

void setup()
{
lcd.begin(16, 2);
pinMode(pin,OUTPUT);
  // Togliere i commenti per la prima programmazione del DS1302
  //Set the clock to run-mode, and disable the write protection
  //rtc.halt(false);
  //rtc.writeProtect(false);
  // Setup LCD to 16x2 characters
  // The following lines can be commented out to use the values already stored in the DS1302
  //rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY
  //rtc.setTime(17, 22, 0);     // Set the time to 17:22:00 (24hr format)
  //rtc.setDate(28, 3, 2014);   // Set the date to March 28th, 2014
}
 void loop()
{
  {
    String temp = rtc.getTimeStr();
  if(temp == "19:27:00"){ //se il tempo è uguale a 19:27:00 accendi il PIN5
    digitalWrite(pin, HIGH);
    //delay(4000);
    //digitalWrite(pin, HIGH);
    //delay(100);
    //digitalWrite(pin, LOW);
    //delay(1000);
   }
   if(temp == "19:28:00"){ //se il tempo è uguale a 19:28:00 spegni il PIN5
   digitalWrite(pin, LOW);
    }
    // Display time centered on the upper line
  lcd.setCursor(4, 0);
  lcd.print(rtc.getTimeStr());
    // Display abbreviated Day-of-Week in the lower left corner
  lcd.setCursor(0, 1);
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));
    // Display date in the lower right corner
  lcd.setCursor(6, 1);
  lcd.print(rtc.getDateStr());
  // Wait one second before repeating :)
  delay (1000);
}}
 

Saluti a tutti

 

ritratto di Piero Boccadoro
Offline
Titolo: Moderator
Moderatore
Ultima visita:
1 settimana 4 giorni fa
Utente dal: 28/06/2011
Messaggi: 868
Utente PREMIUM
NO, non ci siamo

NO, non ci siamo capiti.
Ricominciamo da capo.
PRIMA di parlare di codice, io ti ho chiesto dell'altro.
Ti ho parlato di hardware.
Quest'hardware c'è o no?
Non per niente ma qualunque discorso si può fare ma va fatto con ordine.
Tanto per iniziare la mia domanda ne sottointende un'altra: come si collegano display ed RTC?
Domanda alla quale tu non hai risposto.
E naturalmente l'hardware ed il suo collegamento sono più importanti del software non foss'altro che son nodi da sciogliere PRIMA! :D
Tu hai già l'hardware?
Possiamo avere delle info in merito?
DS1302 potrebbe anche bastare ma un non meglio precisato "display" non mi basta a sapere, ad esempio, se tu, come me, hai optato per un backpack che mi consente di collegarlo con protocollo I2C.

Insomma, se vuoi una mano, lasciati aiutare o almeno permettici di capire... ;)

ritratto di Piero Boccadoro
Offline
Titolo: Moderator
Moderatore
Ultima visita:
1 settimana 4 giorni fa
Utente dal: 28/06/2011
Messaggi: 868
Utente PREMIUM
Quello che hai postato poi è

Quello che hai postato poi è un codice di esempio.
Lo hai testato? funziona? O lo hai solo "modificato" senza poi testarlo?
Ne hai altri? Possiamo vederli?
Se hai provato a creare un codice unico dalla fusioni di più codici questo, da solo, potrebbe averti creato milioni di problemi..

ritratto di Gius_Res
Offline
Titolo: User
Utente
Ultima visita:
6 settimane 2 giorni fa
Utente dal: 28/02/2014
Messaggi: 2
Utente PREMIUM
mi potete aiutare perchè ho

mi potete aiutare perchè ho "qualche problema nel far interagire il sistema" dalle mie parti non significa "scrivetemi il codice" e nemmeno "ho bisogno del codice" e tanto meno "sapreste dirmi che devo scrivere?".

ritratto di fabiozinna
Offline
Titolo: User
Utente
Ultima visita:
12 settimane 3 giorni fa
Utente dal: 09/09/2013
Messaggi: 6
Utente PREMIUM
La mia era solo una semplice

La mia era solo una semplice risposta ed il mio punto di vista.

Lungi da me nel fare polemica ma cortesemente gradirei osservazioni ed eventuali proposte sul codice e non sterili critiche.

Credo che sia questo lo spirito giusto.

GRAZIE

ritratto di fabiozinna
Offline
Titolo: User
Utente
Ultima visita:
12 settimane 3 giorni fa
Utente dal: 09/09/2013
Messaggi: 6
Utente PREMIUM
Codice test

Tornando al codice è la prima versione funzionante che fa al mio caso.

Ovviamento essendo ancora in fase di test lo sto provando e sembra funzionare.

Il passo successivo sarà l'uso del programmatore realizzato per aprire o chiudere uno una piccola porta automatica verticale.

Per il progetto utilizzerò due relè, un motore per alzacristalli elettrici, eventuali fine corsa e come alimentazione una batteria al piombo gel da 12V 7Ah con relativo caricabatteria.

Ho tutto il materiale tranne il motore ed i fine corsa.

Pensavo di utilizzare dei finecorsa da posizionare nella battuta della porta apertura/chiusura con collegamento in serie al motore per non avere brutti scherzi in fase di funzionamento.

Ovvero l'uso di un sensore ottico al posto del finecorsa potrebbe dare dei problemi di funzionamento del sistema?

Potete consigliarmi dove reperire i finecorsa?

 

 

 

 

ritratto di fabiozinna
Offline
Titolo: User
Utente
Ultima visita:
12 settimane 3 giorni fa
Utente dal: 09/09/2013
Messaggi: 6
Utente PREMIUM
Soluzioni alternative?

Ho inviato il codice rispondendo a chi avesse chiesto sul suo funzionamento.

A quanto pare nessuna risposta alle mie domande ed alle eventuali modifiche richieste.

Grazie lo stesso

 

 

ritratto di slovati
Offline
Titolo: User+
Utente+
Ultima visita:
15 ore 42 min fa
Utente dal: 12/01/2009
Messaggi: 28
Utente PREMIUM
Salve, come parte di un mio

Salve,
come parte di un mio progetto futuro ho scelto come modulo RTC il DS1337 di Maxim (probabilmente il progetto verrà pubblicato in un prossimo articolo, ma non so dirle se e quando). Rispetto ad altri moduli RTC, il DS1337 ha il vantaggio di avere integrata la funzione di sveglia (o allarme), cioè attiva automaticamente un pin quando l'RTC raggiunge l'ora programmata nei suoi registri interni. Non c'è quindi bisogno di interrogare continuamente l'RTC.
Questa soluzione ha però qualche svantaggio, ad esempio occorre un quarzo esterno, e il chip non ha dei pin dedicati per la batteria tampone.
Detto questo, volevo fare un paio di osservazioni relative alla soluzione che lei sta utilizzando, cioè quella basata sul DS1302.
Do per scontato che la parte circuitale sia esente da difetti (cablaggi corretti e componenti integri e funzionanti), anche perchè non ho elementi per valutarli.
Osservando il codice dello sketch (immagino che la libreria sia quella originaria scaricata dal link indicato nei commenti), proverei a fare queste variazioni:
1. nella funzione setup, toglierei i commenti a queste due righe:
//rtc.halt(false);
//rtc.writeProtect(false);
in modo tale che quelle due istruzioni siano sempre eseguite ad ogni avvio dell'applicazione. Il datasheet del componente dice infatti:

CLOCK HALT FLAG
Bit 7 of the seconds register is defined as the clock halt (CH) flag. When this bit is set to logic 1, the clock oscillator
is stopped and the DS1302 is placed into a low-power standby mode with a current drain of less than 100nA. When
this bit is written to logic 0, the clock will start. The initial power-on state is not defined.

WRITE-PROTECT BIT
Bit 7 of the control register is the write-protect bit. The first seven bits (bits 0 to 6) are forced to 0 and always read 0
when read. Before any write operation to the clock or RAM, bit 7 must be 0. When high, the write-protect bit
prevents a write operation to any other register. The initial power-on state is not defined. Therefore, the WP bit
should be cleared before attempting to write to the device.
2. nella funzione loop, viene confrontata l'ora dell'RTC con un valore prefissato, anzi due per l'esattezza. Vengono poi eseguite altre operazioni (che comportano sicuramente un certo dispendio di tempo), e infine viene eseguita un'attesa di 1 secondo (delay(1000)).
Posto che tutto il resto funzioni, potrebbe accadere che nel ciclo x del loop venga letto l'orario "19:26:59", e nel loop x+1 l'orario "19:27:01" e quindi il test non passerà mai.
Proverei quindi a sostituire l'istruzione "delay(1000)" con "delay(100)", e inoltre stamperei su seriale il valore letto dall'RTC (almeno per qualche ciclo, giusto per vedere che la lettura sia corretta e il tempo si aggiorni correttamente, poi si può commenare per non rallentare l'esecuzione).

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ultimi Commenti