Arduino Spannungssensor Sketch Erklärung

Gast #5032382
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
Gast #5032396
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.
Gast #5032418
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 ...
Gast #5032474
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
}

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