[Casecon] Light Glass [Worklog]

Dank dir Christian, ich find es auch toll hier und vor allem sau stark das ihr mir helft sonst würde ich das niemals alleine packen.

David ok, verstehe dann sind wir ja fast gleich alt(bin 37) das erklärt einiges ;-)
Ne gestern hatten sich unser Posts etwas überschnitten, nachdem ich dann noch bis 0.00 hin und her probiert hatte ging es.

Wenn ich den MotorAus befehl direkt nach dem Motorcode setze blockiert er danach immer irgendeine Eingabe(meistens die IR).
So wie ich den letzten Code gestern gepostet habe, hat es 3 mal in Folge funktioniert.(3x IR, 3xKP, immer abwechseld)

Ahh gut jetzt hast du dem Motorlaufen einen Void verpasst, dann kann ich dieses Wort jetzt auch nutzen , wusste vorher nicht wie oder wo man den Bezug dazu erstellt.

Du wirst lachen aber ich habe sogar versucht die Klammern immer sauber zu setzen damit ich den Überblick behalte aber halt in jeder Zeile anders ohne System. :D
Hat halt genervt immer zeilen zu löschen und wieder leerstellen zu setzen um die Klammer an seine position zu bringen aber jetzt hab ich ja die auto Formatierung gefunden.

Gut durch meine ganze leserei in verschiedenen Foren komm ich immernoch etwas durcheinander aber DIE ARDUINO IDE ist doch das Programm mit dem ich die Sketche erstelle und hochlade oder? Zeilen werden mir dort nicht angezeigt, eine Einstellung fand ich dafür auch nicht, nur den Befehl "gehe zu Zeile".

Bin ja mal gespannt ob dein Sketch jetzt bei mir auch funktioniert.

Gestern hab ich auch endlich mal den Lötkolben ausgepackt und den Digitalen LEDs Kabel verpasst.
Die Zahnstange hab ich auch auf den Aluwinkel geklebt.
Dann muss ich mir nur noch ne kleine Halterung fürn Motor basteln und das Zahnrad auf den Motor setzen.
Werd jetzt aber erstmal dran bleiben und mich mit den LED auseinander setzen.
Hätte nicht gedacht das das verbinden von IR und Keypad doch nochmal nen Abend braucht.

Naja gerade wenn man denkt man hat es verstanden wird einem klar das man gar nix weiß. XD
 
Gut durch meine ganze leserei in verschiedenen Foren komm ich immernoch etwas durcheinander aber DIE ARDUINO IDE ist doch das Programm mit dem ich die Sketche erstelle und hochlade oder? Zeilen werden mir dort nicht angezeigt, eine Einstellung fand ich dafür auch nicht, nur den Befehl "gehe zu Zeile".

:D

1.png
2.PNG
 
Pfeif, Heiligenschein, :D
Den hab ich gesehen , dacht das wär der Resetbutton/Werkseinstellung, so ist das halt heutzutage, schnell die richtige Entscheidung treffen welches Stichwort meinen Suchkriterien am besten entspricht. ;-)
 
So , nachdem ich heute morgen mal ordentlich verschlafen habe war ich dann auch um 12.00 schon wieder zu Hause.
Den Nachmittag habe ich damit verbracht mir sämtliche Adafruit und FastLed Profile anzuschauen, natürlich ohne auch nur irgendetwas zu verstehen.:wall:

Naja nachdem mein Rechner dann irgendwann nicht mehr wollte hatte ich damit erstmal zu tun.
Meine G19 macht Theater.

Danach bin ich dann doch wieder auf Websuche gegangen und konnte mich dann mit dem Strandtest der Adafruit anfreunden.

Damit habe ich nun massig Sketche erstellt:
1x Rot = Alarm
1x Grün = als alles IO nach dem Alarm
1x Orange = Tür öffnet/schließt
1x weiß = Standby, welcher quasi immer leuchtet
1x Rainbow = Hochfahren und der kriegt auch ne Taste aufm Keypad

sind zwar alle aus dem selben Sketch aber mit unterschiedlicher Dauer, Intervall , anzahl der Leds die Leuchten.
Für Heute reicht es, eine Art Knightrider Effekt hätte mich ja noch interessiert, weil es ja Rund ums Case geht und somit kein Anfang oder Ende da ist.
Hab aber nix in der Richtung gefunden.
Momentan passen manche Laufarten halt am Anfang und Ende nicht überein, aber fürs erste passt das.
Morgen kann ich von den Sketchen mal Videos machen und dann werde ich mal versuchen ob ich die mit dem Rest verbunden kriege.:ugly:
(Ja ich weiß jetzt schon wie das ablaufen wird :hmm: :wall: )

Hey die Möglichkeiten mit den LEDs sind ja endlos!
Wenn ihr irgendwelche Ideen habt die zu den oben genannten Aufgaben passen, immer her damit.
Ein Alarm ist klar sollte blinkend/laufend sein und in etwa mit dem Intervall der Sirene übereinstimmen.
Die Türöffner LED stelle ich mir eher wie eine Warnblinkanlage vor(auch gemischt laufend/blinkend) wie ein Gabelstapler oder LKW der Rückwerts fährt.
Rainbow zum hochfahren des PCs, ist aber nur ne Idee.
Wie ich das weiß als dauerlicht laufen lasse weiß ich nicht, es sollte halt entspannt wirken und nicht nerven.

Aber wie gesagt immer her mit euren Vorschlägen! :D
 
David der aufgeräumte Code den du geschrieben hast läuft diesmal 1A :daumen:.
Mit dem Einbinden der RGB hatte ich noch nicht viel Erfolg.
Geht schon voran aber iwas ist immer, entweder blockiert das eine den anderen oder das Lauflicht unterbricht während der Motor läuft.

Ich teste jetzt mal mit Davids Sketch weiter.
Muss es erst mal alleine versuche sonst begreif ich das nie:ugly:
 
David der aufgeräumte Code den du geschrieben hast läuft diesmal 1A :daumen:.
Mit dem Einbinden der RGB hatte ich noch nicht viel Erfolg.
Geht schon voran aber iwas ist immer, entweder blockiert das eine den anderen oder das Lauflicht unterbricht während der Motor läuft.

Ich teste jetzt mal mit Davids Sketch weiter.
Muss es erst mal alleine versuche sonst begreif ich das nie:ugly:

Du hast doch eh keine Ahnung :ugly:
 
Kann sein das jetz der Punkt gekommen ist an dem ich mit Multifunktionen arbeiten muss?
Dann muss ja alles wieder umgeschrieben werden oder ?
Hab mir den Link im Arduino Forum von letztens schon angeschaut.

Also bei dem Strandtest Sketch sind ja alle möglichen Sachen drin.
Die habe ich mir gekürzt auf die Beleuchtung für Tür öffnen oder schließen.

Der Sketch sieht einzeln so aus:

Code:
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN A4

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(120, PIN, NEO_GRB + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code


  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() 
{
  // Send a theater pixel chase in...
  theaterChase(strip.Color(255,100, 0), 1000); // Orange
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<100; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 2; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+2) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+2) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}



// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Lässt sich der überhaupt mit dem letzten Sketch von David verbinden?
oder sollte man den komplett umschreiben?

Diesen Sketch habe ich nun mit dem von David verbunden mit dem Ergebniss das nach Taste drücken beide Befehle nacheinander abgearbeitet werden.

Momentan sieht das so aus:

Code:
#include "Stepper.h"
#include "Keypad.h"
#include "IRremote.h"
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN A4
/*----- Variables, Pins -----*/
#define STEPS  32   // Number of steps per revolution of Internal shaft
int  Steps2Take;  // 2048 = 1 Revolution
int receiver = 12; // Signal Pin of IR receiver to Arduino Digital Pin 12

/*-----( Declare objects )-----*/
// Setup of proper sequencing for Motor Driver Pins
// In1, In2, In3, In4 in the sequence 1-3-2-4
Stepper small_stepper(STEPS, A0, A2, A1, A3);
IRrecv irrecv(receiver);    // create instance of 'irrecv'
decode_results results;     // create instance of 'decode_results'
Adafruit_NeoPixel strip = Adafruit_NeoPixel(120, PIN, NEO_GRB + NEO_KHZ800);
//Deklarationen Keypad
const byte numRows = 4; //number of rows on the keypad
const byte numCols = 4; //number of columns on the keypad

//keymap defines the key pressed according to the row and columns just as appears on the keypad
char keymap[numRows][numCols] =
{
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

//Hier die richtigen Pins eintragen!!! Anschlussgrafik gibt es z.B. hier http://www.learningaboutelectronics.com/Articles/Arduino-keypad-circuit.php
byte rowPins[numRows] = {9, 8, 7, 6};
byte colPins[numCols] = {5, 4, 3, 2};

//initializes an instance of the Keypad class
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);


void setup()
{
  irrecv.enableIRIn(); // Start the receiver
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop()

{
  char keypressed = myKeypad.getKey(); //Tastedruck am Keypad erfassen
  if (keypressed == 'A')
  { // Send a theater pixel chase in...
    theaterChase(strip.Color(255, 100, 0), 100); // Orange
    motorLaufen(2048);
    strip.show();
  }
  if (keypressed == 'B')
  { // Send a theater pixel chase in...
    theaterChase(strip.Color(255, 100, 0), 100); // Orange
    motorLaufen(-2048);
    strip.show();
  }
  if (irrecv.decode(&results)) {
    if (results.value == 16761405) // forward pressed
      motorLaufen(2048);

    if (results.value == 16712445) // backwards pressed
      motorLaufen(-2048);
  }
}
/* --end main loop -- */
void motorLaufen(int mSteps) {
  small_stepper.setSpeed(1000);
  Steps2Take  =  mSteps;  // Rotate CCW
  small_stepper.step(Steps2Take);
  irrecv.resume(); // receive the next value
  MotorAus();
}
void MotorAus ()
{
  digitalWrite(A0, LOW);
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, LOW);
}
//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 10; j++) { //do 10 cycles of chasing
    for (int q = 0; q < 2; q++) {
      for (uint16_t i = 0; i < strip.numPixels(); i = i + 2) {
        strip.setPixelColor(i + q, c);  //turn every third pixel on
      }
      strip.show();

      

      for (uint16_t i = 0; i < strip.numPixels(); i = i + 2) {
        strip.setPixelColor(i + q, 0);      //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if (WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if (WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Hier habe ich die RGBs mal nur zu testen in Zeile 54 und 60 eingefügt.
Also press Keypad A oder B.
Vorher standen die Befehle nicht in Klammern, dann wurden Die LEDs aber immer ausgeführt und haben alle anderen Funktionen blockiert.
Mit Klammer starten sie nun bei dementsprechenden Tastendruck.
Allerdings nacheinander,bzw so wie es jetzt geschrieben ist, startet das Lauflicht dann Dauerlicht, Motordrehung, licht aus.
In Zeile 97 ist ein Delay wert eingetragen der wohl blockiert, beim entfernen wird das Lauflicht halt nicht mehr richtig ausgeführt, bzw. blinkt dann alles nur kurz und geht dann ins Dauerlicht über.
Ich probiere es noch weiter:ugly:
 
Also trotz einiger Sachen die mir nicht ganz gefallen haben, ging es erst mal weiter.
Ich hab den Distanzsensor(läuft nun bei 40cm, also jeder der das Case später anfassen will...:devil:) noch integriert und ein paar Lichterspiele auf die IR programmiert.

Eigentlich wäre jetzt alles soweit drauf was ich vor hatte bis auf den PC ein und ausschalten.
Alle restlichen verfügbaren Tasten werde ich auch noch belegen aber hier erst mal ein kurzes Video zu dem ganzen.

Eingebundener Inhalt
An dieser Stelle findest du externe Inhalte von Youtube. Zum Schutz deiner persönlichen Daten werden externe Einbindungen erst angezeigt, wenn du dies durch Klick auf "Alle externen Inhalte laden" bestätigst: Ich bin damit einverstanden, dass mir externe Inhalte angezeigt werden. Damit werden personenbezogene Daten an Drittplattformen übermittelt.
Für mehr Informationen besuche die Datenschutz-Seite.


Momentan gibt's eigentlich nur 2 kleine Probleme.
1.Fällt die Fernbedienung oft aus bzw. nimmt keine Befehle mehr an. Das ist auch der Grund weshalb ich den
Code:
 irrecv.resume(); // receive the next value
Befehl so ziemlich überall mit reingeklatscht habe.
Das hat das Problem auch behoben außer wenn ich eine unprogrammierte Taste auf der IR tippe.
Da die Tasten auf der IR auch pulsierende oder lang gedrückte Befehle annehmen, kann das mal schnell ohne Absicht passieren.
Wenn ich danach Im Keypad eine Taste drücke wird die FB wieder freigegeben.

2.Wenn ich eine der Lichterspiele auf der FB starte geht danach die Alarmanlage hoch, nicht immer aber immer öfter.
Finde den Fehler einfach nicht außer irgendwas komplett umzuschreiben, wozu ich immer noch nicht in der Lage bin.
(ist auch im Video bei 1.04 zu sehen)

Die Motorbefehle laufen auf IR und KP reibungslos, der Alarm auch.
Der Buzzer für den Alarm hat glaub 90db, ist aber noch Klebeband drauf. :ugly:

Kleinigkeiten die ich noch gerne hätte. haben leider nicht geklappt, wie zb.
LED Effekte sollten normal während des Motorbetriebes weiter laufen,
ein grüner LED Effekt(colorWipe) sollte ja eigentlich kommen nachdem die Alarmanlage ausgeht, leider blockiert sie mir danach alles andere bzw. läuft permanent.
Ich krieg einfach nicht raus wie ich die Effekte aus der Adafruit library gezielt steuern kann, also wie an oder aus, oder mach einmal mach zweimal.
Mann kann zwar die Länge des Effektes ändern anpassen aber mehr nicht, manche leuchten danach einfach weiter andere nicht, trotz des Befehles
Code:
strip.show(); // Initialize all pixels to 'off'


Also für dieses Wochenende reicht es, schade das mir doch noch so vieles schleierhaft bleibt, ich hoffe es hat noch jemand den ein oder andern Tipp für mich um die 2 Probleme zu lösen.
Hier ist der Sketch wie er im Video benutzt wurde.
Bestimmt noch viel Müll drinn und mit mehr Erfahrung kann man bestimmt auch viel verkürzen.Sorry

Code:
#include "Stepper.h"
#include "Keypad.h"
#include "IRremote.h"
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN A4
/*----- Variables, Pins -----*/
#define STEPS  32   // Number of steps per revolution of Internal shaft
int  Steps2Take;  // 2048 = 1 Revolution
int receiver = 12; // Signal Pin of IR receiver to Arduino Digital Pin 12
int trigPin = 10;
int echoPin = 11;
int buzzer = 13;
/*-----( Declare objects )-----*/
// Setup of proper sequencing for Motor Driver Pins
// In1, In2, In3, In4 in the sequence 1-3-2-4
Stepper small_stepper(STEPS, A0, A2, A1, A3);
IRrecv irrecv(receiver);    // create instance of 'irrecv'
decode_results results;     // create instance of 'decode_results'
Adafruit_NeoPixel strip = Adafruit_NeoPixel(120, PIN, NEO_GRB + NEO_KHZ800);
//Deklarationen Keypad
const byte numRows = 4; //number of rows on the keypad
const byte numCols = 4; //number of columns on the keypad

//keymap defines the key pressed according to the row and columns just as appears on the keypad
char keymap[numRows][numCols] =
{
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
//Hier die richtigen Pins eintragen!!! Anschlussgrafik gibt es z.B. hier http://www.learningaboutelectronics.com/Articles/Arduino-keypad-circuit.php
byte rowPins[numRows] = {9, 8, 7, 6};
byte colPins[numCols] = {5, 4, 3, 2};

//initializes an instance of the Keypad class
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

void setup()
{
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(buzzer, OUTPUT);
  irrecv.enableIRIn(); // Start the receiver
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop()
{
  char keypressed = myKeypad.getKey(); //Tastedruck am Keypad erfassen
  if (keypressed == 'A')
    motorLaufen(2048);
  if (keypressed == 'B')
    motorLaufen(-2048);

  { long duration, distance;
    digitalWrite(trigPin, LOW);
    digitalWrite(trigPin, HIGH);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = (duration / 2) / 29.1;
    if (distance < 40) {
      digitalWrite(buzzer, HIGH );
      theaterChase(strip.Color(255, 0, 0), 100); // Red
      strip.show();
    }
    else {
      digitalWrite(buzzer, LOW );
    }
    if (distance > 200) {
      Serial.println("Out of range");
    }
    if (distance < 0) {
      Serial.println("Out of Range");
    }
  }
  if (irrecv.decode(&results))
  { if (results.value == 16761405) // forward pressed
      motorLaufen(2048);
    if (results.value == 16712445) // backwards pressed
      motorLaufen(-2048);
    if (results.value == 16738455) // taste 0
      colorWipe(strip.Color(127, 127, 127), 30); // White
    if (results.value == 16724175) // taste 1
      theaterChase(strip.Color(127, 127, 127), 1000); // White
    if (results.value == 16718055)//taste 2
      theaterChase(strip.Color(255, 0, 0), 100); // Red
    if (results.value == 16743045) //taste 3
      rainbowCycle(10);
    if (results.value == 16716015)//taste 4
      colorWipe(strip.Color(0, 255, 0), 30); // Green
    if (results.value == 16726215)//taste 5
      theaterChase(strip.Color(0, 255, 0), 500); // Green
    if (results.value == 16734885)//taste 6

      if (results.value == 16728765)//taste 7

        if (results.value == 16730805)//taste 8

          if (results.value == 16732845)//taste 9

            if (results.value == 16748655)//taste vol +

              if (results.value == 16754775)//taste vol -
                irrecv.resume(); // receive the next value
  }
}

/* --end main loop -- */
void motorLaufen(int mSteps) {
  // Send a theater pixel chase in...
  theaterChase(strip.Color(255, 100, 0), 1000); // Orange
  small_stepper.setSpeed(1000);
  Steps2Take  =  mSteps;  // Rotate CCW
  small_stepper.step(Steps2Take);
  irrecv.resume(); // receive the next value
  strip.show();
  MotorAus();
}
void MotorAus ()
{
  digitalWrite(A0, LOW);
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  digitalWrite(A3, LOW);
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for (uint16_t i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
  irrecv.resume();
}
//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 10; j++) { //do 10 cycles of chasing
    for (int q = 0; q < 2; q++) {
      for (uint16_t i = 0; i < strip.numPixels(); i = i + 2) {
        strip.setPixelColor(i + q, c);  //turn every third pixel on
      }
      strip.show();
      delay(wait);
      for (uint16_t i = 0; i < strip.numPixels(); i = i + 2) {
        strip.setPixelColor(i + q, 0);      //turn every third pixel off
      }
    }
  }
  irrecv.resume();
}
void rainbow(uint8_t wait) {
  uint16_t i, j;

  for (j = 0; j < 256; j++) {
    for (i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i + j) & 255));
    }
    strip.show();
    delay(wait);
  }
  irrecv.resume();
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
    for (i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
  irrecv.resume();
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if (WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if (WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Liebe Grüße Ronny
 
Spitze. Schaut doch schon gut aus und ein Nano reicht auch zu, wie ich auf dem Breadboard sehe.
Macht wirklich Spaß, den Thread hier zu verfolgen.

Hast du zufällig einen Link für die Fernbedienung? Die könnte mir auch ganz gut gefallen. *gg*
 
Hi Tino, Die FB ist aus einem Standard Startekit.
In der Artikelbeschreibung als auch auf der FB selbst stehen aber keine weiteren Infos dazu.
Sie ist eher für MP3 gedacht.
Ist schon erstaunlich das ich gleich den ersten Tag 2 Arduinos schrotte und seit dem hält der letzte treu durch, eigentlich untypisch :daumen: .
Naja ob es dann wirklich bei dem einen Arduino bleibt werden wir sehen wenn sich der Rest hier dazu äußert:ugly:
Ich verbaue auch 3 wenn es sein muss:P
 
Hab parallel dazu auch mal quer gelesen. Da geht ja im Prinzip jede FB. Muss nur die Signale abfassen und verknüpfen. :D
Kann ich ja mit meiner Universal von Logitech spielen *gg* dimmen per Volume +/- *gg*
 
Jaa der Part mit der IR ist verhältnismäßig leicht finde ich bis auf die paar unerwünschten nebeneffekte die ich oben beschrieben habe.
Die IR hat aber im einzelnen wunderbar funktioniert.
 
Kann sein das jetz der Punkt gekommen ist an dem ich mit Multifunktionen arbeiten muss?
Dann muss ja alles wieder umgeschrieben werden oder ?
Hab mir den Link im Arduino Forum von letztens schon angeschaut.

Ja, musst du, bzw machst du bereits schon. Du hast ja schon Funktionen die nacheinander abgearbeitet werden. Parallelität gibts beim Arduino ja nicht, jedoch läuft der schnell genug, das das nacheinander ausreicht um wie gleichzeitig zu erscheinen. Wie das mit den Leds ist, weiß ich nicht genau. Wenn man sich da nicht an bestimmte Tricks hält, kann das wohl auch seeeehr langsam laufen, was dann alles zum hängen bringen würde. Deine Beispiele sehen aber recht einfach aus.

Hier habe ich die RGBs mal nur zu testen in Zeile 54 und 60 eingefügt.
Also press Keypad A oder B.
Vorher standen die Befehle nicht in Klammern, dann wurden Die LEDs aber immer ausgeführt und haben alle anderen Funktionen blockiert.
Mit Klammer starten sie nun bei dementsprechenden Tastendruck.
Allerdings nacheinander,bzw so wie es jetzt geschrieben ist, startet das Lauflicht dann Dauerlicht, Motordrehung, licht aus.
In Zeile 97 ist ein Delay wert eingetragen der wohl blockiert, beim entfernen wird das Lauflicht halt nicht mehr richtig ausgeführt, bzw. blinkt dann alles nur kurz und geht dann ins Dauerlicht über.
Ich probiere es noch weiter:ugly:

Das mit dem Delay hast du schon sehr gut erkannt. Die theaterChase Funktion die du verwendest ist auch wie die Stepper.h Bibliothek blockierend. Und warum funktioniert es nicht mehr, wenn du das delay rausnimmst?
Kurzer Versuch eines Ausflugs in die Theorie.

Der Nano läuft ja mit 16 MHz, sprich, der Loop wird in der Sekunde 16 Millionen mal aufgerufen. Wenn da jetzt Code reingeschrieben wird, dann dauerts a bissl länger, aber insgesamt bleibt die Zeit sehr kurz für einen Loop Durchlauf. Wenn du jetzt einen zeitlichen Ablauf haben möchtest, also etwas soll mit einer Geschwindigkeit laufen, dann musst du dafür sorgen, dass die Ereignisse nur zu bestimmten Zeiten ausgeführt werden (z.B pro Sekunde ein Schritt, da musst du seeeehr viele Taktzyklen auslassen). Hoffe das ist verständlich...

Einfach kann man das über das delay lösen. Der Arduino schläft dann einfach solange, bis wieder etwas getan werden soll. Wenn du das jetzt entfernst läuft der Code zwar immer noch sauber durch, jedoch bekommst du nix davon mit, da es im Bruchteil einer Sekunde ausgeführt wurde.

Die andere aber aufwändige Methode ist, eben mit der millis Funktion zu arbeiten. Hier wird immer nur abgefragt, ob es etwas zu tun gibt. "Ist schon wieder genügend Zeit vergangen? Gibt es schon wieder etwas zu tun?" If (genügend Zeit vergangen) {dann Code ausführen (z.B. Motor einen einzelnen Schritt machen lassen)}, Falls die Bedingung nicht erfüllt ist, dann wird der Code ignoriert und es geht mit dem Rest. So kann während man auf den nächsten Motorschritt wartet noch andere Dinge erledigen.

Es ist wirklich zwingend notwendig, wenn du verschiedene Funktionen gleichzeitig haben möchtest, dass du auf das delay verzichtest.

Zurück zum Text... Das Verhalten das du beschreibst deckt sich sehr gut mit dem Code. Scheint also alles richtig zu laufen, jedoch nicht wie gewünscht.
 
Yea, das Video sieht doch schon sehr vielversprechend aus!!

Bin für heute noch zu durch vom Arbeiten, hab schon für den anderen Text n halben Tag gebraucht... Daher morgen erst ne ausführlichere Antwort.
Nur zwei kurze Dinger die mir ins Auge gesprungen sind.

irrecv.resume(); Sehr gute Idee den öfters einzusetzen. Denke das ist ne gute Lösung, eventl sogar die richtige. Ich würde diesen aber auch bei den unbenutzen Tasten einfügen. Sprich nach Zeile 98, 100.... usw. Du hast ihn zwar in Zeile 109 eingefügt, aber da betrifft er nur die Zeile direkt davor. Ist eine Eigenheit der If- Abfrage. Normal machst du ja geschweifte Klammern, musst du aber nicht. Du kannst die auch weglassen, dann gilt die nächste Zeile als das was ausgeführt wird, wenn die Bedingung erfüllt ist. In deinem Code wird also Zeile 99 bis 109 nur ausgeführt wenn Taste 6 gedrückt wurde. Ansonsten kommst du an den Codeteil gar nicht ran. Programmier mal auf die Taste 7 oder 8 mal was zum testen. Ich bin mir sehr sicher, dass da nix geht.
Ich finds übrigens ne gute Idee auch alle Tasten im Code aufzugreifen. Nicht das ein unbekanntest Signal Verwirrung stiftet.

Zweitens: strip.show();
Weiß nicht ob ich dich da richtig verstanden habe, aber dieser Befehlt macht nicht grundsätzlich alle Pixel auf Off. Auch wenn das im Kommentar so steht. Nur in dieser Zeile stimmt das. Ich denke eher, das die Einstellungen die man davor getätigt hat, damit an die Pixel ausgegeben werden.
Ähnlich wie bei meinem Motor, erst einstellen (set speed), und dann Befehl (run) zum loslaufen geben.

Lieben Gruß
David
 
Zweitens: strip.show();
Weiß nicht ob ich dich da richtig verstanden habe, aber dieser Befehlt macht nicht grundsätzlich alle Pixel auf Off. Auch wenn das im Kommentar so steht. Nur in dieser Zeile stimmt das. Ich denke eher, das die Einstellungen die man davor getätigt hat, damit an die Pixel ausgegeben werden.
Ähnlich wie bei meinem Motor, erst einstellen (set speed), und dann Befehl (run) zum loslaufen geben.

Denke ich auch :D. Der Befehl schreibt die seit dem letzten show() gemachten Einstellungen quasi nur auf den LED Strip. So kenn ich das auch von FastLED, wenn man da den Streifen ausmachen wollte musste man auch erst die Farbe auf schwarz stellen (oder Helligkeit auf 0) und dann mit dem Befehl "FastLED.show()" die Einstellungen sozusagen "anwenden".

Zu der Sache mit dem Licht und Motor gleichzeitig: Wenn die aufgerufen Befehle mit delays arbeiten wird eben blockiert und es läuft nicht so wie angedacht. Aber auch generell wird ja nach der Reihenfolge abgearbeitet. D.h. wenn du die Lauflichtanimation erst nach dem Motorbefehl aufrufst wird sie auch erst ausgeführt wenn der vorherige Befehl beendet ist. Vielleicht muss man hier so arbeiten, dass man zwischen den beiden ganz schnell wechselst. Also immer 1 Schritt den Motor drehen, dann die Led Animation einen Frame weiter, dann wieder 1 Schritt mit dem Motor usw. Könnte man mit ner do-while Schleife machen:

Code:
stepsRequired = 2048;stepsDone = 0;
do
{
  motorLaufen(1);
  nextLedFrame();
  stepsDone++;


} while (stepsDone != stepsRequired);

Man schreibt in eine Variable wie viele Schritte man machen will und in eine andere wie viele man schon gemacht hat. Letztere wir am Ende der Schleife hochgezählt (da man ja einen Schritt gemacht hat :schief:). Insgesamt wird die Schelife solange ausgeführt bis die beide Variable übereinstimmen, also die Anzahl der gemachten Schritten der der geforderten miteinander übereinstimmen. Bloß wie man die Animation Schritt für Schritt vorwärts bringen kann weiß ich grad nicht :huh:.
 
Hab heute mal den Code der Stepper.h Bibliothek angesehen, und festgestellt, dass die ja gar nicht blockierend ist. Zumindest befindet sich da im Code gar kein Delay. Wenn du wissen willst wie man das macht, sag Bescheid.
Könntest du mal testen ob das stimmt? Wenn ja müsstest du während der Motor läuft z.B. das Lauflicht über die FB starten können.
Ich würde erwarten, dass es geht, aber das der Motor während dem Lauflicht stoppt und die Schritte nach Abschluss des Lauflichts fertig laufen.
Damit hätte man schon mal die Hälfte der Miete.

Dann habe ich noch ein nicht blockierendes Beispiel für die Neopixel gefunden. Avoiding Using Delay in Arduino – NeoPixels | BitchWhoCodes | Stacey Mulcahy - a Microsoft Technical Evangelist

Kannst du das mal einbauen und es in Verbindung mit dem Motor testen? Der Distanzsensor ebenso wie der Buzzer scheinen auch nicht blockierend zu sein. Wenn du an der Stelle mal das Theaterlicht auskommentierst müsste auch das gleichzeitig laufen.

Warum der Distanz Alarm manchmal losgeht kann ich im Code auch nicht erkennen. Ich vermute, dass das Signal auf dem echoPin nicht ganz sauber ist und zufällig die Werte falsch interpretiert werden. Ich würde mal versuchen die Funktion nicht ganz so oft aufzurufen. Vielleicht ist das so wie es jetzt ist zu schnell, und die Auswertung überschreibt sich bei jedem Durchlauf selbst und bringt sich durcheinander.
Füg mal folgendes ein:
Code:
if (millis()%10 == 0){
//Den Distanzcode hier einfügen
}
Was macht diese Zeile? Das Stichwort ist "Modulo" bzw. "Division mit Rest" (Division mit Rest – Wikipedia) bzw. (Arduino - Modulo).
Wenn du den Wert der millis Funktion durch 10 teilst und kein Rest bleibt, dann wird der Code ausgeführt. Der Code läuft dann nur noch jede 10te Millisekunde. Die Messung ist dann nicht mehr so empfindlich. Du kannst den Wert auch ändern, wenn du <10 nimmst wirds öfter bzw. schneller, >10 wirds langsamer.
Könnte man mal ausprobieren.

Lieben Gruß
David
 
Das mit dem Delay hast du schon sehr gut erkannt. Die theaterChase Funktion die du verwendest ist auch wie die Stepper.h Bibliothek blockierend. Und warum funktioniert es nicht mehr, wenn du das delay rausnimmst?

Wenn ich das Delay rausnehme wird das Lauflicht(zb.) nicht richtig ausgeführt. Wie sag ichs am besten:
Im Video der eine LED Effekt(colorWipe weiß) wo sich die 120LEDs in einem bestimmten Tempo der Reihe nach einschalten.
Bei diese Effekt kann ich zwar die Geschwindigkeit ändern, wie schnell alle an sind, sobald ich den delay entferne sind alle LEDs sofort an.
Und so verhält es sich mit jedem Effekt, ein Rainbow wandert dann nicht langsam über alle 12 LEDs sondern in Bruchteilen einer Sekunde.

Bei der Definition der Effekte, colorWipe ,Theaterchase etc bezieht sich das delay ja immer auf diesen Wert:
Code:
uint8_t wait
uint8,16,32 sind alles teile der adafruit liberary, was mich Wochenende auch schon interessierte.
Also auf die Frage:
Hab heute mal den Code der Stepper.h Bibliothek angesehen, und festgestellt, dass die ja gar nicht blockierend ist. Zumindest befindet sich da im Code gar kein Delay. Wenn du wissen willst wie man das macht, sag Bescheid.

BESCHEEEEEIIID! :D

Das mir die Delays überall nur schaden und möglichst nicht verwendet werden sollten war mir von Anfang an klar aber ich hätte es nat. nicht so gut in Worte fassen können wie du.

Bin für heute noch zu durch vom Arbeiten, hab schon für den anderen Text n halben Tag gebraucht... Daher morgen erst ne ausführlichere Antwort.
Nur zwei kurze Dinger die mir ins Auge gesprungen sind.

Hey kein Problem und kein streß, ich bin froh das du dir überhaupt die Zeit nimmst das irgendwie in mein Kopf zu prügeln.:daumen:

irrecv.resume(); Sehr gute Idee den öfters einzusetzen. Denke das ist ne gute Lösung, eventl sogar die richtige. Ich würde diesen aber auch bei den unbenutzen Tasten einfügen. Sprich nach Zeile 98, 100.... usw. Du hast ihn zwar in Zeile 109 eingefügt, aber da betrifft er nur die Zeile direkt davor. Ist eine Eigenheit der If- Abfrage. Normal machst du ja geschweifte Klammern, musst du aber nicht. Du kannst die auch weglassen, dann gilt die nächste Zeile als das was ausgeführt wird, wenn die Bedingung erfüllt ist. In deinem Code wird also Zeile 99 bis 109 nur ausgeführt wenn Taste 6 gedrückt wurde. Ansonsten kommst du an den Codeteil gar nicht ran. Programmier mal auf die Taste 7 oder 8 mal was zum testen. Ich bin mir sehr sicher, dass da nix geht.
Ich finds übrigens ne gute Idee auch alle Tasten im Code aufzugreifen. Nicht das ein unbekanntes Signal Verwirrung stiftet.

Okay super das ich nicht vollkommen in die falsche Richtung arbeite.
Ich weiß nicht ob du es gesehen hattest aber ich hab den irrecv.resume(); Befehl unten bei den einzelnen Effekte eingefügt um es oben ebend übersichtlicher zu halten.
Somit sollte irrecv.resume(); ja nach jedem LED Effekt wieder aktiviert werden.
Genauso bin ich auch mit dem Orangenem Theaterchase für Motorlaufen verfahren. Ich habe es gar nicht mehr oben bei den Eingaben zu stehen sondern direkt beim void motorLaufen eingefügt.
Da das Orange ja nur für das öffnen/schließen da ist, startet es auch automatisch sobald motorlaufen aktiviert wird.:nicken:


Code:
strip.show();

Ja habe ich auch schon mitbekommen das er nicht direkt einen Aus Befehl erteilt, mal ja mal nein. Theaterchase mit motorlaufen geht er danach aus, wenn ich ein theaterchase auf IR lege bleibt es an.
Ich möchte eigentlich beides für bestimmte Aufgabe, sollte nur wissen wie ich das genau steuer.

Hab heute mal den Code der Stepper.h Bibliothek angesehen, und festgestellt, dass die ja gar nicht blockierend ist. Zumindest befindet sich da im Code gar kein Delay. Wenn du wissen willst wie man das macht, sag Bescheid.
Könntest du mal testen ob das stimmt? Wenn ja müsstest du während der Motor läuft z.B. das Lauflicht über die FB starten können.
Ich würde erwarten, dass es geht, aber das der Motor während dem Lauflicht stoppt und die Schritte nach Abschluss des Lauflichts fertig laufen.
Damit hätte man schon mal die Hälfte der Miete.

Ja habs probiert aber während der Motor läuft(ohne LED, nur rein der Motor) geht nix, IR nimmt keine Befehle an, erst nachdem der Motor wieder still steht. Am KP selbiges.
Hab die IR mal komplett raus um nur über KP LED zu starten während der Motor läuft aber er blockiert definitiv.


Der Distanzsensor ebenso wie der Buzzer scheinen auch nicht blockierend zu sein. Wenn du an der Stelle mal das Theaterlicht auskommentierst müsste auch das gleichzeitig laufen.

Ja die zwei laufen absolut problemlos, gehen gleichzeitig an und auch gleichzeitig aus. Was meinst du mit "auskommentierst "? Dahinter // ? Ich dachte das wird vom Programm nicht berücksichtigt?
Oder soll ich es nur zum Buzzer hinzufügen, das hatte ich ja schon, also so wie es im Video zu sehen war, springt beides gleichzeitig an wenn der Sensor Alarm gibt.
Ich bin aber gerade ,dank eurer Hilfe versteht sich auf eine mega Idee gekommen , schon getestet läuft.:rollen:
Das Theaterchase bezieht sich ja auf mehrere Aufgaben (öffnen , schließen, Alarm, led) Die Geschwindigkeit kann ich bei den Tasten Zeilen ändern aber die Dauer nur ganz unten im void theaterChase.
Hatte halt ein gesundes Mittelmaß für alle Effekte eingegeben aber der Alarm nervt mich jetzt schon(zeigt vor allem genau auf die Tür,sobald man rein oder rausgeht :wall::ugly:).
Also Buzzer und LED springen zwar gleichzeitig an aber die LED blockiert das Buzzer "Aus" für die dauer ihrer Laufzeit.
Jetzt hab ich doch spaßeshalber mal ein void theaterChase1 erstellt(Betonung liegt auf der 1 am ende) und die Laufzeit komplett runtergeschraubt damit der Buzzer wirklich nur läuft wenn was im Weg ist.
Klappt einwandfrei, und der Standard theaterChase läuft für die anderen Funktionen wie vorher.

Warum der Distanz Alarm manchmal losgeht kann ich im Code auch nicht erkennen. Ich vermute, dass das Signal auf dem echoPin nicht ganz sauber ist und zufällig die Werte falsch interpretiert werden. Ich würde mal versuchen die Funktion nicht ganz so oft aufzurufen. Vielleicht ist das so wie es jetzt ist zu schnell, und die Auswertung überschreibt sich bei jedem Durchlauf selbst und bringt sich durcheinander.
Füg mal folgendes ein:


Code:
if (millis()%10 == 0){
//Den Distanzcode hier einfügen
}

Was macht diese Zeile? Das Stichwort ist "Modulo" bzw. "Division mit Rest" (Division mit Rest – Wikipedia) bzw. (Arduino - Modulo).
Wenn du den Wert der millis Funktion durch 10 teilst und kein Rest bleibt, dann wird der Code ausgeführt. Der Code läuft dann nur noch jede 10te Millisekunde. Die Messung ist dann nicht mehr so empfindlich. Du kannst den Wert auch ändern, wenn du <10 nimmst wirds öfter bzw. schneller, >10 wirds langsamer.
Könnte man mal ausprobieren.

Also erst mal hab den Code eingefügt aber ohne große Änderung.
%10 und <10 geht der Alarm trotzdem nach jedem LED Effekt an(nur bei den die manuell gestartet werden,bzw eigentlich nur bei dem weißen colorwipe( IR taste 0, KP Taste 1) bei einem grünen colorwipe auf IR 4 oder Öffnen schließen geht kein Alarm an.
Womit ich auch vorher schon die selbe Vermutung hatte. Unsauberes Signal bzw. wozu brauchte man einen Mantelstromfilter:ugly:
Wenn die LEDs laufen kommen aus dem Buzzer schleifende Geräusche, als ob er Saft bekommt aber nicht genug für einen Ton.
Ja und wenn ich >10 einstelle geht der Alarm gar nicht mehr. Zumindest kann ich dann vorm Sensor tanzen und keine Reaktion:P

VORSCHAU: Alter wer soll da noch durchblicken? :ugly:


Dann habe ich noch ein nicht blockierendes Beispiel für die Neopixel gefunden. Avoiding Using Delay in Arduino – NeoPixels | BitchWhoCodes | Stacey Mulcahy - a Microsoft Technical Evangelist

Okay also die Hausaufgabe ist heftig.
Hab schon etwas experimentiert aber das ist auch genau der Beispielsketch der nichtmal mit Delay bei mir läuft.
Angabe 120 Numpixels(oder 0-119, schon bemerkt) es leuchtet aber immer nur eine.
Er hat auf der Seite ja die unit16,32 definiert ,das schon mal gut aber die unit8 nicht.
Aber egal an dem Brocken habe ich noch etwas zu kauen, ich kriege das schon raus.
Momentan ist sein sketch ja noch kein Effekt bzw lauflicht ich denke mal ich muß die Werte nur richtig eintragen, denn so wie er dort ist macht er noch gar nix.

Zum Thema Motor nochmal abschließend: Er blockiert die anderen Aufgaben auf jeden Fall, wäre es jetzt an der Zeit nochmal von vorne anzufangen?
AccelStepper.h :rollen:
 
Zurück