Distributeur automatique de snacks Arduino – Guide de conception et construction
Composants et fournitures
![]() |
|
× | 1 | |||
|
× | 1 | ||||
|
× | 3 | ||||
|
× | 3 | ||||
|
× | 1 | ||||
|
× | 1 | ||||
|
× | 1 | ||||
|
× | 1 | ||||
|
× | 1 | ||||
![]() |
|
× | 2 | |||
|
× | 3 |
Applications et services en ligne
![]() |
|
|||
|
À propos de ce projet
Introduction
Bonjour, salutations d'Indonésie.
Ce distributeur automatique de snacks est mon projet de fin d'études. Ce projet a été achevé fin 2015.
L'objectif de ce projet est de créer un distributeur automatique, piloté par microcontrôleur Arduino, en utilisant des composants « bon marché et faciles à trouver » disponibles dans le commerce local.
La vidéo ci-dessous montre le test final du distributeur : test de paiement/pièces, sélection du produit et distribution.
Voici ce que j'ai fait pour atteindre ces objectifs :
Étape 1 : Esquisser le concept
D'abord, le concept.
Ce croquis est ma toute première idée de ce que je pourrais construire. Ce sera un distributeur de snacks, acceptant les pièces comme paiement, avec un boîtier en acrylique.
Choisissez et affinez votre concept, essayez de penser à tout, n'importe quel scénario, n'importe quelle condition.

Essayez de tout dessiner, ne vous inquiétez pas si votre dessin est moche, sérieusement regardez le mien. :D
Le bon moment pour penser à l'impensable, c'est avant même que le projet ne commence.
Étape 2 : Créer un modèle 3D
Cette étape n'est peut-être pas nécessaire pour tout le monde, mais pour moi et pour ce projet, elle est cruciale.

J'ai créé un modèle SolidWorks complet. J'ai dû déterminer les dimensions du produit, dans ce cas des paquets de snacks. La taille des pièces acceptées, la taille des pièces rejetées, la taille de la fente à pièces, la taille de la rampe à pièces, la taille des boutons poussoirs, les dimensions de presque tout. Cette étape inclut la comparaison, le choix et la mesure de la taille du microcontrôleur Arduino utilisé. Quels capteurs utilisés ou possibles à l'avenir, où les placer, leurs dimensions, où vont les pièces acceptées. J'ai aussi pensé où mettre un LCD monochrome (pas nécessaire mais je tenais à l'avoir).
Et enfin, toujours dans la création du modèle SolidWorks, n'oubliez pas de créer les trous pour les vis, pour chaque pièce.
Le boîtier est en acrylique, découpé au laser. C'est pourquoi je crée un modèle aussi détaillé et précis que possible, car plus mon modèle est précis, plus le boîtier sera précis.
Étape 3 : Concevoir une fente à pièces
Pour filtrer les pièces, j'utilise d'abord les dimensions des pièces. En concevant la fente à pièces, je peux déterminer quelles tailles de pièces sont autorisées à entrer dans la machine.
Ensuite, second filtre, je détermine quelles tailles de pièces sont acceptées et roulent vers le réceptacle à pièces.
En utilisant la force de gravité, si les tailles des pièces (diamètre) sont plus petites que la longueur de la rampe/piste à pièces, elles tomberont et seront rejetées.

- Sur l'image ci-dessus, la pièce de gauche n'entrera pas dans la fente.
- La pièce du milieu tombera et sera rejetée.
- La pièce de droite est la pièce acceptée, elle descend vers le réceptacle.
C'est une vidéo où je faisais des tests de pièces, elle vous montrera comment cette méthode fonctionne.
Étape 4 : Préparer et tester chaque composant

Préparez votre Arduino, tout ce qui est nécessaire.

Testez chaque composant : LCD, bouton poussoir, relais, LED, essayez de tout combiner et apprenez différentes logiques et codages. Assurez-vous de savoir ce que vous faites. Essayez de tester jusqu'à la limite, trouvez la limite, mais ne cassez rien.
Pourquoi utiliser une résistance, que se passe-t-il si ceci ou cela, pourquoi les lectures du capteur ne sont pas stables, quelle valeur est réellement lue par le capteur, etc. J'ai fait les tests et découvert que les lectures du capteur de proximité étaient « pas propres », il fallait ajouter une résistance pour les stabiliser.

Le capteur infrarouge fonctionne très mal et de manière anormale sous le soleil direct (je le savais avant, mais je n'avais jamais vraiment ressenti l'impact, jusqu'à maintenant). La solution est d'utiliser du ruban adhésif pour isoler la partie réceptrice du capteur infrarouge, comme montré sur l'image.
Étape 5 : Construire un mécanisme en spirale
C'est l'une des parties les plus importantes d'un distributeur automatique : le mécanisme de distribution.
J'utilise un mécanisme en spirale, avec du fil d'aluminium (diamètre 2 mm), façonné manuellement en spirale avec l'aide d'un tube PVC de 9 cm de diamètre.

Le fil en spirale est attaché à une roue avec des colliers de serrage. Quand le moteur DC s'allume, la roue tourne et le fil en spirale tourne.
La spirale rotative convertit en fait le mouvement rotatif en mouvement linéaire du produit.
Étape 6 : Construire un mécanisme d'identification des pièces

La première image est le capteur de pièce n°1, il utilise un capteur de proximité ou un capteur à induction électromagnétique. Quand une pièce acceptée passe ce capteur, il déclenche l'Arduino pour commencer à compter le temps (en millisecondes).
si capteur1 déclenché alors commencer à compter le temps en millisecondes
Et quand la pièce acceptée passe le capteur de pièce n°2, un capteur interrupteur de distance, l'Arduino arrête de compter le temps et obtient le temps nécessaire pour cette pièce particulière pour aller du capteur n°1 au capteur n°2.
si capteur2 déclenché alors arrêter de compter le temps en millisecondes. "temps de trajet" est xxx millisecondes
N'utilisez pas trop d'aimants car cela bloquerait et ferait arrêter la pièce au milieu de la rampe. Nous ne voulons pas que cela arrive, car nous avons besoin de compter le temps pour chaque pièce, pour obtenir le « temps de trajet » entre le capteur n°1 et le n°2. Ce « temps de trajet » (en millisecondes) est utilisé par l'Arduino pour déterminer la valeur de la pièce acceptée.
si "temps de trajet" plus grand ou égal à "yyy" millisecondes, alors c'est la pièce "aaa", sinon c'est "bbb"
C'est une vidéo où je testais cette méthode, identification des pièces par aimant.
Étape 7 : Construire un mécanisme de détection de produit
J'utilise 3 capteurs infrarouges pour la détection du produit quand il tombe après avoir été poussé/déplacé par le mécanisme en spirale.

Quand le produit tombe, il déclenche le capteur infrarouge, envoyant un signal OFF au moteur DC (via relais).
Cette vidéo montre comment la détection de produit fonctionne dans ce distributeur.
Étape 8 : Utiliser le LCD pour l'information

Dans ce projet, je fais afficher sur le LCD des informations (en monnaie indonésienne) sur la valeur de la pièce acceptée, à chaque fois que le client insère une pièce. Il affiche aussi le solde total des pièces acceptées, et d'autres instructions générales sur l'utilisation étape par étape de la machine.
Quand la machine est allumée
- Affichage principal = « Veuillez insérer une pièce ».
- SI pièce insérée = « Afficher valeur pièce et solde total ».
- SI pièce non insérée = garder l'affichage principal.
Après identification réussie de la pièce
- SI solde total supérieur ou égal au prix du produit = « Veuillez sélectionner un produit ».
- SI solde total inférieur au prix du produit = « Veuillez insérer plus de pièces ».
Après mise en marche du mécanisme en spirale (distribution)
- SI mécanisme de détection produit déclenché = « Merci », transaction terminée.
- Délai, et retour à l'affichage principal.
Étape 9 : Finition et tests
Enfin, distributeur de snacks terminé. ;)

Après 3 mois environ, j'étais prêt à faire des tests finaux sur cette machine, du test de paiement/pièces, sélection produit, et distribution.
Voici la vidéo de test final du distributeur de snacks :
J'espère que ce projet aidera certains d'entre vous, peut-être vous donnera-t-il de l'inspiration ou des idées pour construire et créer le prochain distributeur automatique piloté par Arduino.
Étape 10 : Pistes d'amélioration
Quelques idées pour améliorer ce distributeur de snacks :
- Ajouter un mécanisme de rendu de monnaie.
- Accepter les billets.
- Accepter le bitcoin et/ou les paiements numériques.
- Afficher le stock produits sur le LCD.
- IoT : Notifier via internet à chaque transaction.
- IoT : Notifier quand le stock produit est vide ou bas, etc.

Remerciements spéciaux : ITENAS Bandung, Département de Génie Mécanique.
Code
- Code source pour Distributeur de Snacks
Code source pour Distributeur de SnacksArduino
Voici le code source que j'ai utilisé pour ce projet de distributeur
const byte SIAP = 0; const byte KOIN_MASUK1 = 1; const byte KOIN_MASUK2 = 2; const byte KOIN_MASUK3 = 3; const byte KOIN_MASUK4 = 4; const byte KOIN_MASUK5 = 5; const byte KOIN_MASUK6 = 6; const byte KOIN_MASUK7 = 7; const byte SALDO_500 = 8; const byte SALDO_500500 = 9; const byte SALDO_500500500 = 10; const byte SALDO_500500500500 = 11; const byte SALDO_5005005001000 = 12; const byte SALDO_5001000 = 13; const byte SALDO_5001000500 = 14; const byte SALDO_50010001000 = 15; const byte SALDO_5005001000 = 16; const byte SALDO_1000 = 17; const byte SALDO_10001000 = 18; const byte SALDO_1000500 = 19; const byte SALDO_1000500500 = 20; const byte SALDO_10005001000 = 21; const byte KOIN_KELUAR = 22; byte state = SIAP; const float jeda_waktu = 876; unsigned long time1; unsigned long time2; unsigned long time3; unsigned long time4; unsigned long time5; unsigned long time6; unsigned long time7; #define PIN_SCE 7 #define PIN_RESET 6 #define PIN_DC 5 #define PIN_SDIN 4 #define PIN_SCLK 3 #define LCD_C LOW #define LCD_D HIGH #define LCD_X 84 #define LCD_Y 48 static const byte ASCII[][5] = { {0x00, 0x00, 0x00, 0x00, 0x00} // 20 , {0x00, 0x00, 0x5f, 0x00, 0x00} // 21 ! , {0x00, 0x07, 0x00, 0x07, 0x00} // 22 " , {0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 # , {0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $ , {0x23, 0x13, 0x08, 0x64, 0x62} // 25 % , {0x36, 0x49, 0x55, 0x22, 0x50} // 26 & , {0x00, 0x05, 0x03, 0x00, 0x00} // 27 ' , {0x00, 0x1c, 0x22, 0x41, 0x00} // 28 ( , {0x00, 0x41, 0x22, 0x1c, 0x00} // 29 ) , {0x14, 0x08, 0x3e, 0x08, 0x14} // 2a * , {0x08, 0x08, 0x3e, 0x08, 0x08} // 2b + , {0x00, 0x50, 0x30, 0x00, 0x00} // 2c , , {0x08, 0x08, 0x08, 0x08, 0x08} // 2d - , {0x00, 0x60, 0x60, 0x00, 0x00} // 2e . , {0x20, 0x10, 0x08, 0x04, 0x02} // 2f / , {0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0 , {0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1 , {0x42, 0x61, 0x51, 0x49, 0x46} // 32 2 , {0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3 , {0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4 , {0x27, 0x45, 0x45, 0x45, 0x39} // 35 5 , {0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6 , {0x01, 0x71, 0x09, 0x05, 0x03} // 37 7 , {0x36, 0x49, 0x49, 0x49, 0x36} // 38 8 , {0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9 , {0x00, 0x36, 0x36, 0x00, 0x00} // 3a : , {0x00, 0x56, 0x36, 0x00, 0x00} // 3b ; , {0x08, 0x14, 0x22, 0x41, 0x00} // 3c < , {0x14, 0x14, 0x14, 0x14, 0x14} // 3d = , {0x00, 0x41, 0x22, 0x14, 0x08} // 3e > , {0x02, 0x01, 0x51, 0x09, 0x06} // 3f ? , {0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @ , {0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A , {0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B , {0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C , {0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D , {0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E , {0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F , {0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G , {0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H , {0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I , {0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J , {0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K , {0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L , {0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M , {0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N , {0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O , {0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P , {0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q , {0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R , {0x46, 0x49, 0x49, 0x49, 0x31} // 53 S , {0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T , {0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U , {0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V , {0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W , {0x63, 0x14, 0x08, 0x14, 0x63} // 58 X , {0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y , {0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z , {0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [ , {0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥ , {0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ] , {0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^ , {0x40, 0x40, 0x40, 0x40, 0x40} // 5f _ , {0x00, 0x01, 0x02, 0x04, 0x00} // 60 ` , {0x20, 0x54, 0x54, 0x54, 0x78} // 61 a , {0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b , {0x38, 0x44, 0x44, 0x44, 0x20} // 63 c , {0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d , {0x38, 0x54, 0x54, 0x54, 0x18} // 65 e , {0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f , {0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g , {0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h , {0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i , {0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j , {0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k , {0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l , {0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m , {0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n , {0x38, 0x44, 0x44, 0x44, 0x38} // 6f o , {0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p , {0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q , {0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r , {0x48, 0x54, 0x54, 0x54, 0x20} // 73 s , {0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t , {0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u , {0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v , {0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w , {0x44, 0x28, 0x10, 0x28, 0x44} // 78 x , {0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y , {0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z , {0x00, 0x08, 0x36, 0x41, 0x00} // 7b { , {0x00, 0x00, 0x7f, 0x00, 0x00} // 7c | , {0x00, 0x41, 0x36, 0x08, 0x00} // 7d } , {0x10, 0x08, 0x08, 0x10, 0x08} // 7e ← , {0x78, 0x46, 0x41, 0x46, 0x78} // 7f → }; void LcdWrite(byte dc, byte data) { digitalWrite(PIN_DC, dc); digitalWrite(PIN_SCE, LOW); shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data); digitalWrite(PIN_SCE, HIGH); } void LcdCharacter(char character) { LcdWrite(LCD_D, 0x00); for (int index = 0; index < 5; index++) { LcdWrite(LCD_D, ASCII[character - 0x20][index]); } LcdWrite(LCD_D, 0x00); } void LcdClear(void) { for (int index = 0; index < LCD_X * LCD_Y / 8; index++) { LcdWrite(LCD_D, 0x00); } } void LcdInitialise(void) { pinMode(PIN_SCE, OUTPUT); pinMode(PIN_RESET, OUTPUT); pinMode(PIN_DC, OUTPUT); pinMode(PIN_SDIN, OUTPUT); pinMode(PIN_SCLK, OUTPUT); digitalWrite(PIN_RESET, LOW); digitalWrite(PIN_RESET, HIGH); LcdWrite(LCD_C, 0x21 ); LcdWrite(LCD_C, 0xB1 ); LcdWrite(LCD_C, 0x04 ); LcdWrite(LCD_C, 0x14 ); LcdWrite(LCD_C, 0x20 ); LcdWrite(LCD_C, 0x0C ); } void LcdString(char *characters) { while (*characters) { LcdCharacter(*characters++); } } void setup() { //enable output on the digital pins pinMode( 11, INPUT); pinMode( 12, INPUT); pinMode( 14, INPUT); pinMode( 15, INPUT); pinMode( 16, INPUT); pinMode( 17, INPUT); pinMode( 18, INPUT); pinMode( 19, INPUT); pinMode( 13 , OUTPUT); pinMode( 8 , OUTPUT); pinMode( 9 , OUTPUT); pinMode( 10 , OUTPUT); pinMode( 2 , OUTPUT); digitalWrite(8, HIGH); digitalWrite(9, HIGH); digitalWrite(10, HIGH); digitalWrite(13, LOW); Serial.begin(9600); Serial.println("=> Siap"); LcdInitialise(); LcdClear(); LcdString(" Masukkan Koin Rp500 atau Koin Rp1000 @ Rp2000"); delay(500); } void loop() { int x = analogRead(14); if (state == SIAP) { if (x >= 33) { state = KOIN_MASUK1; time1 = millis(); tone(2, 4200, 40); Serial.println("snsr1,"); Serial.println("start wkt"); } } else if ((state == KOIN_MASUK1) && (!(digitalRead(13)))) { if ((digitalRead(12)) && (state == KOIN_MASUK1)) { unsigned long diff1 = (millis() - time1); Serial.println("snsr2,"); Serial.println("stop wkt"); Serial.print("jeda wkt: "); Serial.print(diff1); Serial.println(" ms"); if (diff1 > jeda_waktu) { state = SALDO_1000; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp1000 Tambah Koin Koin Rp1000"); digitalWrite (13, HIGH); Serial.println("koin=Rp 1000, Saldo: Rp1000"); tone(2, 4200, 299); } else if (diff1 < jeda_waktu) { state = SALDO_500; digitalWrite (13, HIGH); LcdInitialise(); LcdClear(); LcdString(" diterima Saldo= Rp500 Tambah Koin Koin Rp500"); Serial.println("koin=Rp 500, Saldo: Rp500"); tone(2, 4200, 299); } } } if (state == SALDO_500) { if (x >= 33) { state = KOIN_MASUK2; time2 = millis(); tone(2, 4200, 40); Serial.println("snsr1,"); Serial.println("start wkt"); } } else if ((state == KOIN_MASUK2) && ((digitalRead(13)))) { if ((digitalRead(12)) && (state == KOIN_MASUK2)) { unsigned long diff2 = (millis() - time2); Serial.println("snsr2,"); Serial.println("stop wkt"); Serial.print("jeda wkt: "); Serial.print(diff2); Serial.println(" ms"); if (diff2 > jeda_waktu) { state = SALDO_5001000; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp1500 Tambah Koin Koin Rp1000"); tone(2, 4200, 299); Serial.println("koin=Rp 1000, Saldo: Rp1500"); } else if (diff2 < jeda_waktu) { state = SALDO_500500; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp1000 Tambah Koin Koin Rp500"); tone(2, 4200, 299); Serial.println("koin=Rp 500, Saldo: Rp1000"); } } } if (state == SALDO_500500) { if (x >= 33) { state = KOIN_MASUK3; time3 = millis(); tone(2, 4200, 40); Serial.println("snsr1,"); Serial.println("start wkt"); } } else if ((state == KOIN_MASUK3) && ((digitalRead(13)))) { if ((digitalRead(12)) && (state == KOIN_MASUK3)) { unsigned long diff3 = (millis() - time3); Serial.println("snsr2,"); Serial.println("stop wkt"); Serial.print("jeda wkt: "); Serial.print(diff3); Serial.println(" ms"); if (diff3 > jeda_waktu) { state = SALDO_5005001000; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp2000 Pilih Produk Koin Rp1000"); Serial.println("koin=Rp 1000, Saldo: Rp2000"); tone(2, 4200, 799); } else if (diff3 < jeda_waktu) { state = SALDO_500500500; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp1500 Tambah Koin Koin Rp500"); Serial.println("koin=Rp 500, Saldo: Rp1500"); tone(2, 4200, 299); } } } if (state == SALDO_500500500) { if (x >= 33) { state = KOIN_MASUK4; time4 = millis(); tone(2, 4200, 40); Serial.println("snsr1,"); Serial.println("start wkt"); } } else if ((state == KOIN_MASUK4) && ((digitalRead(13)))) { if ((digitalRead(12)) && (state == KOIN_MASUK4)) { unsigned long diff4 = (millis() - time4); Serial.println("snsr2,"); Serial.println("stop wkt"); Serial.print("jeda wkt: "); Serial.print(diff4); Serial.println(" ms"); if (diff4 > jeda_waktu) { state = SALDO_5005005001000; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp2500 Pilih Produk Koin Rp1000"); Serial.println("koin=Rp 1000, Saldo: Rp2500"); tone(2, 4200, 799); } else if (diff4 < jeda_waktu) { state = SALDO_500500500500; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp2000 Pilih Produk Koin Rp500"); Serial.println("koin=Rp 500, Saldo: Rp2000"); tone(2, 4200, 799); } } } if (state == SALDO_5001000) { if (x >= 33) { state = KOIN_MASUK5; time5 = millis(); tone(2, 4200, 40); Serial.println("snsr1,"); Serial.println("start wkt"); } } else if ((state == KOIN_MASUK5) && ((digitalRead(13)))) { if ((digitalRead(12)) && (state == KOIN_MASUK5)) { unsigned long diff5 = (millis() - time5); Serial.println("snsr2,"); Serial.println("stop wkt"); Serial.print("jeda wkt: "); Serial.print(diff5); Serial.println(" ms"); if (diff5 > jeda_waktu) { state = SALDO_50010001000; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp2500 Pilih Produk Koin Rp1000"); Serial.println("koin=Rp 1000, Saldo: Rp2500"); tone(2, 4200, 799); } else if (diff5 < jeda_waktu) { state = SALDO_5001000500; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp2000 Pilih Produk Koin Rp500"); Serial.println("koin=Rp 500, Saldo: Rp2000"); tone(2, 4200, 799); } } } if (state == SALDO_1000) { if (x >= 33) { state = KOIN_MASUK6; time6 = millis(); tone(2, 4200, 40); Serial.println("snsr1,"); Serial.println("start wkt"); } } else if ((state == KOIN_MASUK6) && ((digitalRead(13)))) { if ((digitalRead(12)) && (state == KOIN_MASUK6)) { unsigned long diff6 = (millis() - time6); Serial.println("snsr2,"); Serial.println("stop wkt"); Serial.print("jeda wkt: "); Serial.print(diff6); Serial.println(" ms"); if (diff6 > jeda_waktu) { state = SALDO_10001000; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp2000 Pilih Produk Koin Rp1000"); Serial.println("koin=Rp 1000, Saldo: Rp2000"); tone(2, 4200, 799); } else if (diff6 < jeda_waktu) { state = SALDO_1000500; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp1500 Tambah Koin Koin Rp500"); Serial.println("koin=Rp 500, Saldo: Rp1500"); tone(2, 4200, 299); } } } if (state == SALDO_1000500) { if (x >= 33) { state = KOIN_MASUK7; time7 = millis(); tone(2, 4200, 40); Serial.println("snsr1,"); Serial.println("start wkt"); } } else if ((state == KOIN_MASUK7) && ((digitalRead(13)))) { if ((digitalRead(12)) && (state == KOIN_MASUK7)) { unsigned long diff7 = (millis() - time7); Serial.println("snsr2,"); Serial.println("stop wkt"); Serial.print("jeda wkt: "); Serial.print(diff7); Serial.println(" ms"); if (diff7 > jeda_waktu) { state = SALDO_10005001000; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp2500 Pilih Produk Koin Rp1000"); Serial.println("koin=Rp 1000, Saldo: Rp2500"); tone(2, 4200, 799); } else if (diff7 < jeda_waktu) { state = SALDO_1000500500; LcdInitialise(); LcdClear(); LcdString(" diterima Saldo=Rp2000 Pilih Produk Koin Rp500"); Serial.println("koin=Rp 500, Saldo: Rp2000"); tone(2, 4200, 799); } } } else if ((state == SALDO_500500500500)||(state == SALDO_5005005001000)||(state == SALDO_5001000500)||(state == SALDO_50010001000)||(state == SALDO_5005001000)||(state == SALDO_10001000)||(state == SALDO_1000500500)||(state == SALDO_10005001000)) { if (((( digitalRead(13) && ( ( digitalRead(9) ) && ( digitalRead(10) ) ) ) && digitalRead(17) )) && ((digitalRead(8)))) { LcdInitialise(); LcdClear(); LcdString(" Mohon Menunggu"); Serial.println("pb1"); tone(2, 4200, 200); delay( 2500 ); digitalWrite( 8 , LOW ); Serial.println("motor1"); } else { if ( (!(digitalRead(8)) && (!(digitalRead(11)) ))) { digitalWrite( 8 , HIGH ); LcdInitialise(); LcdClear(); LcdString(" Terima Kasih"); tone(2, 4200, 100); delay( 150 ); tone(2, 4200, 100); Serial.println("produk1 jatuh"); delay( 4000 ); digitalWrite( 13 , LOW ); state = KOIN_KELUAR; } else { } } if (((( ( digitalRead(13) && ( ( digitalRead(8) ) && ( digitalRead(10) ) ) ) && digitalRead(18) )) && ((digitalRead(9))))) { LcdInitialise(); LcdClear(); LcdString(" Mohon Menunggu"); Serial.println("pb2"); tone(2, 4200, 200); delay( 2500 ); digitalWrite( 9 , LOW ); Serial.println("motor2"); } else { if ( (!(digitalRead(9)) && (!(digitalRead(15)) ))) { digitalWrite( 9 , HIGH ); LcdInitialise(); LcdClear(); LcdString(" Terima Kasih"); tone(2, 4200, 100); delay( 150 ); tone(2, 4200, 100); Serial.println("produk2 jatuh"); delay( 4000 ); digitalWrite( 13 , LOW ); state = KOIN_KELUAR; } else { } } if (((( ( digitalRead(13) && ( ( digitalRead(8) ) && ( digitalRead(9) ) ) ) && digitalRead(19) )) && ((digitalRead(10))))) { LcdInitialise(); LcdClear(); LcdString(" Mohon Menunggu"); Serial.println("pb3"); tone(2, 4200, 200); delay( 2500 ); digitalWrite( 10 , LOW ); Serial.println("motor3"); } else { if ( (!(digitalRead(10)) && (!(digitalRead(16)) ))) { digitalWrite( 10 , HIGH ); LcdInitialise(); LcdClear(); LcdString(" Terima Kasih"); tone(2, 4200, 100); delay( 150 ); tone(2, 4200, 100); Serial.println("produk3 jatuh"); delay( 4000 ); digitalWrite( 13 , LOW ); state = KOIN_KELUAR; } else { } } } else if ((state == KOIN_KELUAR)) { if (((x <= 33) && !digitalRead(12)) && (!digitalRead(13))) { state = SIAP; LcdInitialise(); LcdClear(); LcdString(" Masukkan Koin Rp500 atau Koin Rp1000 @ Rp2000"); Serial.println("=> Siap"); } } }
Pièces personnalisées et boîtiers
Ceci est une capture d'écran de mon modèle 3D SolidWorks pour ce projet.
Processus de fabrication
- Les distributeurs automatiques : une industrie américaine de 36,6 milliards de dollars
- Capteur CO2 K30 : Surveillance en temps réel de la qualité de l'air intérieur
- Construisez un Stadiomètre Numérique : Suivez la Croissance avec Arduino et Capteur Laser
- Intégrer un capteur d'empreintes capacitif DFRobot (ID809) avec Arduino ou ESP8266
- Tour de Capteurs avec Arduino Cloud : Température, Mouvement et Gaz
- Pistolet à eau intelligent à détection de mouvement avec Arduino Nano
- Maximisez votre profit : fixer le meilleur prix pour machines d'occasion
- Distributeurs de Lait Frais : Pratiques, Économiques et Écologiques
- Découvrir les distributeurs automatiques de nouilles : fonctionnement et options


