Hallo Arduino Community,
ich bin neu im Forum und habe vor kurzem angefangen mit dem Arduino zu experimentieren.
In meinem aktuellen Projekt möchte ich zwei Spannungen messen (kleiner 5V) und ein Mosfet schalten. Mein vermutlich nicht normgerechter Schaltplan ist auf dem Foto zu sehen. Die Spannung welche ich messen möchte ist stark und schnell schwankend.
Mein Code tut fast alles was ich möchte. Dazu gehört:
- Schalten des Mosfet (hier eingestellt mit 1000ms)
- Messen der Spannungen 1 und 2 (hier eingestellt mit 1ms)
- Mathematische weiterverwendung der Spannung 1 (hier CSB genannt und erst mal nur eine Verdoppelung die richtige Umformung an der Stelle muss noch eingetragen werden)
- Ausgabe der Spannungen 1 und 2 auf ein LCD Display
- Ausgabe des "CSB-Wertes" auf dem LCD Display
- Umschalten der Anzeige zweischen Spannung und CSB auf dem Display mittels Taster
- Loggen der gemessenen Daten auf einer SD-Karte.
Der Code dazu sieht wie folgt aus:
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int mosfetPin = 9;
unsigned long mosfetMillis = 0;
const long mosfetInterval = 1000; // Intervall für MOSFET-Steuerung in Millisekunden
const int analogPin1 = A0;
const int analogPin2 = A1;
unsigned long analogMillis = 0;
const long analogInterval = 1; // Intervall für Spannungsmessung in Millisekunden
const int buttonPin = 2; //Button zum Wechseln der Displayausgabe
int displayMode = 1;
File dataFile;
void setup() {
pinMode(mosfetPin, OUTPUT);
pinMode(analogPin1, INPUT);
pinMode(analogPin2, INPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
lcd.init();
lcd.backlight();
// Initialisiere die SD-Karte
if (SD.begin(10)) {
Serial.println("SD-Karte initialisiert.");
} else {
Serial.println("Fehler beim Initialisieren der SD-Karte!");
}
// Überprüfe, ob die .csv-Datei vorhanden ist, andernfalls erstelle sie
if (!SD.exists("daten.csv")) {
dataFile = SD.open("daten.csv", FILE_WRITE);
if (dataFile) {
// Schreibe Spaltenüberschriften in die erste Zeile
dataFile.println("Spannung 1,Spannung 2");
// Schließe die Datei
dataFile.close();
Serial.println("Datei daten.csv erstellt.");
} else {
Serial.println("Fehler beim Erstellen der Datei.");
}
}
}
void loop() {
unsigned long currentMillis = millis();
// MOSFET-Steuerung im mosfetInterval-Takt
if (currentMillis - mosfetMillis >= mosfetInterval) {
mosfetMillis = currentMillis;
digitalWrite(mosfetPin, !digitalRead(mosfetPin));
}
// Taster abfragen, um zwischen den Spannungen umzuschalten
if (digitalRead(buttonPin) == LOW) {
if (displayMode == 1) {
displayMode = 2;
} else {
displayMode = 1;
}
delay(500);
}
// Spannungsmessungen im analogInterval-Takt
if (currentMillis - analogMillis >= analogInterval) {
analogMillis = currentMillis;
int rawValue1 = analogRead(analogPin1);
int rawValue2 = analogRead(analogPin2);
float voltage1 = (rawValue1 * 5.0 / 1023.0) * 1000.0; // Spannung 1 in mV (drei Nachkommastellen)
float voltage2 = (rawValue2 * 5.0 / 1023.0) * 1000.0; // Spannung 2 in mV (drei Nachkommastellen)
// Öffne die CSV-Datei im Schreibmodus (wird erstellt oder überschrieben)
dataFile = SD.open("daten.csv", FILE_WRITE);
if (dataFile) {
// Schreibe Daten in die CSV-Datei
dataFile.print(voltage1, 2); // Anzeige auf 2 Dezimalstellen
dataFile.print(",");
dataFile.println(voltage2, 2); // Anzeige auf 2 Dezimalstellen
// Schließe die Datei
dataFile.close();
Serial.println("Daten in CSV-Datei geschrieben.");
} else {
Serial.println("Fehler beim Öffnen der Datei.");
}
// Aktualisiere das Display
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Spannung 1: ");
lcd.print(voltage1, 3);
lcd.setCursor(0, 1);
lcd.print("Spannung 2: ");
lcd.print(voltage2, 3);
}
}
Meine Problem mit dem Code ist, dass die erhobenen und dokumentierten Messungen deutlich weniger sind als erwartet. Meine Erwartung ist, dass bei einem Schaltintervall von 1000ms des Mosfets und einem Intervall der Spannungsmessung von 1ms theoretisch 1000Spannungesmessungen inerhalb einer Mosfet-Umschaltung gemacht werden müssten. Dies ist aber nicht der fall der Dokumentation auf der SD-Zufolge werden nur ~14 Messungen in 1000ms gemacht.
Ich benötige nicht die vollen 1000 Messungen aber 50-200 Messungen währen für mein Projekt gut.
Könnt ihr mir helfen und erklären wieso nur so wenig Messungen gemacht werden? Hängt es vielleicht mit Aktualisierungsraten des LCD´s, oder Schreibgeschwindigkeiten der SD-Karte zusammen?
Ich hoffe das ihr mit meinen Angaben und Dokumentation etwas anfangen könnt und es nicht all zu laienhaft wirkt
Über eine Lösung meines Problems würde ich mich auf jeden Fall sehr freuen
Mit besten Grüßen in die Community
Connnnee