Es wird PWM (Pulsweitenmodulation), 2 Buttons, 1 Potentiometer, Colour Variable (enum) und eine RGB-LED verwendet, um eine RGB-LED mit seiner vollen Farbpracht Anzusteuern! Funktion der Buttons: Button 1 -> Aufwärtszähler vom Ausgangspunkt [R=0, G=1, B=2] (aktueller Farbwert + 1) Button 2 -> Abwärtszähler vom Ausgangspunkt [R=0, G=1, B=2] (aktueller Farbwert - 1) Mit dem Poti lässt sich die "Helligkeit" der ausgewählten Farbe regeln. Somit lassen sich alle Farben mit einer Auflösung von 256 anzeigen (16 777 216 Farben).

Dependencies:   mbed

Committer:
Aagrus
Date:
Mon Feb 03 16:44:53 2020 +0000
Revision:
0:0f5932820c1a
Eine fertige PWM-Ansteuerung einer RGB-LED mittels 2 Buttons

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Aagrus 0:0f5932820c1a 1 #include <mbed.h>
Aagrus 0:0f5932820c1a 2
Aagrus 0:0f5932820c1a 3 // Lege Farbcodewert fest
Aagrus 0:0f5932820c1a 4 enum Colour { red, blue, green };
Aagrus 0:0f5932820c1a 5
Aagrus 0:0f5932820c1a 6
Aagrus 0:0f5932820c1a 7 // Buttonevents
Aagrus 0:0f5932820c1a 8 bool button1_clicked = false;
Aagrus 0:0f5932820c1a 9 bool button2_clicked = false;
Aagrus 0:0f5932820c1a 10
Aagrus 0:0f5932820c1a 11 void Button1_Down() { button1_clicked = true; }
Aagrus 0:0f5932820c1a 12 void Button1_Up() { button1_clicked = false; }
Aagrus 0:0f5932820c1a 13 void Button2_Down() { button2_clicked = true; }
Aagrus 0:0f5932820c1a 14 void Button2_Up() { button2_clicked = false; }
Aagrus 0:0f5932820c1a 15
Aagrus 0:0f5932820c1a 16
Aagrus 0:0f5932820c1a 17
Aagrus 0:0f5932820c1a 18 Colour ColorChange(Colour aktualColour, bool countUp);
Aagrus 0:0f5932820c1a 19
Aagrus 0:0f5932820c1a 20
Aagrus 0:0f5932820c1a 21 int main()
Aagrus 0:0f5932820c1a 22 {
Aagrus 0:0f5932820c1a 23 // Legt eine Kommunikation zum PC an (Seriell)
Aagrus 0:0f5932820c1a 24 Serial pc(USBTX, USBRX);
Aagrus 0:0f5932820c1a 25
Aagrus 0:0f5932820c1a 26 // Eingänge / Ausgänge
Aagrus 0:0f5932820c1a 27 AnalogIn poti(PA_4);
Aagrus 0:0f5932820c1a 28 PwmOut ledRed(PA_9);
Aagrus 0:0f5932820c1a 29 PwmOut ledBlue(PA_10);
Aagrus 0:0f5932820c1a 30 PwmOut ledGreen(PA_11);
Aagrus 0:0f5932820c1a 31
Aagrus 0:0f5932820c1a 32
Aagrus 0:0f5932820c1a 33 // Interrupt für die Buttons
Aagrus 0:0f5932820c1a 34 InterruptIn button1(PA_1);
Aagrus 0:0f5932820c1a 35 InterruptIn button2(PA_3);
Aagrus 0:0f5932820c1a 36
Aagrus 0:0f5932820c1a 37 button1.rise(&Button1_Down);
Aagrus 0:0f5932820c1a 38 button1.fall(&Button1_Up);
Aagrus 0:0f5932820c1a 39 button2.rise(&Button2_Down);
Aagrus 0:0f5932820c1a 40 button2.fall(&Button2_Up);
Aagrus 0:0f5932820c1a 41
Aagrus 0:0f5932820c1a 42
Aagrus 0:0f5932820c1a 43
Aagrus 0:0f5932820c1a 44
Aagrus 0:0f5932820c1a 45 // Startfarbe = rot
Aagrus 0:0f5932820c1a 46 Colour colour = red;
Aagrus 0:0f5932820c1a 47
Aagrus 0:0f5932820c1a 48 // Für Buttons (Funktion schon ausgeführt oder nicht)
Aagrus 0:0f5932820c1a 49 bool isSend1 = false;
Aagrus 0:0f5932820c1a 50 bool isSend2 = false;
Aagrus 0:0f5932820c1a 51
Aagrus 0:0f5932820c1a 52 // Für Poti (alter und neuer Wert)
Aagrus 0:0f5932820c1a 53 float lastValue = 0;
Aagrus 0:0f5932820c1a 54 float aktualValue = 0;
Aagrus 0:0f5932820c1a 55
Aagrus 0:0f5932820c1a 56
Aagrus 0:0f5932820c1a 57
Aagrus 0:0f5932820c1a 58
Aagrus 0:0f5932820c1a 59 while(1)
Aagrus 0:0f5932820c1a 60 {
Aagrus 0:0f5932820c1a 61 aktualValue = poti.read();
Aagrus 0:0f5932820c1a 62
Aagrus 0:0f5932820c1a 63
Aagrus 0:0f5932820c1a 64
Aagrus 0:0f5932820c1a 65 if (button1_clicked && !isSend1)
Aagrus 0:0f5932820c1a 66 {
Aagrus 0:0f5932820c1a 67 isSend1 = true;
Aagrus 0:0f5932820c1a 68 colour = ColorChange(colour, true);
Aagrus 0:0f5932820c1a 69 pc.printf("Der Farbwert ist: %d\n", colour);
Aagrus 0:0f5932820c1a 70 }
Aagrus 0:0f5932820c1a 71
Aagrus 0:0f5932820c1a 72 else if (!button1_clicked && isSend1)
Aagrus 0:0f5932820c1a 73 {
Aagrus 0:0f5932820c1a 74 isSend1 = false;
Aagrus 0:0f5932820c1a 75 }
Aagrus 0:0f5932820c1a 76
Aagrus 0:0f5932820c1a 77
Aagrus 0:0f5932820c1a 78
Aagrus 0:0f5932820c1a 79 if (button2_clicked && !isSend2)
Aagrus 0:0f5932820c1a 80 {
Aagrus 0:0f5932820c1a 81 isSend2 = true;
Aagrus 0:0f5932820c1a 82 colour = ColorChange(colour, false);
Aagrus 0:0f5932820c1a 83 pc.printf("Der Farbwert ist: %d\n", colour);
Aagrus 0:0f5932820c1a 84
Aagrus 0:0f5932820c1a 85 }
Aagrus 0:0f5932820c1a 86
Aagrus 0:0f5932820c1a 87 else if (!button2_clicked && isSend2)
Aagrus 0:0f5932820c1a 88 {
Aagrus 0:0f5932820c1a 89 isSend2 = false;
Aagrus 0:0f5932820c1a 90 }
Aagrus 0:0f5932820c1a 91
Aagrus 0:0f5932820c1a 92
Aagrus 0:0f5932820c1a 93
Aagrus 0:0f5932820c1a 94 // Aktualisierung für den PWM-Wert auf der LED //
Aagrus 0:0f5932820c1a 95 if (aktualValue != lastValue)
Aagrus 0:0f5932820c1a 96 {
Aagrus 0:0f5932820c1a 97 if (colour == red)
Aagrus 0:0f5932820c1a 98 {
Aagrus 0:0f5932820c1a 99 ledRed = aktualValue;
Aagrus 0:0f5932820c1a 100 }
Aagrus 0:0f5932820c1a 101
Aagrus 0:0f5932820c1a 102 else if (colour == blue)
Aagrus 0:0f5932820c1a 103 {
Aagrus 0:0f5932820c1a 104 ledBlue = aktualValue;
Aagrus 0:0f5932820c1a 105 }
Aagrus 0:0f5932820c1a 106
Aagrus 0:0f5932820c1a 107 else
Aagrus 0:0f5932820c1a 108 {
Aagrus 0:0f5932820c1a 109 ledGreen = aktualValue;
Aagrus 0:0f5932820c1a 110 }
Aagrus 0:0f5932820c1a 111
Aagrus 0:0f5932820c1a 112
Aagrus 0:0f5932820c1a 113 lastValue = aktualValue;
Aagrus 0:0f5932820c1a 114 }
Aagrus 0:0f5932820c1a 115 }
Aagrus 0:0f5932820c1a 116 }
Aagrus 0:0f5932820c1a 117
Aagrus 0:0f5932820c1a 118
Aagrus 0:0f5932820c1a 119
Aagrus 0:0f5932820c1a 120 Colour ColorChange(Colour aktualColour, bool countUp)
Aagrus 0:0f5932820c1a 121 {
Aagrus 0:0f5932820c1a 122 // Legt die aktuelle Farbe fest (aktualColour -> aktueller Farbwert, countUp -> Farbewert aufwärts oder verringern)
Aagrus 0:0f5932820c1a 123 switch(aktualColour)
Aagrus 0:0f5932820c1a 124 {
Aagrus 0:0f5932820c1a 125 // Kurzsyntax für if else Abfragen --> bei true aufwärts zählen
Aagrus 0:0f5932820c1a 126 case red: countUp ? aktualColour = blue : aktualColour = green; break;
Aagrus 0:0f5932820c1a 127 case blue: countUp ? aktualColour = green : aktualColour = red; break;
Aagrus 0:0f5932820c1a 128 case green: countUp ? aktualColour = red : aktualColour = blue; break;
Aagrus 0:0f5932820c1a 129 }
Aagrus 0:0f5932820c1a 130
Aagrus 0:0f5932820c1a 131 return aktualColour;
Aagrus 0:0f5932820c1a 132 }