
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é.

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

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