Nach Umrechnung teilweise keine Ausgabe

Hallo,
Ich kann mein Problem leider keinem bestimmten Thema zuordnen. Ich habe auch schon diverse Artikel durchforstet, aber konnte keine Lösung finden.

Wahrscheinlich liegt es an meinem Code, denn ich bin sehr neu auf dem Gebiet. Aber nun zum Problem:

Ich habe einen Arduino Uno und ein Oled Display. Auf dem Arduino ist ein Data logger Shield.
Ich Zeichne damit meine Daten vom Anemometer auf.

Ich musste schon diverse Libarys kombinieren, damit die Aufzeichnung und Ausgabe überhaupt klappt.

Ich habe also meine ermittelte Spannung und schreibe diese auf die SD Karte und zeige sie auf dem Display an. Wenn ich jetzt die Spannung in die Windgeschwindigkeit umrechne funktioniert nur noch die Serielle Ausgabe. Auf dem Display und der SD Karte wird dauerhaft 0 angezeigt.

Wie an den Kommentaren zu erkennen, habe ich auch schon viel probiert. leider ohne wirklichen Erfolg.

Schon einmal danke für die Hilfe :slight_smile:

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
#include "RTClib.h"

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3C for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
#define LOGO_HEIGHT 16
#define LOGO_WIDTH 16

SSD1306AsciiWire oled;

const int chipSelect = 10; //10 is default by shield, but normally on Pin 4
int interval = 5; //Log to SD Card every 5 seconds
long timer;
String timestring;
String mvalue;

const int analogpin = A0;

int volt, oldvolt = 0;

//float geschw = 0;
unsigned long geschw;
//int geschw;

RTC_DS1307 rtc;

void setup() {

Serial.begin(9600);

display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.display();

oled.begin(&Adafruit128x32, I2C_ADDRESS, -1);

oled.setFont(TimesNewRoman16_bold); // Auswahl der Schriftart
oled.clear();

Serial.println("Initializing SD card...");
if (!SD.begin(chipSelect)) {
Serial.println("SD Card error");
return;
}
Serial.println("card initialized");
if (! rtc.begin()) {
Serial.println("No RTC found");
} else {
Serial.println("RTC clock found");
}
if (! rtc.isrunning()) {
Serial.println("RTC is not configured");
}

//rtc.adjust(DateTime(F(DATE), F(TIME)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

}

void messung() {

int wert = analogRead(analogpin);
volt = map(wert, 10, 1023, 0, 491);
if (volt != oldvolt) {
Serial.print(wert);
Serial.print(", ");
Serial.print(volt / 100.0);
Serial.print(" V");

float geschw = ((volt/100.0 * 0.006) * 10 * 10 * 10);
//geschw = (((volt/100.0) * 0.006) * 10 * 10 * 10);
Serial.print(geschw);
Serial.println(" m/s");
//oled.clear();
//oled.print(geschw);
//oled.print(" m/s");

}

}

void ausgabe() {

String dataString = mvalue + "," + timestring;
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.println(geschw);
dataFile.close();

}
else {
Serial.println("error writing datalog.txt");
}

oled.clear();
oled.print(geschw);
oled.print(" m/s");

}

void loop() {

messung();
ausgabe();

delay(500);
}

Der Variabel geschw im Funktion messung() :
float geschw = ((volt/100.0 * 0.006) * 10 * 10 * 10);

ist nicht verfügbar im Funktion ausgabe()
dataFile.println(geschw);

Um von Funktionen gemeinsam genutzt zu werden, müssen die Variablen global deklariert werden, wie diese

int volt, oldvolt = 0;

Weg mit "float" hier. In diesem Fall ist geschw lokal.

float geschw = ((volt/100.0 * 0.006) * 10 * 10 * 10);

Das geht aber sehr schnell hier. Cool. Ich habe noch ein bisschen probiert und so läuft es nun.

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
#include "RTClib.h"

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3C for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16


SSD1306AsciiWire oled;


const int chipSelect = 10; //10 is default by shield, but normally on Pin 4
int interval = 5;  //Log to SD Card every 5 seconds
long timer;
String timestring;
String mvalue;

const int analogpin = A0;

int volt, oldvolt = 0;

//float geschw = 0;
//unsigned long geschw;
int geschw;


RTC_DS1307 rtc;


void setup() {

  Serial.begin(9600);


  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.display(); 





  oled.begin(&Adafruit128x32, I2C_ADDRESS, -1);
 
  oled.setFont(TimesNewRoman16_bold); // Auswahl der Schriftart
  oled.clear();




  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("SD Card error");
    return;
  }
  Serial.println("card initialized");
  if (! rtc.begin()) {
    Serial.println("No RTC found");
  } else {
    Serial.println("RTC clock found");
  }
  if (! rtc.isrunning()) {
    Serial.println("RTC is not configured");
  }




  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));









}


void messung() {

  int wert = analogRead(analogpin);
  volt = map(wert, 10, 1023, 0, 491);
  if (volt != oldvolt) {
    Serial.print(wert);
    Serial.print(", ");
    Serial.print(volt / 100.0);
    Serial.print(" V");





  geschw = volt * 6 ;
  //float geschw = ((volt/100.0 * 0.006) * 10 * 10 * 10);
  //geschw = (((volt/100.0) * 0.006) * 10 * 10 * 10);
  Serial.print(geschw / 100.0);
  Serial.println(" m/s");
  //oled.clear();
  //oled.print(geschw / 100.0);
  //oled.print(" m/s");
  



  }

}

void ausgabe() {

  String dataString = mvalue + "," + timestring;
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (dataFile) {
    dataFile.println(geschw / 100.0);
    dataFile.close();



  }
  else {
    Serial.println("error writing datalog.txt");
  }



  oled.clear();
  oled.print(geschw / 100.0);
  oled.print(" m/s");
 
}



void loop() {

  messung();
  ausgabe();

  delay(500);
}