(Neuling) Arduino - Relay mit Münzzähler freischalten!

Ich möchte mir gerne mit dem Arduino einen Münzautomat für eine FotoBox bauen!

Ich habe den Arduino UNO angeschafft + Zubehör!
Relay 5V Ausgangsspannung - Für den USB Anschluss (Touch-Monitor)

Bei 2,00€ Einwurf soll das Relay 3 Min. freigeschaltet sein! (180000 Millis)
(Das Relay habe ich schon soweit, so das es nach 180000 Millis wieder Ausschaltet!)

Aber die Umsätzung vom Münzautomat das Relay freizuschalten bekomme ich einfach nicht hin!

Hinzu kommt noch, das ich ein Display habe und das auch verwenden möchte!
Er sollte Anzeigen, wieviel Geld eingeschmissen wurde!

Geräte:

  • Arduino UNO
  • Münzautomat = HX-916 Multi Coin Selector
  • Display = ARCELI IIC I2C TWI 1602 LCD Modul Display, Serielle 16x2 Display Module
  • Relay = Hailege 2pcs 5V Einkanal Relaismodul Relaisschalter mit OPTO-Isolierung High Low Level Trigger

Ich bin gerade am verzweifeln, weil ich die Umsätzung nicht verstehe (Englisch)
Ich finde aber auch nichts in Deutsch bei Youtube nur in Englisch

Vielleicht kann mir ja hier jemand helfen?

Gruß PartyPuls

Nice. Präsentieren Sie Ihren Code ((wie diese Anleitung)) und einen Schaltplan ((wie diese Anleitung)) Ihrer Ausrüstung.

Der Coin-Zähler hat einen TTL-Ausgabepin, der für jeden Cent einen Impuls auslöst.
Du brauchst also einen Zähler, der die Impulse zählt.

Um möglichst keinen Cent zu verpassen, benutzt Du einen Interruptpin.

Da der Anschluß des Display und des Relais an den Münzautomaten geknüpft sind, muss zuerst der Automat funktionieren.

constexpr uint8_t zaehlerPin {2};   // Ein PIN der Interrupt direkt unterstützt
constexpr uint16_t maxCent {200};   // Betrag der auslöst
uint16_t cent;                      // Betrag
uint16_t oldCent;                   // Vergleichsvariable für Debugausgabe

constexpr uint32_t onTime {1800};   // Einschaltzeit
uint32_t startZeit;                 // Merker

constexpr bool AUS {LOW};           // :-)
constexpr bool EIN{!AUS};

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Start...."));
  pinMode(zaehlerPin, INPUT_PULLUP);  // 
  attachInterrupt(digitalPinToInterrupt(zaehlerPin), zaehlerIsr, RISING);  // Zuweisung des Zaehlerpin an eine Interrupt-Routine
  pinMode(LED_BUILTIN, OUTPUT);     // OnBoard-LED zur Kontrolle
}

void loop()
{
  checkCent();                      // Funktionsaufrufe
  checkTime();
}

void checkCent()                    // erklärt sich von selbst
{
  if (oldCent != cent)
  {
    Serial.print(F("neuer Betrag: "));
    Serial.print(cent);
    Serial.print(F(" cent"));
    oldCent = cent;
  }

  if (cent >= maxCent)
  {
    if (digitalRead(LED_BUILTIN) == AUS)
    {
      digitalWrite(LED_BUILTIN, EIN);
      startZeit = millis();
      cent = 0;
      Serial.println(F("Betrag erreicht - starte Timer"));
    }
  }
}

void checkTime()
{
  if (digitalRead(LED_BUILTIN) == EIN)    // Wenn die LED leuchtet
  {
    if (millis() - startZeit >= onTime)   // UND die Zeit abgelaufen ist
    {
      digitalWrite(LED_BUILTIN, AUS);     // mach die LED aus
      Serial.println(F("Einschaltzeit abgelaufen"));
    }
  }
}

void zaehlerIsr()                  // wird bei jedem Impuls aufgerufen
{
  cent++;
}

Einmal den Schaltplan und den Code bitte.
Gute Fotos vom Aufbau sind auch gerne gesehen.

Bitte Links zu deinen Komponenten posten.
Hast du das Datenblatt und Anleitung zum HX-916?

Grob sehe ich gerade diese Komponenten:

Die Relaislogik dürfte mit dieser Statemachine abbildbar sein:

Dabei sind Bedingungen um einen Pfeil ablaufen zu dürfen über der Trennlinie.
Aktionen die beim Ablaufen ausgeführt werden müssen unterhalb.

Die Anzeige dürfte auf diese Schritte hinauslaufen:

  • Informationen zusammenstellen
  • Formatieren
  • Ausgeben
2 Likes

Vielen Dank, ich probiere es mal aus.... Das Datenblatt habe ich hier
Tausend Dank

1 Like


Der Pin fängt mit:
2 = 0,10 €
3 = 0,20 €
4 = 0,50 €
5 = 1,00 €
6 = 2,00 €

Stell mal den Zähler ein, wie Du ihn haben willst.
Dann schieb den code auf den Controller und vergleiche die Ausgabe auf dem seriellen Monitor mit dem, was Du tatsächlich an Coins eingibst.
Alles andere ist raten.

https://www.amazon.de/dp/B0CK1JBMGS?ref=ppx_yo2ov_dt_b_fed_asin_title

https://www.amazon.de/dp/B07XY2C5M5?ref=ppx_yo2ov_dt_b_fed_asin_title

Ich bin gerade ein bisschen Überfordert, ich glaube nicht das ich es hin bekomme.
Hatte es mir leichter vorgestellt
Danke für eure Hilfe

Der Link hat ein Problem.
Hier der funktionierende Link.

Gruß Tommy

Moin @Tommy56 ,

Dein Link geht auf ein 16x2er LCD, korrekt?

Was der TO vermutlich verlinken wollte, ist vermutlich so etwas wie hier:

https://www.faranux.com/product/hx-916-multi-coin-acceptor-programmable-for-vending-machines-9-coins-types-com/

Zumindest sprechen die Fotos von der Anleitung aus Post 6 dafür ...

Gruß
ec2021

Nein.

kopiert aus #10 - Stand 23:22 Uhr
(Und der von @Tommy56 funktioniert auch mit Trackinkreferenz)

korrekt

Ok, habe es jetzt auch gesehen :wink:

Die von mir verlinkte HX-916-Beschreibung stimmt leider nicht mit der von den Fotos überein ...

Die vom TO gepostete Setup-Beschreibung des Münzzählers ist schon denkwürdig, schlechtes Englisch trifft auf mangelhafte Formulierung ...

Hier ein kleines Beispiel aus einem meiner Projekte auf deine Münzwerte angepasst.
Hoffe es hilft weiter, auch wenn die Modell-Bezeichnung des Münzprüfers abweicht, aber ich glaube die funktionieren gleich... :innocent: :crossed_fingers:

// Token-Acceptor CH-926
const uint8_t TokenPin = 2;
uint32_t lastimpulse;             // timer für den letzten Impuls-Zeitpunkt
const uint16_t timeout = 500;     // wann das Impuls-Zählen abgeschlossen sein soll (Zeit in ms)
uint8_t impulseCount = 0;         // Anzahl der Impulse
uint16_t credits = 0;

void setup() {
  Serial.begin(9600);
  pinMode(TokenPin, INPUT_PULLUP);
  attachInterrupt(0, incomingImpulse, FALLING);
}

void loop() {
  checkforCredits();
}


void incomingImpulse() {
  impulseCount = impulseCount + 1;
  lastimpulse = millis();
}

void checkforCredits() {
  if ((impulseCount > 0) && ((millis() - lastimpulse) > timeout)) {
    switch (impulseCount) {
      case 2:
        // 2 Pulses = 10 cent
        credits += 10;
        break;
      case 3:
        // 3 Pulses = 20 cent
        credits += 20;
        break;
      case 4:
        // 4 Pulses = 50 cent
        credits += 50;
        break;
      case 5:
        // 5 Pulses = 100 cent
        credits += 100;
        break;
      case 6:
        // 6 Pulses = 200 cent
        credits += 200;
        break;
      default:
        // no valid impulesCount
        break;
    }
    Serial.print("Impulse: "); Serial.println(impulseCount);
    Serial.print("Credits in Cent: "); Serial.println(credits);
    impulseCount = 0;
  }
}

(Basiert auf diesem Youtube-Video)

..und wenn das funktioniert (und mich keiner bremst :grimacing:), hier auch gleich die nächste Stufe: 2EUR erreicht => Relais für 3 Minuten aktivieren :slightly_smiling_face:

// Token-Acceptor CH-926
const uint8_t TokenPin = 2;
uint32_t lastimpulse;             // timer für den letzten Impuls-Zeitpunkt
const uint16_t timeout = 500;     // wann das Impuls-Zählen abgeschlossen sein soll (Zeit in ms)
uint8_t impulseCount = 0;         // Anzahl der Impulse
uint16_t credits = 0;

// Relais
const uint8_t RelaisPin = 3;
bool relaisaktiv = false;           // true, wenn aktiviert .. duh!
const bool relaisaktivlevel = LOW;  // LOW- oder HIGH-Level Relais?
uint32_t relaistimer;               // timer für die Relaisaktivzeit
const uint32_t relaisdauer = 180000;// wie lange das Relais aktiviert sein soll

void setup() {
  Serial.begin(9600);
  pinMode(TokenPin, INPUT_PULLUP);
  attachInterrupt(0, incomingImpulse, FALLING);
  pinMode(RelaisPin, OUTPUT);
  digitalWrite(RelaisPin, !relaisaktivlevel);
}

void loop() {
  checkforCredits();                // Münzprüfer-Impulse abfragen und Geldwerte addieren
  
  if ((credits >= 200) && (relaisaktiv == false)) {       // 2EUR erreicht? UND Relais deaktiviert?
    credits -= 200;           // 2EUR abziehen
    relaistimer = millis();   // Relaiszeit starten 
    relaisaktiv = true;                                   // bei Abfrage, Relais aktivieren
  }

  if (relaisaktiv == true) {
    if ((millis() - relaistimer) > relaisdauer) {       // relaiszeit abgelaufen?
      relaisaktiv = false;                              // bei Abfrage Relais deaktivieren 
    }  
  }

  if (relaisaktiv == true) { digitalWrite(RelaisPin, relaisaktivlevel); }   // Relais AN
  else { digitalWrite(RelaisPin, !relaisaktivlevel); }                      // Relais AUS
}


void incomingImpulse() {
  impulseCount = impulseCount + 1;
  lastimpulse = millis();
}

void checkforCredits() {
  if ((impulseCount > 0) && ((millis() - lastimpulse) > timeout)) {
    switch (impulseCount) {
      case 2:
        // 2 Pulses = 10 cent
        credits += 10;
        break;
      case 3:
        // 3 Pulses = 20 cent
        credits += 20;
        break;
      case 4:
        // 4 Pulses = 50 cent
        credits += 50;
        break;
      case 5:
        // 5 Pulses = 100 cent
        credits += 100;
        break;
      case 6:
        // 6 Pulses = 200 cent
        credits += 200;
        break;
      default:
        // no valid impulsCount
        break;
    }
    Serial.print("Impulse: "); Serial.println(impulseCount);
    Serial.print("Credits in Cent: "); Serial.println(credits);
    impulseCount = 0;
  }
}

Geht bestimmt eleganter und kürzer, aber so finde ich es doch recht anschaulich und nachvollziehbar, oder?

Nur um sicherzugehen: Die verschiedenen Münztypen, die der Apparat nutzen soll, hast Du schon am Münzzähler eingelernt, richtig?

Berechtigte Frage! :grinning_face_with_smiling_eyes:

Falls nicht, gibt es im Youtube-Video aus #17 die (mMn) beste Anleitung dafür. Untertitel automatisch übersetzen lassen.. :wink: