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
xfpd
November 2, 2025, 1:24am
2
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++;
}
Rintin
November 2, 2025, 10:46am
4
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.
Ich bin gerade ein bisschen Überfordert, ich glaube nicht das ich es hin bekomme.
Hatte es mir leichter vorgestellt
Danke für eure Hilfe
Tommy56
November 3, 2025, 9:43pm
12
Der Link hat ein Problem.
Hier der funktionierende Link .
Gruß Tommy
ec2021
November 3, 2025, 10:04pm
13
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.
Features: Thanks to the IIC/I2C interface, only two I/O ports are occupied, freeing up more space for other applications. The contrast can be adjusted via a potentiometer on the back. The cover on the back of the LCD can also be removed when no...
€5.99
kopiert aus #10 - Stand 23:22 Uhr
(Und der von @Tommy56 funktioniert auch mit Trackinkreferenz)
ec2021
November 3, 2025, 10:46pm
16
Ok, habe es jetzt auch gesehen
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...
// 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 ), hier auch gleich die nächste Stufe: 2EUR erreicht => Relais für 3 Minuten aktivieren
// 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?
ec2021
November 4, 2025, 3:55pm
19
Nur um sicherzugehen: Die verschiedenen Münztypen, die der Apparat nutzen soll, hast Du schon am Münzzähler eingelernt, richtig?
Berechtigte Frage!
Falls nicht, gibt es im Youtube-Video aus #17 die (mMn) beste Anleitung dafür. Untertitel automatisch übersetzen lassen..