Project tutorial

Doorbell © LGPL

Using EEPROM as a sound source.

  • 6,833 views
  • 0 comments
  • 19 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.

Schematics

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 
     }
     
}

Comments

Similar projects you might like

Windows PC Lock/Unlock Using RFID

Project tutorial by Prasanth K S

  • 6,781 views
  • 6 comments
  • 30 respects

Lie Detector

Project tutorial by Adaline Baskaran

  • 5,897 views
  • 6 comments
  • 16 respects

LED Cube

Project tutorial by Praditha Alwis

  • 377 views
  • 0 comments
  • 4 respects

Arduino Keyboard

Project in progress by Gabriele Scordamaglia

  • 449 views
  • 2 comments
  • 4 respects

Makers (Cubecon) #1 Infrared Transmit & Infrared Receive

Project in progress by Alpha

  • 137 views
  • 0 comments
  • 3 respects
Add projectSign up / Login