Дверной звонок в стиле Star Wars на ATtiny13

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Всем привет, вот написаль небольшую статейку:
http://razniepodelki.blogspot.com/2014/08/attiny13-arduino.html
Вот видео роботы и пояснением схемотехники:
https://www.youtube.com/watch?v=AuqrLxtdL4E
Вот так выглядит схема:

А вот всё файлы, включая фьюзы и хекс файл:
https://vk.com/doc256435878_321956604?hash=39c3653df11f0c8399&dl=b6eaa0a...
Ну и как же без кода:
 

// by @tartakynov:
// youtu.be/5R7NeQkVS_8
// and me - vk.com/razniepodelkiblogspot
// как прошить тини: 
// razniepodelki.blogspot.com/2014/05/attiny13-arduino.html
// Этот код взято из статьи:
// razniepodelki.blogspot.com/2014/08/attiny13-arduino.html

#define F_CPU 1200000L  // Частота МК в герцах
#include <avr/pgmspace.h> // нужно для PROGMEM

#define PIN_BUZZER 2 // PB2 Динамик
#define BUTTON 4 // PB4 Кнопка

#define COUNT_NOTES 39

word frequences[COUNT_NOTES] PROGMEM = { // тут лежат частоты
  392, 392, 392, 311, 466, 392, 311, 466, 392,
  587, 587, 587, 622, 466, 369, 311, 466, 392,
  784, 392, 392, 784, 739, 698, 659, 622, 659,
  415, 554, 523, 493, 466, 440, 466,
  311, 369, 311, 466, 392 };

word durations[COUNT_NOTES] PROGMEM = { // тут их длительность 
  350, 350, 350, 250, 100, 350, 250, 100, 700,
  350, 350, 350, 250, 100, 350, 250, 100, 700,
  350, 250, 100, 350, 250, 100, 100, 100, 450,
  150, 350, 250, 100, 100, 100, 450,
  150, 350, 250, 100, 750 };

//void setup()
//{
  
int main( void ) // это аналог void setup(), для экономии места
{
  pinMode(PIN_BUZZER, OUTPUT); // инициализация пинов
  pinMode(BUTTON, INPUT); // подключаем подтягивающий резистор
  digitalWrite(BUTTON, HIGH); // чтобы кнопка возвращала 
  //LOW при нажатии

  //}
  //void loop()
  //{
    
  while(1){ // аналог void loop()(вечный цикл)
    if (digitalRead(BUTTON) == LOW) {   // когда кнопка нажата
      for (byte i = 0; i < COUNT_NOTES; i++) // собственно проигрываем мелодию
      {
        buzz(PIN_BUZZER, pgm_read_word(&(frequences[i])) * 3, 2 * pgm_read_word(&(durations[i])));
        // изначально было:
        // buzz(PIN_BUZZER, pgm_read_word(&(frequences[i])), 2 * pgm_read_word(&(durations[i])));
        // но я умножил частоту на 3
        //(pgm_read_word(&(frequences[i])) * 3) 
        //чтобы было громче слышно на небольшом динамике
        //delay(100); // этого не нужно
      }
    }
    //delay(3000); // и этого
    
  }         // эти строчки нужны 
  return 0; // int main( void ) 
}           // и while(1)

void buzz(unsigned char pin, word frequencyInHertz, word timeInMilliseconds) // по сути это 
{                                                                            // генератор частоты            
  long delayAmount = (long)(long(1000000) / (long)frequencyInHertz);         // имеет 3 параметра
  long loopTime = (long)(((long)timeInMilliseconds * 500) / delayAmount);    // 1 - пин
  for (long i = 0; i < loopTime; i++)                                      // 2 - частота
  {                                                                          // 3 - длительность
    digitalWrite(pin, HIGH);        // генерируем импульсы нужной частоты  
    delayMicroseconds(delayAmount);
    digitalWrite(pin, LOW);
    delayMicroseconds(delayAmount);
  }
}

 

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Кстати в архиве есть файлы протеуса, можно даже ничего не собирать на макетке.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Не ну так не пойдет.
Звонок должен звонить внутри. Кнопка должна быть снаружи. Где питание? Где радио кнопка на батарейке?

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

И с проводками сойдёт, потом доделаю с спящим режымом.
Мне бы найти хороший пример по прерываниям, точней пробуждению по прерываниям на тини13...

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Появилась идея сделать после проигрования уход в глубокий сон, тоесть кнопку подцепить к ресету и ресетить МК когда гости у порога.
Надо будет попробовать...

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Ток потребления при проигровании от двух батареек АА составляет около 50 мА, то есть, обычные алкалиновые батарейки, аля дюрасел, имеют емкость 2000 мА/ч:

2000 / 50 = 40 часов безпрерывного проигрования.
Одно проигрывание длится 20 сек, тоесть батареек хватит на...
40 * 3600 = 
144000 / 20 = 7200 нажатий.

То есть из подсчёта выше получается что парочки хороших батареек АА хватит на более 7000 нажатий, и это я ещё не учёл то, что падение тока при постепенной разрядки батареек неизбежно.

Ну и ещё расход тока на работу в режыме Power-down  будет составлять 2 мкА * 24 =  48 мкА/день * 365 дней в году = 0.01752 А, то есть потребление платы в ждущем режыме будет составлять 175.2 мА/год при емкости 2000 мА/ч батарейки разрядятся до 50% своей емкости за 5 с половиной лет.

К чему всё это? Смысл делать такой девайс на батарейках есть.

axill
Offline
Зарегистрирован: 05.09.2011

HWman пишет:

Появилась идея сделать после проигрования уход в глубокий сон, тоесть кнопку подцепить к ресету и ресетить МК когда гости у порога.
Надо будет попробовать...

выбростье эту идею))

так не делают. У этого МК есть два типа внешних прерываний INT0 и PCINT. INT0 работает только на одном входе это PB1, а PCINT есть на каждом из 6-ти входов. INT0 удобнее тем что можно указать по какому событию срабатывать (например только при переходе из HIGH в LOW), а PCINT если включить срабатывать будет по любому изменению состояния и потом уже програмно надо разбираться что произошло и с каким из входов это произошло

читайте даташит разделы External interrupts и Power management and Sleep Modes.

Логика должна быть примерно такая

- после старта МК инициализирует порты, активирует прерывания от нужной кнопки и активирует систему прерываний (команда sei() ) и засыпает в состояние power_down. В этом мостоянии он может проснуться только от watchdog (если активирован) или от INT0/PCINT. Потребление в этом состоянии минимально.

- при нажатии на кнопку МК срабатывает прерывание и он пробуждается из сна

- проигрываете мелодию и снова уходите в сон до следующего нажатия кнопки

Дим
Offline
Зарегистрирован: 05.05.2017

Не хочет работать