Posted on Leave a comment

How to make a SONAR based on an ultrasonic sensor

SONAR stands for Sound Navigation and Ranging.

SONAR uses the concept of ultrasonic waves that get reflected from the object in front of it. And the time it takes between the transmission and reception tells us about the distance it has traveled.

Components Required

  • Arduino UNO
  • Servo Motor
  • Ultrasonic Sensor
  • Jumper wires
  • Laptop
Circuit Diagram

After making the connection you have to make a sketch and copy paste the below Arduino code into your arduino and upload the code.

Then you have to download the Processing Software

Download link for processing software https://processing.org/download

Then you have to extract the processing software and open the processing.exe and copy and paste the processing code given below.

After you done that you have to connect your ardunio to your computer.

Open the arduino software.

Go to the TOOLS > PORTS

In the port list you will the something like com26 or com6

You have to remeber this com## (HERE ## represent the number)

Then in the processing code you have to change this line shown in the figure below

Arduino Code

// Includes the Servo library
#include <Servo.h>. 
// Defines Tirg and Echo pins of the Ultrasonic Sensor
const int trigPin = 10;
const int echoPin = 11;
// Variables for the duration and the distance
long duration;
int distance;
Servo myServo; // Creates a servo object for controlling the servo motor
void setup() {
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
  Serial.begin(9600);
  myServo.attach(12); // Defines on which pin is the servo motor attached
}
void loop() {
  // rotates the servo motor from 15 to 165 degrees
  for(int i=15;i<=165;i++){  
  myServo.write(i);
  delay(30);
  distance = calculateDistance();// Calls a function for calculating the distance measured by the Ultrasonic sensor for each degree
  
  Serial.print(i); // Sends the current degree into the Serial Port
  Serial.print(","); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing
  Serial.print(distance); // Sends the distance value into the Serial Port
  Serial.print("."); // Sends addition character right next to the previous value needed later in the Processing IDE for indexing
  }
  // Repeats the previous lines from 165 to 15 degrees
  for(int i=165;i>15;i--){  
  myServo.write(i);
  delay(30);
  distance = calculateDistance();
  Serial.print(i);
  Serial.print(",");
  Serial.print(distance);
  Serial.print(".");
  }
}
// Function for calculating the distance measured by the Ultrasonic sensor
int calculateDistance(){ 
  
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds
  distance= duration*0.034/2;
  return distance;
}

Processing Code

import processing.serial.*; // imports library for serial communication
import java.awt.event.KeyEvent; // imports library for reading the data from the serial port
import java.io.IOException;
Serial myPort; // defines Object Serial
// defubes variables
String angle="";
String distance="";
String data="";
String noObject;
float pixsDistance;
int iAngle, iDistance;
int index1=0;
int index2=0;
PFont orcFont;
void setup() {
  
 size (1200, 700); // ***CHANGE THIS TO YOUR SCREEN RESOLUTION***
 smooth();
 myPort = new Serial(this,"COM18", 9600); // starts the serial communication
 myPort.bufferUntil('.'); // reads the data from the serial port up to the character '.'. So actually it reads this: angle,distance.
}
void draw() {
  
  fill(98,245,31);
  // simulating motion blur and slow fade of the moving line
  noStroke();
  fill(0,4); 
  rect(0, 0, width, height-height*0.065); 
  
  fill(98,245,31); // green color
  // calls the functions for drawing the radar
  drawRadar(); 
  drawLine();
  drawObject();
  drawText();
}
void serialEvent (Serial myPort) { // starts reading data from the Serial Port
  // reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
  data = myPort.readStringUntil('.');
  data = data.substring(0,data.length()-1);
  
  index1 = data.indexOf(","); // find the character ',' and puts it into the variable "index1"
  angle= data.substring(0, index1); // read the data from position "0" to position of the variable index1 or thats the value of the angle the Arduino Board sent into the Serial Port
  distance= data.substring(index1+1, data.length()); // read the data from position "index1" to the end of the data pr thats the value of the distance
  
  // converts the String variables into Integer
  iAngle = int(angle);
  iDistance = int(distance);
}
void drawRadar() {
  pushMatrix();
  translate(width/2,height-height*0.074); // moves the starting coordinats to new location
  noFill();
  strokeWeight(2);
  stroke(98,245,31);
  // draws the arc lines
  arc(0,0,(width-width*0.0625),(width-width*0.0625),PI,TWO_PI);
  arc(0,0,(width-width*0.27),(width-width*0.27),PI,TWO_PI);
  arc(0,0,(width-width*0.479),(width-width*0.479),PI,TWO_PI);
  arc(0,0,(width-width*0.687),(width-width*0.687),PI,TWO_PI);
  // draws the angle lines
  line(-width/2,0,width/2,0);
  line(0,0,(-width/2)*cos(radians(30)),(-width/2)*sin(radians(30)));
  line(0,0,(-width/2)*cos(radians(60)),(-width/2)*sin(radians(60)));
  line(0,0,(-width/2)*cos(radians(90)),(-width/2)*sin(radians(90)));
  line(0,0,(-width/2)*cos(radians(120)),(-width/2)*sin(radians(120)));
  line(0,0,(-width/2)*cos(radians(150)),(-width/2)*sin(radians(150)));
  line((-width/2)*cos(radians(30)),0,width/2,0);
  popMatrix();
}
void drawObject() {
  pushMatrix();
  translate(width/2,height-height*0.074); // moves the starting coordinats to new location
  strokeWeight(9);
  stroke(255,10,10); // red color
  pixsDistance = iDistance*((height-height*0.1666)*0.025); // covers the distance from the sensor from cm to pixels
  // limiting the range to 40 cms
  if(iDistance<40){
    // draws the object according to the angle and the distance
  line(pixsDistance*cos(radians(iAngle)),-pixsDistance*sin(radians(iAngle)),(width-width*0.505)*cos(radians(iAngle)),-(width-width*0.505)*sin(radians(iAngle)));
  }
  popMatrix();
}
void drawLine() {
  pushMatrix();
  strokeWeight(9);
  stroke(30,250,60);
  translate(width/2,height-height*0.074); // moves the starting coordinats to new location
  line(0,0,(height-height*0.12)*cos(radians(iAngle)),-(height-height*0.12)*sin(radians(iAngle))); // draws the line according to the angle
  popMatrix();
}
void drawText() { // draws the texts on the screen
  
  pushMatrix();
  if(iDistance>40) {
  noObject = "Out of Range";
  }
  else {
  noObject = "In Range";
  }
  fill(0,0,0);
  noStroke();
  rect(0, height-height*0.0648, width, height);
  fill(98,245,31);
  textSize(25);
  
  text("10cm",width-width*0.3854,height-height*0.0833);
  text("20cm",width-width*0.281,height-height*0.0833);
  text("30cm",width-width*0.177,height-height*0.0833);
  text("40cm",width-width*0.0729,height-height*0.0833);
  textSize(40);
  text("exasub.com", width-width*0.875, height-height*0.0277);
  text("Angle: " + iAngle +" °", width-width*0.48, height-height*0.0277);
  text("Distance: ", width-width*0.26, height-height*0.0277);
  if(iDistance<40) {
  text("        " + iDistance +" cm", width-width*0.225, height-height*0.0277);
  }
  textSize(25);
  fill(98,245,60);
  translate((width-width*0.4994)+width/2*cos(radians(30)),(height-height*0.0907)-width/2*sin(radians(30)));
  rotate(-radians(-60));
  text("30°",0,0);
  resetMatrix();
  translate((width-width*0.503)+width/2*cos(radians(60)),(height-height*0.0888)-width/2*sin(radians(60)));
  rotate(-radians(-30));
  text("60°",0,0);
  resetMatrix();
  translate((width-width*0.507)+width/2*cos(radians(90)),(height-height*0.0833)-width/2*sin(radians(90)));
  rotate(radians(0));
  text("90°",0,0);
  resetMatrix();
  translate(width-width*0.513+width/2*cos(radians(120)),(height-height*0.07129)-width/2*sin(radians(120)));
  rotate(radians(-30));
  text("120°",0,0);
  resetMatrix();
  translate((width-width*0.5104)+width/2*cos(radians(150)),(height-height*0.0574)-width/2*sin(radians(150)));
  rotate(radians(-60));
  text("150°",0,0);
  popMatrix(); 
}
Posted on Leave a comment

How to make a simple Traffic Light using Arduino UNO

Everyone must have seen those big lights in red, yellow, and green color at the corner of every road. Some even flash. Some stay lit all day long.

Big junctions have a separate controller which synchronizes these lights. So that the traffic flows smoothly. And the possibility of having a deadlock is minimized. That is very complex and requires a deep understanding of road traffic and human perception.

To make a simple traffic light. You will require three LED in RED, Yellow, and Green color.

Components Required:

Arduino
Red 5mm LED
Yellow 5mm LED
Green 5mm LED
330-ohm resistor
Jumper wires
Breadboard small

Arduino Code

#define red 8
#define yellow 7
#define green 4

void setup()
{
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(green, OUTPUT);
}

void loop()
{
  digitalWrite(green, HIGH);
  delay(10000); // Wait for 10 second(s)
  digitalWrite(green, LOW);
  digitalWrite(yellow, HIGH);
  delay(4000); // Wait for 4 second(s)
  digitalWrite(yellow,LOW);
  digitalWrite(red, HIGH);
  delay(5000);
  digitalWrite(red,LOW);
}
Posted on Leave a comment

Python – Basic Mathematical Programs

How to perform addition.

# Addend + Addend = Sum
a = 19
b = 15

sum = a + b

print("Total Sum of a and b =",sum)

How to perform subtraction

#Minuend - Subtrahend = Difference

Minuend = 22
Subtrahend = 140

Difference = Minuend - Subtrahend

print("The Difference equals to ",Difference)

How to perform multiplication

# Multiplicand X multiplier = product

Multiplicand = 56
Multiplier = 12

Product = Multiplicand * Multiplier

print("The product of the Multiplicand and mulitplier is ",Product)

How to perform division

# Dividend / Divisor = Quotient (Remainder)

Dividend = 18
Divisor = 5

Quotient = Dividend / Divisor

print("The quotient + reminder = ",Quotient)

How to perform if-else operations

# If-else Python

a = 1
b = 1

if (a < b):
    print("A is Lesser than B")
elif (a ==b):
    print("A is equal to B")
else:
    print("A is Greater than B")

How to perform a while loop operation

# While Loop
# Using While Loop to perform multiplication using Addition

A = 13131313

sum = 0;
counter = 1

while (counter < 11):
    sum = A + sum
    print(A," x ",counter," = ",sum)
    counter = 1 + counter
    
Posted on Leave a comment

Using Blender as a High-Quality Scene Render from FreeCAD 3D STL Models

When you create a parametric model in FreeCAD. The model will look very bland. You can add different colors to your 3d model face and you can even make your model transparent to help view the underneath wireframes.

But when you have to present the work to a more general audience you can’t really show a dull-colored 3D object. You need to have the 3D model in some rendering environment which will add colors, shadows, lights, a camera, etc.

12mm Button CAP in FreeCad

As you can see in the above image it is not very pleasing to look at. It will not look very good on a website or printed in a pamphlet.

So we export the 3d model from the FreeCAD to a .stl file.

That STL file will be imported into the blender software.

There in the blender environment, we can add different lights, cameras, colors, and textures to make it look more pleasing to view and create a nice scene.

As you can see these images are more presentable to a wider audience.

Download Links
Blender from https://www.blender.org/download/
FreeCAD from https://www.freecadweb.org/downloads.php

Posted on Leave a comment

FreeCAD and KiCAD workflow for Product Design

They are two software packages designed by two independent teams. Both of them are free to use.

To create a product you will need an enclosure that will house all the essential components inside it. And this enclosure can be built in FreeCAD.

I am using FreeCAD 0.20.1

There are some Addons that I have installed.

You can install Addon from “Tools > Addon Manager”

  1. KiCad StepUP workbench
  2. Glass
  3. PieMenu
  4. A2Plus (for making assembly from different individual parts)
  5. Fasteners Workbench (Easy to use the preconstructed model of many standard nuts, bolts, screws, washers, etc.)

KiCad StepUP workbench provides an ECAD-MCAD collaboration tool.

From what I learned in FreeCAD you create Sketch that can be exported to KiCad PCB.

The KiCad uses the Sketch created in the FreeCAD as Edge Cuts.

Edge Cuts are the outline of the PCB in which all your components along with all the tracks, via, hole, and other miscellaneous items must reside.

Youtube video from user mathcodeprint

This video demonstrates a basic example.

It is not a perfect collaborating tool. There are other software tools available from big companies but they are not affordable for a budding engineer.

The ECAD/MCAD collabration proccess:

  1. Design your schematic in Kicad.
  2. Assign Footprint and make sure that each footprint have a 3d model assigned to its footprint.
  3. make a pcb and update the component from the schematics.
    place a grid origin. Using the grid origin draw a rectangle in the edge cut layer.
  4. Save the pcb.
  5. After doing the above steps open the PCB in the FreeCAD KiCadStepUp workbench.
  6. Load the PCB into the freecad environment using the
    “ksu PushPull > Load Board” option
  7. Make changes to the sketch and the 3d model.

If you select a 3d model and make changes to its position.

To make changes to the 3d model. You have to select that particular model. And then you have to select the model from the Model view. Right click on the model in the Model view and select Transform.

Three orthogonal arrow will be preseneted to you in three different color.
You can move the model by selecting the conical arrow heads.

You have to push the changes by selecting that model into the kicad pcb.

After you have saved the kicad will automatically adust its footprint automatically.

It is this PUSH PULL method of making the changes to your pcb dimension and component positions.

Posted on Leave a comment

Standard Screws

Whenever you have to mount a pcb in place. Most of the time it is easier if we use the screws it on/in the enclosures.

There are standards for screws which are already available in the market. Which will reduce the BOM cost.

If you happen to calculate the screw dimensions based on the mechanical stresses. That would be the best. Since it gives you an optimum result in terms of material choice, strength and cost of the screw.

But in when you want to just mount the PCB on a plastic enclosure then you need to know the dimension in order to provide the provisions for the holes.

There are a few websites which will help in finding the appropriate size screw.

https://www.fasteners.eu/standards/ISO/

Posted on Leave a comment

MC34063 DC-DC Step-Down Voltage Regulator

MC34063 is an integrated circuit which has all the essential components to make a DC-DC switching voltage regulator.

There are other popular switching regulators in the market. And the mc34063 IC is not the very best. But this chip is cheap.

As you can see from the block diagram. This chip contains an AND gate, an SR latch, two transistors, A 1.25V reference voltage and an op-amp configured as a comparator.

You can just choose any value of the component and think they will work.

There are very basic calculations which you need to perform in sequential order. The calculations are given in the datasheet.

You need to calculate in this particular sequence only.

  1. ton/toff
  2. (ton + toff)
  3. toff
  4. ton
  5. CT
  6. Ipk(switch)
  7. Rsc
  8. L(min)
  9. Co

You can also take the help of an online calculator for mc34063

http://www.nomad.ee/micros/mc34063a/

or you can create a spreadsheet.

You must read the SLVA252B Application of the MC34063 Switching Regulator

By following you can create the cheapest switching power supply.

There are a few considerations with this integrated circuit.

There is a lot of switching noise. So you will need a bigger capacitor if you want to dampen those noise signals.

If you want to reduce the size of the inductor used. Then you will need to use a higher switching frequency.

You need to remember that the L(min) you have selected is for a particular base frequency. The maximum frequency will be set up according to the load connected to it. And the maximum frequency of the oscillator is 100KHz according to the datasheet.

Posted on Leave a comment

How to make a plant watering system using Arduino Uno

Sometimes we are so busy in our work or in our day-to-day life that we forget to water our plants on time. Or in the summertime when the plants need additional water to sustain themselves in the high-temperature region like New Delhi.

This is a simple project that one can assemble and implement within a few minutes.

To make this project you will need some modules which are readily available in the market.

Arduino UNO x 1

Moisture Sensor x 1

A 5V relay x 1

5V water pump x 1

A short length of plastic or rubber tube x 1 – 1.5m

Rechargeable Power Bank x 1

#define sense A0
#define relay 9
void setup() {
  // put your setup code here, to run once:
pinMode(sense, INPUT);
pinMode(relay, OUTPUT);

Serial.begin(9600);
}
int val;
void loop() {
  // put your main code here, to run repeatedly:
val = analogRead(sense);
Serial.println(val);

if (val < 600)        /*  adjust this value to control how much soil must be moist */
{
  digitalWrite(relay, HIGH);
}
else
{
  digitalWrite(relay, LOW);
}
delay(400);
}
Posted on Leave a comment

How to connect STM32F429I-DISC1 board to DS1307 using I2C

On the STM32F429 board, there is one I2c extension connector. This connector has eight pins. Which is used to connect to other I2C peripherals such as RTC, EEPROM and other microcontrollers etc.

DS1307 connected to I2C

In the hardware schematics, it is labelled as ACP/RF E2P connector.

The I2C3 SDA and SCL lines are pulled up via a 4.7 k ohm resistor to VCC 3.3V.

This is the basic code that I used to set/get the data in/from the DS1307 via I2c.

/* USER CODE BEGIN 4 */
struct Time{
	  uint8_t sec;
	  uint8_t min;
	  uint8_t hour;
	  uint8_t weekday;
	  uint8_t day;
	  uint8_t month;
	  uint8_t year;
	  };

/* USER CODE END 4 */

/* USER CODE BEGIN Header_StartDefaultTask */
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* init code for USB_HOST */
  MX_USB_HOST_Init();
  /* USER CODE BEGIN 5 */
 char buff[30];
  uint8_t *ptr1;
  uint8_t *ptr2;
  ptr2 = (uint8_t *)buff;

  struct Time Set_time,Get_Time;

  Set_time.sec = 0;
  Set_time.min = 0;
  Set_time.hour = 0;
  Set_time.day = 0;
  Set_time.month = 04;
  Set_time.year = 0;
  Set_time.weekday = 0;

  HAL_I2C_Mem_Write(&hi2c3, 0xd0, 0, 1,&Set_time.sec, 7, 1000);



  /* Infinite loop */
  for(;;)
  {
	 
	  HAL_I2C_Mem_Read(&hi2c3, 0xD1, 0, 1, &Get_Time.sec, 7, 1000);
    osDelay(1000);
    ptr1 = (uint8_t *)"Hello\n";
    HAL_UART_Transmit(&huart1, ptr1, 6, 1000);
    sprintf(buff,"%02x:%02x:%02x - %02x - %02x/%02x/%02x \n",
    		Get_Time.hour,
			Get_Time.min,
			Get_Time.sec,
			Get_Time.weekday,
			Get_Time.day,
			Get_Time.month,
			Get_Time.year);
    HAL_UART_Transmit(&huart1, ptr2,26, 1000);
  }
  /* USER CODE END 5 */
}

In this code, I created a structure for the time, weekday and date. Which is similar to the internal registers of DS1307.

The Structure then creates two instances called set_time and Get_time. The Set_time object is filled with the values and then its location is transfered to the HAL_I2C_Mem_Write function. Which sends this data through polling to the DS1307.

Similarly the Get_time structure is used to retrieve the data from the DS1307 using the HAL_I2C_Mem_Read function. Which reads 7 bytes from the DS1307.

The retrieved time and date are then sent via the UART to display on a terminal.

Posted on Leave a comment

How to use AT24C32 EEPROM with ATmega328PB in Microchip Studio

AT24C32 is an i2c compatible serial EEPROM which can be programmed using a microcontroller.

The AT24C32 provides 32,768 bits of serial electrically erasable and programmable
read-only memory (EEPROM). The device’s cascadable feature allows up to 8 devices to share a common 2-
wire bus. The device is optimized for use in many industrial and commercial applications
where low power and low voltage operation are essential. The AT24C32/64 is
available in space-saving 8-pin JEDEC PDIP, 8-pin JEDEC SOIC, 8-pin EIAJ SOIC,
and 8-pin TSSOP (AT24C64) packages and is accessed via a 2-wire serial interface.
In addition, the entire family is available in 2.7V (2.7V to 5.5V) and 1.8V (1.8V to 5.5V)
versions.

/*
 * main.c
 *
 * Created: 8/24/2022 10:53:05 PM
 *  Author: abhay
 */ 
#define F_CPU 16000000
#include <xc.h>
#include "util/delay.h"
#include "uart.h"
#include <stdio.h>
#define FALSE 0
#define TRUE 1

void EEOpen();
uint8_t EEWriteByte(uint16_t,uint8_t);
uint8_t EEReadByte(uint16_t address);

int main(void)
{
	UART_Init();
	EEOpen();
	char buff[20];
	sprintf(buff,"Hello EEPROM TEST \nBy: \t ABHAY");
	UART_SendString(buff);
	//Fill whole eeprom 32KB (32768 bytes)
	//with number 7
	uint16_t address;
	char failed;
	failed = 0 ;
	for(address=0;address< (32768);address++)
	{
		sprintf(buff,"address =  %d \n",address);
		UART_SendString(buff);
		if(EEWriteByte(address,5)==0)
		{
			//Write Failed
			sprintf(buff,"write Failed %x \n",address);
			UART_SendString(buff);
			failed = 1;
			break;
		}
	}
	
	if(!failed)
	{
		//We have Done it !!!
		
		sprintf(buff,"Write Success !\n");
		UART_SendString(buff);
	}
    while(1)
    {
        //TODO:: Please write your application code 
		//Check if every location in EEPROM has
		//number 7 stored
		failed=0;
		for(address=0;address < 32768 ; address++)
		{
			if(EEReadByte(address)!=5)
			{
				//Failed !
			
				
				sprintf(buff,"Verify Failed %x \n",address);
				UART_SendString(buff);
				
				failed=1;
				break;
			}
		}

		if(!failed)
		{
			//We have Done it !!!
			
			sprintf(buff,"Write Success !\n");
			UART_SendString(buff);
		}
		
    }
}


void EEOpen()
{
	//Set up TWI Module
	TWBR0 = 5;
	TWSR0 &= (~((1<<TWPS1)|(1<<TWPS0)));

}

uint8_t EEWriteByte(uint16_t address,uint8_t data)
{
	do
	{
		//Put Start Condition on TWI Bus
		TWCR0=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

		//Poll Till Done
		while(!(TWCR0 & (1<<TWINT)));

		//Check status
		if((TWSR0 & 0xF8) != 0x08)
			return FALSE;

		//Now write SLA+W
		//EEPROM @ 00h
		TWDR0=0b10100000;	

		//Initiate Transfer
		TWCR0=(1<<TWINT)|(1<<TWEN);

		//Poll Till Done
		while(!(TWCR0 & (1<<TWINT)));
	
	}while((TWSR0 & 0xF8) != 0x18);
		

	//Now write ADDRH
	TWDR0=(address>>8);

	//Initiate Transfer
	TWCR0=(1<<TWINT)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR0 & (1<<TWINT)));

	//Check status
	if((TWSR0 & 0xF8) != 0x28)
		return FALSE;

	//Now write ADDRL
	TWDR0=(address);

	//Initiate Transfer
	TWCR0=(1<<TWINT)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR0 & (1<<TWINT)));

	//Check status
	if((TWSR0 & 0xF8) != 0x28)
		return FALSE;

	//Now write DATA
	TWDR0=(data);

	//Initiate Transfer
	TWCR0=(1<<TWINT)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR0 & (1<<TWINT)));

	//Check status
	if((TWSR0 & 0xF8) != 0x28)
		return FALSE;

	//Put Stop Condition on bus
	TWCR0=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
	
	//Wait for STOP to finish
	while(TWCR0 & (1<<TWSTO));

	//Wait untill Writing is complete
	_delay_ms(1);

	//Return TRUE
	return TRUE;

}

uint8_t EEReadByte(uint16_t address)
{
	uint8_t data;

	//Initiate a Dummy Write Sequence to start Random Read
	do
	{
		//Put Start Condition on TWI Bus
		TWCR0=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

		//Poll Till Done
		while(!(TWCR0 & (1<<TWINT)));

		//Check status
		if((TWSR0 & 0xF8) != 0x08)
			return FALSE;

		//Now write SLA+W
		//EEPROM @ 00h
		TWDR0=0b10100000;	

		//Initiate Transfer
		TWCR0=(1<<TWINT)|(1<<TWEN);

		//Poll Till Done
		while(!(TWCR0 & (1<<TWINT)));
	
	}while((TWSR0 & 0xF8) != 0x18);
		

	//Now write ADDRH
	TWDR0=(address>>8);

	//Initiate Transfer
	TWCR0=(1<<TWINT)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR0 & (1<<TWINT)));

	//Check status
	if((TWSR0 & 0xF8) != 0x28)
		return FALSE;

	//Now write ADDRL
	TWDR0=(address);

	//Initiate Transfer
	TWCR0=(1<<TWINT)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR0 & (1<<TWINT)));

	//Check status
	if((TWSR0 & 0xF8) != 0x28)
		return FALSE;

	//*************************DUMMY WRITE SEQUENCE END **********************


	
	//Put Start Condition on TWI Bus
	TWCR0=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR0 & (1<<TWINT)));

	//Check status
	if((TWSR0 & 0xF8) != 0x10)
		return FALSE;

	//Now write SLA+R
	//EEPROM @ 00h
	TWDR0=0b10100001;	

	//Initiate Transfer
	TWCR0=(1<<TWINT)|(1<<TWEN);

	//Poll Till Done
	while(!(TWCR0 & (1<<TWINT)));

	//Check status
	if((TWSR0 & 0xF8) != 0x40)
		return FALSE;

	//Now enable Reception of data by clearing TWINT
	TWCR0=(1<<TWINT)|(1<<TWEN);

	//Wait till done
	while(!(TWCR0 & (1<<TWINT)));

	//Check status
	if((TWSR0 & 0xF8) != 0x58)
		return FALSE;

	//Read the data
	data=TWDR0;

	//Put Stop Condition on bus
	TWCR0=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
	
	//Wait for STOP to finish
	while(TWCR0 & (1<<TWSTO));

	//Return TRUE
	return data;
}