Archivio mensile:settembre 2011

Adafruit data logger shield for arduino soldering

E come promesso ecco il mio soldering.
Non è molto preciso in quanto sono un zozzone però posso ritenermi soddisfatto del prodotto finito soprattutto perchè… funziona!

La scheda è stata ordinata a giugno e in poche settimane mi è arrivata in italia con un bel pacco ultra sicuro.

La confezione conteneva: ricevuta, stickers del logo di adafruit e la bustina col kit.

Ottimi componenti, ottima pcb e ottima scheda!

Giocando con il logger shield

Ciao mondo!

L’altro giorno ho finalmente montato il data logger shield di Adafruit: figata pazzesca!
Funziona tutto alla perfezione…  la pcb è davvero di alto livello, sono rimasto davvero soddisfatto di questo acquisto. LadyAda non si smentisce mai!
Così stasera ho montato al volo la scheda e ho saldato un paio di socket d’ausilio da utilizzare sulla scheda tipo breadboard.
Poi mi sono documentato sulla pagina ufficiale della shield e ho seguito tutte le indicazioni alla lettera: http://www.ladyada.net/make/logshield/

La mia idea era quella di fare un pò di test e usare un pò tutto quello che avevo a disposizione: sensore di temperatura, RTC e SD.
Come sensore di temperatura ho usato un comunissimo LM35, facile da montare e con output in Celsius (molto comoda come cosa).

L’idea era quella di ottenere un file testo formato in questo modo: TEMPERATURA – ORA

Non è stato molto difficile ottenere il tutto, ho giocato un pò con il codice, pagina di riferimento da un lato, reference dall’altro ed ide al centro (ho un 17″ pollici!) e ho compilato un programmino che funziona abbastana bene.

Unico appunto è che negli esempi dell’utilizzo dell’SD e, precisamente il file “Datalogger”, nella funzione loop è stata usata una variabile di tipo stringa “dataString”.
Questa veniva costruita con i tre dati ricevuti dai tre sensori.
Bene, utilizzando lo stesso codice (modificato per un solo sensore) spesso mi capitava che arduino mi scrivesse nel file caratteri strani… come se non riuscisse a scrivere correttamente i dati nel record del file: MAH!
Così ho fatto un uso massiccio del metodo print della libreria SD ogni volta che leggevo qualcosa dai sensori… e non ho avuto problemi.

L’output che ho ottenuto è stato questo:

26 - 21:15:36
25 - 21:17:15
25 - 21:17:19
25 - 21:17:22
...

Così ho proiettando graficamente il tutto con excel ed ho ottenuto questo:

capturesg

 

La scheda montata è questa:

dscn6886y
dscn6887
dscn6889
dscn6890

 

Il codice:

#include <SD.h>
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

const int chipSelect = 10;
short i=0;

void setup()
{
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  pinMode(10, OUTPUT);
  pinMode(3, OUTPUT); 
  pinMode(4, OUTPUT); 
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    for (i=0;i<10;i++) {
      digitalWrite(3, HIGH);   
      delay(100);              
      digitalWrite(3, LOW);     
      delay(100);
    }
    return;
  }
  Serial.println("card initialized.");
  digitalWrite(4, HIGH);   
  delay(500);              
  digitalWrite(4, LOW);
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}

void loop()
{
  DateTime now = RTC.now();
  int analogPin=0;
  int sensor =0;  
  delay(2900);
  sensor = analogRead(analogPin);
  sensor = (5.0 * sensor * 100.0)/1024.0;
  Serial.print("Temperatura: ");
  Serial.println(sensor);
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (dataFile) {
    dataFile.print(sensor);
    dataFile.print(" - ");
    dataFile.print(now.hour(), DEC);
    dataFile.print(":");
    dataFile.print(now.minute(), DEC);
    dataFile.print(":");
    dataFile.println(now.second(), DEC);
    dataFile.close(); 
    digitalWrite(4, HIGH);   
    delay(100);              
    digitalWrite(4, LOW);
  }  
  else {
    Serial.println("error opening datalog.txt");
    for (i=0;i<10;i++) {
      digitalWrite(3, HIGH);   
      delay(100);              
      digitalWrite(3, LOW);     
      delay(100);
    }
  } 
}