From b0a48ad835bf2de17e66a962e736aa91ad42e129 Mon Sep 17 00:00:00 2001 From: roversochi Date: Wed, 12 Jul 2017 10:45:17 +0300 Subject: [PATCH 1/5] =?UTF-8?q?=D0=BF=D0=BE=D0=B2=D1=8B=D1=88=D0=B0=D0=B5?= =?UTF-8?q?=D0=BC=20=D1=82=D0=BE=D1=87=D0=BD=D0=BE=D1=81=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Так, как у одного номинала монетки немного отличаются друг от друга, то вводим дополнительные значения в массив, по 3 значения --- money_box_counter/money_box_counter.ino | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/money_box_counter/money_box_counter.ino b/money_box_counter/money_box_counter.ino index 1ec1ef9..ef8fc96 100644 --- a/money_box_counter/money_box_counter.ino +++ b/money_box_counter/money_box_counter.ino @@ -5,8 +5,12 @@ */ //-------НАСТРОЙКИ--------- -#define coin_amount 5 // число монет, которые нужно распознать -float coin_value[coin_amount] = {0.5, 1.0, 2.0, 5.0, 10.0}; // стоимость монет +#define coin_amount 15 // число монет, которые нужно распознать + +// стоимость монет, для повышения точности необходимо выбрать по 3 монетки каждого номинала, +// максимально отличающихся друг от друга. Например блестящую, матовую и средней загрязненности +float coin_value[coin_amount] = {0.5, 1.0, 2.0, 5.0, 10.0, 0.5, 1.0, 2.0, 5.0, 10.0, 0.5, 1.0, 2.0, 5.0, 10.0}; + String currency = "RUB"; // валюта (английские буквы!!!) int stb_time = 10000; // время бездействия, через которое система уйдёт в сон (миллисекунды) //-------НАСТРОЙКИ--------- From 40d53cf20ed98e647325cea34e2daaede08325bd Mon Sep 17 00:00:00 2001 From: roversochi Date: Wed, 12 Jul 2017 11:29:13 +0300 Subject: [PATCH 2/5] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20=D0=BC=D0=BE=D0=BD=D0=B5?= =?UTF-8?q?=D1=82=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit переписан алгоримт поиска монетки --- money_box_counter/money_box_counter.ino | 41 +++++++++++++++---------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/money_box_counter/money_box_counter.ino b/money_box_counter/money_box_counter.ino index ef8fc96..813d745 100644 --- a/money_box_counter/money_box_counter.ino +++ b/money_box_counter/money_box_counter.ino @@ -9,7 +9,7 @@ // стоимость монет, для повышения точности необходимо выбрать по 3 монетки каждого номинала, // максимально отличающихся друг от друга. Например блестящую, матовую и средней загрязненности -float coin_value[coin_amount] = {0.5, 1.0, 2.0, 5.0, 10.0, 0.5, 1.0, 2.0, 5.0, 10.0, 0.5, 1.0, 2.0, 5.0, 10.0}; +float coin_value[coin_amount] = {0.5, 1.0, 2.0, 5.0, 10.0, 0.5, 1.0, 2.0, 5.0, 10.0, 0.5, 1.0, 2.0, 5.0, 10.0}; String currency = "RUB"; // валюта (английские буквы!!!) int stb_time = 10000; // время бездействия, через которое система уйдёт в сон (миллисекунды) @@ -28,7 +28,7 @@ float summ_money = 0; // сумма монет в копилке //-------БИБЛИОТЕКИ--------- LCD_1602_RUS lcd(0x27, 16, 2); // создать дисплей -boolean recogn_flag, sleep_flag = true; // флажки +boolean sleep_flag = true; // флажки //-------КНОПКИ--------- byte button = 2; // кнопка "проснуться" byte calibr_button = 3; // скрытая кнопка калибровкии сброса @@ -123,9 +123,12 @@ void setup() { /* // для отладки, вывести сигналы монет в порт for (byte i = 0; i < coin_amount; i++) { + Serial.print(coin_value[i]); + Serial.print(": "); Serial.println(coin_signal[i]); } */ + standby_timer = millis(); // обнулить таймер ухода в сон } @@ -134,7 +137,7 @@ void loop() { delay(500); lcd.init(); lcd.clear(); - lcd.setCursor(0, 0); lcd.print(L"На яхту"); + 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); @@ -148,20 +151,26 @@ void loop() { 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 - // далее начинаем сравнивать со значениями для монет, хранящимися в памяти + + + // алгоритм сравнивает последовательно сигнал каждой монетки с last_sens_signal + // и находит монетку, наиболее подходящую под сигнал (минимально отличающуюся от last_sens_signal) + int delta = 1000; // для временной записи минимального значения + int min_i = 0; // номер минимальной монетки 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; + if (delta > abs(last_sens_signal - coin_signal[i]) ) { + delta = abs(last_sens_signal - coin_signal[i]) ; + min_i = i; } } + + // для отладки, вывести номинал найденной монетки + // Serial.println(coin_value[min_i]); + + summ_money += coin_value[min_i]; // к сумме тупо прибавляем цену монетки (дада, сумма считается двумя разными способами. При старте системы суммой всех монет, а тут прибавление + lcd.setCursor(0, 1); lcd.print(summ_money); + coin_quantity[min_i]++; // для распознанного номера монетки прибавляем количество + coin_flag = false; standby_timer = millis(); // сбросить таймер break; @@ -172,8 +181,8 @@ void loop() { good_night(); break; } - - // если монетка вставлена (замыкает контакты) и удерживается 2 секунды + + // если монетка вставлена (замыкает контакты) и удерживается 2 секунды while (!digitalRead(button)) { if (millis() - standby_timer > 2000) { lcd.clear(); From 61b3b306029ae705ad81a67ef267754c5adc3180 Mon Sep 17 00:00:00 2001 From: roversochi Date: Wed, 12 Jul 2017 11:39:45 +0300 Subject: [PATCH 3/5] =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=8C=D1=88=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BB=D0=B8=D1=87=D0=B5=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=BE=20=D0=BC=D0=BE=D0=BD=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Надо разбираться, почему при количестве монет 15 или больше, сумма криво считается. --- money_box_counter/money_box_counter.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/money_box_counter/money_box_counter.ino b/money_box_counter/money_box_counter.ino index 813d745..74197da 100644 --- a/money_box_counter/money_box_counter.ino +++ b/money_box_counter/money_box_counter.ino @@ -5,11 +5,11 @@ */ //-------НАСТРОЙКИ--------- -#define coin_amount 15 // число монет, которые нужно распознать +#define coin_amount 10 // число монет, которые нужно распознать // стоимость монет, для повышения точности необходимо выбрать по 3 монетки каждого номинала, // максимально отличающихся друг от друга. Например блестящую, матовую и средней загрязненности -float coin_value[coin_amount] = {0.5, 1.0, 2.0, 5.0, 10.0, 0.5, 1.0, 2.0, 5.0, 10.0, 0.5, 1.0, 2.0, 5.0, 10.0}; +float coin_value[coin_amount] = {0.5, 1.0, 2.0, 5.0, 10.0, 0.5, 1.0, 2.0, 5.0, 10.0}; String currency = "RUB"; // валюта (английские буквы!!!) int stb_time = 10000; // время бездействия, через которое система уйдёт в сон (миллисекунды) From 4fde23e006f43d220ebbdb180032e854e679ad1a Mon Sep 17 00:00:00 2001 From: roversochi Date: Thu, 13 Jul 2017 12:30:10 +0300 Subject: [PATCH 4/5] =?UTF-8?q?=D1=81=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20memory=5Foffset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавил константу memory_offset, которая смещает область хранения количества каждой монетки. Это позволяет указывать количество монеток больше 10, а значит повышает точность измерений. Пока что установил в значение 40, но при необходимости можно генерить его динамически, например memory_offset = coin_amount*2+5 --- money_box_counter/money_box_counter.ino | 38 ++++++++++++++++++------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/money_box_counter/money_box_counter.ino b/money_box_counter/money_box_counter.ino index 74197da..ebecff1 100644 --- a/money_box_counter/money_box_counter.ino +++ b/money_box_counter/money_box_counter.ino @@ -2,15 +2,29 @@ Created 2017 by AlexGyver AlexGyver Home Labs Inc. + + + Updated + Zaven Bastrykin + 2017 + + Структура памяти + i - id монетки по порядку + по адресам (i * 2) хранятся значения с датчика для каждой монетки - массив coin_signal + по адресам (memory_offset + i * 2) хранятся количество каждой монетки - массив coin_quantity */ -//-------НАСТРОЙКИ--------- -#define coin_amount 10 // число монет, которые нужно распознать + +//-------НАСТРОЙКИ--------- +#define coin_amount 15 // число монет, которые нужно распознать +#define memory_offset 40 // смещение необходимо для отделения значений сигналов от количества каждой монетке в общей памяти, + // оно напрямую зависит от количества элементов в массиве coin_value[], должно быть мимимум в 2 раза больше coin_amount + // так как для хранения одного инта требуется 2 ячейки памяти // стоимость монет, для повышения точности необходимо выбрать по 3 монетки каждого номинала, // максимально отличающихся друг от друга. Например блестящую, матовую и средней загрязненности -float coin_value[coin_amount] = {0.5, 1.0, 2.0, 5.0, 10.0, 0.5, 1.0, 2.0, 5.0, 10.0}; - +float coin_value[coin_amount] = {0.5, 1.0, 2.0, 5.0, 10.0, 0.5, 1.0, 2.0, 5.0, 10.0, 0.5, 1.0, 2.0, 5.0, 10.0}; + String currency = "RUB"; // валюта (английские буквы!!!) int stb_time = 10000; // время бездействия, через которое система уйдёт в сон (миллисекунды) //-------НАСТРОЙКИ--------- @@ -71,14 +85,14 @@ void setup() { lcd.clear(); lcd.setCursor(3, 0); lcd.print(L"Сервис"); - delay(500); + delay(100); reset_timer = millis(); while (1) { // бесконечный цикл if (millis() - reset_timer > 3000) { // если кнопка всё ещё удерживается и прошло 3 секунды // очистить количество монет for (byte i = 0; i < coin_amount; i++) { coin_quantity[i] = 0; - EEPROM.writeInt(20 + i * 2, 0); + EEPROM.writeInt(memory_offset + i * 2, 0); } lcd.clear(); lcd.setCursor(0, 0); @@ -94,6 +108,7 @@ void setup() { } while (1) { for (byte i = 0; i < coin_amount; i++) { + lcd.setCursor(0, 1); lcd.print(" "); // очищаем экран lcd.setCursor(0, 1); lcd.print(coin_value[i]); // отобразить цену монеты, размер которой калибруется lcd.setCursor(13, 1); lcd.print(currency); // отобразить валюту last_sens_signal = empty_signal; @@ -116,18 +131,18 @@ void setup() { // при старте системы считать из памяти сигналы монет для дальнейшей работы, а также их количество в банке for (byte i = 0; i < coin_amount; i++) { coin_signal[i] = EEPROM.readInt(i * 2); - coin_quantity[i] = EEPROM.readInt(20 + i * 2); + coin_quantity[i] = EEPROM.readInt(memory_offset + i * 2); summ_money += coin_quantity[i] * coin_value[i]; // ну и сумму сразу посчитать, как произведение цены монеты на количество } - /* + // для отладки, вывести сигналы монет в порт for (byte i = 0; i < coin_amount; i++) { Serial.print(coin_value[i]); Serial.print(": "); Serial.println(coin_signal[i]); } - */ + standby_timer = millis(); // обнулить таймер ухода в сон } @@ -164,6 +179,9 @@ void loop() { } } + lcd.setCursor(9, 0); lcd.print(" "); + lcd.setCursor(9, 0); lcd.print(coin_value[min_i]); + // для отладки, вывести номинал найденной монетки // Serial.println(coin_value[min_i]); @@ -201,7 +219,7 @@ void loop() { void good_night() { // перед тем как пойти спать, записываем в EEPROM новые полученные количества монет по адресам начиная с 20го (пук кек) for (byte i = 0; i < coin_amount; i++) { - EEPROM.updateInt(20 + i * 2, coin_quantity[i]); + EEPROM.updateInt(memory_offset + i * 2, coin_quantity[i]); } sleep_flag = true; // вырубить питание со всех дисплеев и датчиков From 176ba0ee15aefcd65140522d0ba54f5efc6b4e7c Mon Sep 17 00:00:00 2001 From: vorers Date: Sun, 1 Dec 2019 15:54:48 +0300 Subject: [PATCH 5/5] Update money_box_counter.ino --- money_box_counter/money_box_counter.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/money_box_counter/money_box_counter.ino b/money_box_counter/money_box_counter.ino index ebecff1..6aa09c8 100644 --- a/money_box_counter/money_box_counter.ino +++ b/money_box_counter/money_box_counter.ino @@ -5,7 +5,7 @@ Updated - Zaven Bastrykin + roversochi 2017 Структура памяти