Datenlogger mit Arduino yun

Hallo @ all

ich möchte ds18b20 Sensoren auslesen und auf die SD karte des Arduino yun speichern. Das auslesen mit der library ds18x20_temperature klappt super aber wie bekomme ich die werte nun auf die sd karte?

Liebe Grüße
DJ

Hallo dragan
Das gleiche Problem hatte ich auch vor ein paar Wochen.
Ich kenne zwar das Arduino yun nicht , denn ich habe meinen Datenlogger auf einen Arduino Duemilanove (DS18B20 - GLCD-MICRO SD) aufgeb1aut.
Wenn du den Code Haben willst gib mir einen Nachricht.
Weis zwar nicht ob er auf dem Arduino yun läuft aber einen Versuch ist es Wert.

Danke Stefan

Hallo,

sehr Simple - nimm dir einen HC4050 oder 74125 und einen Spannungsregler 3.3V
Denn die Karte braucht 3.3V …

#include <SD.h>
  String DatenFile = "";

  File dataFile = SD.open("Datei.txt", FILE_WRITE); // Schreiben
  dataFile.print("Schreibe in die TXT Datei");
  dataFile.close(); // Datei schliessen

Gruss Michael

MAC_GERMANY:
Hallo,

sehr Simple - nimm dir einen HC4050 oder 74125 und einen Spannungsregler 3.3V
Denn die Karte braucht 3.3V ...

Zur Pegelwandlung sind HC4050 oder 74125 die falschen ICs. Du kannst Spannungsteiler nehmen (1,8kOhm und 3,3kOhm) oder einen 74LVX125 oder 74LVC125. Diese mit 3,3V versorgt vertragen 5V an den Eingängen.

Grüße Uwe

FYI:

The 74HC4050 is a hex buffer with over-voltage tolerant inputs. Inputs are overvoltage tolerant to 15 V which enables the device to be used in HIGH-to-LOW level shifting applications.

http://www.nxp.com/products/logic/level_shifters_translators/series/74HC4050.html

Hallo Uwe,

dir ist aber schon klar das z.B Adafruit auf dem Shield es genauso macht?!
hier mit 74HC4050:

Habe es selber so mit gleichen Bauteilen verbaut und läuft seit langem problemlos in mehreren Versionen.
Einen Spannungsteiler zu nehmen finde ich aufgrund der tolleranz ehr nicht so sinnvoll. Lasse mich aber auch gerne belehren und bin sicher nicht der Stein der Weisen :slight_smile: aber für mich macht das so Sinn.
Gruss Michael

Spannungsteiler gehen schon. Das ist auf den einfacheren Shields sehr oft so gemacht. Auch bei TFTs. Die Eingänge haben ja auch etwas Toleranzen, daher muss das nicht 100%ig genau sein. Die besseren, bzw. neueren Version von Shields haben aber eher solche ICs.

Ich bin ein stück weitergekommen. Temperatur Sensoren werden gelesen. SD Karte habe ich nicht geschafft anzusprechen aber
mit FileIO.h kann ich auf die Karte auch schreiben leider bekomme ich es nicht hin das die Temperaturen dort geschrieben werden.

#include <Bridge.h>
#include <FileIO.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

int numberOfDevices; // Number of temperature devices found

DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address





void setup(void)
{
  Bridge.begin();
  FileSystem.begin();
  // start serial port
  Serial.begin(9600);
  while(!Serial);  // wait for Serial port to connect.
  Serial.println("Filesystem datalogger\n");
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
  
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();
  
  // locate devices on the bus
  Serial.print("Locating devices...");
  
  Serial.print("Found ");
  Serial.print(numberOfDevices, DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  
  // Loop through each device, print out address
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
	{
		Serial.print("Found device ");
		Serial.print(i, DEC);
		Serial.print(" with address: ");
		printAddress(tempDeviceAddress);
		Serial.println();
		
		Serial.print("Setting resolution to ");
		Serial.println(TEMPERATURE_PRECISION, DEC);
		
		// set the resolution to TEMPERATURE_PRECISION bit (Each Dallas/Maxim device is capable of several different resolutions)
		sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
		
		 Serial.print("Resolution actually set to: ");
		Serial.print(sensors.getResolution(tempDeviceAddress), DEC); 
		Serial.println();
	}else{
		Serial.print("Found ghost device at ");
		Serial.print(i, DEC);
		Serial.print(" but could not detect address. Check power and cabling");
	}
  }

}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{

  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}

void loop(void)
{ 
  

  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  
  
  //dragan begin 
   
  File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);
delay(15000);

    // print to the serial port too:
  /* Jetzt begreife ich nicht wie ich Serial.print auf /mnt/sd/datalog.txt umleite.
  */
  
  //dragan ende
  
  // Loop through each device, print out temperature data
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
	{
		// Output the device ID
		Serial.print("Temperature for device: ");
		Serial.println(i,DEC);
		
		// It responds almost immediately. Let's print out the data
		printTemperature(tempDeviceAddress); // Use a simple function to print out the data
	} 
	//else ghost device! Check your power requirements and cabling
	
  }
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

Ich komme nicht weiter. Die SD Library funktioniert bei yun nicht. Ich habe zumindest bei CardInfo
const int chipSelect = 8; 4; und 10 probiert aber immer mit dem selben Ergebnis. Eine Aufforderung den chipSelect pin zu ändern. Jedes Beispiel das ich fand arbeitete entweder mit Arduino Shild´s wo chipSelect pin angaben auch funktionieren oder es waren Analoge Sensoren verwendet welche ganz anders ausgewertet werden. Ich habe mir jetzt auch das Buch Die elektronische Welt mit Arduino entdecken gekauft aber leider ist auch da kaum etwas zu diesem Thema enthalten. Also wenn mir keiner weiterhelfen kann bleibt mir nichts anderes übrig als zu den Beispielen passende Hardware zu kaufen.
$)

mit FileIO.h kann ich auf die Karte auch schreiben...

Wie genau stellst Du es denn an, auf die Karte zu schreiben (welche Methode(n) verwendest Du)?
Hast Du vielleicht ein Zeilchen Beispielcode, der uns zeigt, wie Du es geschafft hast, auf die Karte zu schreiben?
(Hier weiß jetzt nämlich im Moment keiner, womit genau Du Probleme hast).

Hallo Reinhard,

ich habe versucht den code von serial.print 1=1 auf dataFile.print zu übertragen.
Momentan wird nur einen sensor in die dabei geschrieben aber die Terminal Ausgabe zeigt mir beide Sensoren.

#include <Wire.h>
#include <Bridge.h>
#include <FileIO.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "RTClib.h"
RTC_Millis rtc;


// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9


// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

int numberOfDevices; // Number of temperature devices found
DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address
float tempC;


 

void setup(void)
{
  rtc.begin(DateTime(__DATE__, __TIME__));
  Bridge.begin();
  FileSystem.begin();
  // start serial port
  Serial.begin(9600);
  while(!Serial);  // wait for Serial port to connect.
  Serial.println("Filesystem datalogger\n");
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
  
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();
  
  // locate devices on the bus
  Serial.print("Locating devices...");
  
  Serial.print("Found ");
  Serial.print(numberOfDevices, DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  
  // Loop through each device, print out address
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
	{
		Serial.print("Found device ");
		Serial.print(i, DEC);
		Serial.print(" with address: ");
		printAddress(tempDeviceAddress);
		Serial.println();
		
		Serial.print("Setting resolution to ");
		Serial.println(TEMPERATURE_PRECISION, DEC);
		
		// set the resolution to TEMPERATURE_PRECISION bit (Each Dallas/Maxim device is capable of several different resolutions)
		sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
		
		 Serial.print("Resolution actually set to: ");
		Serial.print(sensors.getResolution(tempDeviceAddress), DEC); 
		Serial.println();
	}else{
		Serial.print("Found ghost device at ");
		Serial.print(i, DEC);
		Serial.print(" but could not detect address. Check power and cabling");
	}
  }
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{

  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}
 
void loop(void)
{ 
   DateTime now = rtc.now();
    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
    Serial.print(" seconds since 1970: ");
    Serial.println(now.unixtime());
    
    // calculate a date which is 7 days and 30 seconds into the future
    DateTime future (now.unixtime() + 7 * 86400L + 30);
    
    Serial.print(" now + 7d + 30s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();

   
    

  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  
  
  //dragan begin 
  
  sensors.requestTemperatures();                         // get data from DS18B20
  tempC = sensors.getTempCByIndex(0);     
  File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);
  
  
  if (dataFile) {
  //Header für Ausgabe -
  dataFile.println("Temperatur Messung");
  dataFile.print("Start der Messung:");
  dataFile.print(now.day(),DEC); 
  dataFile.print("."); 
  dataFile.print(now.month(),DEC); 
  dataFile.print("."); 
  dataFile.print(now.year(),DEC); 
  dataFile.print(" "); 
  dataFile.print(now.hour(),DEC); 
  dataFile.print(":"); 
  dataFile.println(now.minute(),DEC);
 sensors.requestTemperatures();  
 dataFile.println((float)tempC);
  
  //Serial.print("DS18B20 = ");
 Serial.println(tempC);
//  dataFile.println("Zeit \t Tag \t Monat \t Jahr \t  Stunde \t Minute ");    
  }
  
  
delay(15000);

    // print to the serial port too:
  /* Jetzt begreife ich nicht wie ich Serial.print auf /mnt/sd/datalog.txt umleite.
  */
  
  //dragan ende
  
  // Loop through each device, print out temperature data
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
	{
		// Output the device ID
		Serial.print("Temperature for device: ");
		Serial.println(i,DEC);
	// It responds almost immediately. Let's print out the data
		printTemperature(tempDeviceAddress); // Use a simple function to print out the data
	} 
	//else ghost device! Check your power requirements and cabling
	
  }
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}
  //dragan 
  
  sensors.requestTemperatures();                         // get data from DS18B20
  tempC = sensors.getTempCByIndex(0);     
  File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);
  
  
  if (dataFile) {
  //Header für Ausgabe -
  dataFile.println("Temperatur Messung");
  dataFile.print("Start der Messung:");
  dataFile.print(now.day(),DEC); 
  dataFile.print("."); 
  dataFile.print(now.month(),DEC); 
  dataFile.print("."); 
  dataFile.print(now.year(),DEC); 
  dataFile.print(" "); 
  dataFile.print(now.hour(),DEC); 
  dataFile.print(":"); 
  dataFile.println(now.minute(),DEC);
 sensors.requestTemperatures();  
 dataFile.println((float)tempC); // ich verstehe nicht warum nur ein sensor in die Datei geschrieben wird.
  
  //Serial.print("DS18B20 = "); 
 Serial.println(tempC); 
//  dataFile.println("Zeit \t Tag \t Monat \t Jahr \t  Stunde \t Minute ");    
  }
  
  
delay(15000);

    // 
  /* .
  */
  
  //dragan ende

OK, was genau steht denn nach Durchführung dieser Operationen in der Datei auf der Karte?
Wenn da NICHTS steht: welchen Zustand (TRUE oder FALSE) nimmt denn "datafile" an nach

File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);

Terminal Ausgabe

Temperature for device: 0
Temp C: 25.50 Temp F: 77.90
Temperature for device: 1
Temp C: 33.00 Temp F: 91.40
2014/4/7 6:36:11
seconds since 1970: 1396852571
now + 7d + 30s: 2014/4/14 6:36:41
Requesting temperatures...DONE
25.50

Die gewünschte Dateiausgabe
Temperatur Messung
Start der Messung:7.4.2014 6:35
25.50
Temperatur Messung
Start der Messung:7.4.2014 6:36
25.50
Temperatur Messung
Start der Messung:7.4.2014 6:36
25.50
Temperatur Messung
Start der Messung:7.4.2014 6:36
25.50

Ähh ja, noch einmal meine Frage:

was genau steht nach Durchführung dieser Operationen in der Datei auf der Karte?
Wenn da NICHTS steht: welchen Zustand (TRUE oder FALSE) nimmt denn “datafile” an nach

File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);

Ich habe den datalog.text oben bereits eingefügt. Ich dachte zumindest das du diesen haben wolltest. Das Problem habe ich aber anscheinend gelöst. Die Lösung ist zwar nicht Elegant aber verwendbar.

  if (dataFile) {
  //Header für Ausgabe -
  dataFile.println("Temperatur Messung");
  dataFile.print("Start der Messung:");
  dataFile.print(now.day(),DEC); 
  dataFile.print("."); 
  dataFile.print(now.month(),DEC); 
  dataFile.print("."); 
  dataFile.print(now.year(),DEC); 
  dataFile.print(" "); 
  dataFile.print(now.hour(),DEC); 
  dataFile.print(":"); 
  dataFile.println(now.minute(),DEC);
  
 sensors.requestTemperatures();  
  dataFile.println("Sensor 1");
 dataFile.println((float)tempC); // ich verstehe nicht warum nur ein sensor in die Datei geschrieben wird.
  
  //Serial.print("DS18B20 = ");
 
 Serial.println(tempC);
  dataFile.println("Sensor 2");
 tempC = sensors.getTempCByIndex(1); 
  sensors.requestTemperatures();  
 dataFile.println((float)tempC); // ich verstehe nicht warum nur ein sensor in die Datei geschrieben wird.
  
  //Serial.print("DS18B20 = ");
 Serial.println(tempC);
 
 
//  dataFile.println("Zeit \t Tag \t Monat \t Jahr \t  Stunde \t Minute  ");    
  }

Hallo zusammen,

der Post ist zwar schon aien paar Tage alt aber ich habe derzeit das selbe Problem.
Ich will ein LogFile auf die SD Karte des YUN schreiben. Dieses wird aber nicht immer geöffnet.
Hier der Code:

void Debugprint (String strDebug){
	DebugSerial.println(strDebug);
	File dataFile = FileSystem.open("/mnt/sd/log.txt", FILE_APPEND);
	delay(100);

	if (dataFile) {
		dataFile.println(strDebug);
		dataFile.close();
	}  
	else {
		 DebugSerial.println("DataFile not opened");
	}
}

DebugSerial ist die Ausgabe an die Serielle Schnittstelle, derzeit habe ich das noch mit laufen weil ich in der Entwicklung stecke. Später sollen aber sämtliche Ausgaben nur noch im LogFile erfolgen. Die Funktion Debugprint bekommt Strings die ich ins File schreiben will. Das delay habe ich eingefügt weil ich dachte das das öffnen vielleicht zu schnell geht. Ist FileSystem.open eine blockierende Funktion? Ich bekomm doch nur die Werte 1 oder 0 zurück korrekt?
Woran kann es liegen das die Datei nicht geöffnet werden kann?