Guten tag ich habe ein paar Probleme , bei meinem Projekt den ich mache. Ich bin auf einer Abschlussklasse. Ich habe als Projekt eine Lageregelung eines Balls auf einer Schiene bekommen und arbeite schon seit 6 Monaten dran und bekomme immer die selben Fehler Meldungen.
expected constructor, destructor, or type conversion before serial´ und exit status 1 expected unqualified before {´
hier ist mein Programm :
#include<Wire.h>
#include<Servo.h>
#include<ArduPID.h>
#include<U8glib.h>
#define MUX_Address 0x70 // Adresse des Mulitplexers TCA9548A
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_FAST); // Fast I2C / TWI
ArduPID myController;
double input;
double output;
double setpoint = 10;
double p = 4;
double i = 3;
double d = 2;
int Analog_in = A0;
Servo myservo;
float distance = 50;
float time1;
float distance_previous_error, distance_error;
float period = 0;
char taco [4];
int Sollwert = 0;
void tcaselect(uint8_t i2c_bus) {
if (i2c_bus > 7 ) return;
Wire.beginTransmission (MUX_Address);
Wire.write(1 << i2c_bus);
Wire.endTransmission();
}
void setup() {
// put your setup code here, to run once:
Serial.begin (9600);
myservo.attach (9);
myservo.write (125);
pinMode (Analog_in, INPUT);
time1 = millis();
}
DisplayInit()
Serial.begin(250000);
float get_dist(int n)
{
long sum = 0; //Der Befehl "long" speichert den aktuellen Wert
for (int i = 0; i < n; i++) //Befehl für eine Schleife
{
sum = sum + analogRead(Analog_in); //Mit dem Befehl "analogRead" liest der Arduino den Wert vom angegebenen analogen Pin ein und konvertiert von Analog in Digital.
//Addiert die aktuelle Summe mit dem Analogwert des Sensors
}
float adc = sum / n;
float distance_cm = 17569.7 * pow(adc, -1.2062); //Umwandlung von Volt in Zentimeter (Fromel, Datasheet Sensor). Befehl "pow" gibt uns die möglichkeit eine Zahl mit einer Potenz zu multiplizieren.
return (distance_cm); //Der Befehl "return" beendet die Funktion und gibt den Wert an die aufrufende Funktion zurück.
}
{ Serial.begin(115200);
myController.begin(&input, &output, &setpoint, p, i, d);
myController.start();
// myController.reset(); // Used for resetting the I and D terms - only use this if you know what you're doing
// myController.stop(); // Turn off the PID controller (compute() will not do anything until start() is called)
}
void DisplayInit() { //Initialisierung der Displays
for (int i = 0; i < 7; i++) {
tcaselect(i);
u8g.firstPage();
do {
u8g.begin();
} while ( u8g.nextPage() );
}
}
void loop() {
input = analogRead(A0); // Replace with sensor feedback
myController.compute();
myController.debug(&Serial, "myController", PRINT_INPUT | // Can include or comment out any of these terms to print
PRINT_OUTPUT | // in the Serial plotter
PRINT_SETPOINT |
PRINT_BIAS |
PRINT_P |
PRINT_I |
PRINT_D);
analogWrite(3, output); // Replace with plant control signal
}
distance = get_dist(100);
distance_error = Sollwert - distance; //Sollwert - Istwert
PID_p = kp1 * distance_error; //P-Reglung Gleichung (P-Regler kp * den Eingang)
float dist_diference = distance_error - distance_previous_error; //Der Befehl "float" wird benutzt um mit Dezimalzahlen zu rechnen //(Eingang - den vorherigen Eingang) Eingangswert immer aktuell
PID_d = kd3 * ((distance_error - distance_previous_error) / period); //D-Reglung Gleichung (D-Regler kd * Eingang pro periode)
if (-3 < distance_error && distance_error < 3) //Liegt Ball zwischen -3cm und +3cm des Sollwerts wird I-Anteil mitberechnet
{
PID_i = PID_i + (ki2 * distance_error); //I-Reglung Gleichung (Aktueller Wert + ki * den Eingang)
}
else
{
PID_i = 0; //Wenn nicht wird I-Anteil auf 0 gesetzt und dann wird nur PD benutzt.
}
PID_total = PID_p + PID_i + PID_d; //(P Wert + I Wert + D Wert) Differenz
PID_total = map(PID_total, -150, 150, 0, 150); //Der Befehl "map" wandelt den Sensorwert im Bereich 0-1023 um in einen Zahlenwert zwischen 0 und 255
if (PID_total < 20) {
PID_total = 20; //Begrentzt die PID-Reglung auf minimal 20 (minimaler Grenzwert für den Servo)
}
if (PID_total > 160) {
PID_total = 160; //Begrentzt die PID-Reglung auf maximal 160(maximaler Grenzwert für den Servo)
}
myservo.write(PID_total + 30); //Arduino sendet die berechneten Werte an den Servo
distance_previous_error = distance_error; //(Vorheriger Eingang = Eingang)Damit beim Anfang der Schleife dieser Wert benutzt wird um zu rechnen
tcaselect(4); //Display aufrufen der am Pin SDA6 und SCL6 des Multiplexer angeschlossen ist
u8g.firstPage(); //Befehl um den ersten Display aufzurufen
do {
u8g.setFont(u8g_font_ncenB10); //Befehl für die Schriftart für den Display für was wir auf dem Display schreiben
u8g.drawStr(2, 35, "KP="); //Position und Text auf dem Display für was wir auf dem Display schreiben
sprintf(taco, "%04d", Kp); //Potentiometer Wert in string umwandeln
u8g.setFont(u8g_font_ncenB10); //Befehl für die Schriftart für den Display für den Potentiometer Wert
u8g.drawStr(32, 35, taco); //Position und Text auf dem Display für den Potentiometer Wert
} while (u8g.nextPage() ); //Befehl um den nächsten Display aufzurufen
delay (20); //20 ms warten bis der nächste Display drankommt
tcaselect(5);
u8g.firstPage();
do {
u8g.setFont(u8g_font_ncenB10);
u8g.drawStr(2, 35, "KI=0,");
sprintf(taco, "%04d", Ki);
u8g.setFont(u8g_font_ncenB10);
u8g.drawStr(45, 35, taco);
} while ( u8g.nextPage() );
tcaselect(6);
u8g.firstPage();
do {
u8g.setFont(u8g_font_ncenB10);
u8g.drawStr(2, 35, "KD=");
sprintf(taco, "%04d", Kd);
u8g.setFont(u8g_font_ncenB10);
u8g.drawStr(45, 35, taco);
} while ( u8g.nextPage() );
tcaselect(7);
u8g.firstPage();
do {
u8g.setFont(u8g_font_ncenB10);
u8g.drawStr(2, 35, "Sollwert =");
sprintf(taco, "%04d", Sollwert);
u8g.setFont(u8g_font_ncenB10);
u8g.drawStr(82, 35, taco);
} while ( u8g.nextPage() );
delay (20);
}
könnt ihr mir sagen was ich ändern kann oder verbessern muss
danke