Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Distributeur automatique de snacks Arduino – Guide de conception et construction

Composants et fournitures

Distributeur automatique de snacks Arduino – Guide de conception et construction
Arduino UNO
J'aurais dû utiliser Arduino Mega pour plus d'E/S.
× 1
Shield capteurs
× 1
Moteur DC 6V avec roue
× 3
Capteur infrarouge (réfléchissant) ou suiveur de ligne, pour détection produit
× 3
Capteur de proximité (électromagnétique), pour capteur pièce n°1
× 1
Capteur interrupteur de distance (infrarouge/optocoupleur), pour capteur pièce n°2
× 1
Alimentation 6V pour moteur DC
× 1
Relais (générique)
Relais 4 commutateurs
× 1
LCD (Nokia 5110)
× 1
Distributeur automatique de snacks Arduino – Guide de conception et construction
LED (générique)
LED blanche
× 2
Bouton poussoir
Rouge, Jaune et Vert
× 3

Applications et services en ligne

Distributeur automatique de snacks Arduino – Guide de conception et construction
Arduino IDE
Solidworks
ou tout logiciel de modélisation 3D

À 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.

Distributeur automatique de snacks Arduino – Guide de conception et construction

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.

Distributeur automatique de snacks Arduino – Guide de conception et construction

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.

Distributeur automatique de snacks Arduino – Guide de conception et construction

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

Distributeur automatique de snacks Arduino – Guide de conception et construction

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

Distributeur automatique de snacks Arduino – Guide de conception et construction

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.

Distributeur automatique de snacks Arduino – Guide de conception et construction

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.

Distributeur automatique de snacks Arduino – Guide de conception et construction
Distributeur automatique de snacks Arduino – Guide de conception et construction
Distributeur automatique de snacks Arduino – Guide de conception et construction

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

Distributeur automatique de snacks Arduino – Guide de conception et construction
Distributeur automatique de snacks Arduino – Guide de conception et construction
Distributeur automatique de snacks Arduino – Guide de conception et construction

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.

Distributeur automatique de snacks Arduino – Guide de conception et construction

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

Distributeur automatique de snacks Arduino – Guide de conception et construction

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

Après identification réussie de la pièce

Après mise en marche du mécanisme en spirale (distribution)

Étape 9 : Finition et tests

Enfin, distributeur de snacks terminé. ;)

Distributeur automatique de snacks Arduino – Guide de conception et construction
Distributeur automatique de snacks Arduino – Guide de conception et construction
Distributeur automatique de snacks Arduino – Guide de conception et construction

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 :

Distributeur automatique de snacks Arduino – Guide de conception et construction

Remerciements spéciaux : ITENAS Bandung, Département de Génie Mécanique.

Code

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

  1. Les distributeurs automatiques : une industrie américaine de 36,6 milliards de dollars
  2. Capteur CO2 K30 : Surveillance en temps réel de la qualité de l'air intérieur
  3. Construisez un Stadiomètre Numérique : Suivez la Croissance avec Arduino et Capteur Laser
  4. Intégrer un capteur d'empreintes capacitif DFRobot (ID809) avec Arduino ou ESP8266
  5. Tour de Capteurs avec Arduino Cloud : Température, Mouvement et Gaz
  6. Pistolet à eau intelligent à détection de mouvement avec Arduino Nano
  7. Maximisez votre profit : fixer le meilleur prix pour machines d'occasion
  8. Distributeurs de Lait Frais : Pratiques, Économiques et Écologiques
  9. Découvrir les distributeurs automatiques de nouilles : fonctionnement et options