Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Автомат по продаже закусок на базе Arduino

Компоненты и расходные материалы

Arduino UNO
Вместо этого я должен использовать Arduino Mega для большего количества операций ввода-вывода.
× 1
Экран датчика
× 1
Двигатель постоянного тока 6 В с колесом
× 3
Инфракрасный (отражающий) датчик или датчик следящего за линией, используемый для обнаружения продукта
× 3
Датчик приближения (электромагнитный), используемый для датчика монет № 1
× 1
Датчик расстояния (инфракрасный / оптопара), используемый для датчика монет номер 2
× 1
Источник питания 6 В для двигателя постоянного тока
× 1
Реле (универсальное)
Реле с 4 переключателями
× 1
ЖК-дисплей (ЖК-дисплей Nokia 5110)
× 1
LED (общий)
Белый светодиод
× 2
Кнопка
Красный, желтый и зеленый
× 3

Приложения и онлайн-сервисы

IDE Arduino
Solidworks
или любой производитель 3D-моделей

Об этом проекте

Введение

Привет, привет из Индонезии.

Этот автомат по продаже закусок - мой последний проект. Фактически этот проект был завершен в конце 2015 года.

Целью этого проекта является создание торгового автомата на базе микроконтроллера Arduino с использованием «любых дешевых и простых в продаже» компонентов, доступных в местном магазине.

Это видео ниже является финальным тестовым видео автомата по продаже закусок, начиная с проверки оплаты / монет, выбора продукта и доставки продукта.

Итак, вот что я сделал для достижения этих целей:

Шаг 1. Набросайте концепцию

Сначала подумайте, о концепции .

Этот набросок - мое первое представление о том, что я могу построить. Это будет автомат по продаже закусок, принимающий монеты в качестве оплаты и использующий акриловый футляр.

Выберите и доработайте свою концепцию , постарайтесь думать о чем угодно, любом сценарии, любом условии.

Попробуйте все набросать, не волнуйтесь, если ваш рисунок некрасивый, серьезно посмотрите на мой рисунок. :D

Подходящее время для размышлений о немыслимом - еще до начала проекта.

Шаг 2. Создайте 3D-модель

Может быть, этот шаг нужен не всем, но для меня и для этого проекта он важен.

Создаю модель solidworks. И я имею в виду действительно полностью завершенную модель. Мне нужно определиться с габаритами продукта, в данном случае закусочной упаковки. Размер принятых монет, размер отклоненных монет, размер гнезда для монет, размер платформы для монет, размер кнопки, размеры почти всего. Этот шаг включает сравнение, выбор и измерение размера используемого микроконтроллера Arduino. Какой датчик использовался или, возможно, будет использоваться в будущем, где его разместить, каковы размеры и размеры, куда поступают принятые монеты, я также думаю о том, где мне следует разместить монохромный ЖК-дисплей (это не обязательно, но я настаиваю). P>

И, наконец, при создании модели SolidWorks не забывайте делать отверстия под винт для каждой детали.

Корпус изготовлен из акрила и вырезан методом лазерной резки. Вот почему я создаю модель настолько детализированной и точной, насколько я могу, потому что чем точнее моя модель, тем более точным я получу.

Шаг 3. Создайте слот для монет

Для фильтрации монет я сначала использую размер монеты. Создавая слот-монеты, я могу определить, монеты какого размера разрешено вводить в автомат .

Затем, второй фильтр, я определяю монеты какого размера разрешено принимать и переходить к держателю монет .

Поскольку при использовании силы тяжести, если размер (диаметр) монеты меньше, чем длина трапа / направляющей для монет, она упадет и отклонится.

  • На рисунке выше монета слева не входит в слот.
  • Монета в середине упадет и отклонится.
  • Монета справа принимает монету, переходит в монетоприемник.

Это видео, когда я провожу тестирование монет, оно покажет вам, как работает этот метод.

Шаг 4. Подготовьте и протестируйте каждый компонент

Подготовьте свой Arduino, подготовьте все необходимое.

Проверьте каждый компонент, ЖК-кнопку, реле, светодиод, просто попробуйте все объединить и изучить различную логику и кодирование. Убедитесь, что вы знаете, что делаете. Попробуйте испытать предел, найдите предел, но не нарушайте его.

Зачем использовать резистор, что происходит, когда то или иное, почему показания датчика нестабильны, какое значение фактически считывается датчиком и т. Д. Я провел тест и обнаружил, что показания датчика приближения "не чистые", необходимо добавить резистор к успокойся.

Инфракрасный датчик работает очень плохо и ненормально под прямыми солнечными лучами (я знаю об этом раньше, но до сих пор не ощущаю удара). Решением является использование изоляционной ленты вокруг приемной части инфракрасного датчика, как показано на рисунке.

Шаг 5. Постройте спиральный механизм

Это одна из самых важных частей торгового автомата, механизма доставки.

Я использую спиральный механизм с алюминиевой проволокой (диаметр проволоки 2 мм), вручную сформированную в спираль с помощью трубы из ПВХ диаметром 9 см.

Спиральные проволоки привязываются к колесу с помощью стяжек. Когда двигатель постоянного тока включен, колесо вращается, и спиральный провод вращается.

Вращающаяся спираль фактически преобразует вращательное движение в линейное товара.

Шаг 6. Создайте механизм идентификации монеты

Первый рисунок - датчик монеты номер 1, он использует датчик приближения или датчик индукционного электромагнита. Когда монета проходит мимо этого датчика, он запускает Arduino, чтобы начать отсчет времени (в миллисекундах).

  если сработал датчик 1, время начала отсчета в миллисекундах  

А когда принят датчик монетного прохода номер 2, датчик прерывания расстояния, arduino прекратит отсчет времени и получит время, необходимое для этой конкретной монеты, чтобы пройти от датчика номер 1 к датчику номер 2.

  если сработал датчик 2, прекратить отсчет времени в миллисекундах. «время в пути» - ххх миллисекунды  

Не используйте слишком много магнита, так как он заклинит и остановит монету в середине лотка для монет. Мы не хотим, чтобы это произошло, потому что нам нужно подсчитывать время для каждой монеты, чтобы получить «время прохождения» между датчиком номер 1 и номер 2. Это «время прохождения» (в миллисекундах) используется для Arduino для определения значения принятая монета.

  если «время прохождения» больше или равно «yyy» миллисекунды, то это монета «aaa», иначе это «bbb»  

Это видео, когда я тестирую этот метод, идентифицируя монеты с помощью магнита.

Шаг 7. Создайте механизм обнаружения товаров

Я использую 3 инфракрасных датчика для обнаружения продукта, когда он падает из-за толкания / перемещения спирального механизма.

Когда продукт падает, он запускает инфракрасный датчик, отправляя сигнал выключения на двигатель постоянного тока (через реле).

В этом видео показано, как обнаружение товаров работает в этом торговом автомате.

Шаг 8:Использование ЖК-дисплея для информации

В этом проекте я делаю ЖК-дисплей, отображающий информацию (в индонезийской валюте) о принятой стоимости монеты каждый раз, когда покупатель вводит монету. Он также покажет, какой общий баланс от принятой монеты, и другие общие инструкции по пошаговой работе с этим автоматом.

Когда машина включена

  • MAIN display ="Пожалуйста, введите монету".
  • Если монета введена ="Показать стоимость монеты и общий баланс".
  • ЕСЛИ монета не введена =оставить ГЛАВНЫЙ дисплей.

После успешной идентификации монеты

  • ЕСЛИ общий баланс больше или равен цене продукта ="Пожалуйста, выберите продукт".
  • ЕСЛИ общий остаток меньше, чем цена товара ="Пожалуйста, введите больше монет".

После включения спирального механизма (происходит доставка)

  • ЕСЛИ сработал механизм обнаружения продукта ="Спасибо", транзакция выполнена.
  • Задержка и возврат к ГЛАВНОМУ экрану.

Шаг 9. Завершение и тестирование

Наконец, закончил Торговый автомат закусок.;)

Примерно через 3 месяца я готов провести заключительное испытание этой машины, от проверки оплаты / монет, выбора продукта и доставки продукта.

Это видео финального тестирования автомата по продаже закусок:

Я надеюсь, что этот проект поможет некоторым из вас, может быть, даст вам вдохновение или идею о создании и создании следующего торгового автомата с питанием от Arduino.

Шаг 10. Возможности для улучшения

Некоторые идеи по улучшению этого торгового автомата с закусками:

  • Добавить механизм размена монет.
  • Принимайте бумажные деньги.
  • Принимать биткойны и / или цифровые платежи.
  • Показать товарный запас на ЖК-дисплее.
  • Интернет вещей:уведомлять через Интернет каждый раз, когда происходит транзакция.
  • Интернет вещей:уведомление, когда товар заканчивается или заканчивается и т. д.

Особая благодарность:ITENAS Bandung, Департамент машиностроения.

Код

  • Исходный код для автомата по продаже закусок.
Исходный код для автомата по продаже закусок Arduino
Это исходный код, который я использовал для этого проекта торгового автомата
 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; константный байт KOIN_MASUK6 =6; константный байт KOIN_MASUK7 =7; константный байт SALDO_500 =8; константный байт SALDO_500500 =9; константный байт SALDO_500500 =10; константный байт SALDO_500500500500 =11; константный байт SALDO_5005001 SALDO_5001000500 =14; константный байт SALDO_50010001000 =15; константный байт SALDO_5005001000 =16; константный байт SALDO_1000 =17; константный байт SALDO_10001000 =18; константный байт SALDO_1000500 =19; константный байт SALDO_1000_500 байтов =20; 22; состояние байта =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 # определить PIN_DC 5 # определить PIN_SDIN 4 # define PIN_SCLK 3 # define LCD_C LOW # define LCD_D HIGH # define LCD_X 84 # define LCD_Y 48static 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, 0 x36, 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 В, {0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 Вт, {0x63, 0x14, 0 x08, 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 с, {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 (байт постоянного тока, байтовые данные) {digitalWrite (PIN_DC, dc); digitalWrite (PIN_SCE, LOW); shiftOut (PIN_SDIN, PIN_SCLK, MSBFIRST, данные); digitalWrite (PIN_SCE, HIGH);} void LcdCharacter (символьный символ) {LcdWrite (LCD_D, 0x00); for (int index =0; index <5; index ++) {LcdWrite (LCD_D, ASCII [символ - 0x20] [индекс]); } LcdWrite (LCD_D, 0x00);} void LcdClear (void) {for (int index =0; index  Siap"); LcdInitialise (); LcdClear (); LcdString ("Masukkan Koin Rp500 atau Koin Rp1000 @ Rp2000"); задержка (500);} void loop () {int x =analogRead (14); if (state ==SIAP) {if (x> =33) {state =KOIN_MASUK1; время1 =миллис (); тон (2, 4200, 40); Serial.println ("snsr1,"); Serial.println ("начать работу"); }} else if ((state ==KOIN_MASUK1) &&(! (digitalRead (13)))) {if ((digitalRead (12)) &&(state ==KOIN_MASUK1)) {unsigned long diff1 =(millis () - time1 ); Serial.println ("snsr2,"); Serial.println ("остановить работу"); Serial.print ("jeda wkt:"); Serial.print (diff1); Serial.println ("мс"); если (diff1> jeda_waktu) {состояние =SALDO_1000; LcdInitialise (); LcdClear (); LcdString ("diterima Saldo =Rp1000 Tambah Koin Koin Rp1000"); digitalWrite (13, ВЫСОКИЙ); Serial.println ("koin =1000 рупий, Saldo:1000 рупий"); тон (2, 4200, 299); } иначе, если (diff1  =33) {state =KOIN_MASUK2; время2 =миллис (); тон (2, 4200, 40); Serial.println ("snsr1,"); Serial.println ("начать работу"); }} else if ((state ==KOIN_MASUK2) &&((digitalRead (13)))) {if ((digitalRead (12)) &&(state ==KOIN_MASUK2)) {unsigned long diff2 =(millis () - time2); Serial.println ("snsr2,"); Serial.println ("остановить работу"); Serial.print ("jeda wkt:"); Serial.print (diff2); Serial.println ("мс"); если (diff2> jeda_waktu) {состояние =SALDO_5001000; LcdInitialise (); LcdClear (); LcdString ("diterima Saldo =1500 тамба-коин-коин 1000 рупий"); тон (2, 4200, 299); Serial.println («Койн =1000 рупий, Сальдо:1500 рупий»); } иначе, если (diff2  =33) {state =KOIN_MASUK3; время3 =миллис (); тон (2, 4200, 40); Serial.println ("snsr1,"); Serial.println ("начать работу"); }} else if ((state ==KOIN_MASUK3) &&((digitalRead (13)))) {if ((digitalRead (12)) &&(state ==KOIN_MASUK3)) {unsigned long diff3 =(millis () - time3); Serial.println ("snsr2,"); Serial.println ("остановить работу"); Serial.print ("jeda wkt:"); Serial.print (diff3); Serial.println ("мс"); если (diff3> jeda_waktu) {состояние =SALDO_5005001000; LcdInitialise (); LcdClear (); LcdString ("diterima Saldo =Rp2000 Pilih Produk Koin Rp1000"); Serial.println ("koin =1000 рупий, Saldo:2000 рупий"); тон (2, 4200, 799); } иначе, если (diff3  =33) {state =KOIN_MASUK4; время4 =миллис (); тон (2, 4200, 40); Serial.println ("snsr1,"); Serial.println ("начать работу"); }} else if ((state ==KOIN_MASUK4) &&((digitalRead (13)))) {if ((digitalRead (12)) &&(state ==KOIN_MASUK4)) {unsigned long diff4 =(millis () - time4); Serial.println ("snsr2,"); Serial.println ("остановить работу"); Serial.print ("jeda wkt:"); Serial.print (diff4); Serial.println ("мс"); если (diff4> jeda_waktu) {состояние =SALDO_5005005001000; LcdInitialise (); LcdClear (); LcdString ("diterima Saldo =Rp2500 Pilih Produk Koin Rp1000"); Serial.println («Койн =1000 рупий, Сальдо:2500 рупий»); тон (2, 4200, 799); } иначе, если (diff4  =33) {state =KOIN_MASUK5; time5 =миллис (); тон (2, 4200, 40); Serial.println ("snsr1,"); Serial.println ("начать работу"); }} else if ((state ==KOIN_MASUK5) &&((digitalRead (13)))) {if ((digitalRead (12)) &&(state ==KOIN_MASUK5)) {unsigned long diff5 =(millis () - time5); Serial.println ("snsr2,"); Serial.println ("остановить работу"); Serial.print ("jeda wkt:"); Serial.print (diff5); Serial.println ("мс"); если (diff5> jeda_waktu) {состояние =SALDO_50010001000; LcdInitialise (); LcdClear (); LcdString ("diterima Saldo =Rp2500 Pilih Produk Koin Rp1000"); Serial.println («Койн =1000 рупий, Сальдо:2500 рупий»); тон (2, 4200, 799); } иначе, если (diff5  =33) {state =KOIN_MASUK6; time6 =миллис (); тон (2, 4200, 40); Serial.println ("snsr1,"); Serial.println ("начать работу"); }} else if ((state ==KOIN_MASUK6) &&((digitalRead (13)))) {if ((digitalRead (12)) &&(state ==KOIN_MASUK6)) {unsigned long diff6 =(millis () - time6); Serial.println ("snsr2,"); Serial.println ("остановить работу"); Serial.print ("jeda wkt:"); Serial.print (diff6); Serial.println ("мс"); если (diff6> jeda_waktu) {состояние =SALDO_10001000; LcdInitialise (); LcdClear (); LcdString ("diterima Saldo =Rp2000 Pilih Produk Koin Rp1000"); Serial.println ("koin =1000 рупий, Saldo:2000 рупий"); тон (2, 4200, 799); } иначе, если (diff6  =33) {state =KOIN_MASUK7; time7 =миллис (); тон (2, 4200, 40); Serial.println ("snsr1,"); Serial.println ("начать работу"); }} else if ((state ==KOIN_MASUK7) &&((digitalRead (13)))) {if ((digitalRead (12)) &&(state ==KOIN_MASUK7)) {unsigned long diff7 =(millis () - time7); Serial.println ("snsr2,"); Serial.println ("остановить работу"); Serial.print ("jeda wkt:"); Serial.print (diff7); Serial.println ("мс"); если (diff7> jeda_waktu) {состояние =SALDO_10005001000; LcdInitialise (); LcdClear (); LcdString ("diterima Saldo =Rp2500 Pilih Produk Koin Rp1000"); Serial.println («Койн =1000 рупий, Сальдо:2500 рупий»); тон (2, 4200, 799); } иначе, если (diff7  Siap"); }}} 

Изготовленные на заказ детали и корпуса

Это печатный экран моей 3d-модели SolidWorks для этого проекта.

Производственный процесс

  1. Торговый автомат
  2. Мониторинг CO2 с помощью датчика K30
  3. Какой ты рост?
  4. Емкостной датчик отпечатков пальцев с Arduino или ESP8266
  5. Башня датчика облаков Arduino
  6. Водяной пистолет с датчиком движения
  7. Обратный торговый автомат (RVM)
  8. Цена подержанной техники
  9. Что такое автомат по продаже молока?
  10. Что такое автомат по продаже лапши?