КОПИЛКА СО СЧЁТЧИКОМ МОНЕТ
Электронный распознаватель монет (по размеру) для копилки со счётчиком суммы и статистикой по каждому типу монет.
Возможности:
- Распознавание размера монет с высокой точностью и его привязка к стоимости каждой монеты
- Вычисление общей суммы монет в копилке
- Статистика по числу монет каждого типа
- Все настройки сохраняются в энергонезависимую память и не сбрасываются при питании
- Накопленная сумма тоже хранится в энергонезависимой памяти и не боится сбоев питания
- Режим глубокого энергосбережения: в спящем режиме потребляется 0.07 мА, в схеме без преобразователя 0.02 мА
- Поддержка любого числа монет разного размера
- Автоматическая калибровка типов монет
- Сброс накопленного количества
ПОДРОБНОЕ ВИДЕО ПО ПРОЕКТУ
- В данном видео показан полный и максимально подробный процесс разработки и изготовления устройства, а также обзор его возможностей и функций, всё это с приятным монтажиком, музычкой и комментариями. В общем, приятного просмотра!
ИНСТРУКЦИИ ПО ЭКСПЛУАТАЦИИ
Перед началом работы нужно провести калибровку под ваш монеты, делается это следующим образом. На ардуино есть кнопка перезагрузки, и рядом есть наша кнопка для калибровки. Нажимаем кнопку калибровки, и затем перезагружаем ардуину, кнопку не отпускаем. На дисплее появится кнопка сервис, держим кнопку 3 секунды. Затем появится надпись память очищена. Эта процедура обнуляет число монеток, которые были брошены в копилку. Отпускаем, запускается процесс калибровки. Теперь нужно бросать в копилку монетки с такой ценой, которая указана на дисплее. Система находит максимальное значение сигнала с датчика для каждой монетки и записывает его в память, все настройки сохраняются даже после перезагрузки. Всё, копилка выходит на обычный режим.
Давайте посчитаем, сколько мелочи было у меня в кошельке. Сейчас система спит глубоким сном и видит жуткие цифровые сны. Как только я вставляю монетку, контакты на входе в щель замыкаются, и ардуино просыпается и включает дисплей и датчик, и начинает ждать монетки. Если перестать кидать монетки, дисплей погаснет и ардуино снова уснёт. А сейчас я покажу вам ещё одну интересную функцию: вставляем монетку и удерживаем её несколько секунд, то есть замыкаем контакты. И на дисплее отображается в первой строчке цена монетки, и на второй строчке число этих монеток, то есть мы знаем, какое количество монеток каждого типа лежит в копилке на данный момент. И затем снова засыпаем.
МАТЕРИАЛЫ И КОМПОНЕНТЫ
Ссылки на магазины, с которых я закупаюсь уже не один год
Вам скорее всего пригодится:
- Arduino NANO 328p – искать
- Дисплей 1602
- Датчик искать
- Повышайка https://ali.ski/NzWdL3
- Кнопки и прочее https://alexgyver.ru/electronics/
- Мосфеты (список подходящих: IRF3704ZPBF, IRLB8743PBF, IRL2203NPBF, IRLB8748PBF, IRF3704PBF, IRL8113PBF, IRL3803PBF, IRLB3813PBF, IRL3502PBF, IRL2505PBF, IRF3711PBF, IRL3713PBF, IRF3709ZPBF, AUIRL3705N, IRLB3034PBF, IRF3711ZPBF)
- Фототранзисторы отдельные: L-7113P3C, L-53P3C
- Светодиоды отдельные: L-7113F3C, L-53F3C
- Аккумуляторы https://alexgyver.ru/18650/
- Модуль зарядки и защиты https://ali.ski/pspbG
ПРОШИВКА И НАСТРОЙКА
Содержимое папок в архиве
- Библиотеки – библиотеки для дисплея и прочего, скопировать в
C:\Program Files (x86)\Arduino\libraries\
(Windows x64)
C:\Program Files\Arduino\libraries\
(Windows x86) - money_box_counter – прошивка для Arduino, файл в папке открыть в Arduino IDE (читай FAQ)
Как прошить?
- ЕСЛИ ЭТО ПЕРВЫЙ ОПЫТ РАБОТЫ С ARDUINO – посмотреть ВИДЕО о платформе с целью ознакомления, далее скачать, установить и настроить необходимые для работы программы согласно СУПЕР ПОДРОБНОЙ ИНСТРУКЦИИ (там даже видео версия есть!).
- Скачать архив с проектом напрямую, или с GitHub (кнопки чуть выше)
Установить библиотеки (папка Libraries) в
C:\Program Files (x86)\Arduino\libraries\ (Windows x64)
C:\Program Files\Arduino\libraries\ (Windows x86)- Подключить Ардуино к компьютеру при помощи Data-кабеля
- Открыть файл прошивки желаемой версии (файлы прошивок .ino лежат в одноимённых папках)
- Настроить Arduino IDE (COM порт, куда подключена плата; подключенная модель Arduino, как в статье из первого пункта)
- Настроить что нужно в прошивке, нажать загрузить
- Если происходит ошибка компиляции или ошибка загрузки, читать 5-ый пункт в ЭТОЙ СТАТЬЕ
Настройки в прошивке
#define coin_amount 5 // число монет, которые нужно распознать float coin_value[coin_amount] = {0.5, 1.0, 2.0, 5.0, 10.0}; // стоимость монет String currency = "RUB"; // валюта (английские буквы!!!) int stb_time = 10000; // время бездействия, через которое система уйдёт в сон (миллисекунды)
Дополнительно
- Нажать и удерживать кнопку калибровки, затем подать питание/перезагрузить Arduino
- Если отпустить кнопку калибровки, система перейдёт в режим калибровки
- Если удерживать ещё 3 секунды – режим очистки памяти (сброс числа монет)
- После окончания калибровки система сама перейдёт в обычный режим работы
АЛГОРИТМ РАБОТЫ
if (sleep_flag) { // если проснулись после сна, инициализировать дисплей и вывести текст, сумму и валюту delay(500); lcd.init(); lcd.clear(); lcd.setCursor(0, 0); lcd.print(L"На яхту"); lcd.setCursor(0, 1); lcd.print(summ_money); lcd.setCursor(13, 1); lcd.print(currency); empty_signal = analogRead(IRsens); sleep_flag = false; } // далее работаем в бесконечном цикле last_sens_signal = empty_signal; while (1) { sens_signal = analogRead(IRsens); // далее такой же алгоритм, как при калибровке if (sens_signal > last_sens_signal) last_sens_signal = sens_signal; if (sens_signal - empty_signal > 3) coin_flag = true; if (coin_flag && (abs(sens_signal - empty_signal)) < 2) { recogn_flag = false; // флажок ошибки, пока что не используется // в общем нашли максимум для пролетевшей монетки, записали в last_sens_signal // далее начинаем сравнивать со значениями для монет, хранящимися в памяти for (byte i = 0; i < coin_amount; i++) { int delta = abs(last_sens_signal - coin_signal[i]); // вот самое главное! ищем АБСОЛЮТНОЕ (то бишь по модулю) // значение разности полученного сигнала с нашими значениями из памяти if (delta < 30) { // и вот тут если эта разность попадает в диапазон, то считаем монетку распознанной summ_money += coin_value[i]; // к сумме тупо прибавляем цену монетки (дада, сумма считается двумя разными способами. При старте системы суммой всех монет, а тут прибавление lcd.setCursor(0, 1); lcd.print(summ_money); coin_quantity[i]++; // для распознанного номера монетки прибавляем количество recogn_flag = true; break; } } coin_flag = false; standby_timer = millis(); // сбросить таймер break; }