Дисковый телефон для свадебного квеста

HOTOREL

✩✩✩✩✩✩✩
16 Янв 2019
5
0
Привет народ, хочу с вами поделится процессом создания телефона с дисковым номеронабирателем (будь он неладен) для свадебного квеста который будет через два дня а у меня нифига не готово)
Как, вы, уже поняли телефон нужен лишь для того, что бы отъиграть свою роль в квесте.
Оно имеет функционал :
- Способен воспроизводить заранее записанные MP3 файлы с SD карточки в трубку (фурычит)
- Способен понимать что у него сняли трубку (фурычит)
- Способен воспроизводить родной бой в колокола от микромотора с эксцентриком (фурычит)
- Способен понимать какую цифру вводят сейчас и сверять с установленным заранее кодом для воспроизведения заранее записанного mp3 файла (сжёг USB вход Arduino nano)


Алгоритм работы : Телефон стоит себе спокойно в углу комнаты (люди подходят трогают его в трубке тишина и он не привлекает внимания), спустя час с момента начала квеста (начало квеста можно активировать трижды подняв и опустив трубку в ответ в трубке можно получить три гудка) раздаётся звонок (как буд-то на телефон кто то позвонил) гости подходят снимают трубку и включается фаил с подсказкой на зацикленном воспроизведении, после того как трубку положат и снимут вновь будет просто гудок и ожидание введения кода на номеронабирателе. После удачного введения кода воспроизводится последняя подсказка и после очередного поднятия трубки будет включаться просто зацикленная музыка.
Интерфейс и настройка : Номеронабиратель и кнопка подъёма трубки
Реализация : Батарея и плата заряда готова (питаю от лития из смартфона 3000мА 4.2В)
Кнопка, звонок, трубка, плеер готовы

Не готово подавления дребезга на контактах номеронабирателя!



Кода пока нет, так как есть только отладочные куски чуть позже соберу всё воедино.

DFPlayer
C4pljs3pivw.jpg


Задняя сторона номеронабирателя с резистором 10кОм
DpzaoO4pEjU.jpg

Почти собрано
i24yRy0U6MY.jpg

Сгорела та часть которая обведена в кружок
lh6acLZ2EFs.jpg

АКБ
Ry3skcjWwD0.jpg


Собственно как называется тот "предохранитель" который сгорел и который я уже потерял на своём ковре?
И как побороться с дребезгом контактов?

В сообщении ниже опишу что уже пытался делать:
 

HOTOREL

✩✩✩✩✩✩✩
16 Янв 2019
5
0
Для начала были просто эксперименты, по результатом которых я понял что:
- Контакты импульсного номеронабирателя нормальнозамкнутые
- Во время вращения номеронабирателя они как бы "трутся" друг о друга создавая неимоверное количество дребезга
Всего в интернете нашёл один более ли менее работающий вариант дискового телефона на ардуино,
Туть
взяв сначала их код на вооружение безжалостно кастрировал его вырезав GSM модуль и звонки всякие и решил проверить что получится, но результата это не дало так как дребезг так и остался и куда копать стало ещё не понятнее...

Потом наткнулся на библиотеку Алекса по работе с кнопкой и думал ну вот, счастье. Но нет. Пока всё встало вот на этом этапе:

#define PIN 3 // кнопка подключена сюда (PIN --- КНОПКА --- GND)
#include "GyverButton.h"
GButton butt1(PIN, LOW_PULL, NORM_CLOSE);

void setup() {
butt1.setDebounce(85);
Serial.begin(9600);
butt1.setTimeout(400); // настройка таймаута на удержание и второй клик (по умолчанию 500 мс)
}

void loop() {
butt1.tick(); // обязательная функция отработки. Должна постоянно опрашиваться

if (butt1.hasClicks()) // проверка на наличие нажатий
Serial.println(butt1.getClicks()); // получить (и вывести) число нажатий
}
Попутно решил использовать по мимо резистора на 10кОм конденсатор на 10мФ в результате чего и погорел (та часть) в момент прошивки

Я хз что делать просто... Даже не знаю куда и копать уже. Даже если завтра успею найти нужный компонент что бы завести ардуинку (от подачи питания на ACC и GRD она включается) не факт что успею победить это всё за два дня((( Может у кого есть какие мысли?


P.S. Да свадьба если что у меня, и мы с моей девушкой устраиваем этот квест для себя
 

HOTOREL

✩✩✩✩✩✩✩
16 Янв 2019
5
0
Пришла идея вмонтировать оптический датчик в устройство номеронабирателя. Сейчас буду эксперементировать

P.S. Нашёл что сгорело, это был диод шоттке
 

HOTOREL

✩✩✩✩✩✩✩
16 Янв 2019
5
0
Победил номеронабиратель!!!) Если что, переменные Number позволяют изменять и подстраивать пароль под любое количество импульсов. Постараюсь сегодня закончить с этим телефоном
boolean phone_flag = false;
boolean butt; // Кнопка подъёма трубки
boolean phone; // Номеронабиратель
int num1 = 0; // Переменная числа
int number = 0; // Счётчик номеронабирателя первой цифры
int number2 = 0; // Счётчик номеронабирателя второй цифры
int number3 = 0;
int number4 = 0;
int number5 = 0;
int number6 = 0;
unsigned long last_press;

void setup() {

pinMode(13, OUTPUT); // Светодиод импульса на плате для отладки (можно потом удалить)
pinMode(3, INPUT_PULLUP); // Импульс с номеронабирателя
pinMode(2, INPUT_PULLUP); // Кнопка подъёма трубки
Serial.begin(9600); // Исправить при подключении DFPlayer
}

void loop() {
phone = digitalRead(3);
butt = !digitalRead(2);
if (butt == false) {
number = 0;
number2 = 0; // Сброс счётчиков после срабатывания концевика трубки
number3 = 0;
number4 = 0;
number5 = 0;
number6 = 0;
num1 = 0;
}

/**********************ОТРАБОТКА ПЕРВОЙ ЦИФРЫ*****************************/
if (phone == true && phone_flag == false && butt == true && num1 == 0) {
phone_flag = true;
digitalWrite(13, HIGH);
number = number + 1;
}
if (phone == false && phone_flag == true && num1 == 0) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
}
if (number == 6 && millis() - last_press > 250) { // Задаём нужный код первой цифры
num1 = 1;
number = number - 1; // Отключает цикл
}
/**********************ОТРАБОТКА ВТОРОЙ ЦИФРЫ*****************************/

if (phone == true && phone_flag == false && butt == true && num1 == 1) {
phone_flag = true;
digitalWrite(13, HIGH);
number2 = number2 + 1;
}
if (phone == false && phone_flag == true && num1 == 1) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
}
if (number2 == 22 && millis() - last_press > 250) { // Задаём нужный код второй цифры
num1 = 2;
number2 = number2 - 1; // Отключает цикл
}
/**********************ОТРАБОТКА ТРЕТЬЕЙ ЦИФРЫ****************************/
if (phone == true && phone_flag == false && butt == true && num1 == 2) {
phone_flag = true;
digitalWrite(13, HIGH);
number3 = number3 + 1;
}
if (phone == false && phone_flag == true && num1 == 2) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
}
if (number3 == 24 && millis() - last_press > 250) { // Задаём нужный код третьей цифры
num1 = 3;
number3 = number3 - 1; // Отключает цикл
}
/**********************ОТРАБОТКА ЧЕТВЁРТОЙ ЦИФРЫ**************************/
if (phone == true && phone_flag == false && butt == true && num1 == 3) {
phone_flag = true;
digitalWrite(13, HIGH);
number4 = number4 + 1;
}
if (phone == false && phone_flag == true && num1 == 3) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
}
if (number4 == 6 && millis() - last_press > 250) { // Задаём нужный код четвёртой цифры
num1 = 4;
number4 = number4 - 1; // Отключает цикл
}
/**********************ОТРАБОТКА ПЯТОЙ ЦИФРЫ *****************************/
if (phone == true && phone_flag == false && butt == true && num1 == 4) {
phone_flag = true;
digitalWrite(13, HIGH);
number5 = number5 + 1;
}
if (phone == false && phone_flag == true && num1 == 4) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
}
if (number5 == 6 && millis() - last_press > 250) { // Задаём нужный код пятой цифры
num1 = 5;
number5 = number5 - 1; // Отключает цикл
}
/**********************ОТРАБОТКА ШЕСТОЙ ЦИФРЫ*****************************/
if (phone == true && phone_flag == false && butt == true && num1 == 5) {
phone_flag = true;
digitalWrite(13, HIGH);
number6 = number6 + 1;
}
if (phone == false && phone_flag == true && num1 == 5) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
}
if (number6 == 22 && millis() - last_press > 250) { // При введении верного числа происходит переход к проверке второго
num1 = 6;
number6 = number6 - 1; // Отключает цикл
Serial.println("number 6 correct");
}

if (num1 = 6 && butt == true)

}
 

HOTOREL

✩✩✩✩✩✩✩
16 Янв 2019
5
0
В общем тут похоже это ни кому не интересно... Я если что всё собрал и всё работает (мало ли кто интересовался) Вот рабочий код с небольшими пояснениями

3FXhTzPRQDY.jpg
CGSxqgerAoc.jpg
cvevyll8iIY.jpg
emgawAtXRas.jpg

#include <SoftwareSerial.h> // библиотека для для обмена данными
#include <DFPlayer_Mini_Mp3.h> // подключаем библиотеку для DFPlayer Mini

boolean phone_flag = false;
boolean butt_flag = false;
boolean butt; // Кнопка подъёма трубки
boolean phone; // Номеронабиратель
int num1 = 9; // Переменная числа
int number = 0; // Счётчик номеронабирателя первой цифры
int number2 = 0; // Счётчик номеронабирателя второй цифры
int number3 = 0;
int number4 = 0;
int number5 = 0;
int number6 = 0;
int number7 = 0;
unsigned long last_press;

void setup() {
pinMode(5, OUTPUT); // Выход на звонок
pinMode(13, OUTPUT); // Светодиод импульса на плате для отладки (можно потом удалить)
pinMode(3, INPUT_PULLUP); // Импульс с номеронабирателя
pinMode(2, INPUT_PULLUP); // Кнопка подъёма трубки
digitalWrite(5, HIGH);
Serial.begin(9600); // Исправить при подключении DFPlayer
mp3_set_serial(Serial); // включаем передачу данных с DFPlayer mini mp3
delay(1); // задержка в 1ms для установки громкости
// mp3_set_volume(30); // устанавливаем громкость от 0 до 30
}

void loop() {

phone = digitalRead(3);
butt = !digitalRead(2);
if (phone == true && phone_flag == false && butt == true && num1 == 9) {
phone_flag = true;
digitalWrite(13, HIGH);
number7 = number7 + 1;
}
if (phone == false && phone_flag == true && num1 == 9) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
// Serial.println(number7);
}
if (butt == false) number7 = 0;
if (number7 == 66 && millis() - last_press > 750) { // Задаём нужный код цифры для запуска таймера
num1 = 10;
// Serial.println("Active");
number7 = number7 - 1;
delay(2000);
// Serial.println(butt);
// Serial.println(num1);
mp3_play(1); // проигрываем файл mp3/0001.mp3 // П Р О В Е Р И Т Ь!!!
delay(1000);
mp3_play(1); // проигрываем файл mp3/0001.mp3 // П Р О В Е Р И Т Ь!!!
delay(1000);
mp3_play(1); // проигрываем файл mp3/0001.mp3 // П Р О В Е Р И Т Ь!!!
delay(3600000); // Таймер входящего звонка
}

if (butt == false && num1 == 10) {
butt_flag = true;//
Serial.println("Ring");
digitalWrite(5, LOW);
delay(2500);
digitalWrite(5, HIGH);
delay(2000);
}
if (butt == true && num1 == 10 && butt_flag == true) {
num1 = 12;
mp3_play(4);

// Serial.println(butt);
// Serial.println(num1);
}

if (butt == false && num1 != 9 && num1 != 10) {
mp3_stop();
number = 0;
number2 = 0; // Сброс счётчиков после срабатывания концевика трубки
number3 = 0;
number4 = 0;
number5 = 0;
number6 = 0;
num1 = 0;
}
/* if (butt == true && num1 == 0 && millis() - last_press ) {
mp3_play(2);
last_press = millis();
}
*/
/**********************ОТРАБОТКА ПЕРВОЙ ЦИФРЫ*****************************/
if (phone == true && phone_flag == false && butt == true && num1 == 0) {
phone_flag = true;
digitalWrite(13, HIGH);
number = number + 1;
if (number == 1){
mp3_play(2);
}
}
if (phone == false && phone_flag == true && num1 == 0) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
}
if (number > 52 && number < 54){
mp3_play(3);
}
if (number == 6 && millis() - last_press > 250) { // Задаём нужный код первой цифры
num1 = 1;
number = number - 1; // Отключает цикл
}
/**********************ОТРАБОТКА ВТОРОЙ ЦИФРЫ*****************************/

if (phone == true && phone_flag == false && butt == true && num1 == 1) {
phone_flag = true;
digitalWrite(13, HIGH);
number2 = number2 + 1;
}
if (phone == false && phone_flag == true && num1 == 1) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
}
if (number2 > 52 && number2 < 54){
mp3_play(3);
}
if (number2 == 22 && millis() - last_press > 250) { // Задаём нужный код второй цифры
num1 = 2;
number2 = number2 - 1; // Отключает цикл
}
/**********************ОТРАБОТКА ТРЕТЬЕЙ ЦИФРЫ****************************/
if (phone == true && phone_flag == false && butt == true && num1 == 2) {
phone_flag = true;
digitalWrite(13, HIGH);
number3 = number3 + 1;
}
if (phone == false && phone_flag == true && num1 == 2) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
}
if (number3 == 24 && millis() - last_press > 250) { // Задаём нужный код третьей цифры
num1 = 3;
number3 = number3 - 1; // Отключает цикл
}
/**********************ОТРАБОТКА ЧЕТВЁРТОЙ ЦИФРЫ**************************/
if (phone == true && phone_flag == false && butt == true && num1 == 3) {
phone_flag = true;
digitalWrite(13, HIGH);
number4 = number4 + 1;
}
if (phone == false && phone_flag == true && num1 == 3) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
}
if (number4 == 6 && millis() - last_press > 250) { // Задаём нужный код четвёртой цифры
num1 = 4;
number4 = number4 - 1; // Отключает цикл
}
/**********************ОТРАБОТКА ПЯТОЙ ЦИФРЫ *****************************/
if (phone == true && phone_flag == false && butt == true && num1 == 4) {
phone_flag = true;
digitalWrite(13, HIGH);
number5 = number5 + 1;
}
if (phone == false && phone_flag == true && num1 == 4) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
}
if (number5 == 6 && millis() - last_press > 250) { // Задаём нужный код пятой цифры
num1 = 5;
number5 = number5 - 1; // Отключает цикл
}
/**********************ОТРАБОТКА ШЕСТОЙ ЦИФРЫ*****************************/
if (phone == true && phone_flag == false && butt == true && num1 == 5) {
phone_flag = true;
digitalWrite(13, HIGH);
number6 = number6 + 1;
}
if (phone == false && phone_flag == true && num1 == 5) {
phone_flag = false;
digitalWrite(13, LOW);
last_press = millis();
}
if (number6 == 22 && millis() - last_press > 250) { // При введении верного числа происходит переход к проверке второго
num1 = 6;
number6 = number6 - 1; // Отключает цикл
Serial.println("Number correctly");
mp3_play(5);
}
}