Forum: Mikrocontroller und Digitale Elektronik Display ausgabe


von Johannes S. (senzi)


Angehängte Dateien:

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

von Wolfgang (Gast)


Lesenswert?

Johannes S. schrieb:
> Solange man sich in void Setup() Funktion befindet wird der Wert
> "FanSpeed" an gezeigt. Danach erhalte ich nur mehr folgende Ausgabe.

Und was stört dich daran? Das ist das, was du programmiert hast ;-)

Guck dir mal den Unterschied zwischen lcd.write() und lcd.print() an.
https://www.arduino.cc/en/Reference/LiquidCrystal

von Johannes S. (senzi)


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

von TestX (Gast)


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)

von Wolfgang (Gast)


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.

von Johannes S. (senzi)


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

von BirgerT (Gast)


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

von Malte S. (maltest)


Lesenswert?

Sorry, am Thema vorbei, aber kommt das nur mir irgendwie paradox vor?

Johannes S. schrieb:
1
> // Konstante Variablen
2
> 
3
> const int FanPin = 9; // Pin für den Lüfter
4
> const int Taster1Pin = 7; // Pin für Taster 1
5
> const int Taster2Pin = 6; // Pin für Taster 2

von Draco (Gast)


Lesenswert?

Kommt auf den MC an... Welchen verwendet er denn?! Also bei einem AVR 
würde das so definitiv nicht laufen ohne Port-Zuweißung.

von BirgerT (Gast)


Lesenswert?

Draco schrieb:
> Kommt auf den MC an... Welchen verwendet er denn?! Also bei einem
> AVR
> würde das so definitiv nicht laufen ohne Port-Zuweißung.

..is sich ein Arduino; da sind die Ports und Pins schon vornummeriert
http://www.arduino-tutorial.de/2010/06/digital-in/

von BirgerT (Gast)


Lesenswert?

Malte S. schrieb:
> Sorry, am Thema vorbei, aber kommt das nur mir irgendwie paradox
> vor?
>
> Johannes S. schrieb:> // Konstante Variablen

Alle Konstanten sind variabel ;-)

von Draco (Gast)


Lesenswert?

BirgerT schrieb:
> ..is sich ein Arduino; da sind die Ports und Pins schon vornummeriert
> http://www.arduino-tutorial.de/2010/06/digital-in/

Ahh achso... hatte mit dem "Krebs" noch nichts zu tun. :D

von Johannes S. (senzi)


Lesenswert?

@BirgerT

Danke für deine Bemühungen ich habe deinen Code verwendet, leider ohne 
Erfolg. Es werden wieder lauter U`s am Dispaly ausgeben.


@Wolfgang

"75 entspricht dem Zeichen 'U'"

75 entspricht laut ASCII doch 'K'

von BirgerT (Gast)


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

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.