Arduino Forum

International => Deutsch => Topic started by: ErzEngel on Mar 29, 2019, 07:33 pm

Title: NeoPixel Thermometer Problemchen
Post by: ErzEngel on Mar 29, 2019, 07:33 pm
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);
  }
}
Title: Re: NeoPixel Thermometer Problemchen
Post by: Tommy56 on Mar 29, 2019, 07:37 pm
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
Title: Re: NeoPixel Thermometer Problemchen
Post by: ErzEngel on Mar 30, 2019, 12:04 pm
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
Title: Re: NeoPixel Thermometer Problemchen
Post by: agmue on Mar 30, 2019, 09:51 pm
Die Bibliothek FastLed kennt das Farbmodell HSV (https://github.com/FastLED/FastLED/wiki/FastLED-HSV-Colors) 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 (https://github.com/FastLED/FastLED/wiki/Pixel-reference).

Title: Re: NeoPixel Thermometer Problemchen
Post by: ErzEngel on Mar 31, 2019, 03:00 pm
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