Sharp ir sensor mit neopixel

Hallo Leute kann mir jemand verraten warum der serieller Monitor nur alle 8 sekunden mist und wenn ich im colorwipe das delay(wait); entferne, er nur ca 0,5 sekunden mist und ich die zeit des lauflicht nicht mehr einstellen kann.
Kann mir da jemand weiterhelfen?

#include <SharpIR.h>
#include <Adafruit_NeoPixel.h>
#define NUMPIXELS 144
SharpIR sensor( SharpIR::GP2Y0A21YK0F, A0 );

int PIN = 8;
 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  Serial.begin( 9600 ); 
  pixels.begin();
   pixels.show();
   }

void loop(){
{
  int distance = sensor.getDistance(); 
  Serial.println( distance ); 
  //delay(1000);
  }
    int distance = sensor.getDistance(); 

if (distance<=15)
{      colorWipe(pixels.Color(0, 0, 0), 50); //

  } else {
      colorWipe(pixels.Color(78, 0, 0), 50); //
  }
}

 void colorWipe(uint32_t c, uint8_t wait) {
      for(uint16_t i=0; i<pixels.numPixels(); i++) {
          pixels.setPixelColor(i, c);
          pixels.show();
          delay(wait);
      }
    }

You will need to use a non-blocking approach. for-loops are usually not the way to go if you want responsiveness.

It will basically be something like

void colorWipe(uint32_t c, uint8_t wait)
{
  // ledCounter replaces the variable 'i' of the for-loop
  static byte ledCounter = 0;

  pixels.setPixelColor(ledCounter, c);
  pixels.show();

  // next led
  ledCounter++;
  // if all leds done, start from the beginning
  if(ledCounter == NUMPIXELS)
  {
    ledCounter = 0;
  }
  
  delay(wait);
}

The trick is that you call colorWipe() often (from loop()) and that it executes quickly. With the delay, approx 50ms.

In the next step you can get rid of the delay in favour of a millis() based approach to make it really non-blocking. Study blink-without-delay and a few articles like Using millis() for timing. A beginners guide and Demonstration code for several things at the same time.

okay es funktioniert.nur wie mach ich das das bei pixel 1 anfängt. hab mich mit so einer art noch überhaupt nicht beschäftig

Hi

Der Sketch liest sich grausig, drücke Mal STRG+T in der IDE, Das rückt zumindest den Code nach der Klammerebene ein.
Stichwort: Warum eine weitere Klammer in loop?

Weiter wirst Du massiv Probleme bekommen, wenn Du deine Tastatur nicht bald repariert bekommst - C++ ist nämlich "case sensitive".

Wenn wir es Dir nicht wert sind, große Buchstaben in Deinem Geschreibsel finden zu dürfen, muß ich mir schwer überlegen, ob Du es mir wert bist, mich um Dein Problem zu kümmern.

Stichwort (ich wiederhole mich): Worin besteht eigentlich Dein Problem? Das habe ich nämlich auch nicht so ganz gefressen.

MfG

Ich frage mich wieso man für diesen Sensor eine Bibliothek braucht.

Der GP2Y0A21YK0F gibt eine Analogspannung aus, die proportional zum Abstand des detektierten Objekts ist.
Der Meßbereich ist 10 bis 80 cm.
Bei 80 cm ist die Ausgangsspannung typisch 0,4V, bei 10 cm typisch 2,3V
Du kannst die Spannung mittels eines analogen Eingangs messen und in eine Distanz umformen. Achtung: Außerhalb der Distanz 10 bis 80 cm ist die Ausgangsspannung nicht dem Abstand proportional.

Zu Umrechnung von ADC zu cm:

int reading = analogRead(A0);
int calculated = (6762/(reading-9))-4;

Dann müßte keine Latenz oder Verzögerung mehr sein.

Grüße Uwe

postmaster-ino:
Hi

Der Sketch liest sich grausig, drücke Mal STRG+T in der IDE, Das rückt zumindest den Code nach der Klammerebene ein.
Stichwort: Warum eine weitere Klammer in loop?

Weiter wirst Du massiv Probleme bekommen, wenn Du deine Tastatur nicht bald repariert bekommst - C++ ist nämlich "case sensitive".

Wenn wir es Dir nicht wert sind, große Buchstaben in Deinem Geschreibsel finden zu dürfen, muß ich mir schwer überlegen, ob Du es mir wert bist, mich um Dein Problem zu kümmern.

Stichwort (ich wiederhole mich): Worin besteht eigentlich Dein Problem? Das habe ich nämlich auch nicht so ganz gefressen.

MfG

Sorry Ich war Beruflich unterwegs.Ich kann auch auf groß und kleinschreibung achten. :wink:

Die weitere Klammer im Loop ist damit es funktioniert,ansonsten bekomm ich probleme mit dem if.

ich hab das bereits geändert und es hatte fuktioniert das er jede sekunde mist bei 144 Led. und als ich es für mein Kleiderschrank angepasst (470Led´s) habe, hatte ich alle nur 4 sekunden die messwerte

den Code lade ich gleich Hoch

 #include <SharpIR.h>
#include <Adafruit_NeoPixel.h>
#define NUMPIXELS 470


int PIN = 6;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int brightness = 255;
SharpIR sensor( SharpIR::GP2Y0A21YK0F, A0 );
void setup()
{
  strip.setBrightness(brightness);
  Serial.begin( 9600 );
  strip.begin();
  strip.show();
}

void loop() {
  {
    int distance = sensor.getDistance();
    Serial.println( distance );

  }
  int distance = sensor.getDistance();

  if (distance <= 15)
  {
    TurnSignal1(); //

  } else {
    colorWipe(strip.Color(255, 255, 255), 50); //
  }
}

void colorWipe(uint32_t c, uint8_t wait) {
  //Ascend strip
  for (int i = NUMPIXELS / 2; i >= 0; i--) {
    //for (int i = 0; i < (NUMPIXELS / 2) + 1; i++) {
    strip.setPixelColor(i, c);
    strip.show();

    strip.setPixelColor(NUMPIXELS - i, c);
    strip.show();
  }
}
void TurnSignal1() {

  // Descend Strip
  for (int i = NUMPIXELS / 2 ; i >= 0; i--) {
    //for (int i = 0; i < (NUMPIXELS / 2) + 1; i++) {
    strip.setPixelColor(i, strip.Color(0, 0, 0));
    strip.setPixelColor(NUMPIXELS - i, strip.Color(0, 0, 0));
    strip.show();

  }

}

Andreas87:
Sorry Ich war Beruflich unterwegs.Ich kann auch auf groß und kleinschreibung achten. :wink:

Nicht wirklich.

Gruß Tommy

Tommy56:
Nicht wirklich.

Gruß Tommy

Ach na nu wollen Wir mal nicht kleinig werden;)

[OT]

Groß- und Kleinschreibung ist manchmal sogar für den Sinn wichtig, wie bei "helft den armen vögeln". :wink:

[/OT]

Ja das stimmt wohl,aber es hilft mir noch nicht bei meinem Problem;).
Hat jemand ein lösungvorschlag?

Wenn Du es so willst, dann halt nur einen kleinen

lösungvorschlag

:

Das liegt an den vielen delays.

Gruß Tommy

Tommy56:
Wenn Du es so willst, dann halt nur einen kleinen :

Das liegt an den vielen delays.

Gruß Tommy

Lach ich achte darauf immer nicht so.

Es ist doch nur ein delay drin und das ist beim colorWipe

Und warum ändert sich je nach Pixelmenge das Tempo im Serillen Monitor?
Hast es mal ausprobiert?

Das aber in einer Schleife, die Du auch nicht brauchst. Du hast doch loop. Schau Dir mal BlinkWithoutDelay an.

Gruß Tommy

#include <SharpIR.h>
#include <Adafruit_NeoPixel.h>
#define NUMPIXELS 470
SharpIR sensor( SharpIR::GP2Y0A21YK0F, A0 );

int PIN = 6;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int brightness = 255;
unsigned long previousMillis = 0;
const long interval = 1000;

void setup()
{
  strip.setBrightness(brightness);
  Serial.begin( 9600 );
  strip.begin();
  strip.show();
}

void loop() {
  int distance = sensor.getDistance();
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    Serial.println( distance );
  }
  if (distance <= 15)
  {
 TurnSignal();

  } else {
    colorWipe(strip.Color(255, 255, 255), 50); //
  }

}

void colorWipe(uint32_t c, uint8_t wait) {
  //Ascend strip
  for (int i = NUMPIXELS / 2; i >= 0; i--) {
    //for (int i = 0; i < (NUMPIXELS / 2) + 1; i++) {
    strip.setPixelColor(i, c);
    strip.show();

    strip.setPixelColor(NUMPIXELS - i, c);
    strip.show();
  }
}
void TurnSignal() {

  // Descend Strip
  for (int i = NUMPIXELS / 2 ; i >= 0; i--) {
    //for (int i = 0; i < (NUMPIXELS / 2) + 1; i++) {
    strip.setPixelColor(i, strip.Color(0, 0, 0));
    strip.setPixelColor(NUMPIXELS - i, strip.Color(0, 0, 0));
    strip.show();

  }

}

hey Leute,Ich hab das jetzt mal versucht. Das ist dabei herausgekommen. es funktioniert nicht. hab ich da was falsch gemacht?

uwefed:
Ich frage mich wieso man für diesen Sensor eine Bibliothek braucht.

Der GP2Y0A21YK0F gibt eine Analogspannung aus, die proportional zum Abstand des detektierten Objekts ist.
Der Meßbereich ist 10 bis 80 cm.
Bei 80 cm ist die Ausgangsspannung typisch 0,4V, bei 10 cm typisch 2,3V
Du kannst die Spannung mittels eines analogen Eingangs messen und in eine Distanz umformen. Achtung: Außerhalb der Distanz 10 bis 80 cm ist die Ausgangsspannung nicht dem Abstand proportional.

Zu Umrechnung von ADC zu cm:

int reading = analogRead(A0);

int calculated = (6762/(reading-9))-4;





Dann müßte keine Latenz oder Verzögerung mehr sein.

Grüße Uwe

Hallo Uwe das hat leider nicht geklappt. es hatte sich nichts geändert

Hi

Wenn der Sensor nicht so arbeitet, wie's im Datenblatt beschrieben ist, wird wohl der Sensor hin sein.
Nicht auszuschließen ist auch eine Fehlverkabelung.

Wie Dem auch sei, zumindest halbwegs sollte der Sensor dem Datenblatt folgen - es hat sich Nichts geändert.

MfG

Der sensor arbeitet ja Fehlerfrei.
ich hab das schon ein sketch wo nur der sensor liest und mit den millis()das funktioniert.
wenn ich das TurnSignal(); im loop rausnehme und dafür strip.clear einsetze denn misst er zeitlich richtig
nur denn geht der Strip im else nicht an.
verstehst du wie ich das meine?
Ist das mit den millis() denn so richtig?

Was ist eigentlich das Ziel Deines Tuns?

Du mißt eine Entfernung und machst dann was mit LEDs, aber wie soll das aussehen?

Wenn der Abstand größer als 15 ist sollen die Led´s von Innen nach Außen angehen und wenn der Wert kleiner ist als 15 sollen die von Innen nach Außen ausgehen.
Das Ding ist einfach nur,ich hab 470 Led`s im Kleiderschrank verbaut und wenn Ich statt 470 nur 200 Led´s ansteuere denn misst er schneller.

Je mehr Led´s desto langsamer misst er
bei 200 Led´s= alle 0,5 sek. wird gemessen
bei 470Led´s= alle 3-4 sek. wird gemessen

und je länger er brauch desto später geht der kleiderschrank an