Hey guys,
now that my code for controlling a valve works via the serial monitor, I want to control it via a webserver. I am using the Uno R4 Wifi. It shall work as an access point that can be accessed via its ip adress. When accessed, the user can make inputs like setting the pressure and after pressing the start button, the results are shown on the webserver. However, I find it extremely difficult to do this task. Is there a way to transform the serial monitor to the webserver interface? The tutorial about the led that can be switched on and off is helpful to get started, but at some point I dont know what to do anymore. Below you can see my code (which is in german, but maybe you can still help me)
// DAC-Pin-Definition (A0 auf Arduino Due oder einem anderen Board mit DAC)
const int dacPin = A0;
const int istPin = A2;
const int durchflussPin = A4;
// Variablen für Spannung und Steigrate
float zielSpannung = 4.9; // Maximale Spannung in Volt
float spannungRate = 0.0; // Steigrate in Volt/Sekunde
unsigned long lastUpdateTime = 0; // Zeitpunkt des letzten Updates in ms
unsigned long startZeit = 0; //Zeitsteuerung für Teil 1 des Versuchs
unsigned long lastMessageTime = 0; // Zeitpunkt der letzten Nachricht
const unsigned long messageInterval = 100; // Intervall in Millisekunden
// Skalierungsfaktoren (hier können Sie die spezifischen Werte eintragen)
const float startIstwertSpannung = 0.935; // Minimal Istwert-Spannung, ausgegeben vom Ventil
const float voltProBarSoll = 0.773; // Spannung pro Bar für Sollwert (z. B. 1V = 1 Bar)
const float voltProBarIst = 0.444; // Spannung pro Bar für Istwert (z. B. 1V = 1 Bar)
// Variablen für Benutzereingaben
float halteDruck = 0.0;
int halteZeit = 0;
float druckSteigrate = 0.0;
float berstDruck = 0.0;
void setup() {
analogWriteResolution(12); // 12 bit Auflösung (0 - 4095)
Serial.begin(9600);
}
void loop() {
// Start-Up
Serial.println("Berstdruckversuch");
Serial.println("Drücken Sie Enter, um zu starten.");
while (!Serial.available()); // Warten, bis Benutzer fortfährt
Serial.read(); // Eingabe leeren
// Benutzerwerte eingeben
Serial.println("Geben Sie den Haltedruck in Bar ein:");
while (!Serial.available()); // Warten auf Eingabe
halteDruck = Serial.parseFloat(); // Eingabe verarbeiten
Serial.read(); // Eingabe-Puffer leeren
Serial.println("Geben Sie die Haltezeit in Sekunden ein:");
while (!Serial.available()); // Warten auf Eingabe
halteZeit = Serial.parseInt(); // Eingabe verarbeiten
Serial.read(); // Eingabe-Puffer leeren
Serial.println("Geben Sie die Druck-Steigrate in bar/s ein:");
while (!Serial.available()); // Warten auf Eingabe
druckSteigrate = Serial.parseFloat(); // Eingabe verarbeiten
Serial.read(); // Eingabe-Puffer leeren
// Benutzer soll Eingabewerte überprüfen
Serial.println("Überprüfen Sie die Werte und bestätigen Sie mit Enter.");
Serial.print("Haltedruck: ");
Serial.print(halteDruck);
Serial.println(" bar");
Serial.print("Haltezeit: ");
Serial.print(halteZeit);
Serial.println(" s");
Serial.print("Steigrate: ");
Serial.print(druckSteigrate);
Serial.println(" bar/s");
while (!Serial.available());
Serial.read();
// Haltedruckphase starten
Serial.println("Haltephase beginnt...");
float sollSpannung = halteDruck * voltProBarSoll;
analogWrite(dacPin, sollSpannung * 4095.0 / 5.0); // Spannung proportional setzen
startZeit = millis();
//Ausgabe des Haltedrucks, ermittelt über die Istspannung und den Umrechnungsfaktor
while (millis() - startZeit < halteZeit * 1000) { //* 1000 damit Haltezeit als Sekunden gewertet werden und nicht als
float istSpannung = analogRead(istPin) * 5.0 / 1023.0;
float istDruck = istSpannung / voltProBarIst - startIstwertSpannung / voltProBarIst;
Serial.print("Aktueller Druck: ");
Serial.print(istDruck);
Serial.println(" Bar");
delay(1000); //Ausgabe erfolgt ein mal pro Sekunde
}
//Information, dass Zeit abgelaufen ist
Serial.println("Haltezeit abgelaufen.");
// Entscheidung für Teil 2 oder Wiederholung
Serial.println("Teil 1 mit (n) wiederholen.");
Serial.println("Teil 2 starten. Bauteil in Prüfbox legen und mit (y) bestätigen.");
while (!Serial.available());
char choice = Serial.read();
if (choice == 'n' || choice == 'N') {
Serial.println("Wiederholung von Teil 1...");
sollSpannung = 0.0;
analogWrite(dacPin, sollSpannung * 4095.0 / 5.0);
return; // Zurück zum Anfang des Loops
}
unsigned long currentTime = millis();
unsigned long lastUpdateTime = currentTime; // Initialisieren für die erste Berechnung
float istSpannung = analogRead(istPin) * 5.0 / 1023.0;
spannungRate = druckSteigrate * voltProBarSoll;
if (spannungRate > 0.0) { // Sicherstellen, dass die Steigrate positiv ist
while (sollSpannung < zielSpannung) { // Schleife läuft, bis die Spannung 5V erreicht
currentTime = millis(); // Aktuelle Zeit ermitteln
unsigned long elapsedTime = currentTime - lastUpdateTime; // Zeitdifferenz berechnen
float timeInSeconds = elapsedTime / 1000.0; // Umrechnung in Sekunden
if (timeInSeconds > 0) { // Wenn Zeit vergangen ist, berechnen
// Erhöhe die Spannung proportional zur Steigrate und Zeitdifferenz
sollSpannung += spannungRate * timeInSeconds;
// Begrenzen der Spannung auf die Zielspannung
if (sollSpannung >= zielSpannung) {
sollSpannung = zielSpannung; // Begrenzung auf 5V
Serial.println("Berstdruck > 6 bar.");
}
// Spannung in DAC-Wert umrechnen und ausgeben
int dacValue = (int)((sollSpannung / 5.0) * 4095);
analogWrite(dacPin, dacValue);
unsigned long aktuelleZeit = millis(); // Aktuelle Zeit ermitteln
// Prüfen, ob das Intervall seit der letzten Nachricht abgelaufen ist
if (aktuelleZeit - lastMessageTime >= messageInterval) {
lastMessageTime = aktuelleZeit; // Zeitpunkt der letzten Nachricht aktualisieren
Serial.print("Aktuelle Spannung: ");
Serial.print(sollSpannung);
Serial.println(" V");
}
float durchflussWert = analogRead(durchflussPin) * 5.0 / 1023.0;
if (durchflussWert > 0.4) {
Serial.println("Leckage erkannt, beende Versuch.");
Serial.print("Finaler Berstdruck: ");
Serial.println(sollSpannung/voltProBarSoll);
break;
}
lastUpdateTime = currentTime;
}
}
// Nach dem Erreichen von 5V zurücksetzen
Serial.println("Druck wird zurückgesetzt.");
sollSpannung = 0.0; // Spannung zurücksetzen
int dacValue = 0; // DAC auf 0 setzen
analogWrite(dacPin, dacValue);
}
}