"Zapfanlage" mit RGB Ring

Hallo,

ich stelle mich erstmal vor:
Ich bin Roedler, 29 Jahre jung und gerade ganz frisch in Arduino eingestiegen.

Ich habe mir folgendes Projekt überlegt: Eine “Schnaps-Zapfanlage”

Dafür stelle ich mir das so vor, dass ich 2 “Ausläufe” habe.
Mit Taster um die Pumpe über ein Relais anzusteuern und Glaserkennung.

Unter jedem Glas ist ein 16 Bit LED Ring.

Das Programm stelle ich mir wie folgt vor:

Steht kein Glas auf dem Sensor, leuchten (unabhängig) voneinander die LED Ringe einfach Blau.

Stelle ich ein Glas auf den Sensor, soll der entsprechende LED Ring in Gelb im Kreis wandern.

Den Zapfvorgang starte ich mit einem Taster ( Die Pumpe wird nur angesteuert, wenn Glassensor schaltet und der Taster schaltet) und dabei soll der LED Ring rot pulsieren.
Lasse ich den Taster los, soll der LED Ring grün Leuchten ( Jede 2. LED ) Nehme ich das Glas weg, dann wieder Blau.

Ich bin mit dem Programm schon angefangen und ich glaube, ich habe zumindest schon einmal den Befehl drin, dass die LED Ringe Blau leuchten und wenn ein Glas auf den Sensor gestellt werden dann Gelb im Kreis laufen. Nehme ich das Glas wieder weg, sollte er wieder in Blau springen. ( Zumindest sagt das Programm keinen Fehler an )

Und den Befehl, für das Zapfen müsste ich auch schon richtig drin haben:)

Aber ich habe erhebliche Probleme ( Verständnisprobleme ) die LED Ringe da mit der Adafruit Bibliothek einzubinden.

Einen Ausgang einbinden habe ich schon hinbekommen.

Jetzt ist die Frage - Wie kann ich dem Programm sagen, dass ich 2 LED Ringe habe? Muss ich die Bibliothek doppelt integrieren oder wie funktioniert das ?

Mit dem Pulsieren habe ich auch noch keine Lösung gefunden.

Ich möchte hier auch nicht nach einem fertigen Sketch betteln. Das würde den “Lerneffekt” ja versauen.

Aber vielleicht hat jemand den ein oder anderen Lösungsansatz für mich, der mir hilft?

Für das Pulsieren, dass man vielleicht eine IF abfrage mit der FOR abfrage verbinden kann? ( Wenn der Glassensor schaltet, fange an endlos im Kreis zu drehen, wenn der Taster dazu gedrückt wird, wechsel auf Rot und pulsiere . ) Aber wie realisiere ich jetzt, dass wenn ich jetzt den Taster wieder loslasse, dass der Ring dann grün blinkt? Und wenn ihc das Glas wegnehme wieder in Anfang springt?

Das mit dem Anfang müsste ich ja mit dem IF und For oben im Sketch schon haben oder?

Ich hoffe, ich werde nicht gleich zerlegt hier und bekomme etwas Hilfe.

LG

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define NUMPIXELS 16
#define PIN 8
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);





// Umbenennung der Pin-Belegung

int pumpe1 = 2;
int pumpe2 = 3;
int taster1 = 4;
int taster2 = 5;
int glas1 = 6;
int glas2 = 7;
int ledring1 = 8;
int ledring2 = 9;
int tasterstatus1 = 0;
int tasterstatus2 = 0;
int glasstatus1 = 0;
int glasstatus2 = 0;

int s = 0; //s steht für die 1. LED am Ring (s-15) (16Bit Ring)



// Zuordnung der Ein-und Ausgänge

void setup()
{
  pinMode(pumpe1, OUTPUT);
  pinMode(pumpe2, OUTPUT);
  pinMode(ledring1, OUTPUT);
  pinMode(ledring2, OUTPUT);
  pinMode(taster1, INPUT);
  pinMode(taster2, INPUT);
  pinMode(glas1, INPUT);
  pinMode(glas2, INPUT);

  pixels.begin();
  pixels.show();



}


//Hauptprogramm zur Shot-Steuerung

void loop()
{

  // Im Zustand ohne ein Glas unter dem Auslauf leuchten ledring1 und ledring2 blau. Steht ein Glas darunter, dann gelb im Kreis

  if (digitalRead(glasstatus1) == LOW) //Kein Glas unter dem Auslauf

    for (s = 0; s <= 15; s++)
    {
      pixels.setPixelColor(s, pixels.Color( 0, 0, 255)); // Gesamter Ring leuchtet Blau
      pixels.show();
    }
  else // Steht ein Glas drunter
  {
    pixels.setPixelColor(s, pixels.Color( 255, 215, 0));
    pixels.setPixelColor(s - 1, pixels.Color( 0, 0, 0));
    pixels.show();
    if (s == 0) pixels.setPixelColor(15, pixels.Color (0, 0, 0)); // Goldene LED wandert im Kreis
    pixels.show();
    s = s + 1;
    if (s == 16) s = 0;
  }



  // pumpe1 und pumpe2 sollen durch taster1 und taster2 angesteuert werden, solange man den Taster drückt und ein Glas darunter steht.
  // und der ledring1 und ledring2 soll (unabhängig voneinander) rot pulsieren. Ansteuerung nur, wenn Glas1 oder Glas2 geschaltet hat.

  // Glas1 schaltet, Taster1 wird gedrückt, Pumpe1 pumpt, LEDRing1 soll Rot pulsieren

  tasterstatus1 = digitalRead(taster1);  //Pumpe1 startet bei Tasterdruck, Ring1 pulsiert rot
  glasstatus1 = digitalRead(glas1); //Pumpe1 funktioniert nur, wenn Glas1 steht
  if ((digitalRead(glasstatus1) == HIGH) && (digitalRead(tasterstatus1) == HIGH))
  {
    digitalWrite(pumpe1, HIGH);
   
  }
  else
  {
    digitalWrite(pumpe1, LOW);
  }



  // Glas2 schaltet, Taster2 wird gedrückt, Pumpe2 pumpt, LEDRing2 soll Rot pulsieren

  tasterstatus2 = digitalRead(taster2);   //Pumpe2 startet bei Tasterdruck, Ring2 pulsiert rot
  glasstatus2 = digitalRead(glas2);  //Pumpe2 funktioniert nur, wenn Glas2 steht
  if ((digitalRead(glasstatus2) == HIGH) && (digitalRead(tasterstatus2) == HIGH))
  {
    digitalWrite(pumpe2, HIGH);
    
  }
  else
  {
    digitalWrite(pumpe2, LOW);
  }



}

Roedler:
Ich hoffe, ich werde nicht gleich zerlegt hier und bekomme etwas Hilfe.

Üblich ist Teeren und Federn :grin:

Die angelsächsische Höflichkeit fällt mir schwer, aber es ist dennoch von mir nett gemeint.

Roedler:
Unter jedem Glas ist ein 16 Bit LED Ring.

Was soll das sein? Meinst Du einen NeoPixel Ring mit 16 Pixeln?

Roedler:
Jetzt ist die Frage - Wie kann ich dem Programm sagen, dass ich 2 LED Ringe habe? Muss ich die Bibliothek doppelt integrieren oder wie funktioniert das ?

Nein, die Bibliothek benötigst Du genau ein Mal.

Bei einem zweiten Ring hast Du zwei Möglichkeiten:

  • Du hängst die Ringe in Reihe, also Ausgang Ring 1 an Eingang Ring 2. Dann sind die Pixel 0 bis 15 Ring 1 und Pixel 16 bis 31 Ring 2.
  • Du hängst jeden Ring an einen eigenen Ausgang:
Adafruit_NeoPixel pixels1 = Adafruit_NeoPixel(NUMPIXELS, 8, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(NUMPIXELS, 9, NEO_GRB + NEO_KHZ800);

Zum Sketch: Konstanten sollten als solche gekennzeichnet werden, z. B. const byte pumpe1 = 2;

Hast Du PullUp- oder PullDown-Widerstände? Ich nutze gerne die internen PullUps.

Dein Sketch, etwas geändert, mit meinen 120 DotStar Pixeln:

#include <Adafruit_DotStar.h>
#include <SPI.h>

// #include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define NUMPIXELS 16

const int pumpe1 = 2;
const int pumpe2 = 3;
const int taster1 = 4;
const int taster2 = 5;
const int glas1 = 6;
const int glas2 = 7;
const int ledring1 = 8;
const int ledring2 = 9;
// Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, ledring1, NEO_GRB + NEO_KHZ800);
Adafruit_DotStar pixels = Adafruit_DotStar(120, DOTSTAR_BGR);

int tasterstatus1 = 0;
int tasterstatus2 = 0;
int glasstatus1 = 0;
int glasstatus2 = 0;

int s = 0; //s steht für die 1. LED am Ring (s-15) (16Bit Ring)

void setup()
{
  pinMode(pumpe1, OUTPUT);
  pinMode(pumpe2, OUTPUT);
  pinMode(ledring1, OUTPUT);
  pinMode(ledring2, OUTPUT);
  pinMode(taster1, INPUT_PULLUP);
  pinMode(taster2, INPUT_PULLUP);
  pinMode(glas1, INPUT_PULLUP);
  pinMode(glas2, INPUT_PULLUP);

  pixels.begin();
  pixels.setPixelColor(16, pixels.Color (20, 20, 20));
  pixels.show();
}


//Hauptprogramm zur Shot-Steuerung

void loop()
{
  // Im Zustand ohne ein Glas unter dem Auslauf leuchten ledring1 und ledring2 blau. Steht ein Glas darunter, dann gelb im Kreis
  if (digitalRead(glas1) == LOW) //Kein Glas unter dem Auslauf
  {
    for (byte j = 0; j < NUMPIXELS; j++)
    {
      pixels.setPixelColor(j, pixels.Color( 0, 0, 255)); // Gesamter Ring leuchtet Blau
    }
    pixels.show();
  }
  else // Steht ein Glas drunter
  {
    pixels.setPixelColor(s, pixels.Color (0, 0, 0));
    s = (s + 1) % NUMPIXELS;
    pixels.setPixelColor(s, pixels.Color( 255, 215, 0)); // Goldene LED wandert im Kreis
    pixels.show();
    delay(10);
  }
}

Zeiten sollte man anstelle von delay mit millis behandeln.

Vielen Dank für die Antwort.

Es sind RGB NEOPIXEL Ringe.
Habe sie jetzt in Reihe geschaltet. Darauf bin ich ehrlich gesagt gar nicht gekommen :astonished:
Ich nehme die Pulldown Widerstände.

Das mit den Zeiten habe ich ebenfalls noch nicht ganz verstanden