<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>RTC Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/rtc/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/rtc/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Mon, 09 Aug 2021 20:22:27 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://logicaprogrammabile.it/wp-content/uploads/2017/11/cropped-logicaprogrammabile-logo-02-32x32.png</url>
	<title>RTC Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/rtc/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Aggiungere un RTC al Raspberry PI</title>
		<link>https://logicaprogrammabile.it/aggiungere-rtc-ds3231-ds1307-raspberry-pi-offline/</link>
					<comments>https://logicaprogrammabile.it/aggiungere-rtc-ds3231-ds1307-raspberry-pi-offline/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 18 Jan 2021 07:00:35 +0000</pubDate>
				<category><![CDATA[Tutorial Raspberry PI]]></category>
		<category><![CDATA[Clock]]></category>
		<category><![CDATA[DS1307]]></category>
		<category><![CDATA[DS3231]]></category>
		<category><![CDATA[RTC]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=6461</guid>

					<description><![CDATA[<p>RTC per applicazioni offline Data e ora del nostro Raspberry vengono sincronizzate all&#8217;avvio del sistema operativo tramite server NTP. In tutte le altre applicazioni dove non avete un accesso ad internet la data e l&#8217;ora sono impostate di default ma non corrisponderanno a valori corretti....</p>
<p>The post <a href="https://logicaprogrammabile.it/aggiungere-rtc-ds3231-ds1307-raspberry-pi-offline/">Aggiungere un RTC al Raspberry PI</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>RTC per applicazioni offline</h1>
<p>Data e ora del nostro Raspberry vengono sincronizzate all&#8217;avvio del sistema operativo tramite server NTP. In tutte le altre applicazioni dove non avete un accesso ad internet la data e l&#8217;ora sono impostate di default ma non corrisponderanno a valori corretti. In questi casi una soluzione è utilizzare un rtc che in caso di spegnimento della scheda tenga sempre aggiornato il dato di data e tempo.</p>
<p>Vediamo come fare.</p>
<p>La prima cosa è procurarci un modulo rtc pronto all&#8217;uso oppure realizzarne uno partendo dai singoli componenti. Nel mio caso visto il costo e la praticità di installazione ho scelto un rtc già assemblato. Il modello si basa sul chip DS3231 è ha un pratico connettore che permette l&#8217;installazione connettendolo direttamente sui pin header del raspberry;</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-6469" src="https://logicaprogrammabile.it/wp-content/uploads/2021/01/rtc_pi.jpg" alt="RTC Raspberry PI" width="481" height="460" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/01/rtc_pi.jpg 481w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/rtc_pi-300x287.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/rtc_pi-150x143.jpg 150w" sizes="(max-width: 481px) 100vw, 481px" /></p>
<p style="text-align: center;"><a href="https://amzn.to/3qk1W70">DS3231 ad Alta precisione modulo di Memoria Orologio RTC per Arduino Raspberry Pi</a></p>
<p>Nell&#8217;immagine seguente potete osservare come deve essere installato il modulo rtc ds3231. </p>
<p><img decoding="async" class="aligncenter size-full wp-image-6491" src="https://logicaprogrammabile.it/wp-content/uploads/2021/01/raspi_rtc.jpg" alt="" width="703" height="355" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/01/raspi_rtc.jpg 703w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/raspi_rtc-300x151.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/raspi_rtc-150x76.jpg 150w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/raspi_rtc-585x295.jpg 585w" sizes="(max-width: 703px) 100vw, 703px" /></p>
<p><span id="more-6461"></span></p>
<h2>Configurazione del dispositivo</h2>
<p>La comunicazione tra il DS3231 e il Raspberry avviene utilizzando il bus I2C. Procediamo alla sua attivazione eseguendo il comando:</p>
<pre>sudo raspi-config</pre>
<p>Viene avviata la schermata del <strong>Raspberry PI Software Configuration Tool</strong>.  Portiamoci sulla voce <strong>Interface Options</strong> e premiamo invio, nella schermata successiva selezioniamo la voce <strong>I2C</strong>. Confermiamo rispondendo affermativamente e attendiamo l&#8217;attivazione del bus I2C:</p>
<figure id="attachment_6477" aria-describedby="caption-attachment-6477" style="width: 661px" class="wp-caption aligncenter"><img decoding="async" class="wp-image-6477 size-full" src="https://logicaprogrammabile.it/wp-content/uploads/2021/01/Raspi_Config.jpg" alt="" width="661" height="418" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/01/Raspi_Config.jpg 661w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/Raspi_Config-300x190.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/Raspi_Config-150x95.jpg 150w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/Raspi_Config-420x265.jpg 420w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/Raspi_Config-585x370.jpg 585w" sizes="(max-width: 661px) 100vw, 661px" /><figcaption id="caption-attachment-6477" class="wp-caption-text">Interfaccia Raspi-Config</figcaption></figure>
<figure id="attachment_6473" aria-describedby="caption-attachment-6473" style="width: 661px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-6473 size-full" src="https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable.jpg" alt="Seleziona voce I2C" width="661" height="418" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable.jpg 661w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable-300x190.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable-150x95.jpg 150w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable-420x265.jpg 420w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable-585x370.jpg 585w" sizes="auto, (max-width: 661px) 100vw, 661px" /><figcaption id="caption-attachment-6473" class="wp-caption-text">Seleziona voce I2C</figcaption></figure>
<figure id="attachment_6474" aria-describedby="caption-attachment-6474" style="width: 661px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-6474 size-full" src="https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_confirm.jpg" alt="Conferma attivazione bus i2c" width="661" height="418" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_confirm.jpg 661w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_confirm-300x190.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_confirm-150x95.jpg 150w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_confirm-420x265.jpg 420w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_confirm-585x370.jpg 585w" sizes="auto, (max-width: 661px) 100vw, 661px" /><figcaption id="caption-attachment-6474" class="wp-caption-text">Conferma attivazione bus i2c</figcaption></figure>
<figure id="attachment_6475" aria-describedby="caption-attachment-6475" style="width: 661px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-6475 size-full" src="https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_confirm_ok.jpg" alt="Conferma attivazione bus i2c" width="661" height="418" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_confirm_ok.jpg 661w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_confirm_ok-300x190.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_confirm_ok-150x95.jpg 150w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_confirm_ok-420x265.jpg 420w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_confirm_ok-585x370.jpg 585w" sizes="auto, (max-width: 661px) 100vw, 661px" /><figcaption id="caption-attachment-6475" class="wp-caption-text">Conferma attivazione bus i2c</figcaption></figure>
<figure id="attachment_6476" aria-describedby="caption-attachment-6476" style="width: 661px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-6476 size-full" src="https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_finish.jpg" alt="Termina procedura guidata attivazione bus I2C" width="661" height="418" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_finish.jpg 661w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_finish-300x190.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_finish-150x95.jpg 150w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_finish-420x265.jpg 420w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2c_enable_finish-585x370.jpg 585w" sizes="auto, (max-width: 661px) 100vw, 661px" /><figcaption id="caption-attachment-6476" class="wp-caption-text">Termina procedura guidata attivazione bus I2C</figcaption></figure>
<p>Dopo aver terminato l&#8217;attivazione del bus, riavviamo il sistema operativo con il comando seguente:</p>
<pre>sudo reboot</pre>
<p>Dopo il riavviamo apriamo una nuova finestra terminale e utilizzando programma i2cdetect possiamo verificare che il modulo rtc e il bus I2C stiano funzionando:</p>
<pre>i2cdetect -y 1</pre>
<p>dovremmo avere una schermata simile alla seguente:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-6479" src="https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2cdetect.jpg" alt="programma i2cdetect" width="661" height="418" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2cdetect.jpg 661w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2cdetect-300x190.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2cdetect-150x95.jpg 150w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2cdetect-420x265.jpg 420w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/i2cdetect-585x370.jpg 585w" sizes="auto, (max-width: 661px) 100vw, 661px" /></p>
<p>il programma i2cdetect non fa altro che scansionare il bus I2C alla ricerca di dispositivi collegati. Nel nostro caso ha trovato un dispositivo all&#8217;indirizzo 0x68 che corrisponde all&#8217;unico dispositivo collegato al raspberry, ovvero il modulo DS3231.</p>
<p>Per sicurezza possiamo verificare sul datasheet dell&#8217;rtc l&#8217;indirizzo del dispositivo.</p>
<p>A questo punto possiamo caricare sul kernel linux il modulo rtc ds3232 (compatibile con il DS3231) eseguendo il seguente commando:</p>
<pre>sudo modprobe rtc-ds3232</pre>
<p>premiamo invio per eseguire il commando:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-6481" src="https://logicaprogrammabile.it/wp-content/uploads/2021/01/modprobe.jpg" alt="modprobe ds3231" width="661" height="418" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/01/modprobe.jpg 661w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/modprobe-300x190.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/modprobe-150x95.jpg 150w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/modprobe-420x265.jpg 420w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/modprobe-585x370.jpg 585w" sizes="auto, (max-width: 661px) 100vw, 661px" /></p>
<p>a questo punto dobbiamo creare un nuovo device con indirizzo 0x68 ed inserirlo nel bus I2C. Per eseguire questa serie di commandi dobbiamo loggarci come utente root digitando il comando seguente:</p>
<pre>su</pre>
<p>inseriamo la password per l&#8217;utente root.</p>
<blockquote>
<p>Nel caso in cui non si disponga di una pssword per l&#8217;utente root è necessario crearla digitando il comando:</p>
<p>sudo passwd root</p>
<p>Digitiamo una nuova password per l&#8217;utente root e confermiamo ripetendola nuovamente.</p>
</blockquote>
<p>Ora che abbiamo i privilegi del superuser digitiamo il seguente commando:</p>
<pre>echo ds3232 0x68 &gt; /sys/class/i2c-adapter/i2c-1/new_device</pre>
<p>premiamo invio. Digitiamo il comando <strong>exit</strong> per ritornare all&#8217;utente <strong>pi</strong>:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-6482" src="https://logicaprogrammabile.it/wp-content/uploads/2021/01/new_device.jpg" alt="add new device to bus i2c" width="741" height="418" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/01/new_device.jpg 741w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/new_device-300x169.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/new_device-150x85.jpg 150w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/new_device-585x330.jpg 585w" sizes="auto, (max-width: 741px) 100vw, 741px" /></p>
<h2>Impostare data e ora dell&#8217;RTC</h2>
<p>Dopo le precedenti istruzioni il sistema carica automaticamente i dati correnti di data e ora sull&#8217;RTC. Se questi dati corrispondono ai valori corretti non dobbiamo far altro che leggere i dati con il seguente comando:</p>
<pre>sudo hwclock -r</pre>
<p>in alternativa possiamo settare i valori come desideriamo eseguendo questo comando:</p>
<pre>sudo hwclock --set --date "Fri Jan 1 15:00:00 CET 2021"</pre>
<p>Tutte queste impostazioni non rimangono memorizzate al successivo riavvio del sistema operativo e quindi necessario inserire queste istruzioni su un file che viene lanciato durante le fasi di boot come ad esempio il file rc.local, quindi procediamo ad eseguire le seguenti istruzioni:</p>
<p>Modifichiamo il files modules per caricare sul kernel il modulo rtc-ds3232</p>
<pre>sudo nano /etc/modules</pre>
<p>inseriamo alla fine del file la seguente stringa:</p>
<pre>rtc-ds3232</pre>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-6484" src="https://logicaprogrammabile.it/wp-content/uploads/2021/01/modules.jpg" alt="file modules" width="661" height="418" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/01/modules.jpg 661w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/modules-300x190.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/modules-150x95.jpg 150w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/modules-420x265.jpg 420w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/modules-585x370.jpg 585w" sizes="auto, (max-width: 661px) 100vw, 661px" /></p>
<p>salviamo il file con la combinazione di tasti <strong>crtl+o</strong>  e usciamo con <strong>ctrl+x</strong></p>
<p>Ora apriamo il file <strong>rc.local</strong>:</p>
<pre>sudo nano /etc/rc.local</pre>
<p>portiamoci con puntatore prima dell&#8217;istruzione <strong>exit 0</strong> e aggiungiamo le seguenti istruzioni:</p>
<pre>echo ds3232 0x68 &gt; /sys/class/i2c-adapter/i2c-1/new_device</pre>
<p>inseriamo subito dopo anche l&#8217;istruzione seguente:</p>
<pre>sudo hwclock -s</pre>
<p>in modo da sincronizzare la data e l&#8217;ora del sistema operativo con quella del modulo RTC.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-6486" src="https://logicaprogrammabile.it/wp-content/uploads/2021/01/rc_local.jpg" alt="file rc.local" width="661" height="562" srcset="https://logicaprogrammabile.it/wp-content/uploads/2021/01/rc_local.jpg 661w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/rc_local-300x255.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/rc_local-150x128.jpg 150w, https://logicaprogrammabile.it/wp-content/uploads/2021/01/rc_local-585x497.jpg 585w" sizes="auto, (max-width: 661px) 100vw, 661px" /></p>
<p>disconnettiamo il Raspberry dalla rete cablata o WiFi, riavviamo e verifichiamo con il comando <strong>date</strong> che le impostazioni del sistema siano coerenti con quelle impostate precedentemente nell&#8217;rtc.</p>
<p>The post <a href="https://logicaprogrammabile.it/aggiungere-rtc-ds3231-ds1307-raspberry-pi-offline/">Aggiungere un RTC al Raspberry PI</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/aggiungere-rtc-ds3231-ds1307-raspberry-pi-offline/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Nuova centralina per impianto di microirrigazione</title>
		<link>https://logicaprogrammabile.it/nuova-centralina-impianto-microirrigazione/</link>
					<comments>https://logicaprogrammabile.it/nuova-centralina-impianto-microirrigazione/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 11 Sep 2017 16:00:06 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Elettrovalvola]]></category>
		<category><![CDATA[Goccia a Goccia]]></category>
		<category><![CDATA[Impianto idrico]]></category>
		<category><![CDATA[Irrrigazione]]></category>
		<category><![CDATA[Microirrigazione]]></category>
		<category><![CDATA[RTC]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=5550</guid>

					<description><![CDATA[<p>Come costruire una centralina di irrigazione a goccia con Arduino In alcuni miei articoli ho parlato della realizzazione di un impianto di micro irrigazione tramite una centralina autocostruita. Questa centralina aveva il compito di pilotare una elettrovalvola bistabile utilizzando una coppia di relè. Nel tempo...</p>
<p>The post <a href="https://logicaprogrammabile.it/nuova-centralina-impianto-microirrigazione/">Nuova centralina per impianto di microirrigazione</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Come costruire una centralina di irrigazione a goccia con Arduino</h1>
<h1><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5593" src="https://logicaprogrammabile.it/wp-content/uploads/2017/09/CentralinaMicroIrrigazione_3.jpg" alt="Centralina Micro Irrigazione" width="717" height="446" srcset="https://logicaprogrammabile.it/wp-content/uploads/2017/09/CentralinaMicroIrrigazione_3.jpg 717w, https://logicaprogrammabile.it/wp-content/uploads/2017/09/CentralinaMicroIrrigazione_3-300x187.jpg 300w, https://logicaprogrammabile.it/wp-content/uploads/2017/09/CentralinaMicroIrrigazione_3-600x373.jpg 600w" sizes="auto, (max-width: 717px) 100vw, 717px" /></h1>
<p>In alcuni miei articoli ho parlato della realizzazione di un impianto di micro irrigazione tramite una <a href="https://logicaprogrammabile.it/come-costruire-fai-da-te-centralina-impianto-microirrigazione/">centralina autocostruita</a>. Questa centralina aveva il compito di pilotare una elettrovalvola bistabile utilizzando una <a href="https://logicaprogrammabile.it/come-pilotare-elettrovalvola-bistabile-usando-2-rele/">coppia di relè</a>.</p>
<p>Nel tempo ho modificato questo prototipo per renderlo più efficiente e facile da gestire, e soprattutto perché la vecchia centralina aveva dei consumi di corrente elevati e quindi non efficiente con alimentazione a batteria.</p>
<p>Il circuito di questo articolo è attualmente installato nel mio giardino e in quello di alcuni miei amici.</p>
<p>La decisione di realizzare una nuova centralina nasce per via di alcune esigenze:<br />
la prima è quella dovuta alla scarsità di piogge di questi ultimi anni e di conseguenza la crescente esigenza di irrigare in modo sostenibile utilizzando sistemi ad ala gocciolante o linee autocostruite con micro gocciolatori.<br />
La seconda è dovuta alla mia passione per il fai da te e per la convinzione che i circuiti autocostruiti, benché inizialmente siano più costosi, possano essere una valida alternativa al modello <a href="https://it.wikipedia.org/wiki/Usa_e_getta">usa e getta</a> e dell&#8217;<a href="https://it.wikipedia.org/wiki/Obsolescenza_programmata">obsolescenza programmata,</a> infatti conoscendo schema elettrico e codice del progetto possiamo, in caso di rottura di qualche componente, ripararlo o riadattarlo per ulteriori esigenze.</p>
<p>Questa mia nuova centralina permette di utilizzare sia elettrovalvole bistabili sia valvole motorizzate.</p>
<p>Le elettrovalvole bistabili sono consigliate per impianti alimentati a batteria in quanto, tramite un breve impulso elettrico di qualche millisecondo, è possibile aprire o chiudere il passaggio dell&#8217;acqua.<br />
L&#8217;uso di una elettrovalvola nel nostro impianto di irrigazione comporta, il più delle volte, l&#8217;impiego di un filtro che privi l&#8217;acqua delle impurità che potrebbero comprometterne il funzionamento dell&#8217;elettrovalvola; le impurità dell&#8217;acqua, col tempo, possono ostruire il piccolo canale che porta l&#8217;acqua nella camera del solenoide.</p>
<p>Quando l&#8217;acqua possiede una torbidità elevata e non possiamo permetterci un sistema filtrante di qualità possiamo optare per una valvola motorizzata (Escludendo però il sistema di irrigazione a gocciolatori ma a irrigazione diretta).<br />
La valvola motorizzata assorbe più corrente perché il tempo necessario per aprirla o chiuderla è maggiore rispetto all&#8217;elettrovalvola (circa3-5 secondi).</p>
<h3>Caratteristiche nuova centralina di micro irrigazione</h3>
<ul>
<li>Basso assorbimento di corrente in standby (circa 0.3uA)</li>
<li>Open Source e Open Hardware</li>
<li>Calendario con RTC</li>
<li>Memorizzazione dati su SD</li>
<li>Interfaccia seriale</li>
<li>Programmazione tempi di irrigazione tramite jumper</li>
<li>Programmazione intervalli di irrigazione tramite jumper</li>
<li>Led di stato</li>
</ul>
<p><span id="more-5550"></span></p>
<h3>Schema elettrico a blocchi</h3>
<p>Lo schema elettrico è stato suddiviso in blocchi. Analizzeremo ognuno di essi con immagini separate per capirne meglio il funzionamento.</p>
<p>La figura seguente riguarda il sistema di alimentazione del circuito. Il connettore JP1 è collegato alla batteria (da 9 a 12v dc) e permette di alimentare l&#8217;elettrovalvola tramite un filtro a larga banda (FILT) e il resto del circuito tramite regolatore a 3.3v (MIC2940A-3.3WT).</p>
<p><figure id="attachment_5559" aria-describedby="caption-attachment-5559" style="width: 600px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-5559 size-full" src="https://logicaprogrammabile.it/wp-content/uploads/2017/08/Alimentazione.png" alt="Alimentazione centralina micro irrigazione" width="600" height="462" srcset="https://logicaprogrammabile.it/wp-content/uploads/2017/08/Alimentazione.png 600w, https://logicaprogrammabile.it/wp-content/uploads/2017/08/Alimentazione-300x231.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /><figcaption id="caption-attachment-5559" class="wp-caption-text">Sezione di alimentazione</figcaption></figure></p>
<p>Il regolatore che ho scelto è un convertitore DC/DC LDO della Microchip. La scelta è ricaduta su questo componente perché assorbe una corrente molto bassa.<br />
Il componete di nome sky2 è un diodo <a href="https://it.wikipedia.org/wiki/Transil">transil</a> bidirezionale da 15v che permette di smorzare le extratensioni generate della commutazione del solenoide dell&#8217;elettrovalvola.<br />
Se non adeguatamente filtrate, le extratensioni possono resettare il microcontrollore rendendo il circuito instabile ed inutilizzabile.</p>
<p>Il partitore di tensione costituito dalle resistenze R12 e R13 serve per monitorare la carica della batteria e di conseguenza arrestare i cicli di irrigazione quando la tensione della batteria non assicura la commutazione dell&#8217;elettrovalvola.</p>
<p>Lo schema seguente riguarda invece il circuito RTC:</p>
<p><figure id="attachment_5562" aria-describedby="caption-attachment-5562" style="width: 633px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-5562 size-full" src="https://logicaprogrammabile.it/wp-content/uploads/2017/08/RealTimeClock.png" alt="Real time clock" width="633" height="345" srcset="https://logicaprogrammabile.it/wp-content/uploads/2017/08/RealTimeClock.png 633w, https://logicaprogrammabile.it/wp-content/uploads/2017/08/RealTimeClock-300x164.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2017/08/RealTimeClock-600x327.png 600w" sizes="auto, (max-width: 633px) 100vw, 633px" /><figcaption id="caption-attachment-5562" class="wp-caption-text">Real Time Clock</figcaption></figure></p>
<p>questo circuito ha il compito sia di gestire la data e l&#8217;ora, ma anche di generare un segnale di allarme (programmato via software), collegato ad un pin di interrupr del microcontrollore, questo sistema mi permette di risvegliare il microcontrollore dallo stato di ibernazione, necessario per garantire bassi assorbimenti del circuito.</p>
<p>Il cuore della centralina è basato sul microcontrollore ATMEGA328P-PU:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5565" src="https://logicaprogrammabile.it/wp-content/uploads/2017/08/Processore_SDcard.png" alt="Centralina microirrigazione goccia a goccia" width="915" height="544" srcset="https://logicaprogrammabile.it/wp-content/uploads/2017/08/Processore_SDcard.png 915w, https://logicaprogrammabile.it/wp-content/uploads/2017/08/Processore_SDcard-300x178.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2017/08/Processore_SDcard-768x457.png 768w, https://logicaprogrammabile.it/wp-content/uploads/2017/08/Processore_SDcard-600x357.png 600w" sizes="auto, (max-width: 915px) 100vw, 915px" /></p>
<p>al micro è collegato lo slot SD (la comunicazione avviene usando la SPI). Osserviamo anche il connettore connettore ISP, e il connettore UART per la comunicazione seriale.<br />
L&#8217;elettrovalvola viene pilotata tramite un ponte ad H realizzato con dei transistors; lo schema è il seguente:</p>
<p><figure id="attachment_5567" aria-describedby="caption-attachment-5567" style="width: 751px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="size-full wp-image-5567" src="https://logicaprogrammabile.it/wp-content/uploads/2017/08/PonteH.png" alt="Ponte ad h" width="751" height="519" srcset="https://logicaprogrammabile.it/wp-content/uploads/2017/08/PonteH.png 751w, https://logicaprogrammabile.it/wp-content/uploads/2017/08/PonteH-300x207.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2017/08/PonteH-600x415.png 600w" sizes="auto, (max-width: 751px) 100vw, 751px" /><figcaption id="caption-attachment-5567" class="wp-caption-text">Circuito per pilotare l&#8217;elettrovalvola</figcaption></figure></p>
<p>&nbsp;</p>
<p>l&#8217;ultimo blocco dello schema elettrico riguarda la selezione del tempo di irrigazione e dell&#8217;intervallo di tempo tra una irrigazione e la successiva:</p>
<p><figure id="attachment_5568" aria-describedby="caption-attachment-5568" style="width: 670px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="size-full wp-image-5568" src="https://logicaprogrammabile.it/wp-content/uploads/2017/08/TempoCalendario.png" alt="Gestione calendario irrigazione" width="670" height="564" srcset="https://logicaprogrammabile.it/wp-content/uploads/2017/08/TempoCalendario.png 670w, https://logicaprogrammabile.it/wp-content/uploads/2017/08/TempoCalendario-300x253.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2017/08/TempoCalendario-600x505.png 600w" sizes="auto, (max-width: 670px) 100vw, 670px" /><figcaption id="caption-attachment-5568" class="wp-caption-text">Sezione gestione tempo di irrigazione e gestione intervallo tra una irrigazione e la successiva</figcaption></figure></p>
<p>Il segnale TMR_TIME e TMR_DATE sono collegati a due ingressi analogici del microcontrollore.</p>
<p>Di seguito il circuito elettrico della centralina di micro irrigazione:</p>
<p><figure id="attachment_5574" aria-describedby="caption-attachment-5574" style="width: 900px" class="wp-caption aligncenter"><a href="https://logicaprogrammabile.it/wp-content/uploads/2017/09/CentralinaMicroirrigazione.png"><img loading="lazy" decoding="async" class="wp-image-5574 " src="https://logicaprogrammabile.it/wp-content/uploads/2017/09/CentralinaMicroirrigazione-1024x619.png" alt="Schema Completo centralina micro irrigazione" width="900" height="544" srcset="https://logicaprogrammabile.it/wp-content/uploads/2017/09/CentralinaMicroirrigazione-1024x619.png 1024w, https://logicaprogrammabile.it/wp-content/uploads/2017/09/CentralinaMicroirrigazione-300x181.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2017/09/CentralinaMicroirrigazione-768x464.png 768w, https://logicaprogrammabile.it/wp-content/uploads/2017/09/CentralinaMicroirrigazione-600x363.png 600w" sizes="auto, (max-width: 900px) 100vw, 900px" /></a><figcaption id="caption-attachment-5574" class="wp-caption-text">Schema Completo centralina micro irrigazione &#8211; CLICCARE PER INGRANDIRE</figcaption></figure></p>
<h3>Descrizione dello schema elettrico</h3>
<p>Il microcontrollore ha il compito di gestire tutte le periferiche collegate alle sue line GPIO. La caratteristica principale di una centralina di questo tipo è il bassissimo assorbimento di corrente; supponendo di alimentare il circuito con una batteria (tipicamente una 9v o nel mio caso 8 batterie stilo alcaline tipo AA) dobbiamo garantire la durata di funzionamento per diversi mesi (naturalmente questo dato dipende dalla capacità della batteria).</p>
<p>Per garantire un basso assorbimento il microcontrollore andrà messo in modalità basso consumo quando non esegue nessuna operazione. Una volta entrato in questa modalità il micro potrà essere risvegliato tramite watchdog oppure tramite interrupt esterno. Nel mio progetto il risveglio è gestito da un interrupt esterno, generato dall&#8217;RTC, perché in questo modo posso gestire tempi di standby molto più prolungati rispetto al watchdog.</p>
<p>L&#8217;interrupt è generato dalla funzione alarm del modulo rtc MCP7940N. In pratica sul piedino 7 (sqw/MFP) viene generato un cambio di stato logico ogni volta che l&#8217;orario dell&#8217; RTC corrisponde all&#8217;orario settato sul registro interno ALARM.</p>
<p>Il pilotaggio dell&#8217;elettrovalvola avviene utilizzando un ponte ad H costruito con dei transistors discreti. Lo schema permette di essere comandato tramite le uscite digitali del microcontrollore. I diodi schottky posti al centro del ponte H garantiscono l&#8217;eliminazione delle sovratensioni generate dalla commutazione del solenoide.</p>
<p>La selezione della durata dell&#8217;irrigazione e dell&#8217;intervallo tra una irrigazione e la successiva avviene utilizzando dei semplici jumper. I jumper sono posizionati in un partitore di tensione. L&#8217;uscita del partitore di tensione è collegata ad un ingresso analogico del microcontrollore. A seconda della posizione del jumper otterremo sull&#8217;ingresso analogico tensioni differenti. Dato che il partitore assorbe una cerca corrente, ho utilizzato dei transistor per alimentare il partitore solo quando voglio leggere la posizione dei jumper. I due transistors vengono pilotati da due uscite digitali del microcontrollore.</p>
<h3>Assemblaggio e test della centralina</h3>
<p>Ho dapprima realizzato il progetto utilizzando una basetta millefori, questo perché prima di realizzare il pcb volevo assicurarmi che tutto funzionasse come da progetto. Dopo qualche giorno di test ed aver avuto la certezza che lo schema non presentasse anomalie ho deciso di produrre il pcb.</p>
<p>Dopo aver montato i componenti sul pcb ho sistemato il circuito in una cassetta ermetica per impianti elettrici. Nella cassetta ho inserito anche la batteria. L&#8217;unico foro praticato è quello per fare uscire i due fili del solenoide dell&#8217;elettrovalvola.</p>
<p>Ho tenuto in osservazione il funzionamento della centralina per circa 2 mesi e mezzo e non ho avuto nessun problema. La posizione del circuito era abbastanza critica perchè rimaneva molto tempo esposta al sole. questa è stata una scelta voluta perché avevo bisogno di sotto porre il circuito a condizioni termiche estreme (giorni con temperature anche superiori ai 40°c). L&#8217;unico cosa che ho osservato è una deriva dell&#8217;orario dell&#8217;RTC, probabilmente perchè non ho eseguito la calibrazione.</p>
<p>In definitiva sono molto contento di questo lavoro perchè ho ottenuto bassi assorbimenti, un costo contenuto del progetto e una grande flessibilità nella programmazione delle irrigazioni.</p>
<p>The post <a href="https://logicaprogrammabile.it/nuova-centralina-impianto-microirrigazione/">Nuova centralina per impianto di microirrigazione</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/nuova-centralina-impianto-microirrigazione/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Arduino come utilizzare l’RTCC MCP7940N</title>
		<link>https://logicaprogrammabile.it/arduino-come-utilizzare-rtcc-mcp7940n/</link>
					<comments>https://logicaprogrammabile.it/arduino-come-utilizzare-rtcc-mcp7940n/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Sun, 13 Nov 2016 19:35:35 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[RTC]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=5313</guid>

					<description><![CDATA[<p>Accedere ai registri dell&#8217;MCP7940N usando Arduino Molti tutorial sull’utilizzo di un RTCC (Real Time Clock and Calendar) con Arduino riguardano l’integrato DS1307 in quanto la sua diffusione è data dalla disponibilità di diverse librerie, dal costo contenuto e dalla sua integrazione in numerose shield. Nonostante...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-come-utilizzare-rtcc-mcp7940n/">Arduino come utilizzare l’RTCC MCP7940N</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Accedere ai registri dell&#8217;MCP7940N usando Arduino</h1>
<p>Molti tutorial sull’utilizzo di un <strong>RTCC</strong> (Real Time Clock and Calendar) con Arduino riguardano l’integrato <strong>DS1307</strong> in quanto la sua diffusione è data dalla disponibilità di diverse librerie, dal costo contenuto e dalla sua integrazione in numerose shield. Nonostante ciò sul mercato esistono molti altri dispositivi interessanti che svolgono funzioni aggiuntive e hanno precisioni molto più elevate riguardo al conteggio del tempo.</p>
<p>Mi sono trovato a realizzare dei progetti che come specifica richiedevano una alimentazione di 3,3V, dato che il <strong>DS1307</strong> lavora tra i 4,5V e i 5,5V ho dovuto ripiegare su un altro rtcc. Quello che ho scelto è l’<strong>MCP7940N</strong> prodotto da Microchip. Nonostante non sia disponibile la versione <strong>PDIP</strong> ho scelto questo integrato perché oltre a lavorare con tensione di alimentazione di 3,3V ha alcune altre funzioni interessanti come la possibilità di impostare due allarmi e la possibilità di calibrare l&#8217;orologio per poter aumentare la sua precisione nel conteggio del tempo.</p>
<p><span id="more-5313"></span></p>
<p>Nella tabella seguente ho messo in comparazione le funzioni del <strong>DS1307</strong> col <strong>MCP7940N</strong></p>
<p>La gestione dei registri di questo integrato è molto semplice; è molto simile a quella del <strong>DS1307</strong> e possiamo usare gran parte del codice usato in <a href="https://logicaprogrammabile.it/usare-modulo-rtc-ds1307-arduino/">questo precedente articolo</a>.</p>
<table>
<tbody>
<tr>
<td></td>
<td><strong>DS1307</strong></td>
<td><strong>MCP7940N</strong></td>
</tr>
<tr>
<td>Tensione di alimentazione</td>
<td>da 4.5V a 5.5V</td>
<td>da 1.8V a 5.5V</td>
</tr>
<tr>
<td>Consumo (Alimentazione a batteria)</td>
<td>&lt;500nA</td>
<td>&lt;700nA</td>
</tr>
<tr>
<td>Calibrazione RTC</td>
<td>NO</td>
<td>SI(digitale)</td>
</tr>
<tr>
<td>SRAM</td>
<td>56Bytes</td>
<td>64Bytes</td>
</tr>
<tr>
<td>Allarme programmabile</td>
<td>NO</td>
<td>SI (2)</td>
</tr>
<tr>
<td>Uscita</td>
<td>Onda quadra<br />
programmabile</td>
<td>Onda quadra programmabile.<br />
Uscita allarme</td>
</tr>
</tbody>
</table>
<p>Passiamo alla pratica realizzando il seguente circuito elettrico. Lo schema è identico a quello utilizzato per il <strong>DS13017</strong>.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5325" src="https://logicaprogrammabile.it/wp-content/uploads/2016/11/Arduino_MCP7940n.png" alt="Arduino MCP7940N" width="363" height="289" srcset="https://logicaprogrammabile.it/wp-content/uploads/2016/11/Arduino_MCP7940n.png 363w, https://logicaprogrammabile.it/wp-content/uploads/2016/11/Arduino_MCP7940n-300x239.png 300w" sizes="auto, (max-width: 363px) 100vw, 363px" /></p>
<p>&nbsp;</p>
<p>Il circuito utilizza il bus <strong>I2C</strong> per comunicare con l&#8217;integrato <strong>MCP7940N</strong>.</p>
<p>Andiamo a controllare il datasheet dell&#8217; <strong>MCP7940N</strong> per vedere quali sono i registri che permettono il settaggio della data e dell&#8217;orario:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5321" src="https://logicaprogrammabile.it/wp-content/uploads/2016/11/RTCC_memory_Map_7940n.gif" alt="Registri MCP7940N" width="783" height="766" /></p>
<p>i registri che vanno dall&#8217;indirizzo <strong>00h</strong> all&#8217;indirizzo <strong>06h</strong> sono quelli che utilizzeremmo per impostare l&#8217;ora e la data. La modalità di scrittura di questi registri deve avvenire utilizzando la codifica BCD. Da notare che oltre al dato di tempo e di tata, ci sono alcuni bit che permettono di attivare alcune funzioni, ad esempio il registro <strong>00h</strong> setta i secondi (dal bit0 al bit6) ma permette anche di avviare l&#8217;oscillatore (bit7 ST).<br />
E&#8217; possibile settare il bit7 manualmente, con la funzione bitSet(), oppure direttamente quando impostiamo il valore dei secondi servendoci di una maschera di bit. Vediamo subito con un esempio cosa dobbiamo fare.</p>
<p>Supponiamo di impostare il registro a 38 secondi. La prima cosa da fare è convertire il numero 38 in codice BCD utilizzando questa funzione:</p>
<pre class="lang:arduino decode:true ">// Converte un valore decimale in valore BCD
byte dec2bcd(byte val)
{
  return ( ((val / 10) * 16) + (val % 10));
}</pre>
<p>il valore decimale 38 equivale al valore BCD 0b00111000.</p>
<blockquote><p>Il valore decimale 38 viene convertito in valore BCD semplicemente convertendo le unità in codice binario e le decine in codice binario, infatti l&#8217;unità 8 equivale al valore binario 0b1000 mentre la decina 3 equivale al valore binario 0b0011. I due valori binari vengono concatenati per ottenere il valore BCD infatti 0b0011 concatenato con 0b1000 forma il valore BCD 0b00111000 (38 decimale)</p></blockquote>
<p>Come possiamo osservare il bit7 del valore BCD è a valore logico basso. Per far partire l&#8217;oscillatore dovremmo impostare questo bit a valore logico alto. Questo può essere fatto utilizzando la funzione bitSet() o più semplicemente mascherando il valore BCD dei secondi con un valore binario che imposti il bit7 a livello alto, lasciando inalterato il valore BCD dei secondi.<br />
Quest&#8217;ultima soluzione viene eseguita usando l&#8217;operatore | (<a href="https://logicaprogrammabile.it/operatori-spostare-bit/">bitwise or</a>). Il valore della maschera deve tenere il bit7 a livello logico alto e lasciare invariato il valore dei secondi. Il valore della maschera da utilizzare sarà quindi 0b10000000 (0x80). In questo modo mettendo il valore 0b10000000 in or col valore BCD dei secondi 0b00111000 otterremmo il valore 0b10111000:</p>
<pre class="lang:arduino decode:true">byte Maschera = 0x80;
byte valore_registro_00h = Secondi | Maschera;</pre>
<p>Ora sappiamo come generare i dati in valore BCD e come mascherarli per attivare le funzioni aggiuntive dei registri quindi di seguito il codice che permette di impostare i registri dall&#8217;indirizzo 00h all&#8217;indirizzo 06h, con l&#8217;ora e la data:</p>
<pre class="lang:arduino decode:true">//includo la libreria per la
//comunicazione su bus I2C
#include &lt;Wire.h&gt;

void setup()
{
  //inizializzo la libreria
  Wire.begin();

  //attivo la comunicazione con il MCP7940N
  //l'indirizzo dell'RTC è 0x6F
  Wire.beginTransmission(0x6F);
  Wire.write(0x00);

  //specifico il tempo e la data
  Wire.write(dec2bcd(0) | 0x80); //Secondi e ST a livello logico alto
  Wire.write(dec2bcd(35)); //minuti
  Wire.write(dec2bcd(20) | 0x20);  // ore e formato 24h
  Wire.write(dec2bcd(4) | 0x08);  //giorno della settimana e VBAT on
  Wire.write(dec2bcd(3)); //Giorno
  Wire.write(dec2bcd(11)); //mese
  Wire.write(dec2bcd(16)); //anno
  Wire.endTransmission();

}

void loop()
{

}

//converte il numero decimale in numero BCD
byte bcd2dec(byte num)
{
  return (((num / 16) * 10) + (num % 16));
}</pre>
<h2>Leggere orario e data dall&#8217;MCP7940N</h2>
<p>Dopo aver impostato data e ora e settato alcuni parametri (ST e VBATEN) il circuito RTCC <strong>MCP7940N</strong> autonomamente gestirà orario e data senza l&#8217;ausilio di istruzioni aggiuntive. A questo punto sarà sufficiente eseguire la lettura dei sette registri, da <strong>00h</strong> a <strong>06h</strong>, per ottenere le informazioni relative a data e ora correnti.</p>
<p>Il codice seguente mostra come eseguire la lettura dei registri e come elaborare i dati, in quanto i registri restituiscono i valori in formato <strong>BCD</strong> comprensivi dei bit di settagio (<strong>ST</strong> e <strong>VBATEN</strong>):</p>
<pre class="lang:arduino decode:true ">#include &lt;Wire.h&gt;

//struttura timeelements
tmElements_t tm;

void setup()
{
  //inizializzo la seriale
  Serial.begin(9600);

  delay (500);

  //inizializzo la libreria
  Wire.begin();

}

void loop()
{
  //leggere registri MCP7940N
  //inizzializza la trasmissione partendo
  //dall'indirizzo 0x00
  Wire.beginTransmission(0x6F);
  Wire.write(0x00);
  Wire.endTransmission();

  //richiedo 7 byte dal dispositivo con
  //indirizzo 0x6F
  Wire.requestFrom(0x6F, 7);
  //regupero i 7 byte relativi ai
  //corrispondenti registri
  tm.Second = bcd2dec(Wire.read() &amp; 0x7f); //secondi 
  tm.Minute = bcd2dec(Wire.read()); //minuti
  tm.Hour = bcd2dec(Wire.read() &amp; 0x3f); //ore
  tm.Wday = bcd2dec(Wire.read() &amp; 0x07); //giorno settimana
  tm.Day = bcd2dec(Wire.read()); //giorno
  tm.Month = bcd2dec(Wire.read() &amp; 0x1F ); //mese 
  tm.Year = bcd2dec(Wire.read()); //anno

  Serial.print("Orario corrente: ");
  Serial.print(tm.Hour);
  Serial.print(":");
  Serial.print(tm.Minute );
  Serial.print(":");
  Serial.println(tm.Second);

  Serial.print("Giorno della settimana: ");
  Serial.println(tm.Wday);

  Serial.print("Data corrente: ");
  Serial.print(tm.Day);
  Serial.print("/");
  Serial.print(tm.Month);
  Serial.print("/");
  Serial.println(tm.Year);

}

//Converti numero BCD in numero Decimale
byte bcd2dec(byte num)
{
  return (((num / 16) * 10) + (num % 16));
}</pre>
<p>Nel codice possiamo osservare come vengono mascherati i dati letti tramite un l&#8217;operatore <strong>&amp;</strong> (bitwise and). Sapendo che i registri contengono bit che permettono di settare o resettare delle funzioni aggiuntive dell&#8217;<strong>MCP7940N</strong>, dobbiamo necessariamente escluderli dalla lettura per ottenere solamente il dato relativo al tempo.</p>
<p>Nel caso del registro <strong>00h</strong> abbiamo che, oltre al dato dei secondi, è presente anche il <strong>bit7 (ST)</strong> che deve essere escluso quando convertiamo il valore BCD in decimale. Tramite l&#8217;operatore <strong>&amp;</strong> e la maschera <strong>0x7f</strong> (0b01111111) otteniamo un comportamento di questo tipo; supponiamo che il dato letto dal registro sia <strong>0b10111000</strong>, mascherando questo dato con il valore <strong>0b01111111</strong> otteniamo <strong>0b00111000</strong>.</p>
<p>In conclusione, risulta molto semplice scrivere e leggere dai registri dell&#8217;<strong>MCP7940N</strong>, dobbiamo solo stare attenti nell&#8217;utilizzo delle maschere di bit che ci permettano, in fase di scrittura, di inserire i dati di data e tempo insieme ai settaggi che abilitano alcune funzionalità, mentre, in fase di lettura, di ottenere i dati di tempo filtrando i settaggi delle funzionalità.</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-come-utilizzare-rtcc-mcp7940n/">Arduino come utilizzare l’RTCC MCP7940N</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-come-utilizzare-rtcc-mcp7940n/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Arduino gps ottenere coordinate geografiche e orario</title>
		<link>https://logicaprogrammabile.it/arduino-gps-coordinate-geografiche/</link>
					<comments>https://logicaprogrammabile.it/arduino-gps-coordinate-geografiche/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 07 Mar 2016 11:06:21 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[gps]]></category>
		<category><![CDATA[RTC]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=5061</guid>

					<description><![CDATA[<p>Come utilizzare un ricevitore gps con Arduino Il ricevitore GPS (Global Positioning System) è oggi un dispositivo alla portata di tutti, dal costo contenuto e dal semplice utilizzo. Questo articolo vuole essere una guida introduttiva all&#8217;interpretazione dei dati di posizione forniti dal ricevitore gps, senza...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-gps-coordinate-geografiche/">Arduino gps ottenere coordinate geografiche e orario</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Come utilizzare un ricevitore gps con Arduino</h1>
<p>Il ricevitore <strong>GPS</strong> (<a href="https://it.wikipedia.org/wiki/Sistema_di_posizionamento_globale" target="_blank">Global Positioning System</a>) è oggi un dispositivo alla portata di tutti, dal costo contenuto e dal semplice utilizzo. Questo articolo vuole essere una guida introduttiva all&#8217;interpretazione dei dati di posizione forniti dal ricevitore gps, senza utilizzare librerie esterne. Ho utilizzato una scheda Arduino/Genuino <strong>UNO</strong> e il modulo <strong>Adafruit Ultimate GPS Breakout v3</strong> (<a href="http://www.amazon.it/gp/product/B00E3DSKD4/ref=as_li_ss_tl?ie=UTF8&amp;camp=3370&amp;creative=24114&amp;creativeASIN=B00E3DSKD4&amp;linkCode=as2&amp;tag=logicaprogram-21">vedi l&#8217;articolo su Amazon</a>).</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5073" src="https://logicaprogrammabile.it/wp-content/uploads/2016/02/GPS_Adafruit.png" alt="arduino Gps" width="300" height="300" srcset="https://logicaprogrammabile.it/wp-content/uploads/2016/02/GPS_Adafruit.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2016/02/GPS_Adafruit-150x150.png 150w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>
<p>Il modulo ha una <strong>sensibilità di ben -165dBm</strong> (in tracking), questo significa che riesce a rilevare segnali di 1.25nVolt, ha un refresh di 10 Hz e permette di &#8216;inseguire&#8217; 22 satelliti.</p>
<p>Questo dispositivo rende semplice la gestione del <strong>tracking dei satelliti</strong> ed del calcolo della posizione. I dati vengono restituiti sul canale seriale TTL, alla frequenza di 1Hz. E&#8217; sufficiente collegarsi alla seriale per poter leggere i dati. I dati principali sono quelli di posizione (espressa in <a href="https://it.wikipedia.org/wiki/Latitudine" target="_blank">Latitudine</a> e <a href="https://it.wikipedia.org/wiki/Longitudine" target="_blank">Longitudine</a>) la quota e <a href="https://it.wikipedia.org/wiki/Greenwich_Mean_Time" target="_blank">l&#8217;orario zulu</a> ma sono presenti anche altre informazioni relative ai satelliti utilizzati per il fix.</p>
<p><span id="more-5061"></span></p>
<p>Lo schema elettrico seguente mostra i collegamenti da effettuare tra una <strong>UNO</strong> e la <strong>Adafruit Ultimate GPS Breakout v3</strong>:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5084" src="https://logicaprogrammabile.it/wp-content/uploads/2016/02/Schema_Elettrico_Gps.png" alt="Schema elettrico arduino uno gps" width="465" height="385" srcset="https://logicaprogrammabile.it/wp-content/uploads/2016/02/Schema_Elettrico_Gps.png 465w, https://logicaprogrammabile.it/wp-content/uploads/2016/02/Schema_Elettrico_Gps-300x248.png 300w" sizes="auto, (max-width: 465px) 100vw, 465px" /></p>
<p>Questo schema serve per inviare direttamente sul <strong>Serial Monitor</strong> i dati restituiti dal modulo gps. Il segnale trasmesso dal dispositivo viene convogliato sulla linea di trasmissione seriale della <strong>UNO</strong> affinché possa raggiungere il pc attraverso la porta usb. Carichiamo sulla <strong>UNO</strong> uno sketch vuoto:</p>
<pre class="lang:arduino decode:true ">void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}</pre>
<p>Terminato l&#8217;upload del programma lanciamo il Serial Monitor e settiamo il bps a 9600. La schermata seguente illustra le stringhe generate dal ricevitore GPS.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5080" src="https://logicaprogrammabile.it/wp-content/uploads/2016/02/gps.png" alt="gps data restitution" width="550" height="338" srcset="https://logicaprogrammabile.it/wp-content/uploads/2016/02/gps.png 550w, https://logicaprogrammabile.it/wp-content/uploads/2016/02/gps-300x184.png 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></p>
<p>Nel mio caso il sensore gps non aveva ancora agganciato i satelliti, i dati ricevuti indicano una latitudine e una longitudine pari a zero. Il led posto sul pcb indica quando avviene il <strong>fix dei satelliti</strong>, se il led lampeggia ogni secondo il gps sta cercando di agganciare i segnali dei satelliti, quando vengono agganciati il led lampeggia ogni 15 secondi. Il fix dei satelliti è funzione della posizione dell&#8217;antenna del sensore, in campo aperto, senza nessun ostacolo, avviene entro il minuto mentre se ci troviamo in posizioni a bassa copertura (ad esempio dentro casa) il sensore impiegherà molto più tempo e nei casi peggiori non riuscirà ad elaborare il segnale.<span id="yui_3_17_2_3_1456480997037_2079" class="ya-q-full-text"></span></p>
<p>Per interpretare i dati è necessario conoscere quali informazioni vengono prodotte dal ricevitore gps. Sul Serial Monitor notiamo quattro righe con informazioni differenti che si ripetono ogni secondo. Queste stringhe iniziano tutte con il simbolo del dollaro e con un codice di cinque caratteri. Il codice specifica quali dati sono  presenti nella relativa stringa, in ogni stringa i dati vengono separati dalle virgole (campi), ulteriori informazioni possono essere apprese in <a href="http://aprs.gids.nl/nmea/" target="_blank">seguendo questo link</a>.</p>
<p>Le quattro stringhe sono riassunte nel box seguente:</p>
<pre class="lang:default decode:true">$GPGGA,235951.800,,,,,0,00,,,M,,M,,*79
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,235951.800,V,,,,,0.00,0.00,050180,,,N*40
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
</pre>
<p>La stringa che inizia con <strong>$GPGGA</strong> (Global Positioning System Fix Data), contiene le informazioni della latitudine, della longitudine, della quota e del tempo.<br />
La stringa che inizia con <strong>$GPGSA</strong>, contiene dati relativi al DOP (<a href="https://it.wikipedia.org/wiki/Diluizione_della_precisione" target="_blank">Diluizione della precisione</a>) e al prn (pseudo random noise) dei satelliti utilizzati per il fix.<br />
La stringa che inizia con <strong>$GPRMC</strong> indica il valore minimo raccomandato dei dati di tempo, velocità e posizione.<br />
La stringa che inizia con <strong>$GPVTG</strong> indica il Track made good e il valore di Groud Speed.</p>
<p>La stringa che ci interessa maggiormente è quella che inizia con $GPGGA perché contiene i dati di posizione ed il tempo. Il codice che andremo a scrivere recupererà i dati separandoli dalle virgole.</p>
<p>Modifichiamo il circuito precedente perché ci serve sia la seriale hardware sia quella software. La seriale software la useremmo per ricevere i dati dal sensore gps mentre la seriale hardware la useremmo per inviare i dati al pc:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5107" src="https://logicaprogrammabile.it/wp-content/uploads/2016/03/Adafruit_ultimate_gps_v3.png" alt="Adafruit ultimate gps breakout" width="546" height="470" srcset="https://logicaprogrammabile.it/wp-content/uploads/2016/03/Adafruit_ultimate_gps_v3.png 546w, https://logicaprogrammabile.it/wp-content/uploads/2016/03/Adafruit_ultimate_gps_v3-300x258.png 300w" sizes="auto, (max-width: 546px) 100vw, 546px" /></p>
<p>Verifichiamo con questo codice che i dati ricevuti dalla seriale software (attivata sul pi 2 e 3) vengano ritrasmessi al pc impiegando la seriale hardware:</p>
<pre class="lang:arduino decode:true">#include &lt;SoftwareSerial.h&gt;

//pin 2 RX e pin 3 TX
SoftwareSerial mySerial(2, 3);

void setup() {
  //init seriale hardware
  Serial.begin(9600);
  //init seriale software
  mySerial.begin(9600);
}

void loop() {
  //controllo se nella seriale software ci sono dati
  if (mySerial.available()) {
    //se sono presenti dati leggili ed inviali
    //alla seriale hardware
    Serial.write(mySerial.read());
  }
}</pre>
<p>Con questo codice otterremmo sul Serial Monitor gli stessi dati ottenuti col primo esempio.<br />
Naturalmente se è avvenuto il fix del segnale, i campi delle stringhe viste in precedenza conterranno i dati di posizione e orario, inoltre ne otterremmo anche una quinta  che inizierà per <strong>$GPGSV</strong> (indica nel dettaglio i parametri dei satelliti agganciati), quindi il risultato sarà qualcosa del genere:</p>
<pre class="lang:arduino decode:true">$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74
$GPGSV,3,2,11,14,25,170,00,16,57,208,39,18,67,296,40,19,40,246,00*74
$GPGSV,3,3,11,22,42,067,42,24,14,311,43,27,05,244,00,,,,*4D
<code>$GPGGA,235317.000,4003.9039,N,10512.5793,W,1,08,1.6,1577.9,M,-20.7,M,,0000*5F
</code>$GPGSA,A,3,19,28,14,18,27,22,31,39,,,,,1.7,1.0,1.3*35 
$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68 
$GPVTG,360.0,T,348.7,M,000.0,N,000.0,K*43</pre>
<p>Ora cercherò di isolare la stringa che inizia con <strong>$GPGGA</strong>. Per prima cosa ho modificato il codice per concatenare i caratteri ricevuti sulla seriale software in un oggetto stringa in questo modo potrò elaborarla usando i metodi della classe <strong>String</strong>:</p>
<pre class="lang:arduino decode:true">#include &lt;SoftwareSerial.h&gt;

//pin 2 RX e pin 3 TX
SoftwareSerial mySerial(2, 3);
String NMEA;

void setup() {
  //init seriale hardware
  Serial.begin(9600);
  //init seriale software
  mySerial.begin(9600);
}

void loop() {
  if (mySerial.available()) {
    //leggo la prima riga
    char c = mySerial.read();
    if (c != '\n') {
      NMEA += c;
    }
    else {
      Serial.println(NMEA);
      //resetto la stringa
      //altrimenti accoderei tutti i caratteri ricevuti!
      NMEA = "";
    }
  }
}</pre>
<p>Ottenute solo le stringhe ho la possibilità di capire come inizia la stringa, ad esempio il metodo <strong><a href="https://www.arduino.cc/en/Tutorial/StringSubstring" target="_blank">subString </a></strong>restituisce una sotto stringa in funzione degli argomenti passati nei parametri. Il codice seguente invia al Serial Monitor solo le stringhe che iniziano con <strong>$GPGGA</strong>:</p>
<pre class="lang:arduino decode:true">#include &lt;SoftwareSerial.h&gt;

//pin 2 RX e pin 3 TX
SoftwareSerial mySerial(2, 3);
String NMEA;

void setup() {
  //init seriale hardware
  Serial.begin(9600);
  //init seriale software
  mySerial.begin(9600);
}

void loop() {
  if (mySerial.available()) {
    //leggo la prima riga
    char c = mySerial.read();
    if (c != '\n') {
      NMEA += c;
    }
    else {
      //printo solo la stringa che mi interessa
      //quella che inizia con GPGGA
      //substring estrapola dalla stringa usando come parametri
      //la posizione iniziale e finale in questo caso 
      //parte dalla posizione 0 alla posizone 6
      if(NMEA.substring(0,6) == "$GPGGA")      
        Serial.println(NMEA);
      //resetto la stringa  
      NMEA = "";
    }
  }
}</pre>
<p>Ho così isolato la stringa che mi interessa maggiormente. Continuo la scrittura del codice con alcune istruzioni che mi permettono di estrapolare i dati separati dalle virgole, quindi utilizzerò il metodo <strong><a href="https://www.arduino.cc/en/Tutorial/StringIndexOf" target="_blank">indexOf</a></strong> per passare i parametri al metodo <strong>subString</strong>:</p>
<pre class="lang:arduino decode:true">#include &lt;SoftwareSerial.h&gt;

//pin 2 RX e pin 3 TX
SoftwareSerial mySerial(2, 3);
String NMEA;
int posizione_delimitatore = 0;
int index = 0;

void setup() {
  //init seriale hardware
  Serial.begin(9600);
  //init seriale software
  mySerial.begin(9600);
}

void loop() {
  if (mySerial.available()) {
    //leggo la prima riga
    char c = mySerial.read();
    if (c != '\n') {
      NMEA += c;
    }
    else {
      posizione_delimitatore = 0;
      //indice di partenza zero
      index = 0;
      //printo solo la stringa che mi interessa
      if (NMEA.substring(0, 6) == "$GPGGA")
      {
        //Serial.println(NMEA);
        //fino a che il metodo indexOf non restituisce -1
        //elabora la stringa
        while (posizione_delimitatore != -1)
        {
          //ottieni la posizione della prima virgola 
          posizione_delimitatore = NMEA.indexOf(",", index);
          //invia al Serial Monitor la sotto stringa usando come indice
          //il dato ottenuto da indexOf
          Serial.println(NMEA.substring(index, posizione_delimitatore));

          //memorizza il nuovo indice di partenza
          index = posizione_delimitatore;
          //incrementa l'indice di 1 per escludere la
          //virgola 
          index++;
        }
      }
      //resetta la stringa
      NMEA = "";
    }
  }
}</pre>
<p>Il risultato sarà qualcosa del genere:</p>
<pre class="lang:default decode:true">$GPGGA,152454.000,4003.1968,N,10512.5793,E,1,05,1.56,890.9,M,48.0,M,,*6A
$GPGGA
152454.000
4003.1968
N
10512.5793
E
1
05
1.56
890.9
M
48.0
M

*6A

</pre>
<p>Il codice suddivide correttamente tutti i campi. Molti di questi dati possono essere ulteriormente filtrati, ad esempio a me interessa ottenere il dato di tempo, la latitudine, la longitudine e la quota. Il codice seguente invia al Serial Monitor solo questi campi:</p>
<pre class="lang:arduino decode:true ">#include &lt;SoftwareSerial.h&gt;

//pin 2 RX e pin 3 TX
SoftwareSerial mySerial(2, 3);
String NMEA;
int posizione_delimitatore = 0;
int index = 0;
int campo = 0;

void setup() {
  //init seriale hardware
  Serial.begin(9600);
  //init seriale software
  mySerial.begin(9600);
}

void loop() {
  if (mySerial.available()) {
    //leggo la prima riga
    char c = mySerial.read();
    if (c != '\n') {
      NMEA += c;
    }
    else {
      posizione_delimitatore = 0;
      index = 0;
      //questa variabile viene usata per contare tutti i campi trovati
      campo = 0;
      //printo solo la stringa che mi interessa
      if (NMEA.substring(0, 6) == "$GPGGA")
      {
        //Serial.println(NMEA);

        while (posizione_delimitatore != -1)
        {
          posizione_delimitatore = NMEA.indexOf(",", index);

          //in funzione del campo invio al serial monitor
          //solo i dati che mi interessano
          switch (campo)
          {
            case 2:
            case 4:
            case 9:
              Serial.println(NMEA.substring(index, posizione_delimitatore));
              break;
          }

          index = posizione_delimitatore;
          index++;
          //incrementa il campo trovato
          campo++;
        }
      }
      NMEA = "";
    }
  }
}</pre>
<p>Abbiamo cosi ottenuto il recupero dei dati di posizione e tempo senza utilizzare una libreria esterna. Le librerie rendono tutto più semplice e veloce ma credo che sia altrettanto importante capire cosa avviene dietro le quinte.</p>
<p>I dati ottenuti sono pronti per l&#8217;utilizzo in tutti quei <strong>progetti</strong> cui è necessario recuperare la <strong>posizione geografica</strong> e il <strong>tempo corrente</strong>.</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-gps-coordinate-geografiche/">Arduino gps ottenere coordinate geografiche e orario</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-gps-coordinate-geografiche/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Promemoria alternativo con Arduino e RTC</title>
		<link>https://logicaprogrammabile.it/promemoria-arduino-rtc/</link>
					<comments>https://logicaprogrammabile.it/promemoria-arduino-rtc/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Tue, 03 Apr 2012 08:48:33 +0000</pubDate>
				<category><![CDATA[Elettronica]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Gadget]]></category>
		<category><![CDATA[Promemoria]]></category>
		<category><![CDATA[RTC]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=2650</guid>

					<description><![CDATA[<p>Come realizzare un simpatico gadget per ricordarci delle date importanti Se anche tu hai difficoltà a ricordare le date degli appuntamenti e sei un tipo creativo e non ti accontenti dei classici promemoria via cellulare, tablet o computer, ma vuoi realizzare qualcosa di insolito, puoi...</p>
<p>The post <a href="https://logicaprogrammabile.it/promemoria-arduino-rtc/">Promemoria alternativo con Arduino e RTC</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Come realizzare un simpatico gadget per ricordarci delle date importanti</h3>
<p>Se anche tu hai difficoltà a ricordare le date degli appuntamenti e sei un tipo creativo e non ti accontenti dei classici promemoria via cellulare, tablet o computer, ma vuoi realizzare qualcosa di insolito, puoi sfruttare la tua passione per l&#8217;elettronica e la tua voglia di costruire per realizzare questo progetto di promemoria con Arduino.</p>
<p>Avendo già le basi per poter<a title="Usare il modulo RTC DS1307 con Arduino" href="https://logicaprogrammabile.it/usare-modulo-rtc-ds1307-arduino/"> lavorare con l&#8217;integrato RTC DS1307</a> puoi sfruttare la ram non volatile di questo chip per memorizzare circa 18 date e permettere, ad Arduino, di avvisarti tramite display, led rgb, twitter o quello che ti viene in mente!!</p>
<p>L&#8217;idea è quella di utilizzare l&#8217;RTC per memorizzare il dato di tempo e sfruttare i 56 byte di flash ram aggiuntive per memorizzare le date degli avvenimenti. Arduino ha il compito di comparare le date e di agire di conseguenza pilotando le uscite digitali.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2681" title="PromemDate" src="https://logicaprogrammabile.it/wp-content/uploads/2012/04/PromemDate.gif" alt="" width="617" height="245" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/04/PromemDate.gif 617w, https://logicaprogrammabile.it/wp-content/uploads/2012/04/PromemDate-300x119.gif 300w" sizes="auto, (max-width: 617px) 100vw, 617px" /></p>
<p>Parto dal presupposto che la data e l&#8217;ora del RTC sia già stata impostata come spiegato nel precedente tutorial.<span id="more-2650"></span><br />
Per memorizzare le date degli avvenimenti possiamo usare un array di 3 byte (Giorno Mese ed Anno), il codice è il seguente:</p>
<p>[c]<br />
//inserisco la libreria per il bus I2C<br />
#include &lt;Wire.h&gt;</p>
<p>//Variabile per memorizzare l&#8217;indirizzo della ram del DS1307<br />
byte IndRam = 0x00;<br />
//array per la data (G M A)<br />
byte Data[3];</p>
<p>void setup()<br />
{<br />
  //init bus I2C<br />
  Wire.begin();<br />
  //init seriale<br />
  Serial.begin(9600);</p>
<p>  //imposto l&#8217;indirizzo iniziale della user ram<br />
  IndRam = 0x08;</p>
<p>  //avvio la comunicazione con il DS1307<br />
  //indirizzo 0x68<br />
  Wire.beginTransmission(0x68);<br />
  //specifico l&#8217;indirizzo a cui voglio accedere<br />
  Wire.write(IndRam);</p>
<p>  //imposto la data 25/04/12 in esadecimale<br />
  Data[0] = 0x19;  //giorno 25<br />
  Data[1] = 0x04;  //mese   04<br />
  Data[2] = 0x0C;  //anno   12</p>
<p>  //scrivo i 3 byte negli indirizzi 0x08 0x09 0x0A<br />
  Wire.write(Data,3);</p>
<p>  //chiudo la comunicazione<br />
  Wire.endTransmission();</p>
<p>}</p>
<p>void loop()<br />
{}</p>
<p>[/c]</p>
<p>Nel datasheet del <strong>DS1307</strong> la ram aggiuntiva inizia all&#8217;indirizzo <strong>0x08</strong> e finisce all&#8217;indirizzo <strong>0x3F</strong> e, sapendo che per memorizzare una data servono 3 byte (G M A), devi sommare alla variabile <strong>IndRam</strong> valori multipli di 3.<br />
Ad esempio per memorizzare la seconda data <strong>IndRam</strong> varrà <strong>0x08 + 3</strong> per la terza data<strong> 0x08+6</strong> e cosi via fino a <strong>0x08+51</strong>, ottenendo così 18 date memorizzabili.</p>
<table style="width: 300px;" border="0" cellspacing="3" cellpadding="3" align="center">
<tbody>
<tr>
<td>Locazione</td>
<td>Valore variabile IndRam</td>
</tr>
<tr>
<td>1</td>
<td>0x08 (8)</td>
</tr>
<tr>
<td>2</td>
<td>0x0B (11)</td>
</tr>
<tr>
<td>3</td>
<td>0x0E (14)</td>
</tr>
<tr>
<td>4</td>
<td>0x11 (17)</td>
</tr>
<tr>
<td>5</td>
<td>0x14 (20)</td>
</tr>
<tr>
<td>6</td>
<td>0x17 (23)</td>
</tr>
<tr>
<td>7</td>
<td>0x1A (26)</td>
</tr>
<tr>
<td>8</td>
<td>0x1D (29)</td>
</tr>
<tr>
<td>9</td>
<td>0x20 (32)</td>
</tr>
<tr>
<td>10</td>
<td>0x23 (35)</td>
</tr>
<tr>
<td>11</td>
<td>0x26 (38)</td>
</tr>
<tr>
<td>12</td>
<td>0x29 (41)</td>
</tr>
<tr>
<td>13</td>
<td>0x2C (44)</td>
</tr>
<tr>
<td>14</td>
<td>0x2F (47)</td>
</tr>
<tr>
<td>15</td>
<td>0x32 (50)</td>
</tr>
<tr>
<td>16</td>
<td>0x35 (53)</td>
</tr>
<tr>
<td>17</td>
<td>0x38 (56)</td>
</tr>
<tr>
<td>18</td>
<td>0x3B (59)</td>
</tr>
</tbody>
</table>
<p>Una volta memorizzate le date che ci interessano, è necessario scrivere del codice che confronti questi valori con quelli dell&#8217;RTC e di conseguenza eseguire delle operazioni di output.</p>
<p>Per primo recupero il giorno, mese e anno dell&#8217;RTC a partire dall&#8217;indirizzo  0x04</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2689" title="RamDS1307" src="https://logicaprogrammabile.it/wp-content/uploads/2012/04/RamDS1307.gif" alt="RAM ds1307" width="263" height="269" /></p>
<p>e poi recupero i dati della user ram per eseguire il confronto quindi:</p>
<p>[c]</p>
<p>void loop()<br />
{<br />
  IndRam = 0x04;</p>
<p>  //setto l&#8217;indirizzo da ddove iniziare<br />
  //a leggere<br />
  Wire.beginTransmission(0x68);<br />
  Wire.write(IndRam);<br />
  Wire.endTransmission();</p>
<p>  //recupero 3 byte G M A<br />
  Wire.requestFrom(0x68, 3);<br />
  byte Giorno = Wire.read();<br />
  byte Mese = Wire.read();<br />
  byte Anno = Wire.read();</p>
<p>  Serial.print(Giorno, DEC);<br />
  Serial.print(&quot;/&quot;);<br />
  Serial.print(Mese,DEC);<br />
  Serial.print(&quot;/&quot;);<br />
  Serial.println(Anno, DEC);</p>
<p>  //recupero tutte le date memorizzate nella user ram<br />
  //e le confronto con quella attuale dell&#8217;RTC</p>
<p>  for( byte Ciclo = 0; Ciclo &lt; 54; Ciclo += 3)<br />
  {<br />
    IndRam = 0x08 + Ciclo;<br />
    //Serial.println(IndRam, HEX);</p>
<p>    Wire.beginTransmission(0x68);<br />
    Wire.write(IndRam);<br />
    Wire.endTransmission();</p>
<p>    Wire.requestFrom(0x68, 3);<br />
    byte memGiorno = Wire.read();<br />
    byte memMese = Wire.read();<br />
    byte memAnno = Wire.read();</p>
<p>    //confronta i dati</p>
<p>    if(Giorno == memGiorno &amp;&amp; Mese == memMese &amp;&amp; Anno == memAnno)<br />
    {<br />
      //trovata data<br />
      //fai qualcosa<br />
      Serial.println(&quot;Data OK&quot;);<br />
    }</p>
<p>    delay(10);<br />
  }</p>
<p>  delay(1000);<br />
}<br />
[/c]</p>
<p>Il codice controlla ciclicamente se la data impostata nell&#8217;RTC è presente nella user ram in caso affermativo viene printata la stringa <strong>Data OK</strong>.<br />
Il codice ha un problema, non tiene conto dell&#8217;andamento temporale, infatti viene fatto un controllo di valori che non permette di verificare se una data è precedente o successiva a quella impostata.<br />
Il compito del codice dovrebbe essere quello di avvisarci degli avvenimenti futuri mentre dovrebbe escludere quelli passati.</p>
<p>Per poter confrontare le date tra di loro mi sono avvalso della libreria <strong>Time</strong> che tra le varie funzioni permette di restituire il numero di secondi trascorsi tra il 1 gennaio 1970 e una data definita.<br />
Ottenendo un numero progressivo posso confrontare due date e capirne l&#8217;ordine temporale.</p>
<h4>Installare e utilizzare la libreria Time</h4>
<p>Sul sito ufficiale di Arduino, seguendo <a href="http://www.arduino.cc/playground/Code/Time" target="_blank">questo link</a> possiamo scaricare la libreria. Scompattiamo il file zip nella cartella Arduino 1.0-&gt;libraries. Questa operazione produrrà tre cartelle una con nome <strong>Time</strong>, <strong>DS1307RTC</strong> e <strong>TimeAlarms</strong>. <span style="text-decoration: underline;">Riavviamo l&#8217;IDE per aggiornare le lista delle librerie e degli esempi</span>.</p>
<p>Per utilizzare la libreria nello sketch del progetto che stiamo sviluppando, possiamo inserire a mano la clausola</p>
<p>[c]#include &lt;Time.h&gt;[/c]</p>
<p>oppure dal menu dell&#8217;ide eseguiamo <strong>Sketch-&gt;Import Library-&gt;Time</strong></p>
<p>Per ottenere i secondi trascorsi dal 1 gennaio 1970 è disponibile la funzione<strong> now()</strong>, ma prima, giustamente bisogna settare la data di riferimento, per farlo si utilizza la funzione <strong>setTime(ora, minuti, secondi, giorno, mese, anno)</strong> quindi il codice precedente viene modificato così:</p>
<p>[c]<br />
#include &lt;Wire.h&gt;<br />
//includo la libreria Time<br />
#include &lt;Time.h&gt;</p>
<p>byte IndRam = 0x00;<br />
byte Data[3];</p>
<p>byte val = 0x00;</p>
<p>//queste variabili servono per memorizzare<br />
//la data in secondi trascorsi dal 1 gen 1970<br />
unsigned long UnixData = 0;<br />
unsigned long memUnixData = 0;</p>
<p>void setup()<br />
{<br />
  Wire.begin();<br />
  Serial.begin(9600);</p>
<p>  //imposto l&#8217;indirizzo iniziale della user ram<br />
  IndRam = 0x08;</p>
<p>  //carico una data da ricordare nei primi<br />
  //3 byte della user ram<br />
  Wire.beginTransmission(0x68);<br />
  Wire.write(IndRam);<br />
  Data[0] = 0x05; //giorno  05<br />
  Data[1] = 0x04; //mese    04<br />
  Data[2] = 0x0C;  //anno   12<br />
  Wire.write(Data,3);<br />
  Wire.endTransmission();</p>
<p>  delay(100);</p>
<p>  //verifico la data appena impostata<br />
  //nella user ram<br />
  Wire.beginTransmission(0x68);<br />
  Wire.write(IndRam);<br />
  Wire.endTransmission();</p>
<p>  Wire.requestFrom(0x68, 3);<br />
  byte data = Wire.read();<br />
  Serial.print(data);<br />
  Serial.print(&quot;/&quot;);<br />
  data = Wire.read();<br />
  Serial.print(data);<br />
  Serial.print(&quot;/&quot;);<br />
  data = Wire.read();<br />
  Serial.print(data);<br />
  Serial.println(&quot;/&quot;);</p>
<p>  delay(100);<br />
}</p>
<p>void loop()<br />
{<br />
  //setto l&#8217;indirizzo per accedere alla data<br />
  //impostata nell&#8217;RTC<br />
  IndRam = 0x04;<br />
  //setto l&#8217;indirizzo da dove iniziare<br />
  //a leggere<br />
  Wire.beginTransmission(0x68);<br />
  Wire.write(IndRam);<br />
  Wire.endTransmission();</p>
<p>  //recupero 3 byte G M A<br />
  Wire.requestFrom(0x68, 3);<br />
  byte Giorno = Wire.read();<br />
  byte Mese = Wire.read();<br />
  byte Anno = Wire.read();</p>
<p>  //visualizzo la data dell&#8217;RTC<br />
  Serial.print(Giorno, DEC);<br />
  Serial.print(&quot;/&quot;);<br />
  Serial.print(Mese,DEC);<br />
  Serial.print(&quot;/&quot;);<br />
  Serial.println(Anno, DEC);</p>
<p>  //setto la libreria Time con la data dell&#8217;RTC<br />
  setTime(0,0,0, Giorno, Mese, (Anno + 2000));<br />
  //Recupero i secondi trascorsi tra la data 1 Gen 1970<br />
  //e la data dell&#8217;RTC<br />
  UnixData = now();<br />
  //Visualizzo i secondi trascorsi sul Serial Monitor<br />
  Serial.println(now());</p>
<p>  //recupero tutte le date memorizzate nella ram<br />
  //e le confronto con quella attuale dell&#8217;RTC<br />
  //trasformandole in secondi in modo da poter confrontare<br />
  //le date</p>
<p>  for( byte Ciclo = 0; Ciclo &lt; 54; Ciclo += 3)<br />
  {<br />
    //imposto il primo indirizzo della user ram<br />
    //e poi proseguo ciclicamente incrementando di<br />
    //3 posizioni<br />
    IndRam = 0x08 + Ciclo;<br />
    //Serial.println(IndRam, HEX);</p>
<p>    //setto l&#8217;indirizzo<br />
    Wire.beginTransmission(0x68);<br />
    Wire.write(IndRam);<br />
    Wire.endTransmission();</p>
<p>    //recupero i tre byte G M A<br />
    //dalla user RAM<br />
    Wire.requestFrom(0x68, 3);<br />
    byte memGiorno = Wire.read();<br />
    byte memMese = Wire.read();<br />
    byte memAnno = Wire.read();</p>
<p>    //imposto la libreria Time con la data dela user RAM<br />
    // per convertirla in secondi<br />
    setTime(0,0,0, memGiorno, memMese, (memAnno + 2000));<br />
    memUnixData = now();<br />
    //Serial.println(now());</p>
<p>    //confronto la data in secondi dell&#8217;RTC con la data<br />
    //appena recuperata dalla user ram</p>
<p>    if(UnixData == memUnixData)<br />
    {<br />
      //trovata data<br />
      //fai qualcosa<br />
      Serial.println(&quot;TROVATA!!!&quot;);<br />
    }</p>
<p>    delay(10);<br />
  }</p>
<p>  delay(1000);<br />
}<br />
[/c]</p>
<p>Il codice ha lo stesso comportamento di quello iniziale ma adesso c&#8217;è la possibilità di eseguire il confronto numerico grazie alla conversione in secondi. Ad esempio per escludere tutte le date passate possiamo fare questa semplice modifica</p>
<p>[c]</p>
<p>   //escludi le date passate</p>
<p>   if(UnixData &gt;= memUnixData)<br />
   {<br />
     //trovata data<br />
     //fai qualcosa<br />
     Serial.println(&quot;TROVATA!!!&quot;);<br />
   }</p>
<p>[/c]</p>
<p>oppure eseguire del codice per avvisarci una settimana in anticipo:</p>
<p>[c]  //avvisami una settimana prima<br />
  //settimana in secondi 60*60*24*7 = 604800</p>
<p>  if((memUnixData &#8211; UnixData) &lt;= 604800)<br />
  {<br />
    //trovata data<br />
    //fai qualcosa<br />
    Serial.println(&quot;TROVATA!!!&quot;);<br />
  }<br />
[/c]</p>
<p>Avendo il modo di eseguire un confronto numerico tra le date ci offre la possibilità di realizzare ulteriori funzioni, come ad esempio sketch che gestiscono l&#8217;Arduino a seconda delle date impostate nella user ram.</p>
<p>Per le operazioni da eseguire quando viene trovata una data possiamo eseguire tutte le tipiche funzioni di output che può gestire Arduino.</p>
<p>&nbsp;</p>
<p>[c]<br />
   //escludi le date passate<br />
   if(UnixData &gt;= memUnixData)<br />
   {<br />
     //trovata data<br />
     //fai qualcosa<br />
     Serial.println(&quot;TROVATA!!!&quot;);<br />
   }<br />
[/c]</p>
<p>The post <a href="https://logicaprogrammabile.it/promemoria-arduino-rtc/">Promemoria alternativo con Arduino e RTC</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/promemoria-arduino-rtc/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Usare il modulo RTC DS1307 con Arduino</title>
		<link>https://logicaprogrammabile.it/usare-modulo-rtc-ds1307-arduino/</link>
					<comments>https://logicaprogrammabile.it/usare-modulo-rtc-ds1307-arduino/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Wed, 21 Mar 2012 10:09:34 +0000</pubDate>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[DateTime]]></category>
		<category><![CDATA[DS1307]]></category>
		<category><![CDATA[RTC]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=2622</guid>

					<description><![CDATA[<p>Cosa devi sapere per usare un real time clock DS1307 Considero molto utile avere un dispositivo che permetta di tenere traccia del tempo e della data, poiché in molti progetti, come quelli della domotica, richiedono un sistema per recuperare queste informazioni. Avere un circuito che...</p>
<p>The post <a href="https://logicaprogrammabile.it/usare-modulo-rtc-ds1307-arduino/">Usare il modulo RTC DS1307 con Arduino</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Cosa devi sapere per usare un real time clock DS1307</h3>
<p>Considero molto utile avere un dispositivo che permetta di tenere traccia del tempo e della data, poiché in molti progetti, come quelli della domotica, richiedono un sistema per recuperare queste informazioni. Avere un circuito che mi garantisca, anche in mancanza di alimentazione, un riferimento temporale sicuro è fondamentale.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2629" title="DS1307" src="https://logicaprogrammabile.it/wp-content/uploads/2012/03/DS1307.png" alt="DS1307 real time clock RTC pin function" width="227" height="124" /></p>
<p>Tipicamente, l&#8217;integrato che viene utilizzato maggiormente, in campo hobbistico, è il DS1307. Le sue caratteristiche tecniche sono le seguenti<span id="more-2622"></span></p>
<table border="0">
<tbody>
<tr>
<td> Caratteristiche</td>
<td> conteggio in secondi, minuti, ore, giorno della settimana, giorno del mese, mese, anno.</td>
</tr>
<tr>
<td> Interfaccia</td>
<td> bus I2C</td>
</tr>
<tr>
<td> RAM</td>
<td> 56 byte aggiuntivi di memoria utente</td>
</tr>
<tr>
<td> Altre uscite</td>
<td> Possibilità di generare un onda quadra di 1Hz, 4096KHz, 8192KHz, 32768KHz</td>
</tr>
</tbody>
</table>
<p>ha un costo contenuto, circa 2.5€, è disponibile sia in package  THT(Through-Hole Technology) sia in SMD, in versioni con standard industriali (temperature di esercizio da -40 a +85 °C).</p>
<p>Anche utilizzarlo è risultato semplice, vista la possibilità di colloquiare tramite bus I2C. Una volta realizzato il circuito seguente, scriviamo alcun istruzioni per settare i registri del DS1307 in modo da impostare la data e l&#8217;ora.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2638 size-full" title="rtc DS1307" src="https://logicaprogrammabile.it/wp-content/uploads/2012/03/DS1307.gif" alt="schema rtc DS1307" width="348" height="296" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/03/DS1307.gif 348w, https://logicaprogrammabile.it/wp-content/uploads/2012/03/DS1307-300x255.gif 300w" sizes="auto, (max-width: 348px) 100vw, 348px" /></p>
<p>La struttura di questi registri è la seguente:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2641 size-full" title="DS1307-Register" src="https://logicaprogrammabile.it/wp-content/uploads/2012/03/DS1307_Register.jpg" alt="Struttura registri DS 1307" width="486" height="366" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/03/DS1307_Register.jpg 486w, https://logicaprogrammabile.it/wp-content/uploads/2012/03/DS1307_Register-300x225.jpg 300w" sizes="auto, (max-width: 486px) 100vw, 486px" /></p>
<p>mentre le istruzioni le trovate di seguito</p>
<pre class="lang:arduino decode:true ">//includo la libreria per la
//comunicazione su bus I2C
#include &lt;Wire.h&gt;

void setup()
{
//inizializzo la libreria
Wire.begin();

//attivo la comunicazione con il DS1307
//l'indirizzo dell'RTC è 0x68
Wire.beginTransmission(0x68);
//il primo byte stabilisce il registro
//iniziale da scivere
Wire.write((byte)0x00);
//specifico il tempo e la data
Wire.write((byte)0x00); //1° byte SECONDI da 0x00 a 0x59
Wire.write((byte)0x10); //2° byte MINUTI da 0x00 a 0x59
Wire.write((byte)0x80 | 0x10); //3° byte ORE da 0x00 a 0x23
Wire.write((byte)0x01); //4° byte GIORNO della settimana da 0x01 a 0x07
Wire.write((byte)0x21); //5° byte GIORNO del mese da 0x01 a 0x31
Wire.write((byte)0x03); //6° byte MESE da 0x01 a 0x12
Wire.write((byte)0x12); //7° byte ANNO 0x00 a 0x99
Wire.endTransmission();
}

void loop()
{
delay(100);
}</pre>
<p>&nbsp;</p>
<p>Per poter recuperare le informazioni è sufficiente eseguire una lettura in sequenza dei primi 7 byte, partendo dall&#8217;indirizzo 0x00</p>
<pre class="lang:arduino decode:true ">//includo la libreria per la
//comunicazione su bus I2C
#include &lt;Wire.h&gt;

void setup()
{
//inizializzo la seriale
Serial.begin(9600);

//inizializzo la libreria
Wire.begin();

//attivo la comunicazione con il DS1307
//l'indirizzo dell'RTC è 0x68
Wire.beginTransmission(0x68);
//il primo byte stabilisce il registro
//iniziale da scivere
Wire.write((byte)0x00);
//specifico il tempo e la data
Wire.write((byte)0x00); //1° byte SECONDI da 0x00 a 0x59
Wire.write((byte)0x10); //2° byte MINUTI da 0x00 a 0x59
Wire.write((byte)0x80 | 0x10); //3° byte ORE da 0x00 a 0x24
Wire.write((byte)0x01); //4° byte GIORNO della settimana da 0x01 a 0x07
Wire.write((byte)0x21); //5° byte GIORNO del mese da 0x00 a 0x31
Wire.write((byte)0x03); //6° byte MESE da 0x00 a 0x12
Wire.write((byte)0x12); //7° byte ANNO 0x00 a 0x99
Wire.endTransmission();
}

void loop()
{
//inizzializza la trasmissione partendo
//dall'indirizzo 0x00
Wire.beginTransmission(0x68);
Wire.write((byte)0x00);
Wire.endTransmission();

//richiedo 7 byte dal dispositivo con
//indirizzo 0x68
Wire.requestFrom(0x68, 7);
//regupero i 7 byte relativi ai
//corrispondenti registri
byte secondi = Wire.read();
byte minuti = Wire.read();
byte ora = Wire.read();
byte giorno_sett = Wire.read();
byte giorno_mese = Wire.read();
byte mese = Wire.read();
byte anno = Wire.read();

Serial.print("Orario corrente: ");
Serial.print(ora, HEX);
Serial.print(":");
Serial.print(minuti, HEX);
Serial.print(":");
Serial.println(secondi, HEX);

Serial.print("Giorno della settimana: ");
Serial.println(giorno_sett, HEX);

Serial.print("Data corrente: ");
Serial.print(giorno_mese, HEX);
Serial.print("/");
Serial.print(mese, HEX);
Serial.print("/");
Serial.println(anno, HEX);
Serial.println();

delay(1000);
}</pre>
<p>La batteria tampone, tipicamente una CR2032, garantisce un back-up di circa 6 mesi.</p>
<p>Delocalizzare la gestione dell&#8217;orario su un chip esterno permette di concentrare le risorse dell&#8217;Arduino su altri processi e allo stesso tempo di impiegare in modo veloce e semplice il bus I2C per recuperare le informazioni di tempo e data.</p>
<p>Realizzare automatismi basati sul DS1307 è risultato molto economico e semplice, vi invito quindi ad acquistare direttamente il chip piuttosto che i kit già assemblati che attualmente si aggirano tra gli 8€ e i 15€.</p>
<p>The post <a href="https://logicaprogrammabile.it/usare-modulo-rtc-ds1307-arduino/">Usare il modulo RTC DS1307 con Arduino</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/usare-modulo-rtc-ds1307-arduino/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
		<item>
		<title>Usare l&#8217;RTC della Fez Panda II</title>
		<link>https://logicaprogrammabile.it/usare-lrtc-della-fez-panda-ii/</link>
					<comments>https://logicaprogrammabile.it/usare-lrtc-della-fez-panda-ii/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 27 Feb 2012 11:24:33 +0000</pubDate>
				<category><![CDATA[Ghi-FEZ]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Clock]]></category>
		<category><![CDATA[DateTime]]></category>
		<category><![CDATA[RTC]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=2558</guid>

					<description><![CDATA[<p>Come gestire il real time clock della Fez Panda II Solitamente quando ho il bisogno di avere un riferimento temporale, che risulta ininfluente dalle mancanze di alimentazione o da riavvi casuali della scheda, utilizzo un RTC esterno, tipicamente un DS1307. La soluzione fornita dalla Fez...</p>
<p>The post <a href="https://logicaprogrammabile.it/usare-lrtc-della-fez-panda-ii/">Usare l&#8217;RTC della Fez Panda II</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Come gestire il real time clock della Fez Panda II</h3>
<p>Solitamente quando ho il bisogno di avere un riferimento temporale, che risulta ininfluente dalle mancanze di alimentazione o da riavvi casuali della scheda, utilizzo un RTC esterno, tipicamente un DS1307. La soluzione fornita dalla <a href="https://www.ghielectronics.com/catalog/product/256" target="_blank">Fez Panda II</a> impiega un rtc on board che necessita solamente di una batteria tampone esterna, tipicamente quella utilizzata nei computer da 3.3Vdc.</p>
<p>La prima operazione da effettuare, dopo aver collegato la batteria tampone tra il pin BAT e il pin GND, è l&#8217;inizializzazione dell&#8217;RTC con una data ed un ora valida:</p>
<p>[csharp]<br />
//Setto la data e l&#8217;ora per l&#8217;RTC<br />
//Anno, Mese, Giorno, Ora, Minuti, Secondi<br />
RealTimeClock.SetTime(new DateTime(2012, 02, 23, 12, 0, 0));<br />
[/csharp]</p>
<p>questo settaggio non agisce automaticamente sulle impostazioni di data ed ora della classe DateTime, ma è soltanto il metodo per inizzializzare l&#8217;RTC.</p>
<p>Per poter leggere la data ed il tempo è necessario utilizzare la classe <strong>Utility</strong> per settare il local time con quello dell&#8217;RTC</p>
<p>[csharp]<br />
//Leggo la data ed il tempo dall&#8217;RTC e lo assegno al local time<br />
Utility.SetLocalTime(RealTimeClock.GetTime());<br />
[/csharp]</p>
<p>Adesso la classe DateTime ha come riferimento la data e l&#8217;ora dell&#8217;RTC, posso richiamarla utilizzando questo esempio</p>
<p>[csharp]<br />
//visualizzo a console la data e l&#8217;ora corrente<br />
Debug.Print(DateTime.Now.ToString());<br />
[/csharp]</p>
<p>Queste poche linee di coidce permettono di gestire l&#8217;RTC on board della Fez Panda II e di implementare ne progetti un sistema basato sul tempo.</p>
<p>The post <a href="https://logicaprogrammabile.it/usare-lrtc-della-fez-panda-ii/">Usare l&#8217;RTC della Fez Panda II</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/usare-lrtc-della-fez-panda-ii/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
