logoПрацюю я адміністратором в одному із львівських ресторанів. Чотири роки в нас біля барної стійки стояв дзвінок для того, щоб оповістити офіціанта, що клієнт готовий зробити замовлення. Пристрій був безпровідний. Була ціла купа так званих безпровідних “дзвінків” і приймач із великим дисплеєм який повідомляв номер столика. Один із таких “дзвінків” ми поставили на кухню, щоб кухарі не кричали весь час при готовності замовлення, а просто викликали “дзвінком” офіціанта на кухню. Але одного прекрасного дня приймач почав глючити і зависати, користуватись ним стало неможливо. Всі спроби ремонту були не вдалі. За довгий час весь колектив привик до цього пристрою і без нього стало якось не так.
Було вирішено зробити власний дзвінок з пасьянсом і сеньйоритами. Звичайно мій варіант не такий прикольний як заводський попередник, зате простий у використанні і надіюсь не буде глючити.
На розробру “заліза” я потратив десь два-три дні і менше 100 грн. За основу дзвінка був взятий контролер Attiny85, який виявився трохи зажирною мікросхемою, можна було вибрати щось попростіше. Далі трохи розсипухи , пара транзисторів, три ватний світлодіод ну і на останок невеликий динамік, який я вирвав із старого пристрою. Корпус купив готовий на радіоринку, один із тих, що пропонують для виготовлення власних девайсів. Блок живлення був пожертвуваний від старого маршрутизатора.
image

Схема досить проста для розуміння. Динамік підключив через транзисторний ключ до 6-ноги контролера, на ньому можна створити PWM сигнал, за допомогою якого генеруються ноти і можна запрограмувати практично любу мелодію. Транзистор n-p-n любий і щоб витримував силу струму в 300 мА. Світлодіод потужністю 3 Ватт, думаю його миготіння буде важко проігнорувати. Його теж підключив через транзистор. Думав спочатку зробити плавне загоряння світлодіода, також його увімкнув через один із виводів контролера який дозволяє генерувати PWM-сигнал, але подумавши що його миготіння буде зливатись із світловою апаратурою нашого музиканта, світлове інформування стає не таким вже і ефективним. Краще хай він загоряється і тухне на повну силу із певною періодичністю, чим буде привертати більше уваги. Все живеться через лінійний стабілізатор 7805 із невеликою купою обв’язу. Також маємо дві кнопки, одна буде стояти на кухні і за допомогою чотири-жильного кабелю підключена, через телефонний джек RJ-11 до дзвінка біля барної стійки. При її натисненні має прозвучати одноразово коротенька мелодія і почати блимати світлодіод, з очікуванням натиснення другої кнопки, яка вимкне блимання діода і переведе знову пристрій в режим очікування натиснення кнопки на кухні.

IMAG0005

А ось і сама кнопка в зборі:

IMAG0007

А також її “потроха”:

IMAG0006

На “макетку” припаяна простенька тактова кнопка і від неї провід до роз’єму RJ-11, який я приклеїв на термоклей (“китайські соплі”).

А також начинка самого дзвінка:

IMAG0417

IMAG0416

Що стосується софтової частини мого проекту, то тут все робилось в останню чергу. Думаючи що написання прошивки буде самою легшою справою я і не чекав що мене спіткало. З початку чесно намагався написати і відладити програму в АВР Студії. Написав і запустив обробник подій кнопок і заставив мигати світлодіод,  але коли діло дійшло до програвання звукового сигналу, в мене настав ступор і проект на декілька тижнів відклався в тумбочку. А так як в мене тумбочки нема, то все тупо валялось на столі і довгий час мозолило мені очі.

Аналогічні проекти які я найшов у мережі були для мене досить заплутані, я в них не зміг розібратись. На допомогу прийшов проект із книги “Программирование микроконтроллерных плат Arduino/Freeduino“. Знаю-знаю ардуіно не по феншую і взагалі воно для людей далеких від електроніки. Але своєї цілі я добився! Також із зеркала книги можна скачати додаткові файли і приклади які в ній використовуються. Для того щоб середовище програмування ардуіни почало працювати із контролером Attiny85, прийдеться доставити в нього невеликий патч .

Також сам код скетча мого проекту:

/********************************/
// Автор: Корнута Тарас         //
// www: http://digiua.com/      //
// 10.01.2014                   //
// Дзвінок для виклику офіціанта//
/********************************/
 
int Speaker = 1;                        //Декларація змінних для різного роду переферії
int Led = 0;
 
int SW_kitchen=3;
int SW_reset=4;
 
int length = 15;                        //Задає тривалість ноти
 
char kitchen_alarm[] = "Сcdefgabagfedc ";
char reset_alarm[] = "CC a";
 
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
int tempo = 67;
 
void setup()
{
pinMode(Speaker, OUTPUT);            //Конфігурація портій динамік
pinMode(Led, OUTPUT);                //Світлодіод
 
pinMode(SW_kitchen, INPUT);          //Конфігурація кнопок Кухня 
digitalWrite(SW_kitchen, HIGH);
 
pinMode(SW_reset, INPUT);            //Ресет на пристрої
digitalWrite(SW_reset, HIGH);
}
 
void playKitchenAlarm(void)          //Мелодія коли натиснута кнопка на кухні
{
for (int i = 0; i < length; i++)
{
if (kitchen_alarm[i] == ' ')
{
delay(beats[i] * tempo); 
} 
else 
{
playNote(kitchen_alarm[i], beats[i] * tempo);
}
 
delay(tempo / 2); 
}
}
 
void playResetAlarm(void)            //Мелодія коли натиснута кнопка на ресет на пристрої
{
for (int i = 0; i < length; i++)
{
if (reset_alarm[i] == ' ')
{
delay(beats[i] * tempo); 
} 
else 
{
playNote(reset_alarm[i], beats[i] * tempo);
}
 
delay(tempo / 2); 
}
}
 
void loop() 
{
int temp = (digitalRead(SW_reset)==1);
 
if(!digitalRead(SW_kitchen))
{
delay(50);
if(!digitalRead(SW_kitchen))
{
do{}while(!digitalRead(SW_kitchen));
playKitchenAlarm();
do
{
digitalWrite(Led,HIGH);
delay(350);
digitalWrite(Led,LOW);
delay(350);      
}
while(digitalRead(SW_reset));
 
}
}
 
if(!digitalRead(SW_reset))
{
delay(50);
if(!digitalRead(SW_reset))
{
do{}while(!digitalRead(SW_reset));
playResetAlarm();
while(true)
{
digitalWrite(Led,LOW);
break;
}
 
}
}
}
 
void playTone(int tone, int duration)
{
for (long i = 0; i < duration * 1000L; i += tone * 2) 
{
digitalWrite(Speaker, HIGH);
delayMicroseconds(tone);
digitalWrite(Speaker, LOW);
delayMicroseconds(tone);
}
}
 
void playNote(char note, int duration) 
{
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
for (int i = 0; i < 8; i++)
{
if (names[i] == note) 
{
playTone(tones[i], duration);
}
}
}

 

Файли: Kitchen_Bell

Comments:

Написати відповідь

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

вимагається