<?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>Promemoria Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/promemoria/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/promemoria/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Mon, 04 Jun 2012 14:43:15 +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>Promemoria Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/promemoria/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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 fetchpriority="high" 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="(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 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>
	</channel>
</rss>
