Ich komme langsam in Schaltungen und habe einen PWM-LED-Dimmer zusammengestellt. Die LED wird von dieser Schaltung angesteuert:
Ich treibe die PWM über ein separates BLE-Gerät, das eine Benutzereingabe von [0, 100] auf einen 8-Bit-Wert für die Arduinos PWM [0, 255] abbildet. Hier ist der Code:
int led = 9; // the PWM pin the LED is attached to
int intR;
int t;
void setup() {
Serial.begin(9600);
Serial.println("serial connected...");
// declare pin 9 to be an output:
pinMode(led, OUTPUT);
analogWrite(led, 0);
}
void loop() {
if (Serial.available() > 0) {
intR = Serial.parseInt();
t = map(intR, 0, 100, 0, 255); //remaps intR from [0, 100] -> [0, 255] to scale to PWM
Serial.print(intR);
Serial.print(" -> ");
Serial.print(t);
Serial.println("");
analogWrite(led, t);
}
}
Immer wenn ich den Dimmwert auf 100 (100% Einschaltdauer) stelle, leuchtet die LED ziemlich hell, aber wenn ich den Wert auf 0 setze, leuchtet die LED mit wahrscheinlich 60% Helligkeit.
Was müsste ich tun, um die LED reibungslos von einem vollständig ausgeschalteten Zustand in einen vollständig eingeschalteten Zustand zu überführen?
BEARBEITEN:
Nach einer Diskussion in den Kommentaren habe ich meinen Code und meine Schaltung aktualisiert und etwas scheint nicht zu stimmen. Das folgende Code- und Schemapaar gibt mir den besten Dimmbereich (visuell vielleicht 10-100% Gesamtleistung) und funktioniert mit mehreren Mosfets aus meinem Paket.
Neuer Code & Schaltplan:
int led = 9; // the PWM pin the LED is attached to
int intR;
void setup() {
Serial.begin(9600);
Serial.println("serial connected...");
// declare pin 9 to be an output:
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
}
void loop() {
if (Serial.available() > 0) {
intR = Serial.parseInt(); //reads the next valid integer
Serial.print(intR);
Serial.println("");
if (intR <= 255 && intR >= 0) {
if (intR == 0) {
digitalWrite(led, LOW);
} else {
analogWrite(led, intR);
}
}
}
}
Meine MOSFETs sind mit P30N06LE gekennzeichnet, die diesem RFP30N06LE-Datenblatt entsprechen . Und wenn meine Fets nicht falsch gemacht wurden, geht mein Drain wirklich direkt auf GND und mein LED-Negativ wird in die Quelle eingespeist. Das Problem, das ich jetzt habe, ist zweifach: 1) zu verstehen, warum meine Schaltung auf diese Weise funktioniert, und 2) meine LED zum vollständigen Ausschalten zu bringen, wenn der Pin auf LOW gesetzt wird.
Wenn bei der obigen Konfiguration Pin 9 auf LOW gesetzt ist, hat die LED eine Helligkeit von ~ 10%, und wenn ich den Draht physisch von Arduino Pin 9 entferne, schaltet sich die LED vollständig aus. Wenn ich dann das Kabel in verschiedene stromlose Pins stecke, leuchtet die LED mit geringer Helligkeit und zeigt an, dass genügend Spannung vorhanden ist, um den Fet mit Strom zu versorgen. Wie bekomme ich die LED komplett aus?
Wie konvertiert man 0-100 in 0-255? Anscheinend verwenden Sie die externe Kartenfunktion . Alles würde erklärt, wenn die map
Funktion "fehlfunktioniert" wäre und 155-255 für eine 0-100-Eingabe zurückgeben würde. Da 155 60 % von 255 beträgt. Vielleicht funktioniert diese Funktion nicht so, wie Sie denken, dass sie funktioniert.
Warum nicht einfach hingehent = intR * 255 / 100?
Warum überhaupt eine Skala von 0 bis 100 eingeben, binär denken und eine Skala von 0 bis 255 eingeben.
void loop() { if (Serial.available() > 0) { intR = Serial.parseInt(); //reads the next valid integer Serial.print(intR); Serial.println(""); if (intR <= 255 && intR >= 0) { analogWrite(led, intR); } } }
Zur Fehlersuche würde ich den empfangenen Serienwert aus der Gleichung nehmen. Einfach einstellent = 0;
Das ist, was ich vermute, kann passieren.
Diese Antwort erforderte zu viele Annahmen, da die erhaltenen Werte nicht erklärt wurden. Aber es ist eine Möglichkeit, wenn der MOSFET korrekt funktioniert.
Ich habe ein HM10 BLE-Modul an das Arduino angeschlossen. Ich verwende die Android-App BLE-Scanner (zum Testen). Sobald ich eine Verbindung hergestellt habe, sende ich eine Schreibanforderung an die benutzerdefinierte Eigenschaft des HM10. Das Arduino liest die Bits und analysiert die Ganzzahl und sendet dann die Daten direkt an den PWM-Pin.
Wenn ich das richtig verstehe, verwenden Sie ein einzelnes serielles ASCII-Zeichen für Ihre PWM-Werte.
Was Sie nicht erklären, sind die möglichen Werte, die auf der seriellen Schnittstelle empfangen werden.
Eine Null in ASCII wäre ein NULL-Zeichen. Wobei eine "0" 32 wäre und 100 wäre "d". Angenommen, Sie verwenden 7-stellige ASCII-Werte und verwenden daher 0-100 Dimmlevel-Werte.
Das wäre sinnvoll, wenn Sie tatsächlich eine "0" (Wert 32) und nicht NULL (Wert Null) senden. Ihr Auge könnte den Unterschied zwischen 32 % und 60 % Lichtstärke leicht falsch interpretieren.
Ich verstehe nicht, warum die analogWrite(led, t);
in der
if (Serial.available() > 0){}
.
Sie können nur ein einzelnes Zeichen senden, um die Dimmstufe zu ändern, wenn das
analogWrite(led, t);
nicht in den if
Klammern steht.
Ich denke, Sie senden unnötigerweise einen kontinuierlichen Strom von Zeichen.
Serial.parseInt
. Analysieren Arduino-Bibliotheken den von einem ble-Gerät empfangenen Textwert nicht richtig?Serial.parseInt()
den Ordnungswert. Wenn der Puffer "5,220,70" enthielt, gibt der erste Aufruf von Serial.parseInt()
die Ganzzahl 5 zurück, der zweite Aufruf gibt 220 zurück. In meinem aktualisierten Code sende ich keine durch Kommas getrennten Werte, daher Serial.parseInt()
sollte der einzelne Aufruf von korrekt zurückgeben Wert.
τεκ
GregoryNeal
jonk
Andi aka
τεκ
GregoryNeal
GregoryNeal
jonk
GregoryNeal
jonk
GregoryNeal
jonk
GregoryNeal
τεκ
GregoryNeal