Project tutorial

Doorbell

Using EEPROM as a sound source.

  • 13,025 views
  • 0 comments
  • 27 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

A Microwave Interface for the IKEA Duktig Kids Kitchen

Project showcase by Myles Eftos

  • 1,371 views
  • 8 comments
  • 9 respects

Servo Signals and Characterization

by 3 developers

  • 1,262 views
  • 4 comments
  • 14 respects

Music Adaptive RGB LED with Arduino and Processing

Project in progress by ounane mohamed elfarouk

  • 1,061 views
  • 6 comments
  • 11 respects

Cellular IoT with Blynk & Hologram

by Moheeb Zara

  • 5,110 views
  • 9 comments
  • 19 respects

Monitoring Temperature Remotely with Blynk for Dummies

Project in progress by Cmtelesann

  • 1,307 views
  • 2 comments
  • 5 respects

How to Make a Customizable Punchable Keyboard Button

Project tutorial by Amal Mathew

  • 1,549 views
  • 4 comments
  • 4 respects
Add projectSign up / Login