DHT + SD library

Hallo,
Ik ben bezig om via de DHTlib van Rob RH en Temp te loggen naar een SD kaart. Daarvoor gebruik ik de (volgens mij) standaard SD library.

Daarvoor gebruik ik een sketch die werkte met 3 temperatuursensoren (en bedoelt was voor een leerling die een onderzoek naar broei-effecten in paardenmest deed)…

/*
Datalogger.
 
 Poort A0, A1 en A3  worden analoog uitgelezen en de waarde daarvan in een string gezet.
 Daarnaast wordt de wachttijd tussen twee meetmomenten mee gestuurd.
 
 Met de potmeter op het shield kunnen drie meetfrequenties worden ingesteld:
 1 - per minuut
 2 - per 5 minuten
 3 - per 10 minuten
 
 Handleiding:
 - voorzie het arduino-board van voeding (adapter of usb)
 - stop pas daarna de SD-kaart erin (wacht voor de zekerheid een paar seconden
 - druk op de resetknop en de meting zal starten
 
 - druk de SD-kaart er weer uit
 - hier staat nu een .txt bestand op, met komma-gescheiden waarden.
 - dit kun je in bijv. Excel importeren en verder bewerken.
 
 */


//Definities
#include <SD.h>
const int chipSelect = 4;
int sch = 2;
int sch_state;

int pot;
int potx;

long wacht;

void setup()
{
  // Open de Seriele communicatiemogelijkheid
  Serial.begin(9600);

  Serial.print("Initializing SD card...");

  pinMode(10, OUTPUT);
  pinMode(13, OUTPUT);

  // Kijk of de SD kaart present is en geinitialiseerd kan worden
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");
}

void loop()
{
  //lees de waarde van de potmeter uit
  pot = analogRead(A2);
  //converteer deze naar de 3 verschillende meetfrequentie posities
  potx = map (pot, 0, 1023, 1, 4);

  //als de potmeter op 1 staat wacht dan 60 seconden voor dat je de volgende meting doet... etc.
  if (potx == 1){
    wacht = 60000;
  }
  if (potx == 2){
    wacht = 300000;
  }
  if (potx == 3){
    wacht = 600000;
  }

  // maak een string aan om de sensordata in te stoppen

  String dataString = "";

  // mest temperatuur
  int sensor_mest = analogRead(A0);
 
  // fles temperatuur
  int sensor_fles = analogRead(A1);
 
  // buitenlucht temperatuur
  int sensor_buitenlucht = analogRead(A3);

  //stop alle waarden in de string, met een komma ertussen

  dataString += String(sensor_mest);
  dataString += ",";
  dataString += String(sensor_fles);
  dataString += ",";
  dataString += String(sensor_buitenlucht);
  dataString += ",";
  dataString += String(wacht);    

  // Open een file op de SD-kaart
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // Als de file beschikbaar is, schrijf de data er naar toe
  if (dataFile) {

    dataFile.println(dataString);
    dataFile.close();
  }  
  // als de file niet beschikbaar is, laat een foutmelding zien:
  else {
    Serial.println("error opening datalog.txt");
  } 
  //wacht de ingestelde tijd
  delay(wacht);
}

Nu dacht ik dus de DHT-specifieke dingen er tussen te voegen en 'm weg te schrijven op deze manier:

Ipv:

dataString += String(sensor_mest);

Deze:

dataString += String(DHT.humidity,1)

Maar toen ging Arduino mekkeren over double’s & ints dat die niet in een String zouden passen o.i.d.

Kan de SD library ook met iets anders als een String werken?
In een String kunnen toch diverse datatypes zitten? Maar mogelijk niet tegelijkertijd, is dat het probleem hier?

Groet,
Johan

dataString += String(DHT.humidity,1)??? Wat wil je bereiken? 1 decimaal? dat werkt enkel bij classes die van Print afgeleid zijn.

gebruik

dataString += String(DHT.humidity);

of als je 1 decimaal wil afdwingen int heel = (int) DHT.humidity; int decimaal = (int) ((DHT.humidity - heel) * 10);

dataString += String(heel);
dataString += String(".");
dataString += String(decimaal);

Overigens wordt het gebruik van de String class niet aanbevolen omdat het dynamisch geheugen gebruikt en de Arduino geen memory manager heeft.