Forum: Mikrocontroller und Digitale Elektronik (Arduino) Messwerte als Bedingung einer Schleife bzw. if-function


von Arabear (Gast)


Lesenswert?

Hi liebe Gemeinde,

ich bin auf der Suche nach hilfreichen Infos. Bin noch relativ neu in 
der Arduino Gemeinschaft.

Mein Problem liegt darin, dass ich bei meiner Programmierung, an 4 
Stellen, Messwerte mit Konstanten vergleiche um Bedingungen zu 
generieren. Hiermit sollen zwei Mosfets geschalten werden und zwei 
Schleifen ablaufen.

Nun ist mein Problem, dass die Mosfets sich einzeln schalten lassen, 
jedoch nicht in der Abfrage bzw. Schleife. Es ist als ob diese Komplett 
übersprungen werden, da die Bedingungen nicht erkannt werden können.

Vielleicht findet einer von euch meinen Fehler.

DANKE
1
#include "floatToString.h" 
2
//von Tim Hirzel
3
//http://forum.arduino.cc/index.php?topic=37391.0
4
char command;              
5
String string;
6
7
int strom_StationNetzPulser = A0;
8
int Spannung_StationNetzPulser = A1;
9
int strom_StationPulserAkku = A2;
10
int Spannung_StationPulserAkku = A3;
11
int strom_StationAkkuWandler = A4;
12
int Spannung_StationAkkuWandler = A5;
13
14
int sensorValueA0 = 0;
15
int sensorValueA1 = 0;
16
int sensorValueA2 = 0;
17
int sensorValueA3 = 0;
18
int sensorValueA4 = 0;
19
int sensorValueA5 = 0;
20
21
float messA0 = 0;
22
float messA1 = 0;
23
float messA2 = 0;
24
float messA3 = 0;
25
float messA4 = 0;
26
float messA5 = 0;
27
28
const float U = 13.80;
29
const float Umin = 13.00;
30
const float Umax=16.00;
31
const float UDOD=11.00;
32
33
int M1 = 2; // legt Mosfet1 auf Digital Pin2
34
int M2 = 4; // legt Mosfet1 auf Digital Pin2
35
36
void setup() {
37
  // Serielle Schnittstelle für Ausgabe öffnen
38
  Serial.begin(9600);
39
  Serial.println("Messwerte");
40
  pinMode(M1, OUTPUT); //legt M1 als Ausgang fest
41
  pinMode(M2, OUTPUT); //legt M2 als Ausgang fest
42
43
}
44
45
void loop() {
46
  
47
  for (int i=0; 25; i++){
48
          Serial.println("Status M1");
49
      Serial.println(digitalRead(M1));
50
            Serial.println("Status M2");
51
      Serial.println(digitalRead(M2));
52
    
53
    
54
      //***********Start Pulsung**************
55
      
56
  StationNetzPulser ();
57
  StationPulserAkku ();
58
  if (messA3 < Umin)
59
  {
60
    while (messA3 > Umax)
61
    {
62
      StationPulserAkku ();
63
      digitalWrite(M1, HIGH);
64
      Serial.println("Status M1");
65
      Serial.println(digitalRead(M1));
66
      delay(300000);
67
    }
68
  }
69
  else
70
  {
71
    digitalWrite(M1, LOW);
72
    delay(300000);
73
  }
74
  //*************Ende Pulsung*************
75
76
  //****Start Kapazitätsmessung***********
77
  StationAkkuLast ();
78
  
79
  if (messA5 > Umin)
80
  {
81
    while (messA5 > UDOD)
82
    {
83
      StationAkkuLast ();
84
      digitalWrite(M2, HIGH);
85
      Serial.println("Status M2");
86
      Serial.println(digitalRead(M2));
87
      delay(300000);
88
    }
89
  }
90
  else
91
  {
92
    digitalWrite(M2, LOW);
93
    delay(6000);
94
  }
95
}
96
}
97
98
void StationNetzPulser (){
99
  // Strom
100
  sensorValueA0 = analogRead(strom_StationNetzPulser); //Hole Wert
101
  //510=0A
102
  sensorValueA0 = sensorValueA0 - 510;//510=0Ampere 0=-30A 1023=30A
103
  //springen um 0 reduzieren
104
  if (sensorValueA0 == 1)sensorValueA0 = 0;
105
  if (sensorValueA0 == -1)sensorValueA0 = 0;
106
  //Umwandeln um einen Wert zuwischen -30 und +30 zu erhalten
107
  messA0 = (float)30 / 512 * sensorValueA0;
108
  //über Serielle Schnittstelle ausgeben
109
  Serial.println("Strom an Station 1");
110
  Serial.print(floatToString(buffer, messA0, 2));
111
  Serial.print("A");
112
  Serial.print("\t");
113
114
  // Spannung
115
  sensorValueA1 = analogRead(Spannung_StationNetzPulser); //Hole Wert
116
  //Wert umwandeln für Anzeige 0..12.0 Volt
117
  messA1 = (float)12 / 1023 * sensorValueA1;
118
  //über Serielle Schnitstelle ausgeben
119
    Serial.println("Spannung an Station 1");
120
  Serial.print(floatToString(buffer, messA1, 2));
121
  Serial.println("V"); //\n
122
}
123
124
void StationPulserAkku (){
125
  // Strom
126
  sensorValueA2 = analogRead(strom_StationPulserAkku); //Hole Wert
127
  //510=0A
128
  sensorValueA2 = sensorValueA2 - 510;//510=0Ampere 0=-30A 1023=30A
129
  //springen um 0 reduzieren
130
  if (sensorValueA2 == 1)sensorValueA2 = 0;
131
  if (sensorValueA2 == -1)sensorValueA2 = 0;
132
  //Umwandeln um einen Wert zuwischen -30 und +30 zu erhalten
133
  messA2 = (float)30 / 512 * sensorValueA2;
134
  //über Serielle Schnittstelle ausgeben
135
  Serial.println("Strom an Station 2");
136
  Serial.print(floatToString(buffer, messA2, 2));
137
  Serial.print("A");
138
  Serial.print("\t");
139
140
  // Spannung
141
  sensorValueA3 = analogRead(Spannung_StationPulserAkku); //Hole Wert
142
  //Wert umwandeln für Anzeige 0..12.0 Volt
143
  messA3 = (float)12 / 1023 * sensorValueA3;
144
  //über Serielle Schnitstelle ausgeben
145
  Serial.println("Spannung an Station 2");
146
  Serial.print(floatToString(buffer, messA3, 2));
147
  Serial.println("V"); //\n
148
}
149
150
void StationAkkuLast (){
151
  // Strom
152
  sensorValueA4 = analogRead(strom_StationAkkuWandler); //Hole Wert
153
  //510=0A
154
  sensorValueA4 = sensorValueA4 - 510;//510=0Ampere 0=-30A 1023=30A
155
  //springen um 0 reduzieren
156
  if (sensorValueA4 == 1)sensorValueA4 = 0;
157
  if (sensorValueA4 == -1)sensorValueA4 = 0;
158
  //Umwandeln um einen Wert zuwischen -30 und +30 zu erhalten
159
  messA4 = (float)30 / 512 * sensorValueA4;
160
  //über Serielle Schnittstelle ausgeben
161
  Serial.println("Strom an Station 3");  
162
  Serial.print(floatToString(buffer, messA4, 2));
163
  Serial.print("A");
164
  Serial.print("\t");
165
166
  // Spannung
167
  sensorValueA5 = analogRead(Spannung_StationAkkuWandler); //Hole Wert
168
  //Wert umwandeln für Anzeige 0..12.0 Volt
169
  messA5 = (float)12 / 1023 * sensorValueA5;
170
  //über Serielle Schnitstelle ausgeben
171
  Serial.println("Spannung an Station 3");
172
  Serial.print(floatToString(buffer, messA5, 2));
173
  Serial.println("V"); //\n
174
}

von Gucki (Gast)


Lesenswert?

Vermutlich ein Tippfehler.

Da steht:
1
  if (messA3 < Umin)
2
  {
3
    while (messA3 > Umax)

was mit den Variableninhalten zu folgendem wird:
1
  if (messA3 < 13.0)
2
  {
3
    while (messA3 > 16.0)


Wenn aber die erste Bedingung wahr ist, kann die zweite niemals wahr 
sein.

von Gucki (Gast)


Lesenswert?

Der Compiler müsste Dich eigentlich auch warnen, falls Du aus umin, 
umax etc. Konstanten machst, das unerreichbarer Code vorliegt.
Offen gesagt weiss ich gerade nicht, ob das auch mit float-Werten geht.

Jedenfalls ist es eine gute Regel Konstanten auch als solche zu 
schreiben.

von Arabear (Gast)


Lesenswert?

Hi, danke für den Tipp mit den Bedingungen. Hat geholfen. Jetzt jedoch 
spinnen die Spannungsanzeigen. Sie sind mal da.....dann wieder nicht. 
Und Sie sind alles andere als korrekt. Nämlich mit ca. 1V Differenz.

Mein Spannungsteiler besteht aus 1K und 650R. Der müsste also passen. 
Habt ihr noch ne Idee beide jeweiligen Messungen genauer und konstanter 
hinzukriegen?

von Arabear (Gast)


Lesenswert?

Gucki schrieb:
> Der Compiler müsste Dich eigentlich auch warnen, falls Du aus
> umin,
> umax etc. Konstanten machst, das unerreichbarer Code vorliegt.
> Offen gesagt weiss ich gerade nicht, ob das auch mit float-Werten geht.
>
> Jedenfalls ist es eine gute Regel Konstanten auch als solche zu
> schreiben.

Der hat mich nicht gewarnt. Deswegen ja die Frage. War kurz vorm 
verzweifeln.

von Arduinoquäler (Gast)


Lesenswert?

Arabear schrieb:
> Der hat mich nicht gewarnt.

Der hat dich vermutlich nicht gewarnt weil du deine IDE
so eingestellt (bekommen) hast dass nur Fehlermeldungen
aber keine Warnungen angezeigt werden.

Einfach mal mit den Einstellungen "herumspielen" .....

von Arabear (Gast)


Lesenswert?

Hi, selbst damit zeigt er mir keine Warnung an. Aber jetzt geht es 
erstmal. Die Werte flackern zwar noch so ziemlich rum, sind aber in den 
Bereichen der Wirklichkeit angekommen.

Jetzt würd ich die gerne Glätten. Hat da jemand Rat? Was haltet ihr von 
"Smooth"? Damit würden auch die Extrema weggeschnitten. Ist halt dann 
aber kein arithmetisches Mittel.

von chris (Gast)


Lesenswert?

Arabear schrieb:
> for (int i=0; 25; i++){

Das macht wohl auch nicht das was du erwartest.
Die Bedingung '25;' ist immer true, somit hast du hier eine 
Endlosschleife gebaut.
Macht hier aber wohl nichts, weil sonst in deiner loop() eh nichts 
anderes drinsteht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.