Hallo Zusammen,
ich versuche grade über einen Taster eine WS2812B LED ein und auszuschalten.
Eine Teillösung habe ich geschafft:
Die LED wird über das Setup in rot aktiviert
Bei einem Tastendruck leuchtet sie blau
Funktioniert Prima
Erneuter Tastendruck soll sie wieder rot leuchten
Das geht auch, aber nur verzögert d.h. ich muss 2-xx mal den Taster betätigen.
Sieht Jemand den Fehler oder kann schreiben wie ich es richtig mache?
Habe auch versucht das inh. eines Abfragen des Taster einzubauen, da schaltet die LED auf blau aber nicht mehr zurück, bleibt quasi bei zled = 1 stehen.
Danke und Gruß Fritz
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
#define PIN 12
#define NUMPIXELS 1
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int buttonPin = 4; // the number of the pushbutton pin
int zled = 0;
// variables will change:
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time; increase if the output flick
void setup() {
pixels.begin();
pixels.setPixelColor(0, pixels.Color(010, 000, 000)); // rot
pixels.show(); // This sends the updated pixel color to the hardware.
pinMode(buttonPin, INPUT_PULLUP);
// Serial.begin(9600);
}
void loop() {
int reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer than the debounce
// delay, so take it as the actual current state:
// if the button state has changed:
if (reading != buttonState) {
buttonState = reading;
// only toggle the LED if the new button state is HIGH
if (buttonState == LOW) {
pixels.setPixelColor(0, pixels.Color(000, 000, 015)); // blau
pixels.show(); // This sends the updated pixel color to the hardware.
zled = 1;
}
}
}
lastButtonState = reading;
if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer than the debounce
// delay, so take it as the actual current state:
// if the button state has changed:
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW && zled == 1) {
pixels.setPixelColor(0, pixels.Color(010, 000, 000)); // rot
pixels.show(); // This sends the updated pixel color to the hardware.
zled = 0;
}
}
}
lastButtonState = reading;
}
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
#define PIN 12
#define NUMPIXELS 1
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
const byte buttonPin = 4; // the number of the pushbutton pin
int zled = 0;
// variables will change:
bool ledState;
bool lastLedState = 255; // Zwingt die Auswertung einmal durchzuführen
bool lastButtonState = HIGH; // the previous reading from the input pin
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time; increase if the output flick
void setup()
{
pixels.begin();
pinMode(buttonPin, INPUT_PULLUP);
// Serial.begin(9600);
}
void loop()
{
if (!digitalRead(buttonPin)) // Taste gedrückt?
{
if (lastButtonState) // vorher nicht gedrückt?
{
lastDebounceTime = millis(); // merken
lastButtonState =LOW; // setzen
ledState++; // nächster Status
}
}
else if ((millis() - lastDebounceTime) > debounceDelay) // erst wenn debounce & Taste losgelassen
{
lastButtonState = HIGH; //
}
if (ledState != lastLedState) // neuer Status?
{
switch (ledState) // Auswertung
{
case 0:
pixels.setPixelColor(0, pixels.Color(010, 000, 000)); // rot
break;
case 1:
pixels.setPixelColor(0, pixels.Color(000, 000, 015)); // blau
break;
case 2:
pixels.setPixelColor(0, pixels.Color(000, 000, 000)); // :)
break;
default:
ledState = 0;
}
pixels.show(); // This sends the updated pixel color to the hardware.
lastLedState = ledState; // merken
}
}
Ich trau mich ja fast nicht das zu schreiben, aber es hat einmal funktioniert,
dann ist mir die IDE abgekackt, der PC das Board nicht mehr erkannt und
nach dem Neustart schaltet das Programm nur noch einmal.
Hab jetzt auch mal eine anderes Board (alles Clone Unos) angeschlossen
und geht auch nur einmal. Also Taste drücken dann wird von rot auf blau geschaltet.
Jetzt werd ich mal forsten ob mein PC nicht eine Macke hat.
VCC und GND gehen direkt ans Board (5V) sowie auch DIN auf PIN12.
Der Button geht direkt auf PIN4 und auf GND (der nach PIN13).
Sollte an der WS noch Widerstand dran?
Und damit hast du Potential Unterschiede , kaum ein PC hat volle 5V am USB.
Der Spannung ausgleich kann dein PC in die Hölle zichen, für so was nimmt man präpariertes USB Kabel ohne der Plusleitung für Programmieren und testen
Guten Morgen,
funktioniert leider nicht. LED schaltet von rot nach blau.
Ich habe das Board via USB Kabel am PC angeschlossen, sonst keine Netzteile dran hängen.
Die LED holt sich den Strom über VCC und GND vom 5V und GND am Board.
Der DIN geht auch direkt an PIN12. Der Button direkt an PIN4 und direkt an GND.
Es ist auch kein Breadboard verbaut, alles direkt angeschlossen.
Gruß und einen schönen Sonntag.
Fritz
OK, einen Schritt weiter.
Die LED schaltet von rot nach blau und dann nur aus und nach blau.
Hat das mit dem case2 zu tun?
Komme erst wieder heute Abend zum testen.
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
#define PIN 12
#define NUMPIXELS 1
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
const byte buttonPin = 4; // the number of the pushbutton pin
int zled = 0;
// variables will change:
bool ledState;
bool lastLedState = 255; // Zwingt die Auswertung einmal durchzuführen
bool lastButtonState = HIGH; // the previous reading from the input pin
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time; increase if the output flick
void setup()
{
pixels.begin();
pinMode(buttonPin, INPUT_PULLUP);
// Serial.begin(9600);
}
void loop()
{
if (!digitalRead(buttonPin)) // Taste gedrückt?
{
if (lastButtonState) // vorher nicht gedrückt?
{
lastDebounceTime = millis(); // merken
lastButtonState = LOW; // setzen
ledState++; // nächster Status
}
}
else if ((millis() - lastDebounceTime) > debounceDelay) // erst wenn debounce & Taste losgelassen
{
lastButtonState = HIGH; //
}
if (ledState != lastLedState) // neuer Status?
{
lastLedState = ledState; // merken
switch (ledState) // Auswertung
{
case 0:
pixels.setPixelColor(0, pixels.Color(010, 000, 000)); // rot
break;
case 1:
pixels.setPixelColor(0, pixels.Color(000, 000, 015)); // blau
break;
case 2:
pixels.setPixelColor(0, pixels.Color(000, 000, 000)); // :)
break;
default:
ledState = 0;
}
pixels.show(); // This sends the updated pixel color to the hardware.
}
}
Die Abfolge soll sein - rot - blau - aus - rot - blau .....
Sinn Der Übung: Du kannst jetzt weitere case x: einfügen und mit jedem Tastendruck eine weitere Farbe darstellen.
Und ja, du kannst natürlich auch die 2 komplett löschen - dann machts erstmal nur rot / blau
Hab es jetzt ausprobiert, wechselt von rot auf blau und dann ist fertig.
Die serial Ausgabe zeigt nach Upload 0 an, nach dem Tastendruck 1
Ich will dir aber nicht noch mehr Zeit rauben. Tut mir Leid!
Hi Tchefter, ob Du damit my_xy_projekt eine Freude machst, wenn Du jett, nachdem er schon soviel Zeit investiert hast, Alles hinschmeisst, bin ich mir nicht so sicher. So wie ich Ihn hier kennenlernen durfte, ist sein Antrieb nicht, möglichst wenig Zeit zu invstieren, sondern solange an nem Problem dran zu bleiben, bis das läuft. Wenn Du schon jetzt aufgibst, gibst Du my_xy_proekt das Gefül dass seine Bemühungen sinnlos sind, weil sie zu keinem brauchbaren Ergebnis führen.
Hallo Stefan,
nein das will ich nicht! Ganz im Gegenteil,ich will das nicht hinschmeißen und ich schmälere in keiner Art und Weise die Hilfe und Energie was er in das Projekt gesteckt hat! Mir ist es nur mir gegenüber peinlich das ich da nicht mehr dazu beitragen kann, ich bin halt gefühlt der ewige Anfänger, da man immer nur ab und zu Projekte macht. Und ich bin dankbar für my_xy_projekt Hilfe. Schreiben kommt halt immer etwas anders rüber als man es tats. meint.
Vll. bin ich die Hilfe nicht gewohnt, da ich sonst überall alleine durchkämpfen muss, aber da weis ich was ich tue und beim programmieren ist das eben eine ganz andere Welt. Wenn ich noch zurückdenke was "=" und "==" bedeuten soll. Für mich war = immer Gleich aber ist in dieser Welt halt anders. Ich freue mich über jede Hilfe und my_xy_projekt vielen Dank dafür.
Vll. habe ich Post#16 sehr falsch ausgedrückt, das tut mir Leid!
Mach dir mal um mich keine Sorgen.
Wenn ich der Meinung bin, dass es sich nicht lohnt weiterzumachen, dann sag ich es.
Es gab hier schon ganz bitter böse Kommentare, aber ich bin ein Freund einer Ansage, wenn es nicht mehr weiter geht.
Von daher hat @Deltaflyer es auf den Punkt gebracht
So. Nachdem das geklärt ist, hab ich heute auch wieder mehr als nur das Handy.
Die serielle Ausgabe gibt dazu auch Aufschluss.
In meinem Code ist keine drin. Wo kommt die her?
Hast Du evtl. versucht den vorherigen und den aktuellen Code zu mischen?
Das geht nicht.
Aber ich hab das mal zussammengesetzt und dann auch die Stelle gefunden, wo er nicht weiterzählt.
Na denne
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
#define PIN 12
#define NUMPIXELS 1
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
const byte buttonPin = 4; // the number of the pushbutton pin
int zled = 0;
// variables will change:
byte ledState;
byte lastLedState = 255; // Zwingt die Auswertung einmal durchzuführen
bool lastButtonState = HIGH; // the previous reading from the input pin
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time; increase if the output flick
void setup()
{
pixels.begin();
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
Serial.print(F("Start .... "));
Serial.println(digitalRead(buttonPin));
}
void loop()
{
if (!digitalRead(buttonPin)) // Taste gedrückt?
{
if (lastButtonState) // vorher nicht gedrückt?
{
Serial.println(F("Taste ausgelöst"));
lastDebounceTime = millis(); // merken
lastButtonState = LOW; // setzen
ledState++; // nächster Status
}
}
else if ((millis() - lastDebounceTime) > debounceDelay) // erst wenn debounce & Taste losgelassen
{
if (!lastButtonState)
{
lastButtonState = HIGH; //
Serial.println(F("Taste frei"));
}
}
if (ledState != lastLedState) // neuer Status?
{
Serial.print(F("Neuer Status: "));
Serial.println(ledState);
lastLedState = ledState; // merken
switch (ledState) // Auswertung
{
case 0:
pixels.setPixelColor(0, pixels.Color(010, 000, 000)); // rot
break;
case 1:
pixels.setPixelColor(0, pixels.Color(000, 000, 015)); // blau
break;
case 2:
pixels.setPixelColor(0, pixels.Color(000, 000, 000)); // :)
break;
default:
ledState = 0;
}
pixels.show(); // This sends the updated pixel color to the hardware.
}
}
Also, habe eben das Programm hoch geladen, folgendes läuft ab:
LED wird rot
Drücke ich den Taster, wird es kurz blau und schaltet gleich die LED aus
Erneuter Tastendruck, LED wird rot
das nach dem Upload, somit ist die Schleife ja einmal abgearbeitet, wenn ich das richtig verstehe.
Was jetzt komisch ist, das sofortige abschalten kommt unterschiedlich.
Mal von rot nach blau oder blau nach rot.
Habe jetzt mal case 2 rausgenommen, da hüpft dann die LED mal sofort von blau sofort nach rot nach blau, als würde ein Tastendruck zwei Dinge abarbeiten.
Wenn ich den Serial Monitor dazu laufen lasse, sieht es wie folgt aus:
Serial Start:
Start .... 1
Neuer Status: 0
Tastendruck:
-Taste ausgelöst
Neuer Status: 1
Taste frei
Tastendruck
Taste ausgelöst
Neuer Status: 2
Neuer Status: 0
Taste frei
Tastendruck
Taste ausgelöst
Taste frei
Taste ausgelöst
Neuer Status: 2
Neuer Status: 0
Taste frei
Tastendruck
Taste ausgelöst
Neuer Status: 2
Neuer Status: 0
Taste frei
Taste ausgelöst
Neuer Status: 1
Taste frei
Jetzt noch eine Frage zu dem Projekt, wie es eigtl. entstanden ist:
Ich möchte das Handrad meiner CNC upgraden, da kommen einige Taster rein. U.a. auch zum NotAus entriegeln und verriegeln, sowie die Maschine ein/ausschalten.
Das ganze wird i.d.R. per Tastatur über F1 (Estop) und F2 CNC an/aus gemacht. Dafür habe ich mir einen Leonardo bestellt (der erste war defekt) um über die Keyboard.h die Tasten entsprechend senden zu können, es kommt auch noch Programm starten usw. dazu und natürlich einige Encoder.
Die LED soll dafür sein, wenn ich den NotAus entriegle F1-Taster soll sie von rot -> blau gehen, dann schalte ich die Maschine ein F2-Taster, LED von blau -> grün, schalte ich die Maschine aus F2 Taster LED grün -> blau. Muss ich im worst case den Not-Aus F1 drücken grün ->rot.
Diverse HIGH / LOW Signale werden auch über den Leo gesendet, wo ich dann z.B. die Achsen auswähle und oder die Schrittweite zum manuellen jogen auswähle.
Ich hoff ich habe mich jetzt nicht zu kompliziert ausgedrückt. Es geht lediglich darum ob das mit einer WS2812 umsetzbar ist, da ich nur noch den einen PIN12 frei habe, (13 noch, aber denn soll man ja nicht nehmen und es würde ja immer noch ein PIN fehlen für RGB)