Thursday, January 20, 2022

Line Follower Robot using Arduino


This project was a part of Line Follower Robot Competition  







Real Time Clock With PIC16F877A



This Project will demonstrate the real time clock interface with PIC 16F877A


To do this project we need following software:   


   1. MikroC pro for PIC (student verison)
   2. Proteus 8 professional

CODE


//DS1307 Real Time Clock with PIC16F877A

 

// LCD module connections

 

sbit LCD_RS at RD0_bit;

sbit LCD_EN at RD1_bit;

sbit LCD_D4 at RD2_bit;

sbit LCD_D5 at RD3_bit;

sbit LCD_D6 at RD4_bit;

sbit LCD_D7 at RD5_bit;

 

sbit LCD_RS_Direction at TRISD0_bit;

sbit LCD_EN_Direction at TRISD1_bit;

sbit LCD_D4_Direction at TRISD2_bit;

sbit LCD_D5_Direction at TRISD3_bit;

sbit LCD_D6_Direction at TRISD4_bit;

sbit LCD_D7_Direction at TRISD5_bit;

 

// End LCD module connections

 unsigned char *text, second, second10, minute, minute10,

               hour, hour10, date, date10, month, month10,

               year, year10, day, i = 0;

 

 void display()

 {

    //Split data into tow parts

    second10  =  (second & 0x70) >> 4;

    second = second & 0x0F;

    minute10  =  (minute & 0x70) >> 4;

    minute = minute & 0x0F;

    hour10  =  (hour & 0x30) >> 4;

    hour = hour & 0x0F;

    date10  =  (date & 0x30) >> 4;

    date = date & 0x0F;

    month10  =  (month & 0x10) >> 4;

    month = month & 0x0F;

    year10  =  (year & 0xF0) >> 4;

    year = year & 0x0F;

 

    //Display Time

    Lcd_Chr(1, 13, second + 48);

    Lcd_Chr(1, 12, second10 + 48);

    Lcd_Chr(1, 10, minute + 48);

    Lcd_Chr(1, 9, minute10 + 48);

    Lcd_Chr(1, 7, hour + 48);

    Lcd_Chr(1, 6, hour10 + 48);

    //Display calendar

    Lcd_Chr(2, 7, date + 48);

    Lcd_Chr(2, 6, date10 + 48);

    Lcd_Chr(2, 10, month + 48);

    Lcd_Chr(2, 9, month10 + 48);

    Lcd_Chr(2, 15, year + 48);

    Lcd_Chr(2, 14, year10 + 48);

  }  

 void main()

 {

     LCD_Init();

     LCD_Cmd(_LCD_CURSOR_OFF);

     LCD_Cmd(_LCD_CLEAR);

     LCD_Out(1,1, "REAL TIME CLOCK");

     LCD_Out(2,1, "GSM MAHFUZ LIKHON");

     delay_ms(2000);

     LCD_Cmd(_LCD_CLEAR);

 

     TRISB = 3;

     Lcd_Init();                // Initialize LCD

     Lcd_Cmd(_LCD_CLEAR);       // Clear LCD display

     Lcd_Cmd(_LCD_CURSOR_OFF);  // Turn cursor off

     I2C1_Init(100000);         // initialize I2C at 100KHz

     return_:

     text = "TIME:  :  :" ;

     Lcd_Out(1, 1, text);

     text = "DATE:  /  /20" ;

     Lcd_Out(2, 1, text);

     write_value(0, 0);   //Reset seconds and start oscillator

    

     while(1)

     {

       if(i == 1)

       {

         Lcd_Cmd(_LCD_CLEAR);

         text = "Adjust Minute:";

         Lcd_Out(1, 2, text);

         minute = minute + minute10 * 10;

         while(1){

         if (Button(&PORTB, 0, 100, 0)) i++;

         if(i!=1){

         minute = ((minute/10) << 4) + (minute % 10);

         write_value( 1 , minute);

         goto return_;}

         if (Button(&PORTB, 1, 100, 0)) minute++;

         if (minute > 59) minute = 0;

         Lcd_Chr(2, 8, (minute/10) + 48);

         Lcd_Chr(2, 9, (minute % 10) + 48);}

       }

      

       if(i == 2)

       {

         Lcd_Cmd(_LCD_CLEAR);

         text = "Adjust Hour:";

         Lcd_Out(1, 2, text);

         hour = hour + hour10 * 10;

         while(1){

         if (Button(&PORTB, 0, 100, 0)) i++;

         if(i!=2){

         hour = ((hour/10) << 4) + (hour % 10);

         write_value( 2 , hour);

         goto return_;}

         if (Button(&PORTB, 1, 100, 0)) hour++;

         if (hour > 23) hour = 0;

         Lcd_Chr(2, 8, (hour/10) + 48);

         Lcd_Chr(2, 9, (hour % 10) + 48);}

       }

      

       if(i == 3)

       {

         Lcd_Cmd(_LCD_CLEAR);

         text = "Adjust Date:";

         Lcd_Out(1, 2, text);

         date = date + date10 * 10;

         while(1){

         if (Button(&PORTB, 0, 100, 0)) i++;

         if(i!=3){

         date = ((date/10) << 4) + (date % 10);

         write_value( 4 , date);

         goto return_;}

         if (Button(&PORTB, 1, 100, 0)) date++;

         if (date > 31) date = 1;

         Lcd_Chr(2, 8, (date/10) + 48);

         Lcd_Chr(2, 9, (date % 10) + 48);}

       }

      

       if(i == 4)

       {

         Lcd_Cmd(_LCD_CLEAR);

         text = "Adjust Month:";

         Lcd_Out(1, 2, text);

         month = month + month10 * 10;

         while(1){

         if (Button(&PORTB, 0, 100, 0)) i++;

         if(i!=4){

         month = ((month/10) << 4) + (month % 10);

         write_value( 5 , month);

         goto return_;}

         if (Button(&PORTB, 1, 100, 0)) month++;

         if (month > 12) month = 1;

         Lcd_Chr(2, 8, (month/10) + 48);

         Lcd_Chr(2, 9, (month % 10) + 48);}

       }

      

       if(i == 5)

       {

         Lcd_Cmd(_LCD_CLEAR);

         text = "Adjust Year:";

         Lcd_Out(1, 2, text);

         year = year + year10 * 10;

         while(1){

         if (Button(&PORTB, 0, 100, 0)) {i++;

         if (i > 5) i = 0;}

         if(i!=5){

         year = ((year/10) << 4) + (year % 10);

         write_value( 6 , year);

         goto return_;}

         if (Button(&PORTB, 1, 100, 0)) year++;

         if (year > 99) year = 0;

         Lcd_Chr(2, 7, 2 + 48);

         Lcd_Chr(2, 8, 0 + 48);

         Lcd_Chr(2, 9, (year/10) + 48);

         Lcd_Chr(2, 10, (year % 10) + 48);}

       }

      

       if (Button(&PORTB, 0, 100, 0)) i++;

     

        display();

    }

}


Schematic






Video










Tuesday, August 7, 2018

Pulse Width Modulation Based on Analog Input using PIC18F2550



Hello people in this project I will discuss an interesting topic. The main focus will be on PWM (Pulse Width Modulation), though I have also used ADC (Analog to Digital Converter) and USART (Universal Synchronous and Asynchronous Receiver and Transmitter). Here ADC will be the modulation factor of PWM. Depending on the ADC value width of the pulse will be varied. We used USART protocol to see the corresponding value of PWM.

In this project we will use PIC18 series IC PIC18F2550. This is a 28 pin IC. Also it is a popular IC in PIC18 series.

To do this we need following software:   

   1. MikroC pro for PIC (student verison)
   2. Proteus 8 professional

MikroC pro for PIC will be used for writing and compiling the code. Here we will use C language for programming. Proteus 8 professional will be used for the simulation.

This project is completely simulation based, that's why I am not giving any equipment list. But you can do hardware test, if you want. You can connect a dc motor with the PWM pin to see the effect of PWM, which will vary based on analog input.

What is PWM


Pulse width modulation's main job is to convert the digital signal into analog signal. In this micro controller we have ADC but we don't have any DAC. This PWM module helps us to convert the digital signal into analog signal. PIC18F2550 PWM module is 8 bit. That means we can vary the duty cycle from 0 to 255. Here duty cycle refers that in each cycle how long a pulse will be turned on and how long it will be turned off. 0 means it will be turned off and 255 means it will be turned on. For example just take random number 127, this means in each cycle 50 percent time it will be turned on and 50 percent time it will be turned off. If we set the duty cycle to 192, that means 75 percent time it will be turned on and 25 percent time will be turned off. And pulse is determined by the frequency which we can set by using PWM1_Init() function. If we set the frequency to 5000 hz, then pulse will be 1/5000 s. Because we know f=1/T or T=1/f. Following picture can illustrate the basic concept of PWM.



Figure 1


Application of PWM can be controlling speed of a motor, DC to AC inverter, Light dimming and many more. 

CODE


float valADC;
float valADC1;
float valADC2;

char x[4];

void main()
{
     // Set PORTA as Input
     TRISA = 0b11111111;
     PORTA = 0;
   
     // Set PORTC as Output
     TRISC = 0b00000000;
     PORTC = 0;
   
     // Initializing UART
     UART1_Init(9600);
   
     // Initializing ADC
     ADC_Init();
   
     // Initializing PWM
     PWM1_Init(5000);
   
     //  Starting PWM
     PWM1_Start();
   
     while(1)
   
     {
   
       valADC = ADC_read(0);
       valADC1 = valADC/1023;
       valADC2 = valADC1*255;
       PWM1_Set_Duty(valADC2);
     
       IntToStr(ValADC2,x);
       UART1_Write_Text("Analog Input_1 is: ");
       UART1_Write_Text(x);
       strcpy(x,"");
       UART1_Write(13);
       delay_ms(1000);

     }

}

Schematic



Figure 2


Figure 3


Figure 4


Figure 5


Figure 6

Sunday, July 8, 2018

40V DC Voltmeter using PIC16F877a

As we all are playing with electronics and micro controller, we all know what is voltmeter. It is a meter which is used to measure volt. Today we will make a voltmeter using PIC16F877a. But the voltage measure limit is 40V. One important thing is micro controller can not tolerate more than 5V in it's input pin. So what we will do? We will make a voltage divider circuit, so that input pin's voltage doesn't exceed 5V. 

To do this we need following software:

   1. MikroC pro for PIC (student verison)
   2. Proteus 8 professional
   3. PicKit 2

MikroC pro for PIC will be used for writing and compiling the code. Here we will use C language for programming. Proteus 8 professional will be used for the simulation and finally Pickit 2 will be used for burning the hex file in the PIC16F877a  IC. 

To do this project we need following components;

   1. PIC16F877a
   2. Resistor 18k and 2.2K
   3. 20 MHz Crystal Oscillator
   4. Breadboard
   5. Wires
   6. 5V DC Power source
   7. Soil Moisture Sensor
   8. 16*2 LCD
   9. header for connecting LCD
 10. 10K potentiometer


CODE

sbit LCD_RS at RD0_bit;
sbit LCD_EN at RD1_bit;
sbit LCD_D4 at RD2_bit;
sbit LCD_D5 at RD3_bit;
sbit LCD_D6 at RD4_bit;
sbit LCD_D7 at RD5_bit;

sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISD1_bit;
sbit LCD_D4_Direction at TRISD2_bit;
sbit LCD_D5_Direction at TRISD3_bit;
sbit LCD_D6_Direction at TRISD4_bit;
sbit LCD_D7_Direction at TRISD5_bit;

unsigned int k,j,i;
char *l,*m,n[7],o[7];

void main()
{

    int t;
    ADCON1=0x04;
    PORTA = 0;
    TRISA = 0X01;
    PORTB = 0x00;
    TRISB = 0x00;

    LCD_Init();
    ADC_Init();
    LCD_Cmd(_LCD_CURSOR_OFF);
    LCD_Cmd(_LCD_CLEAR);
    LCD_Out(1,1, "   ABDUR ROUF  ");
    LCD_Out(2,1, "   VOLTMETER   ");
    delay_ms(2000);
    LCD_Cmd(_LCD_CLEAR);

       while (1)
        {
            t=ADC_Read(0);
            k = t;
            k =k*0.458;                            //k*0.458;
            j = k/10;
            i =k%10;
            inttostr(j,o);
            inttostr(i,n);
            l =ltrim(o);
            m =ltrim(n);
           
            if(j<=9)
            {
            lcd_out(1,1,"***Voltmeter***");
            lcd_out(2,1,"Volt:");
            lcd_out(2,8,l);
            lcd_out(2,9,".");
            lcd_out(2,10,m);
            lcd_out(2,12,"V");
            }
           
            else
            {
            lcd_out(1,1,"***Voltmeter***");
            lcd_out(2,1,"Volt:");
            lcd_out(2,7,l);
            lcd_out(2,9,".");
            lcd_out(2,10,m);
            lcd_out(2,12,"V");
           
            }
           
        }
}


Schematic


Schematic 1




Schematic 2




Schematic 3



Saturday, July 7, 2018

Automatic Irrigation System Using Soil Moisture Sensor and PIC16F887



In this project we will interface soil moisture sensor with PIC16F887. The micro controller PIC16F887 is a  very popular micro controller in PIC16 series. The sensor can detect if the soil is humid or not. If the soil is dry, then micro controller will turn on the motor to give water in the soil. When There is enough water in the soil, that means the soil is not dry, we will turn off the motor. We will also use a lcd and a led to indicate that motor is on or off. For driving the motor we will use L293D motor driver. This L293D is a dual channel motor drive. Here we will only use 1 channel, because we will run only on motor. The current limit for L293D is 1A. So, choose a motor which doesn't require more 500mA - 700mA current. We will use small motor to demonstrate the process. 



PIC16F887 Pin Diagram


Soil Moisture Sensor


To do this we need following software:

   1. MikroC pro for PIC (student verison)
   2. Proteus 8 professional
   3. PicKit 2


MikroC pro for PIC will be used for writing and compiling the code. Here we will use C language for programming. Proteus 8 professional will be used for the simulation and finally Pickit 2 will be used for burning the hex file in the PIC16F887  IC. 

To do this project we need following components;


   1. PIC16F887
   2. LED
   3. 16 MHz Crystal Oscillator
   4. Breadboard
   5. Wires
   6. 5V DC Power source
   7. Soil Moisture Sensor
   8. 16*2 LCD
   9. L293D Motor Driver
  10. DC motor
  11. 470 ohm resistor
  12. Header for connect LCD
  13. 10K potentiometer

CODE

 sbit LCD_RS at RD0_bit;
 sbit LCD_EN at RD1_bit;
 sbit LCD_D4 at RD2_bit;
 sbit LCD_D5 at RD3_bit;
 sbit LCD_D6 at RD4_bit;
 sbit LCD_D7 at RD5_bit;
 sbit LCD_RS_Direction at TRISD0_bit;
 sbit LCD_EN_Direction at TRISD1_bit;
 sbit LCD_D4_Direction at TRISD2_bit;
 sbit LCD_D5_Direction at TRISD3_bit;
 sbit LCD_D6_Direction at TRISD4_bit;
 sbit LCD_D7_Direction at TRISD5_bit;
 // End LCD module connections

 double source=0;
 double temp=0;
 int view=0;
 char txt[6];

 void main()

 {

  TRISC = 0x00;
  PORTC = 0x00;
  ADC_Init();                   // Initialize ADC
  Lcd_Init();                   // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);          // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);     // Cursor off
                                // clear LCD

  Lcd_Out(1, 1, "     EEE 332    ");
  Lcd_Out(2, 1, "    ABDUR ROUF  ");
  delay_ms(2000);
  Lcd_Cmd(_LCD_CLEAR);
  Lcd_Out(1, 1, "  SOIL MOISTURE ");
  Lcd_Out(2, 1, " MICROCONTROLLER");
  delay_ms(2000);
  Lcd_Cmd(_LCD_CLEAR);          // Clear display
                                //  char code for degree
                                // Display "C" for Celsius
  while(1)
  {
        source=Adc_Read(1);
     
        if(source>600)
        {
          PORTC = 0b11111101;                  //motor on
          delay_ms(500);
          Lcd_Cmd(_LCD_CLEAR);
          Lcd_Out(1,5, "Dry Soil");
          Lcd_Out(2,5, "Motor On");
        }
     
        if(source<=600)
        {
          PORTC = 0b00000000;
          delay_ms(500);                  //motor on
          Lcd_Cmd(_LCD_CLEAR);
          Lcd_Out(1,5, "Humid Soil");
          Lcd_Out(2,5, "Motor OFF");
        }
     }

 }


Schematic



Schematic 1




Schematic 2




Schematic 3



Gas Leakage Detection System Using PIC18F452



In this project we will interface MQ2 gas leakage detector with PIC18F452. MQ2 is suitable for detecting H2, LPG, CH4, CO, Alcohol, Smoke or Propane. PIC18F452 is a popular micro controller in PIC18 series. If this sensor can sense a gas leakage then the buzzer will beep and if there is no gas leakage then buzzer won't beep. Also a LED will turn on and off, if gas leakage is detected. Also we will have a lcd to show that if the alarm is on or not. 


MQ 2 Gas Sensor




PIC18F452 Pin Diagram



To do this we need following software:

   1. MikroC pro for PIC (student verison)
   2. Proteus 8 professional
   3. PicKit 2

MikroC pro for PIC will be used for writing and compiling the code. Here we will use C language for programming. Proteus 8 professional will be used for the simulation and finally Pickit 2 will be used for burning the hex file in the PIC18F452  IC. 

To do this project we need following components;


   1. PIC18F452
   2. LED
   3. 16 MHz Crystal Oscillator
   4. Breadboard
   5. Wires
   6. 5V DC Power source
   7. MQ2 Gas Sensor
   8. 16*2 LCD
   9. BC547 
  10. Buzzer
  11. 150 ohm and 470 ohm resistor
  12. Header for connect LCD
  13. 10K potentiometer


CODE


// LCD module connections
sbit LCD_RS at RB7_bit;
sbit LCD_EN at RB6_bit;
sbit LCD_D4 at RB5_bit;
sbit LCD_D5 at RB4_bit;
sbit LCD_D6 at RB3_bit;
sbit LCD_D7 at RB2_bit;

sbit LCD_RS_Direction at TRISB7_bit;
sbit LCD_EN_Direction at TRISB6_bit;
sbit LCD_D4_Direction at TRISB5_bit;
sbit LCD_D5_Direction at TRISB4_bit;
sbit LCD_D6_Direction at TRISB3_bit;
sbit LCD_D7_Direction at TRISB2_bit;
// End LCD module connections

void main()
{
      unsigned int input = 0;
      TRISD = 0;                  // output register
      PORTD = 0;                  // output port

      ADCON1 =0x0E;               // Analog to digital converter turning on

      Lcd_Init();
      Lcd_Cmd(_LCD_CURSOR_OFF);

      Lcd_Cmd(_LCD_CLEAR);
      Lcd_out(1,1, " EEE 332 PROJECT");
      delay_ms(100);
      Lcd_out(2,1, "Micro Controller");
      delay_ms(1000);
      Lcd_Cmd(_LCD_CLEAR);
      delay_ms(200);

      Lcd_Cmd(_LCD_CLEAR);
      Lcd_out(1,1, "   GAS LEKEAGE  ");
      delay_ms(100);
      Lcd_out(2,1, "DETECTION SYSTEM");
      delay_ms(1000);
      Lcd_Cmd(_LCD_CLEAR);
      delay_ms(200);

      Lcd_Cmd(_LCD_CLEAR);
      Lcd_out(1,1, "  DEVELOPED BY  ");
      delay_ms(100);
      Lcd_out(2,1, "   ABDUR ROUF   ");
      delay_ms(1000);
      Lcd_Cmd(_LCD_CLEAR);
      delay_ms(200);



      while(1)
      {

         input = ADC_read(0);           // Reading the ADC value from PORT A0

               if(input>=400)
         {

            PORTD = 0b11111111;         // Turning on LED on PORTB
            delay_ms(250);
            PORTD = 0b00000000;         // Turning off LED on PORTB
            delay_ms(250);
            Lcd_Cmd(_LCD_CLEAR);
            Lcd_out(1,1, "   GAS LEKEAGE  ");
            Lcd_out(2,1, "    DETECTED    ");
            delay_ms(1000);             // Turning on LED for 5 seconds

         }
               else
         {
            PORTD = 0b00000000;         // Turning off LED
            delay_ms(500);              // Turning off LED for 5 seconds
            Lcd_Cmd(_LCD_CLEAR);
            Lcd_out(1,1, "    ALARM OFF    ");
            Lcd_out(2,1, "  NO GAS LEAKAGE ");
      }
}

}



Schematic


Schematic 1


Schematic 2



Schematic 3



Schematic 4


Line Follower Robot using Arduino

This project was a part of Line Follower Robot Competition