งาน 4 ตัวบ่งชี้ระดับน้ำและตัวควบคุมโดยใช้ไมโครคอนโทรลเลอร์ PIC


นี่เป็นโครงการที่ใช้งานง่ายและอเนกประสงค์ซึ่งบ่งบอกระดับน้ำและควบคุมโดยอัตโนมัติโดยใช้ PIC Microcontroller ส่วนการตรวจวัดระดับน้ำจะตรวจจับระดับน้ำในถังและส่งไปยังส่วนรับสัญญาณ (ไร้สาย) แผนกรับเชื่อมต่อกับส่วนควบคุมซึ่งประมวลผลข้อมูลที่ได้รับและสร้างสัญญาณภาพเสียงและควบคุมการทำงานของมอเตอร์เมื่อใดก็ตามที่ต้องการ โครงการแบ่งออกเป็น 4 ส่วน 1. ส่วนแหล่งจ่ายไฟ ส่วนแหล่งจ่ายไฟจัดหาแหล่งจ่ายไฟที่จำเป็นสำหรับโมดูลรับและควบคุม โมดูลตัวรับต้องใช้แหล่งจ่ายไฟ + 5V โมดูลคอนโทรลเลอร์ต้องการการจ่ายไฟ + 5v และ + 12v แผนภูมิวงจรรวม:


2. มาตราการตรวจวัดระดับน้ำ ASK เครื่องส่งสัญญาณ RF ASK เครื่องส่งสัญญาณ RF โมดูลเซ็นเซอร์ระดับทำด้วย HT12E encoder และตัวส่งสัญญาณ RF ASK (Amplitude Shift Keying) วงจรนี้สามารถขับด้วยแบตเตอรี่ 9V สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับเครื่องส่งสัญญาณนี้โปรดอ่านบทความเครื่องส่งสัญญาณ RF ไร้สายและตัวรับสัญญาณโดยใช้โมดูล RF ASK วงจรนี้วางอยู่ใกล้กับถังเก็บน้ำและเชื่อมต่อกับถังตามที่แสดงในภาพด้านล่าง
Water Tank Connections


3. ส่วนรับสัญญาณ
ASK RF Receiver


โมดูลตัวรับทำด้วยตัวถอดรหัส HT12D และตัวรับสัญญาณ ASK RF ข้อมูลที่ส่งมาจากโมดูลเซ็นเซอร์ได้รับจากโมดูลนี้และมอบให้กับโมดูลควบคุม สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับตัวรับสัญญาณนี้โปรดอ่านบทความตัวส่งและตัวรับสัญญาณ RF ไร้สายโดยใช้โมดูล RF ASK 4. ส่วนควบคุม
Water Level Indicator Controller using PIC Microcontroller

วิญญาณของแผนกควบคุมคือ PIC16F877A มันประมวลผลข้อมูลที่ได้รับจากมาตราผู้รับ จอแสดงผล LCD, LED บ่งชี้และสถานะมอเตอร์มีการปรับปรุงตามข้อมูล คุณสามารถดาวน์โหลดไฟล์ hex และ mikroC ซอร์สโค้ดที่ด้านล่างของบทความนี้

MikroC Code

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

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

char txt1[] = "Water";
char txt2[] = "Level";
char txt3[] = "Indicator";
char txt4[] = "And Controller";

char mtr1[] = "Motor ";
char mtr2[] = "OFF";
char mtr3[] = "ON";

char wtr1[] = "Level: ";
char wtr2[] = "Very Low";
char wtr3[] = "Low";
char wtr4[] = "Medium";
char wtr5[] = "High";
char wtr6[] = "Full";

void main() 
{

  int i = 0;
  int c = 16;
  int b = 0;
  CMCON = 0x07;
  ADCON1 = 0x06;
  TRISA = 0x0F;                  // set direction to be input
  PORTA = 0x00;
  PORTD = 0x00;
  PORTC = 0x00;
  TRISB = 0x00;                  //  set direction to be output
  TRISC = 0x00;                  // set direction to be output
  TRISD = 0x80;                  // set direction to be output

  PORTD.F2 = 1;
  PORTD.F7 = 1;

  Lcd_Init();                    // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);           // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);      // Cursor off
  Lcd_Out(1,1,txt1);             // Write text in first row
  Lcd_Out(2,1,txt2);             // Write text in second row
  Delay_ms(500);
  Lcd_Cmd(_LCD_CLEAR);           // Clear display
  Lcd_Out(1,1,txt3);             // Write text in first row
  Lcd_Out(2,1,txt4);             // Write text in second row
  Delay_ms(500);

  // Moving text
  for(i=0; i<15; i++) 
  {    
    Lcd_Cmd(_LCD_SHIFT_RIGHT);   
    Delay_ms(125);
  } 

  i=0; //Motor Status OFF
 
  do 
  {    
    Lcd_Cmd(_LCD_CLEAR);    
    Lcd_Out(1,1,wtr1);    
    Lcd_Out(2,1,mtr1);    
    if(c>0)
    {
      PORTD.F2 = 1               //LCD Backlight ON
      c--;
    }
    else
      PORTD.F2 = 0;              //LCD Backlight OFF
      
    if(b>0)
    {
      PORTD.F0 = 1;              //Buzzer ON
      Delay_ms(125);
      PORTD.F0 = 0;              //Buzzer OFF
      b--;
    }
      
    if(PORTD.F7 == 0)            //Manual Backlight ON
      c = 16;
     
    if(PORTA == 0x0F)
    {
       PORTD.F1 = 1;
       Lcd_Out(1,8,wtr2);
       Lcd_Out(2,7,mtr3);
       PORTC = 1;
       if(i == 0)
       {
          c = 16;                //Backlight
          b=3;                   //Buzzer
       }
       i=1;
    }
    else if(PORTA == 0x0E)
    {
       Lcd_Out(1,8,wtr3);
       if(i == 1)
          Lcd_Out(2,7,mtr3);
       else
          Lcd_Out(2,7,mtr2);
       PORTC = 3;                 //LED Bar
    }
    else if(PORTA == 0x0C)
    {
       Lcd_Out(1,8,wtr4);
       if(i == 1)
          Lcd_Out(2,7,mtr3);
       else
          Lcd_Out(2,7,mtr2);
       PORTC = 7;                  //LED Bar
    }
    else if(PORTA == 0x08)
    {
       Lcd_Out(1,8,wtr5);
       if(i == 1)
          Lcd_Out(2,7,mtr3);
       else
          Lcd_Out(2,7,mtr2);
          PORTC = 15;              //LED Bar
    }
    else if(PORTA == 0x00)
    {
       Lcd_Out(1,8,wtr6);
       Lcd_Out(2,7,mtr2);
       PORTD.F1 = 0;              // Motor OFF
       if(i == 1)
       {
         c = 16;                  //Backlight
         b = 3;                   //Buzzer
       }
       i=0;                       //Motor Status Updated
       PORTC = 31;                //LED Bar
    }
    else
       PORTA = 0x0F;
   Delay_ms(125);


  }while(1);                     // Endless loop
}

การทำงาน

สำหรับการส่งและรับข้อมูลเราใช้คู่เข้ารหัสของ Holtek HT12E และ HT12D ทั้งคู่เป็นแรงดันไฟฟ้าในการทำงานของ CMOS ICs ตั้งแต่ 2.4 ถึง 12v ความต้านทานของออสซิลเลเตอร์ถูกเลือกตามแผ่นข้อมูล เมื่อระดับน้ำเพิ่มขึ้นหมุดข้อมูลของเครื่องเข้ารหัสจะลงดินสอดคล้องกับระดับน้ำซึ่งจะถูกส่งไปยังเครื่องรับผ่านโมดูล ASK RF ข้อมูลที่ได้รับจะถูกถอดรหัสโดยตัวถอดรหัส HT12D LED บนเครื่องรับแสดงว่ากำลังรับข้อมูล จากนั้นข้อมูลจะถูกส่งไปยัง PIC สำหรับการประมวลผล

ความคิดเห็น

บทความที่ได้รับความนิยม