Ciao,
Io uso sempre github, ma non ho mai condiviso il mio repository.
Il mio repository:
– Sistema antifurto
– Temporizzatore
Bests,
Giuseppe
Ciao,
Io uso sempre github, ma non ho mai condiviso il mio repository.
Il mio repository:
– Sistema antifurto
– Temporizzatore
Bests,
Giuseppe
Eccomi di nuovo con il temporizzatore.
Come ho spiegato nel post precedente voglio accendere e/o spegnere un utilizzatore a 220 V utilizzando dei relè.
Ad oggi non ho mai avuto esperienza nell’utilizzo dei relè, quindi lo schema comprenderà l’accensione/spegnimento di un led.
Ecco lo schema visto precedentemente con l’aggiunta del led collegato al PIN 13 digitale di Arduino:
Ed ecco il codice:
#include <Wire.h> #include <String.h> #include "RTClib.h" #define BUFFER_SIZE 20 #define STATE_OFF 0 #define STATE_ON 1 //Giornate di programmazione const int numeroProgrammazioni = 4; String lunedi[numeroProgrammazioni] = { "21:35", "20:30","20:35","20:40"}; String martedi[numeroProgrammazioni] = { "11:00", "11:35","13:10","13:50"}; String mercoledi[numeroProgrammazioni] = { "20:55", "19:58","20:00","20:05"}; String giovedi[numeroProgrammazioni] = { "10:00", "10:35","17:10","20:00"}; String venerdi[numeroProgrammazioni] = { "10:00", "10:35","14:10","15:00"}; String sabato[numeroProgrammazioni] = { "18:15", "18:20","18:22","18:25"}; String domenica[numeroProgrammazioni] = { "10:00", "10:35","12:10","15:00"}; //Fine giornate di programmazione RTC_DS1307 rtc; int fsm_state; String START_TIME; String END_TIME; int nSize = numeroProgrammazioni / 2; String giornoTemp[numeroProgrammazioni]; void setup () { //Serial.println("Inizio Setup"); fsm_state = STATE_OFF; Serial.begin(57600); #ifdef AVR Wire.begin(); #else Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due #endif rtc.begin(); if (! rtc.isrunning()) { rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } pinMode(13,OUTPUT); //Collegamento al LED } void loop () { // Ricavo il time attuale DateTime now = rtc.now(); int giorno = now.dayOfWeek(); //0 = lunedi 1 = martedi 2 = mercoledi .... //Serial.println( giorno); if (giorno == 1){ //lunedi memcpy(giornoTemp,lunedi, sizeof(lunedi)); } else if (giorno == 2){ //martedi memcpy(giornoTemp,martedi, sizeof(martedi)); } else if (giorno == 3){ //mercoledi memcpy(giornoTemp,mercoledi, sizeof(mercoledi)); } else if (giorno == 4){ //giovedi memcpy(giornoTemp,giovedi, sizeof(giovedi)); } else if (giorno == 5){ //venerdi memcpy(giornoTemp,venerdi, sizeof(venerdi)); } else if (giorno == 6){ //sabato memcpy(giornoTemp,sabato, sizeof(sabato)); } else if (giorno == 7){ //domenica memcpy(giornoTemp,domenica, sizeof(domenica)); } //verifico lo stato che dovrà assumere int isON = 0; for (int i= 0; i< nSize;i++){ START_TIME = giornoTemp[i*2]; END_TIME = giornoTemp[(i*2)+1]; isON = setStatus(now,START_TIME,END_TIME); gestisciCarico(isON); } //end for delay(3000); } int setStatus(DateTime timeOra, String START_TIME, String END_TIME) { //recupero l'ora DateTime dSTART_TIME = DateTime(timeOra.year(),timeOra.month(),timeOra.day(),START_TIME.substring(0, 2).toInt(),START_TIME.substring(3, 5).toInt(),0); DateTime dEND_TIME = DateTime(timeOra.year(),timeOra.month(),timeOra.day(),END_TIME.substring(0, 2).toInt(),END_TIME.substring(3, 5).toInt(),0); long lSTART_TIME = dSTART_TIME.unixtime(); long lEND_TIME = dEND_TIME.unixtime(); switch(fsm_state) { case STATE_OFF: if(timeOra.unixtime() > lSTART_TIME && timeOra.unixtime() < lEND_TIME) { fsm_state = STATE_ON; //Serial.println("caso 1"); } break; case STATE_ON: if(timeOra.unixtime() > lEND_TIME) { fsm_state = STATE_OFF; //Serial.println("caso 2"); } break; } return fsm_state; } void gestisciCarico(int isON) { if (isON == 1){ digitalWrite(13,HIGH); } else { digitalWrite(13,LOW); } }
Spiegazione del codice:
dalla riga 12 alla riga 25: settaggio delle ore del giorno in cui accendere il led in questo caso
riga 47: viene settato RTC con l’ora e la data di compilazione del codice
riga 50: imposto il collegamento al led su pin 13
Nel loop:
riga 55: ricavo giorno e ora corrente
riga 57: ricavo il giorno corrente (0 = lunedi, 1 = martedi….), questo mi serve per capire in quale stringa di array andare a verificare se accendere il led,se l’array lunedi, martedi e cosi via
riga 86: utilizzo la funzione setStatus per verificare se accendere o meno il led
riga 84: funzione setStatus: per confrontare le date utilizzo la funzione unixtime() che converte la data in formato unix, quindi come long. Il confronto quindi si limita al confronto fra due long. La funzione restituisce un int 0/1 se necessario attivare o meno il led
riga 87: funzione gestisciCarico: la funzione prende in input il valore precedentemente restituito. A questo punto viene acceso o spendo il led.
A questo punto il nostro led si accenderà o spegnerà nelle ore da noi stabilite.
I passaggi successivi, che spiegherò prossimamente sono:
1. aggiunta di una funzione random (opzionale): se la funzione random è attiva, allora all’ora di accensione/spegnimento dei giorni settimanali vengono aggiunti dei minuti casuali.
2. modifica del circuito per ospitare il relè e quindi per accendere o spegnere una lampada
Ciao di nuovo a tutti, su suggerimento di mio papà, voglio utilizzare Arduino per poter accendere e spegnere una lampada o un qualsiasi utilizzatore a 220 V in determinati orari della settimana.
Quindi ad esempio:
– il lunedì voglio che la mia lampada si accende alle ore 8.15 fino alle 9.40, il pomeriggio invece dalle 17.10 alle 17.45.
– il martedì dalle ore 9.20 alle ore 10.50
– il mercoledì dalle ore 10.00 alle ore 11.00 e nel pomeriggio dalle ore 15.10 alle ore 15.45
e cosi via, fino a domenica
Per fare questo mi sono procurato il chip DS1307: è un RTC (Real-time clock) molto economico che permette di tenere traccia del tempo e della data.
Inoltre è provvisto di una batteria a tampone che garantisce il funzionamento dell’orologio interno anche in assenza di alimentazione esterna.
E’ possibile colloquiare con il chip tramite protocollo I2C, quindi con la libreria Wire.
Il collegamento fra arduino e il chip è molto semplice, come da foto sottostante:
Riepilogando:
PIN Arduino | PIN DS1307 |
5 V | 5 V |
GND | GND |
Pin Analogico 4 | SDA |
Pin Analogico 5 | SCL |
I collegamenti fra Arduino e il chip variano a seconda del modello di Arduino (uno, leonardo, ecc).
Infatti i PIN SDA (data line) e SCL (clock line) differiscono come da link precedente.
Board | I2C / TWI pins |
Uno, Ethernet | A4 (SDA), A5 (SCL) |
Mega2560 | 20 (SDA), 21 (SCL) |
Leonardo | 2 (SDA), 3 (SCL) |
Due | 20 (SDA), 21 (SCL), SDA1, SCL1 |
Vedremo nel prossimo post come gestire la date ed ora e come poter utilizzare queste informazioni per poter accendere quando desideriamo un dispositivo.
Alla prossima!!!
Arduino Day 2015, che cadrà nella giornata del 28 marzo, vuole celebrare il movimento maker con ancora più eventi. La call è aperta e tutti possono partecipare, in qualsiasi parte del mondo!
Basta iscriversi QUI e partcipare alla Call for Entries.Per essere un semplice partecipante ho utilizzato Eventbrite per la registrazione all’evento di Torino.
Clicca qui per registrarti gratuitamente e ricevere i tuoi biglietti!!!
Per i miei ultimi esperimenti (vedi il precedente post) ho deciso di acquistare per la prima volta un clone di Arduino.
Una volta scritto lo sketch ho cercato di caricarlo: niente, nessuna comunicazione USB della scheda con il mio sistema MAC Yosemite.
Leggendo l’inserzione e guardando meglio la scheda, ho scoperto che il chip che si occupa della comunicazione seriale non è quello standard presente nelle schede originali di Arduino ma il chip CH340G (USB/Serial Interface).
E’ quindi necessario trovare i corretti driver per gestire il chip.
In rete ho trovato questa interessantissima guida.
Riepilogo per mia memoria futura e per chi mi segue:
sudo nvram boot-args="kext-dev-mode=1"
A questo punto nell’ Ide di Arduino, dal menù Strumenti, Porta seriale, sarà possibile selezionare la porta seriale corretta.
Spero possa essere d’aiuto!
Una delle idee iniziali che mi erano venute in mente in fase di realizzazione del mio antifurto era di utilizzare un sensore ad ultrasuoni per la rilevazione della distanza.
Poi sono ripiegato sul modulo PIR.
Ho deciso in ogni caso di rispolverarlo e di leggermi un po’ la documentazione e il datasheet.
La misurazione con questo componente è fatta misurando il tempo impiegato da un segnale sonoro a raggiungere un oggetto e ritornare al sensore.
La misura quindi non è in termini di distanza ma di tempo, in particolare in microsecondi.
Il sensore HC-SR04 dispone di 4 pin: Vcc (+5V), Trigger, Echo, GND.
In linea di massima il funzionamento è così:
Il tempo impiegato ci permette di stabilire la distanza fra il sensore e l’ostacolo.
Come fare?
Per convertire l’unità di tempo in spazio è necessario sapere la velocità del suono nell’aria: ci aiuta wikipedia.
Nell’aria, la velocità del suono è di 331,45 m/s a 0 °C (pari a 1 193,04 km/h) e di 343,8 m/s (pari a 1 237,68 km/h) a 20 °C (e in generale varia secondo la relazione a = 331,45 + 0,62 t con t misurata in °C).
Quindi consideriamo circa 343 m/s, espresso in centrimetri: 0,0343 cm/microsecondi.
Dato che lo spazio = velocità * tempo (s= v*t) ne risulta che s = 0,0343 *t.
Bisogna però considerare che il tempo individuato dal pin Echo è quello di partenza dal pin Trigger, arrivo all’ostacolo e tornare indietro verso il sensore.
Quindi sarà necessario dividere il tempo: s = 0,0343 *t / 2.
La formula che utilizzeremo in definitiva sarà: s = 0,01715 * t
Passiamo ora ai collegamenti con Arduino:
Pin Arduino | Pin Sensore |
POWER 5V | VCC |
Digital 7 | Trig |
Digital 8 | Echo |
GND | GND |
Passiamo quindi al codice:
int trigger_Port = 7; int echo_Port = 8; void setup() { pinMode( trigger_Port, OUTPUT ); pinMode( echo_Port, INPUT ); Serial.begin( 9600 ); Serial.println( "Sensore distanza ad ultrasuoni: "); } void loop() { //setto uscita bassa su pin del trigger digitalWrite( trigger_Port, LOW ); //invio impulso di 10 micro secondi su pin del trigger digitalWrite( trigger_Port, HIGH ); delayMicroseconds( 10 ); //setto nuovamente uscita bassa su pin del trigger digitalWrite( trigger_Port, LOW ); //leggo la durata sul pin Echo long durata = pulseIn( echo_Port, HIGH ); //calcolo la durata long r = 0.034 * durata / 2; Serial.print( "durata: " ); Serial.print( durata ); Serial.print( " , " ); Serial.print( "distanza: " ); //dopo 38ms è fuori dalla portata del sensore if( durata > 38000 ) Serial.println( "fuori portata"); else { Serial.print( r ); Serial.println( "cm" ); } //aspetta 1.0 secondi delay( 1000 ); }
E’ possibile anche utilizzare la libreria new_ping.
Una volta scaricata la libreria e copiato il contenuto nella cartella libraries di Arduino è possibile semplificare la scrittura del codice:
#include <NewPing.h> #define trigger_Port 7 #define echo_Port 8 #define max_distance 200 NewPing sonar(trigger_Port, echo_Port, max_distance); void setup() { Serial.begin(9600); } void loop() { delay(50); unsigned int uS = sonar.ping_cm(); Serial.print(uS); Serial.println("cm"); }
Con questa libreria è possibile inviare anche un ping multiplo e farsi ritornare la media delle letture effettuate, basta utilizzare:
nsigned int uS = sonar.ping_median(numero misurazioni);
#include <NewPing.h> #define trigger_Port 7 #define echo_Port 8 #define max_distance 200 NewPing sonar(trigger_Port, echo_Port, max_distance); void setup() { Serial.begin(9600); } void loop() { delay(50); unsigned int durata = sonar.ping_median(5); long r = 0.034 * durata / 2; Serial.print(r); Serial.println("cm"); }
In questo caso ho impostato come numero di misurazioni 5. Quindi ci verrà riportata la media di 5 misurazioni.
Che dire…è decisamente una libreria tanto utile quanto facile da usare!
Oggi voglio segnalarvi un ghiotto appuntamento: l’Internet of Everything Italian Forum.
Fra i relatori anche Massimo Banzi.
Per chi, come me, non potrà essere presente ecco l’indirizzo dello streaming.
Spero di esservi stato utile.
Finalmente posso postare il codice completo con le modifiche alla gestione della memoria!
#include <String.h> #include <RCSwitch.h> #include <Time.h> #include <SPI.h> #include <Ethernet.h> #include <EEPROM.h> /* Informazioni Ethernet*/ byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 }; int SERIAL_BAUD = 9600; int TRASMIT_PIN = 9; int RECEIVE_PIN = 0; int NOISE_DIGITAL_PIN = 5; //Codice wireless webcam long SEGNALE_ACCENZIONE_WEBCAM = 1394001; long SEGNALE_SPEGNIMENTO_WEBCAM= 1394004; int nSensori = 5; EthernetClient client; EthernetServer server(8081); char smtpServer[] = "smtpcorp.com"; RCSwitch mySwitch = RCSwitch(); void setup() { Serial.begin(SERIAL_BAUD); pinMode(SERIAL_BAUD, INPUT); mySwitch.enableReceive(RECEIVE_PIN); // Receiver on inerrupt 0 => that is pin #2 mySwitch.enableTransmit(TRASMIT_PIN); // Using Pin #10 setupComm(); } void loop() { getClientConnection(); if (detectNoise()){ Serial.print("Rumore"); email("Attenzione, rilevato rumore in casa!"); accendiCam(SEGNALE_ACCENZIONE_WEBCAM) ; } if (mySwitch.available()) { int value = mySwitch.getReceivedValue(); //Serial.print(value); if (value == 0) { Serial.print("Unknown encoding"); Serial.print("\n"); } else { long receivedValue = mySwitch.getReceivedValue(); int isPresente = isPresenteSensore(receivedValue); if (isPresente != -1) { //Trovato codice String messaggioRilevazione = "Attenzione! Sensore " +String(isPresente)+ " rilevato!"; Serial.println(messaggioRilevazione); email(messaggioRilevazione); accendiCam(SEGNALE_ACCENZIONE_WEBCAM) ; delay(1000); } } //mySwitch.resetAvailable(); } } bool detectNoise () { bool rit = false; if (digitalRead(NOISE_DIGITAL_PIN) == HIGH) { rit = true; } return rit; } void accendiCam(long value) { mySwitch.send(value, 24); mySwitch.send(value, 24); mySwitch.send(value, 24); mySwitch.send(value, 24); mySwitch.send(value, 24); } void setupComm() { Serial.println("Trying to connect"); Serial.print("\n"); if (!Ethernet.begin(mac)){ Serial.println("Failed to DHCP"); // no point in carrying on, so do nothing forevermore: while(true); } // print your local IP address: Serial.print("My IP address: "); for (byte thisByte = 0; thisByte < 4; thisByte++) { Serial.print(Ethernet.localIP()[thisByte], DEC); Serial.print("."); } Serial.println("fine"); } // Call to send an email. bool email(String text) { bool success = false; Serial.println("Sending email..."); Serial.print("\n"); Serial.println("SMTP server..."); Serial.print(smtpServer); if (client.connect(smtpServer, 2525)){ Serial.println("connected"); delay(100); client.println("EHLO arduino"); for(int i=0; i<999; ++i){ if(client.read() > 0) break; } Serial.println("responded"); Serial.print("\n"); client.println("AUTH LOGIN"); client.println("XXX"); client.println("XXXXX"); // Put your "from" email address here client.println("MAIL FROM:<dumm@gmail.com>"); //Does not seem to matter what email stands here for(int i=0; i<999; ++i){ if(client.read() > 0) break; } // Put where you are sending it here client.println("RCPT TO:<giuseppe.scola@gmail.com>"); //Must be the reciever ID for(int i=0; i<999; ++i){ if(client.read() > 0) break; } client.println("DATA"); for(int i=0; i<999; ++i){ if(client.read() > 0) break; } //This is the email that is listed in the sender client.println("from: giuseppe.scola@gmail.com"); client.println("to: giuseppe.scola@gmail.com"); client.println("SUBJECT: ArduAlarm"); client.println(""); client.println(text); client.println("."); client.println("QUIT"); for(int i=0; i<999; ++i){ if(i > 998){ Serial.println("error: No response"); } if(client.read() > 0) break; } success = true; client.println(); Serial.println("end"); Serial.print("\n"); } else { Serial.println("Failed"); Serial.print("\n"); client.println("QUIT"); } client.stop(); return success; } void getClientConnection(){ //Serial.println("nuova richiesta"); EthernetClient client = server.available(); if (client) { String postString =""; boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); if(postString.length()<20){ Serial.println(c); postString +=c; } if (c == '\n' && currentLineIsBlank) { client.println(F("HTTP/1.1 200 OK")); client.println(F("Content-Type: text/html")); client.println(F("Connection: close")); // the connection will be closed after completion of the response client.println(); client.println(F("<!DOCTYPE HTML>")); client.println(F("<html>")); client.println(F("<h1>AllarDuino</h1>")); client.print(F("<br>")); client.println(F("<a href=\"./?on\">Accendi CAM</a>")); client.println(F("<a href=\"./?off\">Spegni CAM</a>")); client.print(F("<br>")); client.println(F("<h2>Configurazione</h2>")); client.print(F("<br>")); char linkCompleto[50]; for (int i=0; i<nSensori; i++) { strcpy (linkCompleto, "<a href=\"./?save"); //copio la stringa in array char sprintf(linkCompleto, "%s%d", linkCompleto, i); //concateno int a stringa strcat(linkCompleto, "\">Salva Sensore "); //concateno due stringhe sprintf(linkCompleto, "%s%d", linkCompleto, i); strcat(linkCompleto, "</a><br/>"); client.println(linkCompleto); } client.println(F("<a href=\"./?elenco\">dati sensori</a></html>")); break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } //fine client.connected //Gestione querystring if(postString.indexOf("?on") > 0){ Serial.println("accendi CAM"); accendiCam(SEGNALE_ACCENZIONE_WEBCAM); client.println("<br/>"); client.println("<p>Cam accesa</p>"); } if(postString.indexOf("?off") > 0){ accendiCam(SEGNALE_SPEGNIMENTO_WEBCAM); client.println("<br/>"); client.println("<p>Cam spenta</p>"); } if(postString.indexOf("?save") > 0){ int indexSave = postString.indexOf("?save"); Serial.println("indexOf"); Serial.println(indexSave); Serial.println("====="); //cerco valore del sensore String sSensore = postString.substring(indexSave+5 ,indexSave+6); Serial.println(sSensore); int iSensore = sSensore.toInt(); long valore = salvaSensore(iSensore); client.println("<br/>"); client.println("<p>Salvataggio sensore effettuato</p>"); client.println("<br/>"); client.println("Codice sensore " + sSensore); Serial.println("====="); client.print(valore); } if(postString.indexOf("?elenco") > 0){ for (int i=0; i<nSensori; i++) { Serial.println("<p>Sensore " + String(i)+" : </p>"); client.println("<p>Sensore " + String(i)+" : </p>"); client.print(String(EEPROMReadlong(i*4))); Serial.println(EEPROMReadlong(i*4)); } } delay(1); client.stop(); Serial.println("client disonnected"); } } long salvaSensore(int iSensore) { int addressTosSave = iSensore*4; long valore = 0; Serial.println("salvaSensore"); if (mySwitch.available()) { Serial.println("mySwitch.available"); valore = mySwitch.getReceivedValue(); Serial.println("valore "); Serial.println(valore); EEPROMWritelong(addressTosSave,valore); } delay(1000); Serial.println(valore); return valore; } void EEPROMWritelong(int address, long value) { byte four = (value & 0xFF); byte three = ((value >> 8) & 0xFF); byte two = ((value >> 16) & 0xFF); byte one = ((value >> 24) & 0xFF); //Write the 4 bytes into the eeprom memory. EEPROM.write(address, four); EEPROM.write(address + 1, three); EEPROM.write(address + 2, two); EEPROM.write(address + 3, one); } long EEPROMReadlong(long address) { //Read the 4 bytes from the eeprom memory. long four = EEPROM.read(address); long three = EEPROM.read(address + 1); long two = EEPROM.read(address + 2); long one = EEPROM.read(address + 3); //Return the recomposed long by using bitshift. return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF); } //Se trova sensore ritorna il numero del sensore //Se non lo trova ritorna -1 int isPresenteSensore(long valoreRicevuto) { for(int x = 0; x < nSensori; x ++){ long valoreRegistrato = EEPROMReadlong(x*4); if (valoreRegistrato == valoreRicevuto) { Serial.println("ritorno"); return i; } } }
Per spiegare le modifiche:
riga 19: definisco quanti sensori voglio gestire, in questo caso 5
riga 51: chiamata ad una nuova funzione (isPresenteSensore). Questa funzione (riga 322) riceve in input il codice ricevuto dal sensore wireless e verifica se presente nella EEPROM. Se presente viene fatto scattare l’allarme, inviando la mail ed accendendo la telecamera.
Le ulteriori modifiche sono state effettuate proprio sulla gestione della memoria: ho eliminato molti Serial.print ed utilizzato la funzione F(), si veda ad esempio dalle righe 193 a 204.
Dal punto di vista del codice mi considero al punto finale: sono abbastanza soddisfatto ma spero di avere vostri spunti ed indicazioni per migliorare ed ottimizzare ulteriormente.
In settimana dovrei aver completato lo schema con Eagle…ci sentiamo prestissimo quindi!!
Giuseppe
Si è da tanto che non mi collego…ma ve lo giuro, mettere insieme il codice e soprattutto studiarmi quel minimo Eagle per scrivere la libreria finale del progetto non è stato semplice.
Devo ringraziare il forum di Arduino per tutti i preziosi aiuti!
La parte più difficile è stata la gestione della memoria: sono abituato a programmare in Net ed avere a disposizione pochi Kb mi ha fatto sudare.
Ho deciso di leggere la documentazione per capire come sfruttarla un pochino meglio.
LA MEMORIA IN ARDUINO
Il micro controllore presente sulla scheda Arduino UNO, da me utilizzato, è ATmega328P con le seguenti tipologie di memoria:
Per ogni micro controllore si ha a disposizione una diversa quantità di memoria:
ATMega168 | ATMega328P | ATmega1280 | ATmega2560 | |
---|---|---|---|---|
Flash (1 Kbyte used for bootloader) |
16 KBytes | 32 KBytes | 128 KBytes | 256 KBytes |
SRAM | 1024 bytes | 2048 bytes | 8 KBytes | 8 KBytes |
EEPROM | 512 bytes | 1024 bytes | 4 KBytes | 4 KBytes |
Per Arduino UNO quindi:
Flash 32k bytes
SRAM 2k bytes
EEPROM 1k byte
Le stringhe in particolare utilizzano in grosso quantitativo di memoria e nel mio sketch ne faccio grande uso per scrivere sul client web (client.println) e sulla console (Serial.print).
Ad esempio il comando : Serial.println(“Trying to connect”); occupa 18 bytes (1 char = 1 byte più il carattere di fine riga) della SRAM che ne ha a disposizione 2048. Sembra poco….ma ho utilizzato tantissime volte le stringhe nel mio sketch!
Dalla versione 1.0 l’IDE di Arduino permette l’utilizzo della funzione F() che permette di storare le stringhe nella memoria FLASH e non nella SRAM.
Ho quindi deciso di storare proprio nella memoria FLASH tutte le stringhe utilizzate nel costrutto client.println, risolvendo i miei problemi di memoria SRAM (gli int, float e le stringhe non raggruppate con F() naturalmente saranno inizializzare e gestite nella SRAM).
Consiglio comunque una bella lettura di questo articolo .
Dai che arriva il weekend e finalmente (spero) avrò tempo di pubblicare le modifiche al codice e il file di progetto di Eagle.
Quindi BUON WEEKEND!