Arduino Nano spuckt komische Werte aus

Gast #4786015
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......
Angehängte Dateien:
(Firma: matzetronics) #4786301
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.
#4786302
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
Gast #4786978
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.
Gast #4802505
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren