Chat
Danh mục
Mạch cảnh báo mưa - Hiển thị LCD 16x 2 - Atmega - GTMT

Mạch cảnh báo mưa - Hiển thị LCD 16x 2 - Atmega - GTMT

Số lượng:
Thêm vào giỏ
Mạch cảnh báo mưa - Hiển thị LCD 16x 2 - Atmega - GTMT đã được thêm vào giỏ hàng



Chia sẻ đến các bạn file full code C + Mô Phỏng hệ thống cảnh báo mưa hiển thị màn hình LCD 16 x 2 - Giao tiếp máy tính. Do CTV Dao Nguyen viết.

- File bao gồm:
+ Code C viết trên Codevisionavr
+ Mô phỏng Protues 8.6
+ Danh sách linh kiện các bạn có thể tham khảo mua tại Shopee: http://shopee.linhkiencuatui.com
+ File Code giao tiếp ESP8266

#include <mega8.h>

#define DHT11_in     PIND.4
#define DHT11_out    PORTD.4
#define DHT11_define DDRD.4

#define tb1 PORTB.2
#define tb2 PORTB.1
#define tb3 PORTB.4
#define tb4 PORTB.5
char s1,s2,s3,s4;

#define secvo  PORTD.2
#define cb_mua PIND.3
char s_mua;

#define n1 PIND.5
#define n2 PIND.6
#define n3 PIND.7
#define n4 PINB.0

#define i1 PINC.0
#define i2 PINC.1
#define i3 PINC.2
#define i4 PINC.3

#define bat 1
#define tat 0

#define LCDI2C_ADDR 0x27

// I2C Bus functions
#asm
   .equ __i2c_port=0x15 ;PORTC
   .equ __sda_bit=4
   .equ __scl_bit=5
#endasm
#include <i2c.h>
#include <stdio.h>
#include <delay.h>

unsigned char temp,humi;
unsigned char buff[20];
//---------------------------Chuong trinh giao tiep UART--------------------------------//
void UART_guikitu(unsigned char _data)
{
  while(!(UCSRA & (1<<UDRE))); //kiem tra UDRE
  UDR=_data;
}
void UART_guichuoi(unsigned char *u)
{
  while(*u)
  {
    UART_guikitu(*u);
    u++;
  }
}

//--------------Chuong trinh giao tiep servo----------------------------------
void sv_180()
{
  int i;
  for(i=0;i<50;i++)
  {
     secvo=1;delay_ms(1);
     secvo=0;delay_ms(19);
  }
}
void sv_0()
{
  int i;
  for(i=0;i<50;i++)
  {
     secvo=1;delay_ms(2);
     secvo=0;delay_ms(18);
  }
}



//--------------Chuong trinh doc DHT11---------------------------------------
unsigned long demdht=0xFFFFFFFE;
unsigned char doc_nhietdo_doam(unsigned char *tem,unsigned char *humi)
{
 unsigned char data[5]={0},i,j,check;
 DHT11_define=1; //out
 DHT11_out=1;
 delay_us(60);
 DHT11_out=0;
 delay_ms(25);
 DHT11_out=0;
 DHT11_define=0; //in
 delay_us(60);
 if(DHT11_in)return 0; else while(!DHT11_in);
 delay_us(60);
 if(!DHT11_in)return 0; else while(DHT11_in);
 for(i=0;i<5;i++)
 {
  for(j=0;j<8;j++)
  {
   while(!DHT11_in);
   delay_us(50);
   if(DHT11_in)
   {
    data[i]|=(1<<(7-j));
    while(DHT11_in);
   }
  }
 }
 check=data[0]+data[1]+data[2]+data[3];
 if(check !=data[4])return 0;
 *tem=data[2];
 *humi=data[0];
 return 1;
}
//----------------Chuong trinh giao tiep I2C driver LCD------------------------------------//
void PCD8574_write(unsigned char byte)
{
  i2c_start(); // bat dau ghi
  i2c_write(LCDI2C_ADDR<<1);
  i2c_write(byte); // do du lieu trong ds la BCD nen ta can chuyen ca gia tri sang BCD ( day cau lenh chuyen du lieu sang BCD)
  i2c_stop(); // ket thuc qua trinh truyen du lieu
}
//------------------------------Giao tiep LCD 1602-------------------------//
unsigned char data_MASK=0xFF; //byte mat na
#define LCD_RS   1
#define LCD_RW  (1<<1)
#define LCD_EN  (1<<2)
#define LCD_LED (1<<3)
void LCD_Enable(void)
{
    data_MASK |= LCD_EN;     //SET Enable
    delay_us(3);
    PCD8574_write(data_MASK);
    data_MASK &= ~LCD_EN;   //RESET Enable
    delay_us(50);
    PCD8574_write(data_MASK);
}
void LCD_Send4Bit(unsigned char Data) //chi su dung 4 bit thap cua Data
{
    data_MASK &= 0x0F; //clear 4 bit cao
    data_MASK |=  (Data & 0x01)<<4;        // lay ra bit 0 dua vao vi tri bit 4
    data_MASK |=  (Data & 0x02)<<4;        // lay ra bit 1 dua vao vi tri bit 5
    data_MASK |=  (Data & 0x04)<<4;        // lay ra bit 2 dua vao vi tri bit 6
    data_MASK |=  (Data & 0x08)<<4;        // lay ra bit 3 dua vao vi tri bit 7
}
void LCD_Send1Byte(unsigned char byte)
{
LCD_Send4Bit(byte >>4);/* Gui 4 bit cao */
LCD_Enable();
LCD_Send4Bit(byte); /* Gui 4 bit thap*/
LCD_Enable();
}
// Ham di chuyen con tro: row=0-1; col=0-15 (2 hang + 16 cot)
void LCD_chonvitri(unsigned char x, unsigned char y)
{
unsigned char address;
if (y == 0) address = (0x80 + x); // row=0 - hang 1
    else address = (0xC0 + x); // row=1 - hang 2
    delay_us(1000);
    LCD_Send1Byte(address);
    delay_us(50);
}
// Ham hien thi ra man hinh chuoi ki tu
void LCD_guichuoi(char *s)
{
while(*s)
{
data_MASK |= LCD_RS;  //dua chan RS len vcc
        PCD8574_write(data_MASK);
LCD_Send1Byte(*s);
data_MASK &= ~LCD_RS;  //dua chan RS xuong mass
    PCD8574_write(data_MASK);
s++;
}
}
void LCD_guikitu(int s)
{
data_MASK |= LCD_RS;  //dua chan RS len vcc
        PCD8574_write(data_MASK);
LCD_Send1Byte(s);
        data_MASK &= ~LCD_RS;  //dua chan RS xuong mass
    PCD8574_write(data_MASK);
}
// Ham xoa man hinh
void LCD_xoamanhinh()
{
//    LCD_chonvitri(0,0);
// LCD_guichuoi("                ");
// LCD_chonvitri(1,0);
// LCD_guichuoi("                ");
// LCD_chonvitri(0,0);
LCD_Send1Byte(0x01);
LCD_chonvitri(0,0);
}
// Ham khoi tao LCD
void LCD_khoitao()
{
    data_MASK &= ~LCD_RW;  //dua chan RW xuong mass
    data_MASK &= ~LCD_RS;  //dua chan RS xuong mass
    //PCD8574_write(data_MASK);
LCD_Send4Bit(0x03);
LCD_Enable();
delay_ms(5);
LCD_Enable();
delay_ms(100);
LCD_Enable();
LCD_Send4Bit(0x02); // dua con tro ve dau man hinh
LCD_Enable();

LCD_Send1Byte(0x28);
LCD_Send1Byte(0x0C); // Bat hien thi, bat con tro 0x0C neu muon tat con tro
LCD_Send1Byte(0x06);
delay_ms(20);
    LCD_xoamanhinh();
}

//--------------Chuong trinh check nut nhan -------------
void checknut()
{
   if(!n1)
   {
    s1=1-s1;
    if(s1){tb1=bat;UART_guichuoi("bat1");}
    else {tb1=tat;UART_guichuoi("tat1");}
    delay_ms(500);while(!n1);
   }
   if(!n2)
   {
    s2=1-s2;
    if(s2){tb2=bat;UART_guichuoi("bat2");}
    else {tb2=tat;UART_guichuoi("tat2");}
    delay_ms(500);while(!n2);
   }
   if(!n3)
   {
    s3=1-s3;
    if(s3){tb3=bat;UART_guichuoi("bat3");}
    else {tb3=tat;UART_guichuoi("tat3");}
    delay_ms(500);while(!n3);
   }
   if(!n4)
   {
    s4=1-s4;
    if(s4){tb4=bat;UART_guichuoi("bat4");}
    else {tb4=tat;UART_guichuoi("tat4");}
    delay_ms(500);while(!n4);
   }
}

//--------------------doc cam bien mua-----------------------------------------
char s_mua_old;
void check_cam_bien_mua()
{
  s_mua=cb_mua;
  if(s_mua != s_mua_old)
  {
      s_mua_old=s_mua;
      delay_ms(20);
      if(s_mua==0)       //co mua
      {
         UART_guichuoi("Co mua");
         LCD_chonvitri(0,1);
         LCD_guichuoi("Co mua   ");
         sv_180();
      }
      else
      {
         UART_guichuoi("Khong mua");
         LCD_chonvitri(0,1);
         LCD_guichuoi("Khong mua");
         sv_0();;
      }
  }
}

//------------------------------giao tiep voi esp8266 ngat uart nhan du lieu tu blynk------------------------
interrupt [USART_RXC] void rx_isr()
{
  unsigned char c;
  c=UDR; //Lay du lieu
       if(c=='A'){s1=bat;tb1=bat;}
  else if(c=='B'){s2=bat;tb2=bat;}
  else if(c=='C'){s3=bat;tb3=bat;}
  else if(c=='D'){s4=bat;tb4=bat;}
  else if(c=='a'){s1=tat;tb1=tat;}
  else if(c=='b'){s2=tat;tb2=tat;}
  else if(c=='c'){s3=tat;tb3=tat;}
  else if(c=='d'){s4=tat;tb4=tat;}
}
void doctrangthai()
{
 unsigned char dat[30]="bat1bat2bat3bat4";
 if(i1 == 1)dat[0]='t';
 if(i2 == 1)dat[4]='t';
 if(i3 == 1)dat[8]='t';
 if(i4 == 1)dat[12]='t';
 UART_guichuoi(dat);
}
void main(void)
{
PORTB=0xff;
DDRB=0xFE;

PORTC=0xf0;
DDRC=0xf0;

PORTD=0xff;
DDRD=0x1E;
DDRD.3=0;

UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

tb1=tb2=tb3=tb4=tat;
s1=s2=s3=s4=tat;

i2c_init();
UART_guichuoi("Khoi dong\r\n");
sv_0();

#asm("sei")

LCD_khoitao();
while (1)
      {
        demdht++;if(demdht>500000)
        {
        doctrangthai();
        demdht=0;
        if(doc_nhietdo_doam(&temp,&humi)){
        sprintf(buff,"%i%cC  %i%c  ",temp,0xDF,humi,0x25);
        LCD_chonvitri(0,0);
        delay_ms(50);LCD_guichuoi(buff);
        sprintf(buff,"DHT11%c%c",temp,humi);
        UART_guichuoi(buff);
        }
        else
        {
          LCD_chonvitri(0,0);
          delay_ms(50);LCD_guichuoi("DHT11 Error     ");
        }
        }
        checknut();
        check_cam_bien_mua();
      }
}


Code  ESP8266:

#define BLYNK_PRINT Serial    
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
char auth[] = "Y_PZO1dBT6T3f89RMN1w8_RrZg2lGtbk";    //AuthToken copy ở Blynk Project
char ssid[] = "dieukhien";  //Tên wifi
char pass[] = "12345678";     //Mật khẩu wifi
WidgetLED led1(V0); //register to virtual pin 
WidgetLED led2(V1); //register to virtual pin 
WidgetLED led3(V2); //register to virtual pin 
WidgetLED led4(V3); //register to virtual pin 
WidgetLED mua(V8); //register to virtual pin 

char s1,s2,s3,s4;
BLYNK_WRITE(V4) // V is the number of Virtual Pin  
{
  if(!param.asInt())return;
  s1=1-s1;
  if(s1==1) //bật
  {
    Serial.print("A");
    led1.on();
  }
  else
  {
    Serial.print("a");
    led1.off();
  }
}
BLYNK_WRITE(V5) // V is the number of Virtual Pin  
{
  if(!param.asInt())return;
  s2=1-s2;
  if(s2==1) //bật
  {
    Serial.print("B");
    led2.on();
  }
  else
  {
    Serial.print("b");
    led2.off();
  }
}
BLYNK_WRITE(V6) // V is the number of Virtual Pin  
{
  if(!param.asInt())return;
  s3=1-s3;
  if(s3==1) //bật
  {
    Serial.print("C");
    led3.on();
  }
  else
  {
    Serial.print("c");
    led3.off();
  }
}
BLYNK_WRITE(V7) // V is the number of Virtual Pin  
{
  if(!param.asInt())return;
  s4=1-s4;
  if(s4==1) //bật
  {
    Serial.print("D");
    led4.on();
  }
  else
  {
    Serial.print("d");
    led4.off();
  }
}
void setup() 
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
}
String inputString="";
void read_at8()
{
  if(Serial.available()) 
  {
    inputString="";
    delay(20);
    while (Serial.available()) 
    {
       char inChar = (char)Serial.read(); 
       inputString += inChar;
    }
    if(inputString.indexOf("bat1") != -1)
    {
       s1=1;
       led1.on();
     
    }
    if(inputString.indexOf("bat2") != -1)
    {
       s2=1;
       led2.on();
      
    }
    if(inputString.indexOf("bat3") != -1)
    {
       s3=1;
       led3.on();
      
    }
    if(inputString.indexOf("bat4") != -1)
    {
       s4=1;
       led4.on();
      
    }
    if(inputString.indexOf("tat1") != -1)
    {
      s1=0;
       led1.off();
   
    }
    if(inputString.indexOf("tat2") != -1)
    {
      s2=0;
       led2.off();
   
    }
    if(inputString.indexOf("tat3") != -1)
    {
      s3=0;
       led3.off();

    }
    if(inputString.indexOf("tat4") != -1)
    {
      s4=0;
       led4.off();
    }
    if(inputString.indexOf("Co mua") != -1)
    {
       mua.on();
    }
    if(inputString.indexOf("Khong mua") != -1)
    {
       mua.off();
    }
    int index = inputString.indexOf("DHT11");
    if(index != -1)
    {
      int temp=inputString[index+5];
      int humi=inputString[index+6];
      Blynk.virtualWrite(V9,temp);
      Blynk.virtualWrite(V10,humi);
      return;
    }
  }
}
void loop() 
{
  Blynk.run();
  read_at8();
}



Các bạn sinh viên có thể download về học tập nghiên cứu phát triển thêm. Đừng quên Like - Share nhé.

( Nguyên lý + Code chuẩn) Link Mediafire
Khi nhấn nút "Tải Về Máy", bạn sẽ vào trang quảng cáo, vui lòng chờ 5 giây. Nút  hiện ra ở góc phải phía trên, nhấn vào để đến trang download
------------------------------------------------------------------------------------
DV1 - Nhận vẽ mạch thuê ONLINE Altium Designer/ Orcad 9.2/ Protues nhanh trong ngày



-----------------------------------------------------------------------------------

DV2 - Mua linh kiện về làm mạch nhanh - Miễn phí Ship




DV3 - Kênh youtube chia sẻ kiến thức điện tử thực hành ngay


DV4 - Kênh cộng đồng Facebook Điện Tử ChipKool




eChipKool - Chia sẻ kiến thức Kết Nối đam mê điện tử