Go Down

Topic: RGB-LED Strip als Temperaturanzeige (Read 980 times) previous topic - next topic

maxmaschine

Ok, das werde ich dann mal testen.

versuche dann auch gleich mal den DHT22 einzubauen... mal sehen ob es funktioniert.

Da ich nur den WS2801 derzeit habe, werde ich entweder ohne LED testen (nur serieller Monitor) oder den WS2801 auch versuchen einzubauen!

Ich denke, dass es zuerst wichtig ist am Seriellen Monitor die Funktion des DHT22 lauffähig zu bekommen.
Zusätzlich kann ich mir ohne Strip auch das ext. Netzteil vorerst sparen  ;)  ;)

Danke dir

Bis später
Max

maxmaschine

...jetzt habe ich doch noch gleich eine Frage:


den DHT22 habe ich mal wie beschrieben eingebunden.

Code: [Select]
#include "cactus_io_DHT22.h"      // Includes für Temp-Sensor:
#define DHT22_PIN 4               // Data-Pin des Temp-Sensors:
DHT22 dht(DHT22_PIN);             // Sensor initialisieren:


nun habe ich aber das Problem, wo ich dht.temperature_C einsetze?

Überall wo bei dir der potTemp eingesetzt ist, natürlich mit Pin = 4

Code: [Select]
void ColorModusTemperature() {
  const uint32_t anzeigeintervall = 1000; // in Millisekunden
  static uint32_t vorhin = 0;
  if (millis() - vorhin >= anzeigeintervall) {
    vorhin = millis();
    const byte potTempPin = A0;
    uint16_t potTemp   = analogRead(potTempPin); // Zehntel Grad C

    // Gemessene Werte auf seriellen Monitor ausgeben:
    Serial.print("Temp: "); Serial.print(potTemp / 10.0, 1); Serial.print(" *C\t");

    uint16_t T     = potTemp;  // Zehntel Grad C
    uint16_t Tmin  = 100;      // Zehntel Grad C
    uint16_t Tmax  = 350;      // Zehntel Grad C


oder muss ich da noch mehr aus dem ursprünglichen Code rausholen?

agmue

cactus_io_DHT22.h ist keine mir bekannte Datei.

Man muß mit dht.readTemperature(); erst messen und dann den Meßwert mittels wert = dht.temperature_C; in eine Variable übertragen.

Eventuell also uint16_t potTemp = 10 * dht.temperature_C; // Zehntel Grad C

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

maxmaschine

 :smiley-confuse: ...ok , ich sehe schon; das wird Wochen dauern... aber man lernt dadurch auch was.  :)

Ich sehe gerade dass der WS2815 ein 12V Strip ist. Dann muss ich auf jeden mit Netzteil arbeiten.

Wie wird der dann an Nano angeschlossen?
Grün = PIN 11
Blau = offen
Rot+ und Weiß- = ext. Netz 12V
Masse ext. Netz und GND verbinden?

agmue

:smiley-confuse: ...ok , ich sehe schon; das wird Wochen dauern... aber man lernt dadurch auch was.  :)
Deswegen machst Du das doch  ;D

Ich sehe gerade dass der WS2815 ein 12V Strip ist. Dann muss ich auf jeden mit Netzteil arbeiten.

Wie wird der dann an Nano angeschlossen?
Grün = Widerstand - PIN 11
Blau = GND
Rot = 12 V Netzteil
Weiß = GND Netzteil und Nano

Vorteil ist der geringere Strom von maximal 10 - 15 mA gegenüber 60 mA je Pixel. Das bringt Dir bei 32 Pixeln aber keinen Vorteil.

Ändere einfach die ersten Zeilen auf Deinen Typ.

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

maxmaschine

Deswegen machst Du das doch  ;D
klar, man lernt nie aus! ;)

Grün = Widerstand - PIN 11

Ändere einfach die ersten Zeilen auf Deinen Typ.

welchen R-Wert setze ich ein? bzw. wie berechne ich diesen?
das gilt ja wahrscheinlich auch wenn ich auf den WS2801 ändere?

agmue

welchen R-Wert setze ich ein? bzw. wie berechne ich diesen?
Adafruit verwendet ungefähr 470 Ω. Adafruit NeoPixel Überguide (Die Dame mit den farbigen Haaren ist die Cheffin, sie nennt sich nach Lady Ada Lovelace)

das gilt ja wahrscheinlich auch wenn ich auf den WS2801 ändere?
Ja, für Daten und Takt!

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

maxmaschine

Hallo agmue,

erst mal die supergute Nachricht!  :)

Das Programm läuft:
muss noch ein paar Feinabtimmungen machen, was die Temperatur und die Farben betrifft, aber grundsätzlich funkt das Ganze  :D


Hab mir nun doch noch einen 5M/60 Strip vom WS2815 geleistet und das ganze auf den DHT22 umgeschrieben.

Wenn es interessiert kann ich den Code hier gerne einstellen!?!

Habe aber dennoch ein-zwei Fragen, die noch offen sind.
da ich den WS2801 ja schon habe, würde ich diesen gerne an anderer Stelle einsetzen.
hatte vorhin versucht, das Ganze auf 5V mit dem WS2801 in Gang zu bekommen.

Habe dann aber in der Zeile
Code: [Select]
    Serial.print("R = "); Serial.print(r); Serial.print("\t");
    Serial.print("G = "); Serial.print(g); Serial.print("\t");
    Serial.print("B = "); Serial.print(b); Serial.print("\t\n");
    strip.fill(strip.Color(r , g , b ), 0, strip.numPixels());
    strip.show();   // write all the pixels out
  }

die Fehlermeldung bekommen, dass "fill" beim WS2801 nicht genutzt werden kann.

die Originalzeile für den WS2801 war mit strip.setPixelColor geschrieben:
Code: [Select]
strip.setPixelColor(i, Color(potBright * potRed / 255, potBright * potGreen / 255, potBright * potBlue / 255));
      strip.show();


nun habe ich keine Doku zum WS2801, so dass ich das Passende heraussuchen könnte.
Da ich keine potBright/potRed/potGreen/potBlue verbaut habe und auch nicht verwende, stellt das ein Problem dar.

1. Weis du was ich hier einsetzen kann und wie der Code dazu aussehen müsste?


2. Beim Aufbau mit den WS2815 und 12V Versorgung habe ich nach kurzer Zeit festgestellt, dass der Strip richtig gut warm wird... sicherlich muss ich in die Zuleitung ±5V hier noch einen Vorwiderstand setzen? Oder werden die LED grundsätzlich so warm, wenn sie noch auf der Spule sind?

Am am PWM Pin11 habe ich einen 470 Ohm gesetzt und die Blaue-Leitung auf Masse gesetzt.


Cu
Max  :smiley-cool:


maxmaschine

#23
Jul 07, 2020, 12:17 pm Last Edit: Jul 07, 2020, 12:23 pm by maxmaschine
Hallo agmue,
Hallo zusammen,

ich habe jetzt ein bisschen experimentiert und bin nun an die Grenzen meiner Kenntnisse (C++) gestoßen!
Ich wollte hier mehrere Bedingungen mit if else lösen, bekomme aber immer eine Fehlermeldung!

hier der Code und die Fehlermeldung, vielleicht kann mir jemand weiter helfen, wie ich die Aufgabe lösen kann?
Danke schon mal.

Code: [Select]
uint16_t T = potTemp;      // Zehntel Grad C
    uint16_t Tcool = 250;      // Zehntel Grad C
    uint16_t Tmin = 310;       // Zehntel Grad C
    uint16_t Tmax = 420;       // Zehntel Grad C
    uint16_t Thot = 480;       // Zehntel Grad C

    byte r = 0;
    byte g = 0;
    byte b = 0;

    // - Lineare Verläufe:
    // - Unter Tcool = Farbe Aqua           (aqua   0,255,255)
    // - zwischen Tcool Aqua und Tmin Blau  (aqua   0,255,255 -> blue   0,0,255)
    // - Bei Tmin = Farbe Blau              (blue   0,0,255)
    // - zwischen Tmin Blau und Tmax Rot    (blue   0,0,255   -> red    255,0,0)
    // - Bei Tmax = Farbe Rot               (red    255,0,0)
    // - zwischen Tmax Rot und Thot Gelb    (red    255,0,0   -> yellow 0,255,0)
    // - Über Tmax ist die Farbe Lime       (yellow 0,255,0)

    if (T < Tcool) {
      r = 0;
      g = 255;
      b = 255;
    }
    
    else if (T > Thot) {
      r = 0;
      g = 255;
      b = 0;
    }
    
    else if {
      r = 0;
      g = 255 * (Tmin - T) / (Tmin - Tcool);    // wird schwächer -> linearer Verlauf von Aqua zu Blau
      b = 255 * (T - Tcool) / (Tmin - Tcool);   // wird stärker
    }
    
    else if {
      r = 255 * (T - Tmin) / (Tmax - Tmin);    // wird stärker -> linearer Verlauf von Blau zu Rot
      g = 0;
      b = 255 * (Tmax - T) / (Tmax - Tmin);    // wird schwächer
    }
    
    else {
      r = 255 *  (Thot - T) / (Thot - Tmax);   // wird schwächer -> linearer Verlauf von Rot zu Gelb
      g = 255 * (T - Tmax) / (Thot - Tmax);    // wird stärker
      b = 0;
    }



Die Fehlermeldung lautet:
Code: [Select]

\\.............\My Documents\Arduino\Nano_DHT22_WS2815\Nano_DHT22_WS2815.ino: In function 'void ColorModusTemperature()':

Nano_DHT22_WS2815:108:13: error: expected '(' before '{' token

    else if {

            ^

Nano_DHT22_WS2815:114:5: error: expected '}' before 'else'

    else if {

    ^~~~

Nano_DHT22_WS2815:114:13: error: expected '(' before '{' token

    else if {

            ^

Nano_DHT22_WS2815:120:5: error: 'else' without a previous 'if'

    else {

    ^~~~

Nano_DHT22_WS2815:121:7: error: 'r' was not declared in this scope

      r = 255 *  (Thot - T) / (Thot - Tmax);   // wird schwächer -> linearer Verlauf von Rot zu Gelb

      ^

Nano_DHT22_WS2815:121:19: error: 'Thot' was not declared in this scope

      r = 255 *  (Thot - T) / (Thot - Tmax);   // wird schwächer -> linearer Verlauf von Rot zu Gelb

                  ^~~~

\\........\My Documents\Arduino\Nano_DHT22_WS2815\Nano_DHT22_WS2815.ino:121:19: note: suggested alternative: 'dht'

      r = 255 *  (Thot - T) / (Thot - Tmax);   // wird schwächer -> linearer Verlauf von Rot zu Gelb

                  ^~~~

                  dht

Nano_DHT22_WS2815:121:26: error: 'T' was not declared in this scope

      r = 255 *  (Thot - T) / (Thot - Tmax);   // wird schwächer -> linearer Verlauf von Rot zu Gelb

                         ^

Nano_DHT22_WS2815:121:39: error: 'Tmax' was not declared in this scope

      r = 255 *  (Thot - T) / (Thot - Tmax);   // wird schwächer -> linearer Verlauf von Rot zu Gelb

                                      ^~~~

\\..........\My Documents\Arduino\Nano_DHT22_WS2815\Nano_DHT22_WS2815.ino:121:39: note: suggested alternative: 'fmax'

      r = 255 *  (Thot - T) / (Thot - Tmax);   // wird schwächer -> linearer Verlauf von Rot zu Gelb

                                      ^~~~

                                      fmax

Nano_DHT22_WS2815:122:7: error: 'g' was not declared in this scope

      g = 255 * (T - Tmax) / (Thot - Tmax);    // wird stärker

      ^

Nano_DHT22_WS2815:123:7: error: 'b' was not declared in this scope

      b = 0;

      ^

Nano_DHT22_WS2815:127:40: error: 'r' was not declared in this scope

    Serial.print("R = "); Serial.print(r); Serial.print("\t");

                                       ^

Nano_DHT22_WS2815:128:40: error: 'g' was not declared in this scope

    Serial.print("G = "); Serial.print(g); Serial.print("\t");

                                       ^

Nano_DHT22_WS2815:129:40: error: 'b' was not declared in this scope

    Serial.print("B = "); Serial.print(b); Serial.print("\t\n");

                                       ^

\\...........\My Documents\Arduino\Nano_DHT22_WS2815\Nano_DHT22_WS2815.ino: At global scope:

Nano_DHT22_WS2815:133:1: error: expected declaration before '}' token

}

^

exit status 1
expected '(' before '{' token




Tommy56

Klar. Zu jedem if gehört eine Bedingung in Klammern:

Code: [Select]

if (bedingung) {
  mach was
}
else if (andere Bedingung) {
  mach was anderes
}



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

maxmaschine

#25
Jul 07, 2020, 12:27 pm Last Edit: Jul 07, 2020, 12:33 pm by maxmaschine
ok, das heißt aber, dass ich die 3 linearen Verläufe nicht unbedingt so lösen kann?
Da ich ja keine eindeutige Bedingung habe, sondern ein die sich verändert???


Bzw. die frage lautet: Wie bekomme ich den Verlauf

      r = 0;
      g = 255 * (Tmin - T) / (Tmin - Tcool);
      b = 255 * (T - Tcool) / (Tmin - Tcool);

dann in die (andere Bedingung) nach else if???

agmue

Strg+t hilft, den Text und die Gedanken zu ordnen:

Code: [Select]
uint16_t T = potTemp;      // Zehntel Grad C
uint16_t Tcool = 250;      // Zehntel Grad C
uint16_t Tmin = 310;       // Zehntel Grad C
uint16_t Tmax = 420;       // Zehntel Grad C
uint16_t Thot = 480;       // Zehntel Grad C

byte r = 0;
byte g = 0;
byte b = 0;

// - Lineare Verläufe:
// - Unter Tcool = Farbe Aqua           (aqua   0,255,255)
// - zwischen Tcool Aqua und Tmin Blau  (aqua   0,255,255 -> blue   0,0,255)
// - Bei Tmin = Farbe Blau              (blue   0,0,255)
// - zwischen Tmin Blau und Tmax Rot    (blue   0,0,255   -> red    255,0,0)
// - Bei Tmax = Farbe Rot               (red    255,0,0)
// - zwischen Tmax Rot und Thot Gelb    (red    255,0,0   -> yellow 0,255,0)
// - Über Tmax ist die Farbe Lime       (yellow 0,255,0)

if (T < Tcool)
{
  r = 0;
  g = 255;
  b = 255;
}
else if (T > Thot)
{
  r = 0;
  g = 255;
  b = 0;
}
else if ( HIER FEHLT EINE BEDINGUNG )
{
  r = 0;
  g = 255 * (Tmin - T) / (Tmin - Tcool);    // wird schwächer -> linearer Verlauf von Aqua zu Blau
  b = 255 * (T - Tcool) / (Tmin - Tcool);   // wird stärker
}

else if ( HIER FEHLT EINE BEDINGUNG )
{
  r = 255 * (T - Tmin) / (Tmax - Tmin);    // wird stärker -> linearer Verlauf von Blau zu Rot
  g = 0;
  b = 255 * (Tmax - T) / (Tmax - Tmin);    // wird schwächer
}
else
{
  r = 255 *  (Thot - T) / (Thot - Tmax);   // wird schwächer -> linearer Verlauf von Rot zu Gelb
  g = 255 * (T - Tmax) / (Thot - Tmax);    // wird stärker
  b = 0;
}
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

maxmaschine

Hallo zusammen,

ich habe einige Experimente am WE erfolgreich durchgeführt und komme den 3 Farbverläufen immer näher.
Daher an dieser Stelle schon meinen herzlichen Dank an die netten Unterstützer.


Dennoch schein was passiert zu sein!
Seit gestern bekomme ich meine Mega nicht mehr am Com-Port angezeigt.
Auch an einer anderen USB wird er nicht erkannt.
Daraufhin habe ich einen Nano an der bisherigen USB angeschlossen.
Der wurde sofort erkannt und ich konnte auf ihn zugreifen.

Am Mega hatte ich kein ext. Netzteil, da ich nur mit 2 LED-Pixel meine Schaltung aufgebaut hatte.

Kann es sein, dass am Mega nun die USB-Schnittstelle abgefackelt ist?
Kann ich softwareseitig noch etwas versuchen um hier sicher zu gehen, bevor ich den Mega als Lehrgeld verbuche?

Danke schon mal für die Unterstützung!

Gruß
Max

noiasca

#28
Jul 13, 2020, 12:25 pm Last Edit: Jul 13, 2020, 12:26 pm by noiasca
Möglich ist alles.
Wir sehen ja nicht was du gemacht hast.
Wegwerfen würde ich ihn nicht.
Ab damit in die Bastelkiste. Vieleicht besorgst dir mal einen ISP Programmierer, dann probierst ihn wieder mit einem Blinksketch.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

agmue

Du könntest den Nano zum Programmieren des Megas verwenden und mal schauen, ob ein Programm noch läuft. Dann könntest Du den Mega für ein Projekt verwenden, wo USB nicht benötigt wird.

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Go Up