Problema sketch archiviazione temperatura su Microo SD

Salve a tutti,
sto cercando di fare un termometro con lcd e archiviazione su micro SD per monitorare la temperatura di un panello solare.

Sensore DS18B20
lcd 16*2
ethernet shield

questo è il circuito che uso per il termometro senza archiviazione su micro SD

http://postimg.org/image/ryx2xqulp/
e questo è lo sketch che uso

#include <OneWire.h>
#include <LiquidCrystal.h>
 
#define BUTTON A0
 
int DS18B20_Pin = 2;
 
OneWire ds(DS18B20_Pin);
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
 
void setup(void) {
  Serial.begin(9600);
 
  lcd.begin(16, 2);
 
  lcd.setCursor(0,0);
  lcd.print("  DS18B20 LCD  ");
 
  delay( 3000 );
}
 
void loop(void) {
  float temperature = getTemp();
  Serial.println(temperature);
 
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("Temperatura:   ");
  lcd.setCursor(0,1);
  lcd.print(temperature);
 
  delay(1000); //just here to slow down the output so it is easier to read
 
}
 
float getTemp(){
  //returns the temperature from one DS18B20 in DEG Celsius
 
  byte data[12];
  byte addr[8];
 
  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }
 
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }
 
  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end
 
  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad
 
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }
 
  ds.reset_search();
 
  byte MSB = data[1];
  byte LSB = data[0];
 
  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
 
}

e infine questo è quello che sono riuscito a fare copiando pezzi di sketch riguardanti archiviazione su sd

#include <OneWire.h>
#include <LiquidCrystal.h>
#include <SPI.h>
#include <SD.h>
#define BUTTON A0
const int chipSelect = 4;
int DS18B20_Pin = 2;
 
OneWire ds(DS18B20_Pin);
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
 
void setup(void) {
  Serial.begin(9600);
 while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(4, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
  
  lcd.begin(16, 2);
 
  lcd.setCursor(0,0);
  lcd.print("  DS18B20 LCD  ");
 
  delay( 3000 );
}
 
void loop(void) {
  float temperature = getTemp();
  Serial.println(temperature);
 String dataString = "";
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("Temperatura:   ");
  lcd.setCursor(0,1);
  lcd.print(temperature);
  
 
  delay(1000); //just here to slow down the output so it is easier to read
 dataString += String(temperature);
}

float getTemp(){
  //returns the temperature from one DS18B20 in DEG Celsius
 
  byte data[12];
  byte addr[8];
 
  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }
 
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }
 
  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end
 
  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad
 
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }
 
  ds.reset_search();
 
  byte MSB = data[1];
  byte LSB = data[0];
 
  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
 File dataFile = SD.open("data.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  } 
}

il problema di quest’ultimo è che mi da diversi errori e non saprei come risolveri, se qualcuno può dare un 'occhiata e correggerli ne sarei molto grato.

Grazie in Anticipo!!

Forse dovresti darci la copia degli errori. Ciao Uwe

FabioBre97: Salve a tutti,

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento: Regolamento - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

uwefed: Forse dovresti darci la copia degli errori. Ciao Uwe

Arduino:1.6.3 (Windows 7), Scheda:"Arduino Uno"

prova_datalogging.ino:80:3: error: expected unqualified-id before 'if'

prova_datalogging.ino:87:3: error: expected unqualified-id before 'else'

prova_datalogging.ino: In function 'float getTemp()':

prova_datalogging.ino:96:9: error: 'ds' was not declared in this scope

prova_datalogging.ino:112:3: error: 'ds' was not declared in this scope

Errore durante la compilazione

Ecco gli errori!!!

Intanto scarica l'ultima OneWire e installala

marinaio67: Intanto scarica l'ultima OneWire e installala

Fatto ma non ho risolto nulla, grazie lo stesso!

Ti dà sempre i soliti errori?

Ciao,

ho compilato il tuo codice che l’IDE mi ha dato i seguenti errori:

  • test.ino: In function ‘void loop()’:
  • test.ino:50:2: error: ‘dataString’ was not declared in this scope
  • test.ino: In function ‘float getTemp()’:
  • test.ino:100:22: error: ‘dataString’ was not declared in this scope
  • Errore durante la compilazione

Anche a te da questi errori?
Se si il motivo è perchè la variabile dataString l’hai dichiarata soltanto all’interno del loop e quindi per la funzione float getTemp() non esiste.

Non ho visto bene dal codice se lo puoi fare, ma una possibile soluzione sarebbe quella di dichiarare la variabile dataString in cima al codice, dopo la riga int DS18B20_Pin = 2; per esempio.
Tieni conto che se fai così la stessa variabile viene usata sia nel loop che nella funzione float getTemp() e non so se per te va bene che venga sovrascritta ogni volta sia nel loop che quando viene chiamata la funzione float getTemp().
Spero di essere stato chiaro :slight_smile:

Toglimi una curiosità: i dati li salvi sulla SD presente sullo shiled ethernet giuisto?

Ciao
fiodavid

fiodavid: Ciao,

ho compilato il tuo codice che l'IDE mi ha dato i seguenti errori:

  • test.ino: In function 'void loop()':
  • test.ino:50:2: error: 'dataString' was not declared in this scope
  • test.ino: In function 'float getTemp()':
  • test.ino:100:22: error: 'dataString' was not declared in this scope
  • Errore durante la compilazione

Anche a te da questi errori? Se si il motivo è perchè la variabile dataString l'hai dichiarata soltanto all'interno del loop e quindi per la funzione float getTemp() non esiste.

Non ho visto bene dal codice se lo puoi fare, ma una possibile soluzione sarebbe quella di dichiarare la variabile dataString in cima al codice, dopo la riga int DS18B20_Pin = 2; per esempio. Tieni conto che se fai così la stessa variabile viene usata sia nel loop che nella funzione float getTemp() e non so se per te va bene che venga sovrascritta ogni volta sia nel loop che quando viene chiamata la funzione float getTemp(). Spero di essere stato chiaro :)

Toglimi una curiosità: i dati li salvi sulla SD presente sullo shiled ethernet giuisto?

Ciao fiodavid

Grazie mille fiodavid, il codice ora non mi da errori, il problema adesso è un altro: non mi inizializza la scheda SD. Mi stampa la temperatura sul monitor seriale e non sul lcd, comunque si ho appena comprato l'ethernet shilde e lo sto usando per questo esperimento. Grazie ancora dell'aiuto!!

ciao, nell'esempio SD leggo questo:

//On the Ethernet Shield, CS is pin 4. It's set as an output by default. // Note that even if it's not used as the CS pin, the hardware SS pin // (10 on most Arduino boards, 53 on the Mega) must be left as an output // or the SD library functions will not work.

se ben traduco, vuol dire che se hai la UNO devi mettere il pin 10 come output

pinMode(10, OUTPUT);

se è così devi cambiare il pin anche al lcd che usa il 10.

sposterei la parte di codice SD che sta nella funzione getemp() , ad esempio mettendola nel loop,

memorizzando i valori ogni tot tempo

 This example shows how to read and write data to and from an SD card file
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4

con il mega ci sono meno problemi, con la uno se usi la SD non devi usare per il lcd: pin 4,10,11,12,13