Go Down

Topic: NeoPixel Thermometer Problemchen (Read 215 times) previous topic - next topic

ErzEngel

Hallo liebe Community,
ich möchte hier auf Eure Hilfe zurückgreifen, da ich ein Problem mit meinem NeoPixel-Thermometer habe.

Die Messung funktioniert und der NeoPixel zeigt mir es auch farblich an, aber nur an 5 von 16 LED´s

Folgende Situation mit Erhöhung der Temperatur:
LED 1: Blau
LED 2: Türkis
LED 3: Grün
LED 4: Gelb
LED 5: Rot

LED 6: Rosa
LED 7: Blau
LED 8: Türkis

usw. bis LED 16

Ich wollte aber, dass das Farbspektrum über die 16 LED´s geht und die letzte Rot leuchtet

Könnt Ihr mir bitte sagen wo ich da den Bock abgeschossen habe :)

Danke schon mal und Grüße

ErzEngel
Code: [Select]
#include <Adafruit_NeoPixel.h>
#define NUM_PIXEL 16
#define DATA_PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXEL, DATA_PIN, NEO_GRB + NEO_KHZ800);

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

#define led 13

void setup(void) {
  strip.begin();
  clearStrip();
  sensors.begin();
  pinMode(led, OUTPUT);

}
 


void loop(void) {
  int i = map(analogRead(A0),0,1023,5,255); //LDR Analog Lesen und Mappen und i den Wert übergeben
  strip.setBrightness(i);
 
  digitalWrite(led, LOW);
  sensors.requestTemperatures();
  float temp = (sensors.getTempCByIndex(0)); 
  digitalWrite(led, HIGH);
 
  //Temperatur umlegen auf Strip (Mapping) ###########################################
    int t = map(temp, 20, 60, 1, NUM_PIXEL); // (min temperatur, max temperatur, min Pixel, max Pixel)
    clearStrip();
    for(uint16_t L = 0; L<t; L++) {
   
      strip.setPixelColor(L,wheel(((170+(L*42)) & 255))); //Farbverlauf von Blau (kalt) nach Grün (ok) zu Rot (warm), erster Wert hier 170 = startfarbe, zweiter Wert hier 42 = endfarbe
  }
  strip.show(); // Ausgabe auf Strip
  delay(50);
}

//Farbrad################################################################
uint32_t wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
  else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

//Strip ablöschen########################################################
void clearStrip(){
  for(int i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, 0);
  }
}

Tommy56

Gib doch erst einmal zum Testen die Werte auf den Strip und schaue, ob die Farben so sind, wie Du Dir das vorstellst.
Danach weißt Du, ob er Fehler in der Farbbereitstellung oder in der Messung liegt.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

ErzEngel

Hallo Thommy,
vielen Dank für Deine Antwort.
Ich hab die Tempmessung im Monitor schreiben lassen, passt.
Der Fehler muss in der Aufteilung der LED´s liegen.
Da dies mein erstes Projekt mit NeoPixel ist muss ich mich da noch tiefer einfuchsen.

Erstmal Dank und Grüße

ErzEngel

agmue

Die Bibliothek FastLed kennt das Farbmodell HSV mit Regenbogenfarben, da ist der Farbwert nur eine Variable.

Anstelle NeoPixel habe ich DotStar und die Temperatur mit einem Poti simuliert:

Code: [Select]
#include "FastLED.h"
FASTLED_USING_NAMESPACE
//#define DATA_PIN    4      // MOSI Pin11
//#define CLK_PIN     5      // ACK  Pin13
#define LED_TYPE    APA102
#define COLOR_ORDER BGR
#define BRIGHTNESS  64
#define NUM_LEDS    122

CRGB leds[NUM_LEDS];

void setup() {
  // FastLED.addLeds<LED_TYPE, DATA_PIN, CLK_PIN, COLOR_ORDER, SPI_HZ>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.addLeds<LED_TYPE, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  LEDS.showColor(CRGB(0, 0, 0));
}

void loop()
{
  uint16_t wert = analogRead(A0)/64;
  byte dothue = 160;
  for ( int i = 0; i < 16; i++) {
    if (wert >= i)
    {
      leds[i] = CHSV(dothue, 255, 255);
    } else {
      leds[i] = CHSV(dothue, 0, 0);
    }
    dothue -= 10;
  }
  FastLED.show();
}


Du kannst die Farben auch in einem Feld speichern und über den Index darauf zugreifen. Siehe Predefined colors list.

Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

ErzEngel

Hallo zusammen,
hab´s hinbekommen, der Fehler lag darin, das die Endposition der LED´s falsch deklariert war.
Jetzt funktioniert alles so wie es soll.

Besten Dank nochmal an Euch

Grüße
ErzEngel

Go Up