КОПИЛКА СО СЧЁТЧИКОМ МОНЕТ

Электронный распознаватель монет (по размеру) для копилки со счётчиком суммы и статистикой по каждому типу монет.
Возможности:

  • Распознавание размера монет с высокой точностью и его привязка к стоимости каждой монеты
  • Вычисление общей суммы монет в копилке
  • Статистика по числу монет каждого типа
  • Все настройки сохраняются в энергонезависимую память и не сбрасываются при питании
  • Накопленная сумма тоже хранится в энергонезависимой памяти и не боится сбоев питания
  • Режим глубокого энергосбережения: в спящем режиме потребляется 0.07 мА, в схеме без преобразователя 0.02 мА
  • Поддержка любого числа монет разного размера
  • Автоматическая калибровка типов монет
  • Сброс накопленного количества

ПОДРОБНОЕ ВИДЕО ПО ПРОЕКТУ

  • В данном видео показан полный и максимально подробный процесс разработки и изготовления устройства, а также обзор его возможностей и функций, всё это с приятным монтажиком, музычкой и комментариями. В общем, приятного просмотра!

ИНСТРУКЦИИ ПО ЭКСПЛУАТАЦИИ

Перед началом работы нужно провести калибровку под ваш монеты, делается это следующим образом. На ардуино есть кнопка перезагрузки, и рядом есть наша кнопка для калибровки. Нажимаем кнопку калибровки, и затем перезагружаем ардуину, кнопку не отпускаем. На дисплее появится кнопка сервис, держим кнопку 3 секунды. Затем появится надпись память очищена. Эта процедура обнуляет число монеток, которые были брошены в копилку. Отпускаем, запускается процесс калибровки. Теперь нужно бросать в копилку монетки с такой ценой, которая указана на дисплее. Система находит максимальное значение сигнала с датчика для каждой монетки и записывает его в память, все настройки сохраняются даже после перезагрузки. Всё, копилка выходит на обычный режим.

Давайте посчитаем, сколько мелочи было у меня в кошельке. Сейчас система спит глубоким сном и видит жуткие цифровые сны. Как только я вставляю монетку, контакты на входе в щель замыкаются, и ардуино просыпается и включает дисплей и датчик, и начинает ждать монетки. Если перестать кидать монетки, дисплей погаснет и ардуино снова уснёт. А сейчас я покажу вам ещё одну интересную функцию: вставляем монетку и удерживаем её несколько секунд, то есть замыкаем контакты. И на дисплее отображается в первой строчке цена монетки, и на второй строчке число этих монеток, то есть мы знаем, какое количество монеток каждого типа лежит в копилке на данный момент. И затем снова засыпаем.

СХЕМЫ, ПЕЧАТНЫЕ ПЛАТЫ

Схема питания от USB

Схема питания от аккумулятора через мосфет

МАТЕРИАЛЫ И КОМПОНЕНТЫ

Ссылки на магазины, с которых я закупаюсь уже не один год

Вам скорее всего пригодится:

Если товар закончился, то почти всё указанное ниже можно найти здесь http://alexgyver.ru/arduino_shop/ или здесь http://alexgyver.ru/electronics/

ПРОШИВКА И НАСТРОЙКА

Содержимое папок в архиве

  • Библиотеки — библиотеки для дисплея и прочего, скопировать в
    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;
   }

2018-02-21T00:40:04+00:00