Arduino Spannungssensor Sketch Erklärung

Gast #5032382
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.