Forum: Mikrocontroller und Digitale Elektronik Arduino Nano spuckt komische Werte aus


von PsykoMaN (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Gemeinde,

ich bin neu hier und benötige eure Hilfe! Ich studiere Erneuerbare 
Energien und habe ein kleines Projekt in der Speichertechnik angefangen. 
Leider lassen sich die Messungen hierbei nur schlecht manuell 
anfertigen. Also automatisieren!

Mein Projekt besteht darin, dass ich an verschiedenen Stellen Spannung 
und Strom messen und zwei Mosfets schalten möchte. Hierfür nutze ich ein 
Arduino Nano v.3 und 4 ACS712, die an den Eingängen A0, A2, A4 und A6 
liegen. Des Weiteren habe ich 4 Spannungsteiler angefertigt, die an den 
Eingängen A1, A3, A5 und A7 liegen. Die Mosfets werden durch die 
digitalen Eingänge 2 und 4 geschaltet.

Die Verschaltung ist somit komplett.

Jetzt zur Programmierung, die mir etwas Kopfzerbrechen bereitet hat. Ich 
habe dafür einige Beispiele aus dem Netz gefunden. Leider funktionieren 
weder die Bsp. noch meine eigene Programmierung. Ich bekomme nur 
komische Werte im Seriellen Monitor sowie im Plot.

Bsp. einer sich wiederholenden Anzeige aus dem Monitor:

"$GPGSV,1,1,01,17,,,,,,,,,,,,,,,*7E
$GPGLL,,,,,000103.000,V,N*78
$GPGGA,,,,,,0,0,,,M,,,,*1B
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGST,000103.000,,,,0,,,*7B
$GPRMC,000103.000,V,,,,,,,,,,N*4F
"

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

Im Grunde soll der erste Mosfet bei Start geschaltet werden. Dieser ist 
solange aktiv, bis an der StationPulserAkku ein gewisser Strom 
unterschritten wird. Nach einer kurzen Pause schaltet dann der zweite 
Mosfet bis die Spannung an StationPulserAkku bzw. StationAkkuWandler auf 
11V gesunken ist. Dies soll sich dann wiederholen.

Ich hoffe ihr könnt mir helfen......

von nicht“Gast“ (Gast)


Lesenswert?

Moin,

Du scheinst auf den falschen Port zu sein. Deine Ausgabe sind NMEA 
Daten, also GPS.

Da läuft was total schief.

von PsykoMaN (Gast)


Lesenswert?

Denke ich auch, jedoch hat er auf allen anderen, zur Verfügung stehenden 
Ports, Verbindungsprobleme und kann nicht mal die Prog. raufladen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Anscheinend ist der einzige serielle Hardware Port deines Nano schon 
belegt (und das sieht aus wie ein GPS Empfänger ohne Empfang). Du musst 
also dich entweder mit der 'SoftSerial' Library beschäftigen um auf 
einem beliebigen anderen Pin seriell zu kommunizieren, oder die Hardware 
UART freiräumen, um dort deine Daten auszugeben.
Mutige Seelen könnten die UART auch belegen, indem sie RXD am GPS 
Receiver lassen und nur TXD Richtung PC schicken. Allerdings bist du 
dann auf die Baudrate des GPS Receivers festgelegt und kannst auch vom 
PC nix in Richtung Nano schicken. Ausserdem kann man dann auch den GPS 
Receiver nicht umkonfigurieren, wenn man das mal bräuchte.

von M. P. (matze7779)


Lesenswert?

Hi,

zum Port ist ja schon alles geschrieben.
Aber:
Erstmal fehlen bei den ADC der pinMode Input. Sollte zwar nicht das 
Problem sein aber der vollständigkeit schreibe ich das immer hin.

Dein Problem scheint auch hier zu liegen:
messA1 = (float)12 / 1023 * sensorValueA1;

Richtig müsste es so sein:
messA1 = 12.0 / 1023.0 * (float)sensorValueA1;

Habs jetzt nicht getestet.

Gib doch mal die SensorValueX und messAX mit Seriell aus. Dann siehst Du 
den Fehler schneller.

Gruß
Matze

: Bearbeitet durch User
von PsykoMaN (Gast)


Lesenswert?

Aha.....und wie kann ich das freiräumen???

Kann man den Port nicht neu konfigurieren???

Da ist nämlich kein GPS-Empfänger dran....haha

von yesitsme (Gast)


Lesenswert?

Schau mal im Gerätemanager, welchen Port dein Board überhaupt verwendet.

(WIN+Pause -> Gerätemanager)

Sollte beim An-/Ab- stecken einer auftauchen/verschwinden.

Eventuell fehlt dir auch der Treiber für dein Board.
Sollte dann mit einem gelben Ausrufezeichen angezeigt werden.

Bei meinem Nano-clone war ein Widerstand auf der Unterseite verrutscht. 
Vielleicht auch da einmal schauen.

von Dieter F. (Gast)


Lesenswert?

PsykoMaN schrieb:
> Bsp. einer sich wiederholenden Anzeige aus dem Monitor:

Hast Du das Programm fehlerfrei compilieren und (fehlerfrei) auf den 
Nano flashen können? Ich würde mal auf ein anderes Programm tippen, was 
da noch drauf ist ...

von Walter S. (avatar)


Lesenswert?

M. P. schrieb:
> Dein Problem scheint auch hier zu liegen:
> messA1 = (float)12 / 1023 * sensorValueA1;
>
> Richtig müsste es so sein:
> messA1 = 12.0 / 1023.0 * (float)sensorValueA1;

das ist beides gleich richtig (oder falsch)
es wird jedenfalls beide Male mit float gerechnet

von Dieter F. (Gast)


Lesenswert?

Wo hast Du das

#include "floatToString.h"

denn her?

von PsykoMaN (Gast)


Lesenswert?

Hi,

entschuldigt die Wartezeit.

Ich habe dieses Problem nun gelöst. Der Serial-to-USB Converter ist 
defekt. Mein Rechner hat dann intern, während einer Abfrage, auf die 
enthaltene GPS-Maus zugegriffen. Danke für den Hinweis @Matthias S..

Jetzt Spuckt es auch ordentliche Werte aus, auch wenn meine Mosfets 
immernoch nicht schalten. Aber das, so denke ich, finde ich auch noch 
raus.

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.