Un semplice antifurto: gestiamo al meglio la memoria

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:

  • Flash (program space), è dove lo sketch di arduino  (programma)  viene memorizzato.
  • SRAM (static random access memory) è dove lo sketch  crea e gestisce le variabili quando è in esecuzione.
  • EEPROM (già la conosciamo) è un tipo di memoria non volatile, una memoria in grado di mantenere le informazioni anche quando non viene alimentata.

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!

Un semplice antifurto: il modulo sensore rumore,

Il modulo FC04 è veramente semplice.
Ha solo tre pin: Vcc, GND e SNG, quindi i collegamenti che ho stabilito sono questi:

Pin Ricevitore Pin Arduino
Vcc 5 V
GND GND
SNG Pin 2 (digitale)

Il sensore ha una soglia di rumore impostabile tramite una vite: se viene individuato un rumore che supera la soglia, viene inviato un segnale HIGH sul pin selezionato (2 nel nostro caso)

Quindi lo sketch può essere questo:

 

int SERIAL_BAUD        = 9600;
int SENSOR_DIGITAL_PIN =    2;
int SOUND_DELAY        =   50; /* Un piccolo ritardo per non intercettare rumori duplicati o echi */
 
void setup() {
    Serial.begin(SERIAL_BAUD);
    pinMode(SERIAL_BAUD, INPUT);
}                                                                               
 
void loop() {
    if (digitalRead(SENSOR_DIGITAL_PIN) == LOW) {
        Serial.print("Rumore!");
 
        delay(SOUND_DELAY);
    }
}

A questo punto posso unire insieme i due programmi (sensori movimento e rumore) per inviarmi una mail in caso di sospetta intrusione!

Nel prossimo articolo lavorerò sulla internet shield, come fatto in questi post prima cercherò di capirne il funzionamento svincolato dal resto dei programmi per poi integrare il tutto successivamente.

A presto!