Forum: Mikrocontroller und Digitale Elektronik ESP8266 mit Feuchtesensor und LED WS2812b Ring 16 Bit


von Thorsten A. (hitman47nl)


Lesenswert?

Hallo zusammen und Frohe Weihnachten,

Ich hab einen Wemos D1 mini (esp8266) mit Capacitive Soil Moisture 
Sensor am laufen funktioniert wunderbar. Nun bin ich auf ein Video  bei 
Youtube gestossen wo ein LDE WS2812B 16 bit ring verwendet wird zur 
anzeige. Dachte ich mir das moechtest auch. Der POrogramm-Code wird zum 
Download bereit gestellt.

Das problem ist das er bei mir nicht richtig funktioniert egal was ich 
mache.
Wenn ich den Sensor in ein wasserglas stelle hat er vollen Ausschlag was 
er in der Konsole auch anzeigt denn mit den Werten lief er ja schon bei 
mir.
Wenn der Wert (sensor im Glas) max hat dann sollen alle LED's angehen 
aber es gehen nur 8 an obwohl 16 definiert sind und wenn der wert min 
ist bleiben noch 1-2 an.
1
#include <Adafruit_NeoPixel.h> //Einbinden der Adafruit Bibliothek (quasi der Werkzeugkasten um die LED anzusteuern)
2
3
#define PIN            2 //Definiere PIN LED Anschluss
4
#define NUMPIXELS      16 //Definiere Anzahl LEDs
5
6
const int sensorPin = A0; //Definiere PIN Sensor
7
float sensorValue; //Variable anlegen um Sensorwert später zu speichern
8
int ledanzahl = 0; //Variable anlegen um Anzahl der LEDs die leuchten sollen zu speichern
9
10
Adafruit_NeoPixel led = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); //LED Ring Objekt anlegen
11
long green_color; //Variable für Farbe Grün
12
long black_color; //Variable für Farbe Schwarz
13
14
void setup() {
15
  Serial.begin(115200); //Starten des Seriellen Monitors mit gängiger Baudrate
16
  led.begin(); //LED aktivieren (initialisieren)
17
}
18
19
void loop() {
20
  sensorValue = analogRead(sensorPin); //Sensorwert auslesen Befehl für AD Wandler input
21
  Serial.println(sensorValue); //Sensorwert im Seriellen Monitor anzeigen
22
  
23
  ledanzahl = sensorValue*(16/565.0); //Berechnen wie viele LEDs leuchten sollen
24
  
25
  delay(1000); //Warte eine Sekunde
26
27
  green_color = led.Color(0, 50, 0); //Grüne Farbe anlegen
28
  black_color = led.Color(255, 0, 0); // Schwarze Farbe anlegen
29
30
  for (int i = 0; i < 16; i++) { //Schleife von 0 bis 15 (16-mal durchlaufen)
31
    if(i < ledanzahl){ //Wenn dann Bedinngung, wenn i kleiner als die berechnete LED Anzahl ist, wird die LED auf Grün gesetzt
32
    led.setPixelColor(i, green_color); //Setze die i-te LED auf Grün
33
    }else{
34
      led.setPixelColor(i, black_color); //Wenn Bedinnung (oben) nicht erfüllt setze die i-te LED auf Schwarz
35
    }
36
  }
37
  led.show(); //Lasse die LEDs in den Farben leuchten
38
39
}



Hier der link zum Video:
https://youtu.be/Fufts00WhvI

Vielleicht weis jemand was da faul ist

Gruss hitman47nl

[Mod: C-Tags korrigiert]

: Bearbeitet durch Moderator
von Rahul D. (rahul)


Lesenswert?

Lass dir doch einfach auch mal "ledanzahl" im Monitor ausgeben.
De beiden Farben brauchst du dir auch nicht jedes Mal berechnen lassen.
==> Berechnung ins Setup verschieben.
Das Delay solltest du ans Ende der Schleife packen.

von Rainer W. (rawi)


Lesenswert?

Thorsten A. schrieb:
> Wenn der Wert (sensor im Glas) max hat dann sollen alle LED's angehen
> aber es gehen nur 8 an obwohl 16 definiert sind und wenn der wert min
> ist bleiben noch 1-2 an.

Dann passt deine Umrechnung des Sensorwertes auf die Anzahl der LEDs 
noch nicht.

Sind deine Konstanten (?) EO_GRB und NEO_KHZ800 passend zu deinem Sensor 
definiert?

Woher kommen in Zeile 23 die magischen Zahlen?
> ledanzahl = sensorValue*(16/565.0);
Die werden wohl nicht zu deinem Sensor passen. Möglicherweise musst du 
auch noch einen Offset kompensieren.
Lege eine Tabelle für sensorValue bei verschiedenen Füllständen an und 
wenn du die kennst, kannst du die Umrechnung auf die Anzahl der LEDs 
festlegen.

Warum verwendest du nicht die in Zeile 4 definierte Anzahl der Pixel?

: Bearbeitet durch User
von Thorsten A. (hitman47nl)


Lesenswert?

hab den sensor ja schon seit letztem jahr laufen und das ist der Wert 
der ausgegeben wird wenn die pflanze trocken ist also kein Wasser ( 0%) 
mehr hat. Wenn die Pflanze gegossen ist liegt 100%  ca bei 309. Eeal was 
ich eingebe die Werte Aender oder die Farbe tausche kommt dabei nix raus 
es sind immer zu wenig bis keine LED an.

Bin gaz ehrlich das script habe ich laut dem Video runtergeladen und 
ausprobiert und mochte es anpassen progreammiert habe ich es nicht 
selber aber moechte es nutzen weil die Idee ist sehr gut.

WQerde es gleich nochmal testen hatte mit einem Glas wasser geteste und 
nicht mit der Pflanze.

Gruss Thorsten A.

: Bearbeitet durch User
von Rahul D. (rahul)


Lesenswert?

Thorsten A. schrieb:
> 25.12.2023 10:30:
>     Bearbeitet durch User

aber nicht vollständig...

Thorsten A. schrieb:
> Bin gaz ehrlich das script habe ich laut dem Video runtergeladen und
> ausprobiert und mochte es anpassen progreammiert habe ich es nicht
> selber aber moechte es nutzen weil die Idee ist sehr gut.

ja, so lernt mal. Allerdings solltest du auch Tipps anderer annehmen, 
wenn du schon Fragen in einem Forums stellst.

von Thorsten A. (hitman47nl)


Lesenswert?

Das stimmt das hab ich auch
So hab Sensor kallibriert jeztz hat er einen max Wert von 651 und einen 
min Wert von 306

lese die ledanzahl aus und wenn der SAensor im wasser ist gibt er eine 
Ledanzahl von 8 aus was ja nicht richtig ist. Ist der sensor nicht im 
Wasser sind alle dunkel und er zeigt 16 an.

bin mit meinem Latein am ende aber nur so lernt man

von N. M. (mani)


Lesenswert?

Thorsten A. schrieb:
> lese die ledanzahl aus und wenn der SAensor im wasser ist gibt er eine
> Ledanzahl von 8 aus was ja nicht richtig ist. Ist der sensor nicht im
> Wasser sind alle dunkel und er zeigt 16 an.

Du hast mehrere Baustellen.
Also trenne dein Problem in 2 Teilaufgaben auf:
1) Gib eine Zahl von 0-16 im Code fest vor und überprüfe dass die 
richtige Anzahl an LEDs leuchtet.
Wenn das geht:
2) Stelle sicher dass mit deiner Schaltung der richtige Wert für die LED 
Anzahl berechnet wird. Stichwort Geradengleichung.

von Thorsten A. (hitman47nl)


Lesenswert?

ok werde es ueber die tage probieren und melde mich dann

deine hilfe finde ich echt gut ich kann soviel lernen darueber 
Dankeschoen :)

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Thorsten A. schrieb:

> Nun bin ich auf ein Video  bei
> Youtube gestossen wo ein LDE WS2812B 16 bit ring verwendet wird

Was, zum Teufel, soll ein "LDE WS2812B 16 bit ring" sein?

Vermutlich (nach sinngemäßer "Rückübersetzung" des sinnlos und 
automatisch von chinesisch nach englisch übersetzten Originals: Das sind 
einfach nur 16 WS2812B, die (mehr oder weniger zufällig) in einer 
Ringform angeordnet sind.

Sprich: alles, was in der Lage ist, >=16 WS2812B anzusteuern, sollte 
grundsätzlich benutzbar sein.

Machen (die konkret gewünschte Funktion damit umsetzen) musst du aber 
selber. Das nennt sich dann: Programmieren. Naja, zumindest ist sowas 
die ersten Anfänge davon.

von Michi S. (mista_s)


Lesenswert?

Thorsten A. schrieb:
> black_color = led.Color(255, 0, 0); // Schwarze Farbe anlegen

Das ist schon mal sicher nicht schwarz, sondern max. helles rot.
Sollte es bei Dir blau oder grün leuchten, dann paßt die Konstante 
NEO_GRB bei der Initialisierung nicht zu Deinen LEDs.


Thorsten A. schrieb:
> So hab Sensor kallibriert jeztz hat er einen
> max Wert von 651 und einen min Wert von 306

Wenn Du also von Deinem Sensorwert 306 subtrahierst, hast Du einen Wert 
von 0 bis 345, dann also noch durch 345.0 dividieren um einen Wert von 0 
bis 1 zu erhalten, den Du dann noch mit der Anzahl der LEDs 
multiplizierst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.