Forum: Mikrocontroller und Digitale Elektronik Ergebnis einer Rechnung auf LCD Arduino


von Elektro F. (Firma: Trafo AG) (elektrofrederick)


Lesenswert?

Guten Tag Zusammmen
Es liegt ein Problem vor bei meinem Arduino Code vor.
Ich möchte den Strom mit Hilfe eines Shunts Widerstand den Strom 
berechnen und auf einem LCD anzeigen lassen, doch ich weiß nicht wie ich 
die Lösung anzeigen kann. Im Internet habe ich Beispiele gefunden mit 
serial.Print, was ja theoretisch das gleiche Prinzip wäre wie lcd.Print 
doch es funktioniert leider nicht und es taucht ein Fehlercode auf.
Fehlercode:"`VShunt`" was not declared in this scope"
Würde mich sehr freuen, wenn ihr mir weiterhelfen könnten!
1
#include <LiquidCrystal.h>
2
3
4
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
5
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
6
int LED = 9;
7
int Shunt = A0;
8
9
void setup() {
10
11
  pinMode(LED,OUTPUT);
12
13
}
14
15
void loop() {
16
    
17
  lcd.begin(16, 1);
18
19
  lcd.print ((VShunt / 202)/ 200);
20
  lcd.print ("mA");
21
  pinMode(LED,OUTPUT);
22
    digitalWrite(LED, HIGH);
23
    int VShunt = analogRead(Shunt); // wird von 1-1023 angezeigt!
24
  
25
}
Fehlercode

von Brain 2.0 (Gast)


Lesenswert?

Dann setze doch analogRead mal vor die Printausgabe.

von Thomas G. (Firma: Frickelhauptquartier) (taximan)


Lesenswert?

Int VShunt sollte das Problem lösen. Du hast die Variable VShunt nicht 
deklariert. Der Compiler kennt sie nicht.

von Björn S. (bjrn_s869)


Lesenswert?

Woher soll der Arduino die Variable VShunt bei lcd.print kennen, wenn 
diese erst später deklariert wird?

von Elektro F. (Firma: Trafo AG) (elektrofrederick)


Lesenswert?

Vielen Dank hat geklappt, aber jetzt zeigt es einfach 0mA an wisst Ihr 
an was das liegen könnte?

von H.Joachim S. (crazyhorse)


Lesenswert?

An deinen integer-Divisionen?
1023/202=5
5/200=0

von wendelsberg (Gast)


Lesenswert?

Ueberleg einfach mal, welchen Wert VShunt haben muss, damit das Ergebnis 
der Berechnung ((VShunt / 202)/ 200) groesser als 1 wird.

wendelsberg

von Adam P. (adamap)


Lesenswert?

Elektro F. schrieb:
> Vielen Dank hat geklappt, aber jetzt zeigt es einfach 0mA an wisst Ihr
> an was das liegen könnte?

Also ich würde das alles erstmal besser strukturieren und mir ein C/C++
Buch zur Seite nehmen...das mit der Variable war ein echt unnötiger 
Fehler.

Ich weis zwar nicht was du mit der LED machen möchtest,
aber ansich fang doch ganz am Anfang an und versuch dann den Wert 
umzurechnen:
1
#include <LiquidCrystal.h>
2
3
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
4
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
5
int LED = 9;
6
int Shunt = A0;
7
8
void setup() {
9
  pinMode(LED,OUTPUT);
10
}
11
12
void loop() {
13
    int VShunt;
14
    
15
    // Wertebereich: 0-1023
16
    VShunt = analogRead(Shunt);
17
    
18
    lcd.begin(16, 1);
19
    
20
    lcd.print ("AD-Value:");
21
    lcd.print (VShunt);
22
23
    // Nun AD-Value in mA umrechnen
24
    // ...
25
}

von Johannes S. (Gast)


Lesenswert?

für die Skalierung hat Arduino die map() Funktion:
https://www.arduino.cc/reference/en/language/functions/math/map/

von arduit (Gast)


Lesenswert?


von Elektro F. (Firma: Trafo AG) (elektrofrederick)


Lesenswert?

Vielen Dank für die Antwort, doch das Problem ist ich weiss nicht wie 
ich es in Volt umwandle. Da es irgendwie keine Kommastellen gibt.

von Glanzzahlenrechner (Gast)


Lesenswert?

Ja, bei cents gibt's auch kaum je Nachkommastellen, trotzdem kann 
jeder Schüler das in /€/ umrechnen...

von Theor (Gast)


Lesenswert?

Elektro F. schrieb:
> Vielen Dank für die Antwort, doch das Problem ist ich weiss nicht wie
> ich es in Volt umwandle. Da es irgendwie keine Kommastellen gibt.

Du kannst in dem Programm "sagen", dass ein Wert eine Kommazahl "ist".

Das nennt man auf Deutsch "deklarieren" und auf Englisch "to declare". 
Das Wort "declared" aus der Fehlermeldung ist die Form des Wortes, die 
angibt, dass etwas deklariert wurde, - "declarED", - die 
Vergangenheitsform.

Die Zeile
1
int Shunt;
ist eine solche Deklaration.

Die Zeile
1
float Voltage;
ist die Deklaration einer "Kommazahl". "Float" bedeutet 
"Fliesskommazahl"; dass ist das selbe wie eine Kommazahl.

von Adam P. (adamap)


Lesenswert?

1
void loop()
2
{
3
    int ad_value;
4
    int mV;
5
    int mA;
6
    
7
    // Wertebereich: 0-1023
8
    ad_value = analogRead(Shunt);
9
    
10
    /**
11
    * AD-Value nach mV normieren, falls Vmax = 5V ist.
12
    *    0 = 0,000 V
13
    * 1023 = 5,000 V
14
    *
15
    * Falls du kein float nutzen willst:
16
    * Erst in µV rechnen: (5 * 1000000)
17
    * dann zu mV:         / 1000
18
    *
19
    * Nun hast es in mV vorliegen.
20
    */
21
    mV = (5 * 1000000) / 1023 * ad_value / 1000;
22
    Serial.println(mV, DEC);
23
    
24
    /**
25
    * Annahme, Rshunt = 0,1 Ohm
26
    *
27
    * Eigentlich:     mA = mV / 0.1f;
28
    * Aber wir möchten ja kein float.
29
    */
30
    mA = mV * 10;
31
    Serial.println(mA, DEC);
32
    
33
    // Ausgabe auf dem LCD könntest du dann so machen:
34
    lcd.print("I = ");
35
    lcd.print(mA / 1000);
36
    lcd.print(",");
37
    lcd.print(mA % 1000);
38
    lcd.print("A");
39
40
    delay(1000);
41
}

von NameHierEinfügen (Gast)


Lesenswert?

Adam P. schrieb:
> // Ausgabe auf dem LCD könntest du dann so machen:
>     lcd.print("I = ");
>     lcd.print(mA / 1000);
>     lcd.print(",");
>     lcd.print(mA % 1000);
>     lcd.print("A");

Gleich kommt der OP und beschwert sich, dass er nur "A" auf dem Display 
lesen kann.

von Adam P. (adamap)


Lesenswert?

NameHierEinfügen schrieb:
> Gleich kommt der OP und beschwert sich, dass er nur "A" auf dem Display
> lesen kann.

Denke nicht, weil die meisten Displays ein autoincrement haben, bzgl. 
der X-Position.

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.