Display ausgabe

OP #4203995
Lesenswert?
• ▲
▼
Hallo, ich möchte euch gerne bitten mir bei folgenden Code 
weiterzuhelfen. Ich möchte gerne den Wert der aktuellen PWM-Einstellung 
am Display ausgeben.

Solange man sich in void Setup() Funktion befindet wird der Wert 
"FanSpeed" an gezeigt. Danach erhalte ich nur mehr folgende Ausgabe.
1
#include <LiquidCrystal.h>
2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
3

4

5
// Konstante Variablen
6

7
const int FanPin = 9; // Pin für den Lüfter
8
const int Taster1Pin = 7; // Pin für Taster 1
9
const int Taster2Pin = 6; // Pin für Taster 2
10

11
// Variablen
12

13
int Schrittweite = 60; // Variable für die Schrittweite pro Tasterdruck des PWM Wertes
14
int FanSpeed = 75; // PWM Startwert des Lüfters (ca.30%)
15
int Taster1Status = 0; // Variable zum speichern des Tasterstatus
16
int previousTaster1Status = 0;
17
int Taster2Status = 0; // Variable zum speichern des Tasterstatus
18
int previousTaster2Status = 0;
19

20

21

22

23

24
void setup() {
25

26
  lcd.begin(16, 2);
27
  lcd.print(FanSpeed);
28

29
  TCCR1B = TCCR1B & 0b11111000 | 0x01; // Setzt Timer1 (Pin 9 und 10) auf 31300Hz
30

31
  pinMode(FanPin, OUTPUT); // Setzt den Pin des Lüfters als Ausgang
32
  pinMode(Taster1Pin, INPUT); // Setzt den Pin des Tasters 1 als Eingang
33
  pinMode(Taster2Pin, INPUT); // Setzt den Pin des Tasters 2 als Eingang
34

35
  /* Der Lüfter bekommt 1 Sekunde einen Startimpuls und wir dann gedrosselt.
36
  Das ist eine Sicherheitsmaßnahme, falls der Lüfter mit 30% nicht anläuft
37
  */
38
  analogWrite(FanPin, 255);
39
  delay(1000);
40
  analogWrite(FanPin, FanSpeed);
41

42
}
43

44

45
void loop()
46
{
47

48
  Taster1Status = digitalRead(Taster1Pin); // TasterPin1 lesen und Status speichern
49
  Taster2Status = digitalRead(Taster2Pin); // TasterPin2 lesen und Status speichern
50

51
  if ((Taster1Status != previousTaster1Status) || (Taster2Status != previousTaster2Status))
52
  {
53

54
    if (Taster1Status == HIGH) {
55
      FanSpeed = FanSpeed + Schrittweite;
56
      delay(500);
57
    }
58
    if (Taster2Status == HIGH) {
59
      FanSpeed = FanSpeed - Schrittweite;
60
      delay(500);
61
    }
62

63
    if (FanSpeed > 255) {
64
      FanSpeed = 255;
65
    }
66

67
    if (FanSpeed < 75) {
68
      FanSpeed = 75;
69
    }
70
    
71
    lcd.clear();
72
    lcd.setCursor(0, 0);
73
    lcd.write(FanSpeed);
74

75

76
  }
77
  analogWrite(FanPin, FanSpeed); // Gibt den PWM Wert am FanPin aus
78
}

LG Hannes
Angehängte Dateien:
OP #4204019
Lesenswert?
• ▲
▼
Ich möchte aber gerne wenn, ich das PWM-Signal um eine Schrittweite von 
60 erhöhe, dass mir dann der aktuelle Wert angezeigt. Ich versuche das 
mit dem folgenden Block zu erreichen.
1
lcd.clear();
2
    lcd.setCursor(0, 0);
3
    lcd.write(FanSpeed);

Ich habe bereits beide lcd.write sowie lcd.print verwendet, leider ohne 
Erfolg.


LG Hannes
Gast #4204029
Lesenswert?
• ▲
▼
Schau dur doch einmal die Doku zu den beiden Funktionen an. Write macht 
nicht das was du willst! Print schon.

Außerdem kannst du dem Display nicht unendlich schnell Werte senden 
(clear usw.). Das musst du unbedingt begrenzen (nur bei änderungen 
ausführen)
Gast #4204035
Lesenswert?
• ▲
▼
Johannes S. schrieb:
> Ich habe bereits beide lcd.write sowie lcd.print verwendet ...

Stimmt. Oben in setup(), wo die Ausgabe funktioniert, hast du print 
verwendet und es erscheint die "75".

Unten, in deiner Hauptschleife verwendest du write().

Zu lcd.write() steht in der Beschreibung: "Write a character to the 
LCD."
Der Zahlenwert 75 entspricht dem Zeichen 'U' und genau das zeigt dein 
Display.
OP #4204053
Lesenswert?
• ▲
▼
Danke, die Sache mit dem lcd.print() habe ich total übersehen. Leider 
bringt das auch keine Lösung mit sich.

Erreiche ich durch die folgende Abfrage der Code innerhalb der 
If-Bedingung nur einmal ausgeführt wird?
1
void loop()
2
{
3

4
  Taster1Status = digitalRead(Taster1Pin); // TasterPin1 lesen und Status speichern
5
  Taster2Status = digitalRead(Taster2Pin); // TasterPin2 lesen und Status speichern
6

7
  if ((Taster1Status != previousTaster1Status) || (Taster2Status != previousTaster2Status))
8
  {
9
    
10

11
    if (Taster1Status == HIGH) {
12
      FanSpeed = FanSpeed + Schrittweite;
13
      delay(500);
14
    }
15
    if (Taster2Status == HIGH) {
16
      FanSpeed = FanSpeed - Schrittweite;
17
      delay(500);
18
    }
19

20
    if (FanSpeed > 255) {
21
      FanSpeed = 255;
22
    }
23

24
    if (FanSpeed < 75) {
25
      FanSpeed = 75;
26
    }
27
    
28
    lcd.clear();
29
    lcd.setCursor(0, 0);
30
    lcd.print(FanSpeed);
31
    
32
    analogWrite(FanPin, FanSpeed); // Gibt den PWM Wert am FanPin aus
33
  
34
  }
35
  
36
  previousTaster1Status = Taster1Status;
37
  previousTaster2Status = Taster2Status;
38
}

Aufgefallen ist mir, dass der Wert 255 angezeigt wird. Gibt das nicht 
etwas, bei gleichzeitigen Verwendung von PWM und analogWrite() das Pins 
nicht mehr zu verwenden sind?

LG hannes
Gast #4204089
Lesenswert?
• ▲
▼
Johannes S. schrieb:

> Erreiche ich durch die folgende Abfrage der Code innerhalb der
> If-Bedingung nur einmal ausgeführt wird?
1
 void loop()
2
 {
3
      delay(500);  // Auch wenn's mich persönlich schmerzt..
4
 
5
#define TasteGedrueckt 1 // oder 0, das weiß ich jetzt nicht
6
  
7
   Taster1Status = digitalRead(Taster1Pin); // TasterPin1 lesen und 
8
 Status speichern
9
   Taster2Status = digitalRead(Taster2Pin); // TasterPin2 lesen und 
10
 Status speichern
11
 
12
// if Zweig ausführen, wenn Taste gedrückt wird..
13
   if (((Taster1Status == TasteGedrueckt) && \
14
       (TasteGedrueckt != previousTaster1Status)) || \
15
       ((Taster2Status == TasteGedrueckt) && \
16
       (TasteGedrueckt != previousTaster1Status)))
17

18
// oder if Zweig ausführen, wenn Taste losgelassen wird..
19
/*
20
   if (((Taster1Status != TasteGedrueckt) && \
21
       (TasteGedrueckt == previousTaster1Status)) || \
22
       ((Taster2Status != TasteGedrueckt) && \
23
       (TasteGedrueckt == previousTaster1Status)))
24
*/
25
   {
26
  
27
 
28
     if (Taster1Status == HIGH) {
29
       FanSpeed = FanSpeed + Schrittweite;
30
 //      delay(500);
31
     }
32
     if (Taster2Status == HIGH) {
33
       FanSpeed = FanSpeed - Schrittweite;
34
 //      delay(500);
35
     }
36
 
37
     if (FanSpeed > 255) {
38
       FanSpeed = 255;
39
     }
40
 
41
     if (FanSpeed < 75) {
42
       FanSpeed = 75;
43
     }
44
 
45
 //    lcd.clear();
46
     lcd.setCursor(0, 0);
47

48
      delay(5);  // Auch wenn's mich persönlich schmerzt..
49

50
    lcd.print(FanSpeed);
51
     lcd.print(" ");
52

53
     analogWrite(FanPin, FanSpeed); // Gibt den PWM Wert am FanPin aus
54
 
55
   }
56
 
57
   previousTaster1Status = Taster1Status;
58
   previousTaster2Status = Taster2Status;
59
 }
>
> Aufgefallen ist mir, dass der Wert 255 angezeigt wird. Gibt das nicht
> etwas, bei gleichzeitigen Verwendung von PWM und analogWrite() das Pins
> nicht mehr zu verwenden sind?
..weiß ich nicht, aber lag wohl an Deinen Tastenabfragen und den delays

Viel Spaß /BirgerT
Gast #4204465
Lesenswert?
• ▲
▼
Johannes S. schrieb:
> @BirgerT
>
> Danke für deine Bemühungen ich habe deinen Code verwendet, leider ohne
> Erfolg. Es werden wieder lauter U`s am Dispaly ausgeben.

Dann stell doch nochmal den aktuellen Code hier ein, vielleicht ist da 
doch noch ein Fipptehler drin.

> @Wolfgang
>
> "75 entspricht dem Zeichen 'U'"
>
> 75 entspricht laut ASCII doch 'K'
Uups - erwischt, gute Frage, woher kommt denn jetzt die 85?


Ach und der noch:
#define TasteGedrueckt  HIGH // oder 0, das weiß ich jetzt nicht

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