Project tutorial
Doorbell

Doorbell

Using EEPROM as a sound source.

  • 14,124 views
  • 0 comments
  • 31 respects

Components and supplies

About this project

A doorbell project for Arduino Uno with ATMEGA328P device. The EEPROM 24C512 is 512Kbits and it can store up to 3 seconds wave file of 22.050KHz, 8 bits, mono.

The Arduino reads the ROM bytes in a sequential read mode and stream each byte to the PWM generator at a rate of about 22 KHz. The I2C bus works at 200 KHz for the purpose of managing to process 22 Kbits per second. Changing the bus frequency changes the speed of the sound.

The transistors are a push-pull buffer for driving the speaker, any replacement can be used.

The I2C lib doesn't have a function for sequential read, so I added a routine.

To load sound file to the eeprom do this:

  • Convert sound file to .wav PCM 22.050KHz, 8 bits, mono
  • Change the file name extension from wav to bin.
  • Load the bin file to the EEPROM Programmer.

Code

bellC/C++
/*
 * eeprom_bell.ino
 *
 * Created: 30/06/2017 23:34:47
 *  Author: moty22.co.uk
 */ 
#include <Wire.h>


const int audio = 6;     //output D6
const int ring = A2;     //ring pushbutton
int ringPB=1;         // ring pushbutton status

void setup() {
  // put your setup code here, to run once:

pinMode(ring, INPUT_PULLUP);

  //PWM Timer0
OCR0A = 64;
TCCR0A = _BV(COM0A1) | _BV(WGM01) | _BV(WGM00);  //output in phase, fast PWM mode
TCCR0B = _BV(CS00); // 16MHz/256 = 64KHz

Wire.begin();        // init i2c bus
Wire.setClock(200000);  //200khz

}



void loop()
{
    unsigned int i;
    
    ringPB=digitalRead(ring);
    if(ringPB==LOW)   //pushbutton
     {
      pinMode(audio, OUTPUT);
          //go to address 0
      Wire.beginTransmission(0x50);
      Wire.write((int)(0));   //MSB of eeprom address
      Wire.write((int)(0)); // LSB
      Wire.endTransmission();


       //start sequential read
      TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //start command
      while (!(TWCR & (1<<TWINT)));   //till interrupt 
        //write address
      TWDR = 0b10100001;    //address+read
      TWCR = (1<<TWINT)|(1<<TWEN);
      while (!(TWCR & (1<<TWINT)));   //till interrupt 
    
          //read all the bytes
      for (i=0; i<0xfff0; i++)
      {
         //send ACK
        TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
        while (!(TWCR & (1<<TWINT)));
        OCR0A =  TWDR;      //PWM = eeprom data
      }  
    
        //send NACK, no-aknowledgement + stop commands ends reading
      TWCR = (1<<TWINT)|(1<<TWEN);
      while (!(TWCR & (1<<TWINT)));
      OCR0A =  TWDR;  
      
        //stop
      TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);  

      pinMode(audio, INPUT);    //stop the audio output 
     }
     
}

Schematics

Comments

Similar projects you might like

Talking Clock

Project tutorial by Team moty

  • 2,678 views
  • 1 comment
  • 6 respects

SD Card Doorbell

Project tutorial by Projecter

  • 2,074 views
  • 0 comments
  • 7 respects

NERD ALERT! // Smart Doorbell with Arduino

Project tutorial by Alex Glow

  • 5,782 views
  • 2 comments
  • 11 respects

Smart Doorbell

Project showcase by Kaustubh Agarwal

  • 50,792 views
  • 20 comments
  • 108 respects

Arduino Tutorial : Mini Piano

Project tutorial by the lonely programmer

  • 6,287 views
  • 2 comments
  • 11 respects

Dropping Spider on Doorbell - Halloween Scare Prank

Project tutorial by Kristian Blåsol

  • 1,792 views
  • 0 comments
  • 8 respects
Add projectSign up / Login