Forum: Mikrocontroller und Digitale Elektronik Arduino Spannungssensor Sketch Erklärung


von kevko (Gast)


Lesenswert?

Hallo Leute :)

hab ein kleines Projekt und lese verschiedene Werte von Sensoren über 
einen Arduino aus.
Funktioniert alles soweit doch nun will ich auch die Programmcodes 
verstehen.
1
void Spannungssensor() 
2
{
3
 float temp;
4
wert1=analogRead(A1); //Spannungswert am analogen Eingang 1 auslesen
5
temp=wert1/4.092; //Wert mathematisch umwandeln um den Spannungswert in Volt zu erhalten
6
wert1=(int)temp;
7
wert2=((wert1%100)/10.0);
8
9
10
  lcd.setCursor(0,0);
11
  lcd.print("Spannung:");
12
  lcd.print(wert2);
13
  lcd.setCursor(16,0);
14
  lcd.print("V");
15
 
16
}

warum dividiert man hier den Wert durch 4,092? und danach %100? und das 
durch 10?

vielen dank im voraus

Lg

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

kevko schrieb:
> warum dividiert man hier den Wert durch 4,092?
Welche Referenzspannung hat man hier?

: Bearbeitet durch Moderator
von oldeurope O. (Gast)


Lesenswert?

Das was da am Pin ausgelesen wird, ist ein Datentyp float
Das gibt irgendeine Zahl die nicht in das format int
passt. Deshalb wird sie geteilt und gibt so einen
ganzzahligen interpretierbaren Wert.

Beachte dazu auch die Seiten 8 und 17 im Programmierhandbuch von DK2JK.

LG
old.

von kevko (Gast)


Lesenswert?

wenn ich mich nicht täusche wären das 5V.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

kevko schrieb:
> wenn ich mich nicht täusche wären das 5V.
Und wie viele Bits liefert die analogRead() Funktion zurück?

von Wolfgang (Gast)


Lesenswert?

kevko schrieb:
> Funktioniert alles soweit doch nun will ich auch die Programmcodes
> verstehen.

Erstmal solltest du dir über deine Variablentypen klar werden. Du mischt 
wild float und int - sowohl bei den Variablen, als auch bei den 
Konstanten.

Die Deklaration von wert1 und wert2 fehlt ganz ...

von kevko (Gast)


Lesenswert?

Lothar M. schrieb:
> kevko schrieb:
>> wenn ich mich nicht täusche wären das 5V.
> Und wie viele Bits liefert die analogRead() Funktion zurück?

ja maximal 1024 units. :D

von kevko (Gast)


Lesenswert?

aber ich versteh halt nicht woher die 4.092 kommen

von kevko (Gast)


Lesenswert?

Wolfgang schrieb:
> kevko schrieb:
>> Funktioniert alles soweit doch nun will ich auch die Programmcodes
>> verstehen.
>
> Erstmal solltest du dir über deine Variablentypen klar werden. Du mischt
> wild float und int - sowohl bei den Variablen, als auch bei den
> Konstanten.
>
> Die Deklaration von wert1 und wert2 fehlt ganz ...

das ist ja nicht der vollständige Programmcode hab hier auch noch 
Strom,Drehzahl und Windgeschwindigkeit.
1
#include <Wire.h> 
2
#include <LiquidCrystal_I2C.h>
3
int wert1;
4
float wert2;
5
const int windpin=3;
6
7
const int measureTime=3;
8
9
volatile unsigned int windCounter = 0;
10
float windSpeed = 0.0;
11
unsigned long time = 0;
12
13
const int hallPin=2;
14
const unsigned long sampleTime=1000;
15
const int maxRPM = 10200; 
16
17
18
LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display
19
20
21
22
void countWind() {
23
24
windCounter ++;
25
26
}
27
28
void show_values() {
29
30
31
32
33
lcd.setCursor(0,1);
34
35
lcd.print("Wind:");
36
37
lcd.print(windSpeed);
38
lcd.setCursor(16,1);
39
lcd.print("km/h");
40
41
42
43
}
44
45
46
void setup()
47
{
48
  lcd.init();                      // initialize the lcd 
49
  lcd.init();
50
  // Print a message to the LCD.
51
  lcd.backlight();
52
  pinMode(hallPin,INPUT);
53
  Serial.begin(9600);
54
  time = millis();
55
56
  
57
}
58
59
60
void loop()
61
{
62
  delay(100);
63
  int rpm=getRPM();
64
65
  displayRPM(rpm);
66
  
67
  Spannungssensor();
68
  Windsensor();
69
  Stromsensor();
70
}
71
72
void Stromsensor()
73
74
  {
75
76
  float average = 0;
77
  for(int i = 0; i < 1000; i++) 
78
  {
79
    average = average + (0.048875855327468 * analogRead(A0) -25) / 1000;
80
  
81
  
82
  }
83
lcd.setCursor(0,2);
84
  lcd.print("Strom:");
85
  lcd.print(average);
86
  lcd.setCursor(16,2);
87
  lcd.print("A");
88
  
89
}
90
91
92
void Spannungssensor() 
93
{
94
 float temp;
95
wert1=analogRead(A1); //Spannungswert am analogen Eingang 1 auslesen
96
temp=wert1/4.092; //Wert mathematisch umwandeln um den Spannungswert in Volt zu erhalten
97
wert1=(int)temp;
98
wert2=((wert1%100)/10.0);
99
100
101
  lcd.setCursor(0,0);
102
  lcd.print("Spannung:");
103
  lcd.print(wert2);
104
  lcd.setCursor(16,0);
105
  lcd.print("V");
106
 
107
}
108
109
void Windsensor()
110
{
111
  
112
113
114
windCounter = 0;
115
116
time = millis();
117
118
//zaehl-interrupt aktivieren
119
120
attachInterrupt(1,countWind,RISING);
121
122
//abwarten des messzeitraums
123
124
delay(1000 * measureTime);
125
126
//zaehl-interrupt deaktivieren
127
128
detachInterrupt(1);
129
130
//zeit bestimmen
131
132
time = (millis() - time) / 1000;
133
134
135
windSpeed = (float)windCounter / (float)measureTime * 2,4;
136
137
138
139
//lcs ausgabe aktualisieren
140
141
show_values();
142
  
143
  
144
  }
145
146
  int getRPM()
147
{
148
  // sample for sampleTime in millisecs
149
  int kount=0;
150
  boolean kflag=LOW;
151
  unsigned long currentTime=0;
152
  unsigned long startTime=millis();
153
  while (currentTime<=sampleTime)
154
  {
155
    if (digitalRead(hallPin)==HIGH)
156
    {
157
      kflag=HIGH;
158
    }
159
    if (digitalRead(hallPin)==LOW && kflag==HIGH)
160
    {
161
      kount++;
162
      kflag=LOW;
163
    }
164
    currentTime=millis()-startTime;
165
  }
166
  int kount2rpm = int(60000./float(sampleTime))*kount;
167
  return kount2rpm;
168
}
169
    
170
void displayRPM(int rpm) 
171
{
172
173
  // set the cursor to column 0, line 1
174
  lcd.setCursor(0,3); 
175
  // print the number of seconds since reset:
176
  lcd.print("Drehzahl:");
177
  lcd.print(rpm,DEC);
178
  lcd.setCursor(15,3);
179
  lcd.print("U/min");
180
}

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.