Unire due codici per un progetto

Ciao a tutti,
mi sono appena iscritto al forum, utilizzo arduino a scopo didattico presso la scuola dove lavoro per piccoli semplici progetti, ma tuttavia non sono molto esperto sulla scrittura di codice più complicato.

Avrei bisogno di creare per la scuola un progettino per la scuola che devo consegnare ai ragazzi entro poco tempo e questo progetto riguarda la creazione di un rilevatore di polveri con datalogger.

Abbiamo comprato una board con il Dust Sensor e per datalogger utilizziamo una di quelle economiche tipo Datafruit con SD Card e modulo RTC.

Io ho il codice di un progetto fatto con il modulo datalogger e un sensore di temperatura e dovrei modificare questo codice togliere il sensore di temperatura e inserirci dentro quello del Dust Sensor, cosa che al momento non riesco a fare per via delle mie scarse conoscenze.

Il codice del DataLogger e quello del dust sensor li allego al post.

Spero che qualcuno potrebbe aiutarmi a fare ciò.

Grazie anticipatamente.
A.B.

DataLogger_1.0.ino (6.73 KB)

DustSensor.ino (915 Bytes)

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Guarda è più semplice di quanto immagini, levi tutta la parte di codice relativa al controllo della temperatura e metti al suo posto il codice del Dust sensor facendo proprio copia incolla. Non ho avuto mai a che fare con questo tipo di sensori ma dovrebbe essere una cosa del genere:

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
const int chipSelect = 10; //cs or the save select pin from the sd shield is connected to 10.
RTC_DS1307 RTC;
float celsius, fahrenheit;

#define        COV_RATIO                       0.2            //ug/mmm / mv
#define        NO_DUST_VOLTAGE                 400            //mv
#define        SYS_VOLTAGE                     5000      

File dataFile;
DateTime now;

int measurePin = 7;
int ledPower = 0;
 
int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;
 
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;

void setup(void) {
  Serial.begin(9600);
  //setup clock
  Wire.begin();
  RTC.begin();
//check or the Real Time Clock is on
  if (! RTC.isrunning()) {
    Serial.println("RTC non è avviato!");
    // following line sets the RTC to the date & time this sketch was compiled
    // uncomment it & upload to set the time, date and start run the RTC!
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
//setup SD card
   Serial.print("Avvio SD Card...");

  // see if the SD card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Errore SD Card, o non presente");
    // don't do anything more:
    return;
  }
  Serial.println("SD Card Avviata.");

  //write down the date (year / month / day         prints only the start, so if the logger runs for sevenal days you only findt the start back at the begin.
  now = RTC.now();
  dataFile = SD.open("datalog.txt", FILE_WRITE);
  dataFile.print("Start logging on: ");
  dataFile.print(now.year(),DEC);
  dataFile.print('/');
  dataFile.print(now.month(),DEC);
  dataFile.print('/');
  dataFile.print(now.day(),DEC);
  dataFile.println(" ");
  dataFile.println("Celsius              Time");
  dataFile.close();

  pinMode(ledPower,OUTPUT);
}

void loop(void) {
  // prima parte per lettura con il dustSensor
  digitalWrite(ledPower,LOW); // power on the LED
  delayMicroseconds(samplingTime);
 
  voMeasured = analogRead(measurePin); // read the dust value
 
  delayMicroseconds(deltaTime);
  digitalWrite(ledPower,HIGH); // turn the LED off
  delayMicroseconds(sleepTime);
 
  // 0 - 3.3V mapped to 0 - 1023 integer values
  // recover voltage
  calcVoltage = voMeasured * (3.3 / 1024);

  dustDensity = 0.17 * calcVoltage - 0.1;
 
  Serial.print("Raw Signal Value (0-1023): ");
  Serial.print(voMeasured);
 
  Serial.print(" - Voltage: ");
  Serial.print(calcVoltage);
 
  Serial.print(" - Dust Density: ");
  Serial.println(dustDensity);
  
  //read the time
  now = RTC.now();
  
  //open file to log data in.
   dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  // log the temperature and time.
  if (dataFile) {
    dataFile.print(dustDensity);
    dataFile.print("                 ");
    
    dataFile.print(now.hour(),DEC);
    dataFile.print(":");
    dataFile.print(now.minute(),DEC);
    dataFile.print(":");
    dataFile.println(now.second(),DEC);
   
    dataFile.close();
    // print to the serial port too:
    Serial.println("data stored");
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }
  //delay(60000); // this will log the temperature every minute.
  delay(3000);
}

Poi se vuoi salvare anche il voltaggio o altro basta che utilizzi la funzione dataFile.print()

Grazie mille ZioCri, sei stato molto di aiuto.
Se volessi invece unire questo codice che allego, che forse è più utile per quello che mi serve, a quello del datalogger?

#define        COV_RATIO                       0.2            //ug/mmm / mv
#define        NO_DUST_VOLTAGE                 400            //mv
#define        SYS_VOLTAGE                     5000           


/*
I/O define
*/
const int iled = 7;                                            //drive the led of sensor
const int vout = 0;                                            //analog input

/*
variable
*/
float density, voltage;
int   adcvalue;

/*
private function
*/
int Filter(int m)
{
  static int flag_first = 0, _buff[10], sum;
  const int _buff_max = 10;
  int i;
  
  if(flag_first == 0)
  {
    flag_first = 1;

    for(i = 0, sum = 0; i < _buff_max; i++)
    {
      _buff[i] = m;
      sum += _buff[i];
    }
    return m;
  }
  else
  {
    sum -= _buff[0];
    for(i = 0; i < (_buff_max - 1); i++)
    {
      _buff[i] = _buff[i + 1];
    }
    _buff[9] = m;
    sum += _buff[9];
    
    i = sum / 10.0;
    return i;
  }
}


void setup(void)
{
  pinMode(iled, OUTPUT);
  digitalWrite(iled, LOW);                                     //iled default closed
  
  Serial.begin(9600);                                         //send and receive at 9600 baud
  Serial.print("*********************************** WaveShare ***********************************\n");
}

void loop(void)
{
  /*
  get adcvalue
  */
  digitalWrite(iled, HIGH);
  delayMicroseconds(280);
  adcvalue = analogRead(vout);
  digitalWrite(iled, LOW);
  
  adcvalue = Filter(adcvalue);
  
  /*
  covert voltage (mv)
  */
  voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;
  
  /*
  voltage to density
  */
  if(voltage >= NO_DUST_VOLTAGE)
  {
    voltage -= NO_DUST_VOLTAGE;
    
    density = voltage * COV_RATIO;
  }
  else
    density = 0;
    
  /*
  display the result
  */
  Serial.print("The current dust concentration is: ");
  Serial.print(density);
  Serial.print(" ug/m3\n");  
  
  delay(1000);
}

Grazie mille.

Figurati! Questa volta però provaci tu e poi semmai chiedi aiuto, non è per cattiveria ma altrimenti non imparerai mai... si tratta sempre di fare un taglia e cuci

Per qualsiasi chiarimento sai dove trovarci :smiley:

zioCri:
Figurati! Questa volta però provaci tu e poi semmai chiedi aiuto, non è per cattiveria ma altrimenti non imparerai mai... si tratta sempre di fare un taglia e cuci

Per qualsiasi chiarimento sai dove trovarci :smiley:

Grazie ZioCri, ci provo.. eventualmente scrivo :slight_smile:

zioCri:
Figurati! Questa volta però provaci tu e poi semmai chiedi aiuto, non è per cattiveria ma altrimenti non imparerai mai… si tratta sempre di fare un taglia e cuci

Per qualsiasi chiarimento sai dove trovarci :smiley:

Ciao ZioCri, ho bisogno di te. Ho provato a unire i codici e ci sono quasi, solo che ho degli errori che non riesco a capire, potresti darmi una mano?
Il codice che ho fatto io è questo:

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
const int chipSelect = 10; 
RTC_DS1307 RTC;
float density, voltage;

#define        COV_RATIO                       0.2            //ug/mmm / mv
#define        NO_DUST_VOLTAGE                 400            //mv
#define        SYS_VOLTAGE                     5000      

File dataFile;
DateTime now;

void setup(void) {
  Serial.begin(9600);
  //setup clock
  Wire.begin();
  RTC.begin();
//check or the Real Time Clock is on
  if (! RTC.isrunning()) {
    Serial.println("RTC non è avviato!");
    // following line sets the RTC to the date & time this sketch was compiled
    // uncomment it & upload to set the time, date and start run the RTC!
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
//setup SD card
   Serial.print("Avvio SD Card...");

  // see if the SD card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Errore SD Card, o non presente");
    // don't do anything more:
    return;
  }
  Serial.println("SD Card Avviata.");

  //write down the date (year / month / day         prints only the start, so if the logger runs for sevenal days you only findt the start back at the begin.
    now = RTC.now();
    dataFile = SD.open("datalog.txt", FILE_WRITE);
    dataFile.print("Start logging on: ");
    dataFile.print(now.year(),DEC);
    dataFile.print('/');
    dataFile.print(now.month(),DEC);
    dataFile.print('/');
    dataFile.print(now.day(),DEC);
    dataFile.println(" ");
    dataFile.println("Voltage              Data");
    dataFile.close();
}

void loop(void) {
  
//read the time
  now = RTC.now();
  
  //open file to log data in.
   dataFile = SD.open("datalog.txt", FILE_WRITE);

    if (dataFile) {
    dataFile.print(voltage);
    dataFile.print("                 ");
    
    dataFile.print(now.hour(),DEC);
    dataFile.print(":");
    dataFile.print(now.minute(),DEC);
    dataFile.print(":");
    dataFile.println(now.second(),DEC);
   
    dataFile.close();
    // print to the serial port too:
    Serial.println("data stored");
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }

  delay(3000);
}

  if ( !ds.search(addr)) {
    //Serial.println("No more addresses.");
   //Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  //Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
   // Serial.write(' ');
   // Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
     // Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
    //  Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
    //  Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
   //   Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        
  
  delay(1000);     
    
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

   for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
   
  }
  
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    
  }
  voltage = (float)(SYS_VOLTAGE / 1024.0) * adcvalue * 11;
  density = voltage * COV_RATIO;
  Serial.print("  Voltage = ");
  Serial.print(voltage);
  Serial.print(" V, ");
  Serial.print(density);
  Serial.println(" Densità");

const int iled = 7;                                            
const int vout = 0;                                            

float density, voltage;
int   adcvalue;

int Filter(int m)
{
  static int flag_first = 0, _buff[10], sum;
  const int _buff_max = 10;
  int i;
  
  if(flag_first == 0)
  {
    flag_first = 1;

    for(i = 0, sum = 0; i < _buff_max; i++)
    {
      _buff[i] = m;
      sum += _buff[i];
    }
    return m;
  }
  else
  {
    sum -= _buff[0];
    for(i = 0; i < (_buff_max - 1); i++)
    {
      _buff[i] = _buff[i + 1];
    }
    _buff[9] = m;
    sum += _buff[9];
    
    i = sum / 10.0;
    return i;
  }
}

void setup(void)
{
  pinMode(iled, OUTPUT);
  digitalWrite(iled, LOW);                                     
  
  Serial.begin(9600);                                         
  Serial.print("*********************************** Rilevamento ***********************************\n");
}

void loop(void)
{
 
  digitalWrite(iled, HIGH);
  delayMicroseconds(280);
  adcvalue = analogRead(vout);
  digitalWrite(iled, LOW);
  
  adcvalue = Filter(adcvalue);
  
  /*
  covert voltage (mv)
  */
  voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;
  
  /*
  voltage to density
  */
  if(voltage >= NO_DUST_VOLTAGE)
  {
    voltage -= NO_DUST_VOLTAGE;
    
    density = voltage * COV_RATIO;
  }
  else
    density = 0;
    
  /*
  display the result
  */
  Serial.print("The current dust concentration is: ");
  Serial.print(density);
  Serial.print(" ug/m3\n");  
  
  delay(1000);
}

Potresti controllare dove sta il problema? Te ne sarei molto grato.

Grazie

Devi fondere i testi delle serup() e delle loop() in una sola funzione dello stesso nome
Ora hai

void setup()
{
qualcosa
}
void loop()
{
Dell'altro
}
void setup()
{
Ilterzo
}
void loop()
{
Ilquarto
}

E devi avere

void setup()
{
Qualcosa
Ilterzo
void loop()
{
Dell'altro
Ilquarto
}

Non so se sbaglio io ma mi ritrovo altri errori facendo così.
Potresti farmi la modifica direttamente sul codice che ho allegato? Perdonami ma sto imparando ora...
Grazie mille

Potresti postare il codice nuovo e gli errori che riporta?

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
const int chipSelect = 10;
RTC_DS1307 RTC;
float density, voltage;

#define        COV_RATIO                       0.2            //ug/mmm / mv
#define        NO_DUST_VOLTAGE                 400            //mv
#define        SYS_VOLTAGE                     5000     

File dataFile;
DateTime now;

void setup(void) {
  Serial.begin(9600);
  //setup clock
  Wire.begin();
  RTC.begin();
//check or the Real Time Clock is on
  if (! RTC.isrunning()) {
    Serial.println("RTC non è avviato!");
    // following line sets the RTC to the date & time this sketch was compiled
    // uncomment it & upload to set the time, date and start run the RTC!
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
//setup SD card
   Serial.print("Avvio SD Card...");

  // see if the SD card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Errore SD Card, o non presente");
    // don't do anything more:
    return;
  }
  Serial.println("SD Card Avviata.");

  //write down the date (year / month / day         prints only the start, so if the logger runs for sevenal days you only findt the start back at the begin.
    now = RTC.now();
    dataFile = SD.open("datalog.txt", FILE_WRITE);
    dataFile.print("Start logging on: ");
    dataFile.print(now.year(),DEC);
    dataFile.print('/');
    dataFile.print(now.month(),DEC);
    dataFile.print('/');
    dataFile.print(now.day(),DEC);
    dataFile.println(" ");
    dataFile.println("Voltage              Data");
    dataFile.close();
}

void loop(void) {
 
//read the time
  now = RTC.now();
 
  //open file to log data in.
   dataFile = SD.open("datalog.txt", FILE_WRITE);

    if (dataFile) {
    dataFile.print(voltage);
    dataFile.print("                 ");
   
    dataFile.print(now.hour(),DEC);
    dataFile.print(":");
    dataFile.print(now.minute(),DEC);
    dataFile.print(":");
    dataFile.println(now.second(),DEC);
   
    dataFile.close();
    // print to the serial port too:
    Serial.println("data stored");
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }

  delay(3000);
}

  if ( !ds.search(addr)) {
    //Serial.println("No more addresses.");
   //Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
 
  //Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
   // Serial.write(' ');
   // Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
     // Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
    //  Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
    //  Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
   //   Serial.println("Device is not a DS18x20 family device.");
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);       
 
  delay(1000);     
   
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

   for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
   
  }
 
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
   
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
   
  }
  voltage = (float)(SYS_VOLTAGE / 1024.0) * adcvalue * 11;
  density = voltage * COV_RATIO;
  Serial.print("  Voltage = ");
  Serial.print(voltage);
  Serial.print(" V, ");
  Serial.print(density);
  Serial.println(" Densità");

const int iled = 7;                                           
const int vout = 0;                                           

float density, voltage;
int   adcvalue;

int Filter(int m)
{
  static int flag_first = 0, _buff[10], sum;
  const int _buff_max = 10;
  int i;
 
  if(flag_first == 0)
  {
    flag_first = 1;

    for(i = 0, sum = 0; i < _buff_max; i++)
    {
      _buff[i] = m;
      sum += _buff[i];
    }
    return m;
  }
  else
  {
    sum -= _buff[0];
    for(i = 0; i < (_buff_max - 1); i++)
    {
      _buff[i] = _buff[i + 1];
    }
    _buff[9] = m;
    sum += _buff[9];
   
    i = sum / 10.0;
    return i;
  }
}

void setup(void)
{
  pinMode(iled, OUTPUT);
  digitalWrite(iled, LOW);                                     
 
  Serial.begin(9600);                                         
  Serial.print("*********************************** Rilevamento ***********************************\n");
}

void loop(void)
{
 
  digitalWrite(iled, HIGH);
  delayMicroseconds(280);
  adcvalue = analogRead(vout);
  digitalWrite(iled, LOW);
 
  adcvalue = Filter(adcvalue);
 
  /*
  covert voltage (mv)
  */
  voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;
 
  /*
  voltage to density
  */
  if(voltage >= NO_DUST_VOLTAGE)
  {
    voltage -= NO_DUST_VOLTAGE;
   
    density = voltage * COV_RATIO;
  }
  else
    density = 0;
   
  /*
  display the result
  */
  Serial.print("The current dust concentration is: ");
  Serial.print(density);
  Serial.print(" ug/m3\n"); 
 
  delay(1000);
}

Errori:

Datalogger_Prova:83: error: expected unqualified-id before 'if'

   if ( !ds.search(addr)) {

   ^

Datalogger_Prova:92: error: expected unqualified-id before 'for'

   for( i = 0; i < 8; i++) {

   ^

Datalogger_Prova:92: error: 'i' does not name a type

   for( i = 0; i < 8; i++) {

               ^

Datalogger_Prova:92: error: 'i' does not name a type

   for( i = 0; i < 8; i++) {

                      ^

Datalogger_Prova:97: error: expected unqualified-id before 'if'

   if (OneWire::crc8(addr, 7) != addr[7]) {

   ^

Datalogger_Prova:101: error: 'Serial' does not name a type

   Serial.println();

   ^

Datalogger_Prova:104: error: expected unqualified-id before 'switch'

   switch (addr[0]) {

   ^

Datalogger_Prova:122: error: 'ds' does not name a type

   ds.reset();

   ^

Datalogger_Prova:123: error: 'ds' does not name a type

   ds.select(addr);

   ^

Datalogger_Prova:124: error: 'ds' does not name a type

   ds.write(0x44, 1);       

   ^

Datalogger_Prova:126: error: expected constructor, destructor, or type conversion before '(' token

   delay(1000);     

        ^

Datalogger_Prova:128: error: 'present' does not name a type

   present = ds.reset();

   ^

Datalogger_Prova:129: error: 'ds' does not name a type

   ds.select(addr);   

   ^

Datalogger_Prova:130: error: 'ds' does not name a type

   ds.write(0xBE);         // Read Scratchpad

   ^

Datalogger_Prova:132: error: expected unqualified-id before 'for'

    for ( i = 0; i < 9; i++) {           // we need 9 bytes

    ^

Datalogger_Prova:132: error: 'i' does not name a type

    for ( i = 0; i < 9; i++) {           // we need 9 bytes

                 ^

Datalogger_Prova:132: error: 'i' does not name a type

    for ( i = 0; i < 9; i++) {           // we need 9 bytes

                        ^

Datalogger_Prova:137: error: 'data' was not declared in this scope

   int16_t raw = (data[1] << 8) | data[0];

                  ^

Datalogger_Prova:137: error: 'data' was not declared in this scope

   int16_t raw = (data[1] << 8) | data[0];

                                  ^

Datalogger_Prova:138: error: expected unqualified-id before 'if'

   if (type_s) {

   ^

Più di una libreria trovata per "SD.h"
Usata: C:\Users\xxxxxxxx\Desktop\Documents\Arduino\libraries\SD
Non usata: C:\Program Files (x86)\Arduino\libraries\SD-master
Non usata: C:\Program Files (x86)\Arduino\libraries\SD
exit status 1
expected unqualified-id before 'if'

Qualcuno può darmi una mano?
Grazie

perchè hai due setup()?
e anche due loop()?
Sono sicuro che te lo hanno detto che devi "fondere" tra loro le due setup e le due loop
ogni programma puo' avere una sola funzione di un dato nome, e i programmi per arduino devono avere una loop e una setup
mettiti di buzzo buono, colla e forbici, taglia e incolla fino a fare una sola setup che fa il lavoro delle due che hai adesso
e lo stesso con le loop
ci si vede quando hai fatto
PS cosa insegni a scuola? non informatica, spero............

Edit
hai anche dei problemi con le graffe
forse è il caso che parti da capo coi due codici originali e ri-provi a copiare un pezzo per volta, loop nella loop setup nella setup, inizializzazioni varie nelle inizializzazioni varie.........

Ho effettuato le copie correttamente, però ho dei problemi con le parentesi… potreste dirmi dove sbaglio?

Grazie

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
const int chipSelect = 10; //cs or the save select pin from the sd shield is connected to 10.
RTC_DS1307 RTC;
float density, voltage;

#define        COV_RATIO                       0.2            //ug/mmm / mv
#define        NO_DUST_VOLTAGE                 400            //mv
#define        SYS_VOLTAGE                     5000           

File dataFile;
DateTime now;

const int iled = 7;                                       
const int vout = 0;                                           

int   adcvalue;
int Filter(int m)
{
  static int flag_first = 0, _buff[10], sum;
  const int _buff_max = 10;
  int i;
  
  if(flag_first == 0)
  {
    flag_first = 1;

    for(i = 0, sum = 0; i < _buff_max; i++)
    {
      _buff[i] = m;
      sum += _buff[i];
    }
    return m;
  }
  else
  {
    sum -= _buff[0];
    for(i = 0; i < (_buff_max - 1); i++)
    {
      _buff[i] = _buff[i + 1];
    }
    _buff[9] = m;
    sum += _buff[9];
    
    i = sum / 10.0;
    return i;
  }

void setup(void) {
   Serial.begin(9600);
  //setup clock
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC non è avviato!");
       RTC.adjust(DateTime(__DATE__, __TIME__));
  }
//setup SD card
   Serial.print("Avvio SD Card...");

  // see if the SD card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Errore SD Card, o non presente");
    // don't do anything more:
    return;
  }
  Serial.println("SD Card Avviata.");

  //write down the date (year / month / day         prints only the start, so if the logger runs for sevenal days you only findt the start back at the begin.
    now = RTC.now();
    dataFile = SD.open("datalog.txt", FILE_WRITE);
    dataFile.print("Start logging on: ");
    dataFile.print(now.year(),DEC);
    dataFile.print('/');
    dataFile.print(now.month(),DEC);
    dataFile.print('/');
    dataFile.print(now.day(),DEC);
    dataFile.println(" ");
    dataFile.println("Voltage              Data");
    dataFile.close();
  }
  pinMode(iled, OUTPUT);
  digitalWrite(iled, LOW);                                     
 
  Serial.begin(9600);                                         
  Serial.print("*********************************** Rilevamento ***********************************\n");
  }

void loop(void) {

//read the time
  now = RTC.now();
 
  //open file to log data in.
   dataFile = SD.open("datalog.txt", FILE_WRITE);

    if (dataFile) {
    dataFile.print(voltage);
    dataFile.print("                 ");
   
    dataFile.print(now.hour(),DEC);
    dataFile.print(":");
    dataFile.print(now.minute(),DEC);
    dataFile.print(":");
    dataFile.println(now.second(),DEC);
   
    dataFile.close();
    // print to the serial port too:
    Serial.println("data stored");
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }

  delay(3000);
  
  digitalWrite(iled, HIGH);
  delayMicroseconds(280);
  adcvalue = analogRead(vout);
  digitalWrite(iled, LOW);
  
  adcvalue = Filter(adcvalue);

  /*
  covert voltage (mv)
  */
  voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;
  
  /*
  voltage to density
  */
  if(voltage >= NO_DUST_VOLTAGE)
  {
    voltage -= NO_DUST_VOLTAGE;
    
    density = voltage * COV_RATIO;
  }
  else
    density = 0;
    
  /*
  display the result
  */
  Serial.print("The current dust concentration is: ");
  Serial.print(density);
  Serial.print(" ug/m3\n");  
  
  delay(1000);
}

vediamo cosa trovo:

  1. alla fine della funzione Int filter(Int m), non hai messo la graffa di chiusura della funzione
  2. invece, dopo il datafile.close(), verso la fine della setup, hai una graffa di troppo, che chiude anticipatamente la setup
  3. meno grave, hai due serial.begin(), togline una
    io consiglio sempre di formattare il codice secondo una qualche convenzione, non è difficile, basta fare: "strumenti - formattazione automatica" oppure premere ctrl-T
    magia che vedi il codice che si risistema da solo, andando a mettersi "a filo e cappello" come serve ("filo e cappello" è "indentato" in parole "studiate")
    faccio conto che dalla prossima volta sarà sempre correttamente indentato
    fatto questo compila, ti dovrebbe dare un paio di warning, ma non è roba tua, è roba della libreria rtc, se ti escono le scritt bianche con l'occupazione di memoria ignora eventuali warning
    mi viene il sospetto: ma tu sai programmare, vero, ovvero, e non ti offendere in questo: tu sai cosa significa una parentesi graffa in 'C', vero?
    inoltre mi sembra che tu "prima" stampi il valore di tensione misurato, e dopo lo misuri, prova a rivedere la logica del tuo programma
    non hai risposto alla mia domanda

Un problema ce l'hai sul setup.
Non ti dico dove perchè così alleni l'occhio :wink:
Ma ti do un indizio.
E' indentato bene quasi tutto ma c'è un'indentazione che non è motivata...
... parte dopo un commento invece che dopo un'istruzione tipo ad es. una if :stuck_out_tongue:

Da una rapida occhiata non mi pare di averne viste altre ma mi potrei sbagliare.
Il loop è indentato male e si fa un po' più fatica a cercare questo tipo di errori.

Un altro problema ce l'hai nella funzione Filter, qui l'indizio te lo do meno criptico... non è chiusa!

EDIT:
Ecco il mio amico mi ha rovinato il gioco a premi, quindi ritiro i soldi che avevo messo in palio per irregolarità :wink:

Ti ringrazio per i consigli, a dire il vero sto imparando ancora ma sto avendo diverse difficoltà a mettere a posto questo codice.
Ho provato con le modifica da te suggerite ma ho sempre errori di parentesi e altri errori, ti potrei chiedere se mi metti a posto il codice in modo che io possa comprarlo con quello fatto da me e vedere dove ho sbagliato? Te ne sarei molto grato davvero…

Al momento ho fatto così:

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
const int chipSelect = 10; //cs or the save select pin from the sd shield is connected to 10.
RTC_DS1307 RTC;
float density, voltage;

#define        COV_RATIO                       0.2            //ug/mmm / mv
#define        NO_DUST_VOLTAGE                 400            //mv
#define        SYS_VOLTAGE                     5000

File dataFile;
DateTime now;

const int iled = 7;
const int vout = 0;

int   adcvalue;
int Filter(int m)

{
  static int flag_first = 0, _buff[10], sum;
  const int _buff_max = 10;
  int i;

  if (flag_first == 0)
  {
    flag_first = 1;

    for (i = 0, sum = 0; i < _buff_max; i++)
    {
      _buff[i] = m;
      sum += _buff[i];
    }
    return m;
  }
  else
  {
    sum -= _buff[0];
    for (i = 0; i < (_buff_max - 1); i++)
    {
      _buff[i] = _buff[i + 1];
    }
    _buff[9] = m;
    sum += _buff[9];

    i = sum / 10.0;
    return i;
  }

  void setup(void) {
    Serial.begin(9600);
    //setup clock
    Wire.begin();
    RTC.begin();
    if (! RTC.isrunning()) {
      Serial.println("RTC non è avviato!");
      RTC.adjust(DateTime(__DATE__, __TIME__));
    }
    //setup SD card
    Serial.print("Avvio SD Card...");

    // see if the SD card is present and can be initialized:
    if (!SD.begin(chipSelect)) {
      Serial.println("Errore SD Card, o non presente");
      // don't do anything more:
      return;
    }
    Serial.println("SD Card Avviata.");

    //write down the date (year / month / day         prints only the start, so if the logger runs for sevenal days you only findt the start back at the begin.
    now = RTC.now();
    dataFile = SD.open("datalog.txt", FILE_WRITE);
    dataFile.print("Start logging on: ");
    dataFile.print(now.year(), DEC);
    dataFile.print('/');
    dataFile.print(now.month(), DEC);
    dataFile.print('/');
    dataFile.print(now.day(), DEC);
    dataFile.println(" ");
    dataFile.println("Voltage              Data");
    dataFile.close();

    pinMode(iled, OUTPUT);
    digitalWrite(iled, LOW);

    Serial.begin(9600);
    Serial.print("*********************************** Rilevamento ***********************************\n");
  }

  void loop(void) {

    //read the time
    now = RTC.now();

    //open file to log data in.
    dataFile = SD.open("datalog.txt", FILE_WRITE);

    if (dataFile) {
      dataFile.print(voltage);
      dataFile.print("                 ");

      dataFile.print(now.hour(), DEC);
      dataFile.print(":");
      dataFile.print(now.minute(), DEC);
      dataFile.print(":");
      dataFile.println(now.second(), DEC);

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

    delay(3000);

    digitalWrite(iled, HIGH);
    delayMicroseconds(280);
    adcvalue = analogRead(vout);
    digitalWrite(iled, LOW);

    adcvalue = Filter(adcvalue);

    /*
      covert voltage (mv)
    */
    voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;

    /*
      voltage to density
    */
    if (voltage >= NO_DUST_VOLTAGE)
    {
      voltage -= NO_DUST_VOLTAGE;

      density = voltage * COV_RATIO;
    }
    else
      density = 0;

    /*
      display the result
    */
    Serial.print("The current dust concentration is: ");
    Serial.print(density);
    Serial.print(" ug/m3\n");

    delay(1000);
  }

Come errori ottengo questi:

C:\Users\Antonino\Desktop\Elettronica Sonda\DataLogger_1.0\Datalogger_Prova\Datalogger_Prova.ino\Datalogger_Prova.ino.ino: In function 'int Filter(int)':

Datalogger_Prova.ino:52: error: a function-definition is not allowed here before '{' token

   void setup(void) {

                    ^

Datalogger_Prova.ino:153: error: expected '}' at end of input

   }

   ^

Più di una libreria trovata per "SD.h"
Usata: C:\Users\Antonino\Desktop\Documents\Arduino\libraries\SD
Non usata: C:\Program Files (x86)\Arduino\libraries\SD-master
Non usata: C:\Program Files (x86)\Arduino\libraries\SD
exit status 1
a function-definition is not allowed here before '{' token

Grazie mille per il tuo tempo

Manca la parentesi graffa di chiusura del metodo precedente,
va messa prima di

   void setup(void) {

Ora funziona! Grazie mille a tutti...

maubarzi:
EDIT:
Ecco il mio amico mi ha rovinato il gioco a premi, quindi ritiro i soldi che avevo messo in palio per irregolarità :wink:

Scusa, non volevo
Ma tanto non è bastato, nessuno dei due nostri interventi...
Non solo non ha risposto alle domande
Non è riuscito a contare le graffe
Non ha nemmeno messo a posto l'ordine tra salvataggio e lettura della tensione
Insomma, un bel "carrello"
La prossima volta che qualcuno non risponde a una domanda lo "plonko" diretto
Di carrelli ne ho le tasche piene....