Thiết kế chƣơng trình phần mềm

Một phần của tài liệu Nghiên cứu và chế tạo thiết bị đo bụi liên tục ứng dụng trong giám sát môi trường công nghiệp (Trang 42 - 71)

Một phần mềm nhúng viết cho MCU này đƣợc phát triển trên ngôn ngữ C, sau đó biên dịch và download xuống MCU. Lƣu đồ thuật toán thể hiện trên Hình 3.11.

41

Hình 3. 11. Hoạt động của phần mềm trong thiết bị đo bụi.

Sau khi khởi tạo các thông số ban đầu, chƣơng trình sẽ lấy các số liệu về nồng độ bụi từ phần tử đo bụi, sau đó sẽ tách dữ liệu trong khung truyền ra và đƣa vào tính toán nồng độ bụi theo công thức (1) và (2). Số liệu sau đó đƣợc đƣa ra hiển thị trên LCD đồng thời cũng đƣợc đóng gói và gửi ra các cổng truyền thông để truyền số liệu về trung tâm thu thập. Nếu không có tín hiệu dừng thì chƣơng trình cứ tiếp tục chạy theo đúng chu trình vòng quét này.

Chúng tôi cũng phát triển một phần mềm giao diện trên máy tính giám sát hoạt động theo Webserver. Phần mềm này đƣợc phát triển trên Node.js cho phép thu thập số liệu về bụi, hiển thị số, hiển thị dƣới dạng đồ thị, lƣu trữ trên Server và đƣa ra các cảnh báo. Lƣu đồ thuật toán của phần mềm này thể hiện nhƣ sau:

42

43

CHƢƠNG 4: KẾT QUẢ ĐẠT ĐƢỢC

Sau khi phân tích và thiết kế, chúng tôi đã đạt đƣợc một số kết quả thực nghiệm, bƣớc đầu mạch phần cứng của thiết bị đã hoạt động tốt, đã đo đƣợc các thông số bụi PM10, PM2.5 đúng nhƣ thiết kế ban đầu. Hình 4.1 thể hiển mạch phần cứng đang hoạt động. Đây cũng đang là mô hình thử nghiệm trong phòng thí nghiệm. Chúng tôi kết nối với Modul truyền thông F8114 thông qua cổng truyền thông RS485 trên thiết bị và thử nghiệm tính năng của phần mềm.

Hình 4. 1. Phần cứng của thiết bị đo bụi.

Phần kết nối với máy tính ở xa thông qua Module truyền thông F8114 thể hiện nhƣ sau: dust sensing device STM32F103 Communication ports

44

Hình 4. 2. Mô t hệ thống kết nối

Giao diện phần mềm của trạm thu thập thể hiện trên hình sau:

Hình 4. 3. Giao diện thể hiện nồn đồ bụi đo online tại khu vực cần giám sát.

Kết quả thể hiện số liệu Online về nồng độ bụi PM10 và PM2.5. Ngoài ra chƣơng trình phần mềm cũng đƣợc thiết kế mở để cho phép hiển thị thêm các thông số khác nhƣ Tổng bụi lơ lửng TSP, nhiệt độ, độ ẩm và tốc độ gió.

Một tính năng khác của phần mềm cũng đƣợc thể hiện trong chƣơng trình là tính năng thống kế, cho phép hiển thị dữ liệu theo thời gian. Phần giao diện này đƣợc thể hiện trên Hình 4.3.

45

Hình 4. 4. Giao diện thể hiện diễn biến nồn độ bụi theo thời gian.

So sánh kết quả đạt đƣợc trong nghiên cứu này với [7] có thể thấy dải đo đã đƣợc cải thiện đáng kể từ 400ug/m3 lên 999ug/m3. Ngoài ra giải pháp tích hợp Modul truyền thông GPRS/ZigBee cho thiết bị này đã làm cho thiết bị trong nghiên cứu này có thể truyền số liệu trên một phạm vi lớn (hàng trăm km) rất phù hợp cho phát triển các trạm quan trắc bụi từ xa. Việc sử dụng MCU ST32F103 trong thiết kế thiết bị đo bụi này đã làm tăng cƣờng các tính năng xử lý cũng nhƣ cho phép thực hiện nhiều thuật toán về lọc nhiễu, xử lý giao thức công nghiệp đƣợc triển khai trong các nghiên cứu nối tiếp đây, so sánh này thực hiện với [4, 7].

46

CHƢƠNG 5: KẾT LUẬN

Qua quá trình thực hiện nghiên cứu về đề tài này Học viên đã nắm đƣợc các kiến thức chung về bụi, các chỉ tiêu chất lƣợng môi trƣờng bụi trong công nghiệp,… Nắm đƣợc các phƣơng pháp đo và giám sát bụi tiêu biểu hiện nay trên thế giới, từ đó lựa chọn đƣợc phƣơng pháp đo bụi theo nguyên lý tán xạ ánh sang để đáp ứng đƣợc yêu cầu của đề tài- khả năng đo bụi liên tục.

Thiết bị đo bụi tích hợp vi điều khiển ứng dụng cho giám sát môi trƣờng công nghiệp đã đƣợc nghiên cứu, thiết kế và chế tạo thành công. Thiết bị có khả năng đo trong phạm vi rộng từ 0-999µg/m3. Phƣơng pháp đo tán xạ laser dùng trong nghiên cứu này cho phép thiết bị đo online (liên tục) mà không cần tốn nhiều thời gian cho các xử lý phân tích thủ công theo các phƣơng pháp truyền thống (các phƣơng pháp truyền thống đề hiển thị số liệu đo cần nhiều giờ, nhiều ngày).

Thiết bị đã truyền đƣợc số liệu về trung tâm – nơi có phần mềm chạy trên Webserver đã hoạt động tốt. Các số liệu đã đƣợc lƣu trữ, hiển thị trực tiếp và hiển thị theo thời gian dƣới dạng đồ thị.

Bƣớc tiếp theo của nghiên cứu sẽ là kiểm định sai số của thiết bị và triển khai thử nghiệm tại các khu công nghiệp.

47

TÀI LIỆU THAM KHẢO

[1] N. R. Andrey, V. C. Pavel, G. S. Valery, Dust concentration measurement laser instrument in industrial conditions, Proc. SPIE 4316, International Conference on Lasers for Measurements and Information, 8 Jun. 2000, St. Peterburg, Russia, (2000).

[2] F. Hauert and A. Vogl, Measurement of Dust Cloud Characteristics in Industrial, Technical report PL910695, Research Center for Applied System Safety and Industrial Medicine, (1995).

[3] X. Cheng, L. Hao, L. Li, M. Cao, Study of repairable coal mine dust concentration detecting method based on curve fitting and volume calculation method, 4th International Symposium on Information Science and Engineering, 22 Dec. 2008, Shanghai, China, (2008) 379-383.

[4] I. K. Mokhloss, S. Valentin, Smart sensor nodes for airborne particulate concentration detection, UPB Science Bulletin, Series C, 76 (2014).

[5] B. Matthias, B. Mathias, B. Michael, Investigating the use of commodity dust sensors for the embedded measurement of particulate matter, 2012 9th international conference on networked sensing systems, 11-14 Jun. 2012, Antwerp, Belgium (2012) 1-4.

[6] A.Morpurgo, F. Pedersini, A. Reina, A low-cost instrument for environmental particulate analysis based on optical scattering,” 2012 IEEE International on Instrumentation and Measurement Technology Conference (I2MTC), 13-16 May 2012, Graz, Austria (2012) 2646-2650.

[7] I. K. Mokhloss, S. Grigore, S. Valentin, Wireless measurement node for dust sensor integration, the 6th international conference on sensor technologies and application, 19-24 Aug. 2012, Rome, Italy (2012).

48 [8] National Emission Standards for Hazardous Air Pollutants for Major Sources: Industrial, Commercial, and Institutional Boilers and Process Heaters; Final Rule. January 31, 2013

[9] National Emission Standards for Hazardous Air Pollutants for Area Sources: Industrial, Commercial, and Institutional Boilers; Final Rule. February 1, 2013 [10] National Emissions Standards for Hazardous Air Pollutants for Mineral Wool

Production and Wool Fiberglass Manufacturing; Final Rule. July 29, 2015 [11] National Emission Standards for Hazardous Air Pollutants for Primary

Aluminum Reduction Plants; Final Rule. October 15, 2015

[12] Standards of Performance for New Stationary Sources and Emission Guidelines for Existing Sources: Commercial and Industrial Solid Waste Incineration Units; Final Rule.

[13] National Emission Standards for Hazardous Air Pollutants for the Portland Cement Manufacturing Industry and Standards of Performance for Portland Cement Plants; Final Rule. July 27, 2015

[14] National Emissions Standards for Hazardous Air Pollutants: Ferroalloys Production; Final Rule. June 30, 2015

[15] EPA, methode 5,17,29 determination of particulate matter [16] https://www3.epa.gov

[17] https://www.federalregister.gov [18] clean air act, 1997

[19] QCVN 34:2010/BTNMT - QCKTQG về Khí thải công nghiệp lọc hóa dầu đối với bụi và các chất vô cơ

[20] QCVN 23:2009/BTNMT - Khí thải sản xuất xi măng [21] QCVN 22:2009/BTNMT - Khí thải công nghiệp nhiệt điện [22] QCVN 21:2009/BTNMT - Khí thải sản xuất phân bón hóa học

49 [23] QCVN 06:2009/BTNMT - Chất độc hại trong không khí xung quanh

[24] QCVN 05:2009/BTNMT - Chất lƣợng không khí xung quanh [25] TCVN 5067 : 1995

[26] Giáo trình ô nhiễm không khí(tái bản lần thứ nhất, 2007)-PGS.TS. Dinh Xuân Thắng. Nhà xuất bản Đại học Quôc Gia TP HCM

[27] Ô nhiễm không khí và xử lý khí thải, tập 2 – GS.TS. Trần Ngọc Chấn, Nhà xuất bản khoa học và kỹ thuật Hà Nội – 2007

[28] Giáo trình xử lý khí thải – Phan Tấn Triều.

[29] http://eec.com.vn/home/articledetail.asp?iData=907

[30] TTKTTV Quốc gia, 2010; Chi cục BVMT Tp. Hồ Chí Minh, 2010.

[31] Các trạm QT&PTMT vùng (Đất liền 1, 2, 3) – Mạng lƣới QT&PTMT quốc gia, 2010.

[32] Liang H., Wang F. "An Improved Back Scattering Photoelectric Dust Sensor," Photonics and Optoelectronics (SOPO), 2011 Symposium on, pp.1-4, Wuhan, China, 2011.

[33] Budde, M. ; TECO/Pervasive Comput. Syst., Karlsruhe Inst. of Technol., Karlsruhe, Germany ; Busse, M. ; Beigl, M. "Investigating the use of commodity dust sensors for the embedded measurement of particulate matter," Networked Sensing Systems (INSS), 2012 Ninth International Conference on , Antwerp, Germany 2012.

50

PHỤ LỤC

1. Chƣơng trình phần mềm trong hàm Main()

#include"../include/Main.h"

/****************Goal Varies *************************/

char _Status=0;

unsignedchar Data[10]="";

float T_LM=0;

extern __IO uint16_t ADCConvertedValue;

externlong time_to_send_pc,time_to_display;

float PM25=0,PM10=0,TSP=0;

int main() {

char Dis[100]="";

//Add delay for all Periph Drivers Start up.

GLCD_Delay(2000); // SYSCLK=72MHz // HCLK=SYSCLK/AHB=SYSCLK/1=72MHz // APB2 clock = HCLK/8 // APB2 clock = 9MHz RCC_PCLK2Config(RCC_HCLK_Div8); // APB1 clock = HCLK/8 // APB1 clock = 9MHz RCC_PCLK1Config(RCC_HCLK_Div8); ADC_TM_Init(); GLCD_Init();

51 Timer2_Init_TM();

//EXI_Init_TM();

/* Generate software interrupt: simulate a falling edge applied on EXTI9 line */ //EXTI_GenerateSWInterrupt(EXTI_Line9); USART1_Init_TM(); USART2_Init_TM(); USART3_Init_TM(); GLCD_Gotoxy(0,1);

GLCD_Puts((unsignedchar*)" NONG DO BUI ");

//USART1_puts((unsigned char*)"Tran Van Manh\n");

while(1) {

if(Receive_Data_From_Dust_Sensor(Data)==1)

{

_Status=1;

//USART1_puts((unsigned char *)"OK\n");

} else { _Status=0; } T_LM=(float)ADCConvertedValue*3.3/4095.0/0.01; GLCD_Update(); if(time_to_send_pc>=5000) { time_to_send_pc=0; sprintf(Dis,"DB*5*BT1*%0.2f*%0.2f*%0.2f*0*0*0*0*0*0*0*0*0*0*0*0*0*0* KT\n",PM10,PM25,TSP);

USART1_puts((unsignedchar *)Dis); USART3_puts((unsignedchar *)Dis);

52

} }

2. Phần mềm trong truyền thông UART

#include"../include/Main.h"

externchar _Status;

externunsignedchar Data[10];

/*************************USART1******************************/

void USART1_Init_TM(void) {

//Define Varies

GPIO_InitTypeDef GPIO_USART1;

USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;

//Init for Usart

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);//cho phep ngat RX

USART_Cmd(USART1,ENABLE);

USART_Init(USART1,&USART_InitStructure);

53 GPIO_USART1.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_USART1.GPIO_Speed=GPIO_Speed_2MHz; GPIO_USART1.GPIO_Pin=GPIO_Pin_9; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_Init(GPIOA,&GPIO_USART1); //Init for RX GPIO_USART1.GPIO_Mode=GPIO_Mode_IPU; GPIO_USART1.GPIO_Speed=GPIO_Speed_2MHz; GPIO_USART1.GPIO_Pin=GPIO_Pin_10; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_Init(GPIOA,&GPIO_USART1); //

/* Configure the NVIC Preemption Priority Bits */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

/* Enable the USART1 Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }

void USART1_puts(unsignedchar *s) {

int i=0;

while(s[i]) {

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==0);//wait for buffer Emtry

54 i++; } } void USART1_IRQHandler() { char a; a = USART_ReceiveData(USART1);

USART_SendData(USART1,a);//Echo character

USART_ClearFlag(USART2, USART_FLAG_RXNE); }

/*************************USART2******************************/

void USART2_Init_TM(void) {

//Define Varies

GPIO_InitTypeDef GPIO_USART2;

USART_InitTypeDef USART_InitStructure;

//NVIC_InitTypeDef NVIC_InitStructure;

//Init for Usart

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);//cho phep ngat RX

USART_Cmd(USART2,ENABLE);

55 //Init for TX GPIO_USART2.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_USART2.GPIO_Speed=GPIO_Speed_2MHz; GPIO_USART2.GPIO_Pin=GPIO_Pin_2; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_Init(GPIOA,&GPIO_USART2); //Init for RX GPIO_USART2.GPIO_Mode=GPIO_Mode_IPU; GPIO_USART2.GPIO_Speed=GPIO_Speed_2MHz; GPIO_USART2.GPIO_Pin=GPIO_Pin_3; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_Init(GPIOA,&GPIO_USART2); //

/* Configure the NVIC Preemption Priority Bits */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

/* Enable the USART2 Interrupt */

// NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // NVIC_Init(&NVIC_InitStructure); }

void USART2_puts(unsignedchar *s) {

int i=0;

while(s[i]) {

56

while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==0);//wait for buffer Emtry USART_SendData(USART2,s[i]); i++; } } void USART2_IRQHandler() { USART_ReceiveData(USART2); USART_ClearITPendingBit(USART2, USART_IT_RXNE); USART_ClearFlag(USART2, USART_FLAG_RXNE); }

char Receive_Data_From_Dust_Sensor(unsignedchar Data[10]) {

char i=0;

while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==0);//wait for data

Data[0] = USART_ReceiveData(USART2);

if(Data[0]!=0xAA) return 0;// Faile

while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==0);//wait for data

Data[1] = USART_ReceiveData(USART2);

if(Data[1]!=0xC0) return 0;//Faile

for(i=2;i<9;i++) {

while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==0);//wait for data

57 }

while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==0);//wait for data

Data[9] = USART_ReceiveData(USART2);

if(Data[9]!=0xAB) return 0;//Faile

if(Data[8]!=(unsignedchar)(Data[2]+Data[3]+Data[4]+Data[5]+Data[6]+Data[7]))

return 0;//Faile

return 1;//Success

}

/*************************USART3******************************/

void USART3_Init_TM(void) {

//Define Varies

GPIO_InitTypeDef GPIO_USART3;

USART_InitTypeDef USART_InitStructure;

//NVIC_InitTypeDef NVIC_InitStructure;

//Init for Usart

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

//USART_ITConfig(USART3,USART_IT_RXNE, ENABLE);//cho phep ngat RX

58 USART_Cmd(USART3,ENABLE); USART_Init(USART3,&USART_InitStructure); //Init for TX GPIO_USART3.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_USART3.GPIO_Speed=GPIO_Speed_2MHz; GPIO_USART3.GPIO_Pin=GPIO_Pin_10; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_Init(GPIOB,&GPIO_USART3); //Init for RX GPIO_USART3.GPIO_Mode=GPIO_Mode_IPU; GPIO_USART3.GPIO_Speed=GPIO_Speed_2MHz; GPIO_USART3.GPIO_Pin=GPIO_Pin_11; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_Init(GPIOB,&GPIO_USART3); //Init Ctrl_Data GPIO_USART3.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_USART3.GPIO_Speed=GPIO_Speed_2MHz; GPIO_USART3.GPIO_Pin=GPIO_Pin_15; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); GPIO_Init(GPIOE,&GPIO_USART3); Ctrl_Data(1); //

/* Configure the NVIC Preemption Priority Bits */ // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //

// /* Enable the USART1 Interrupt */

// NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

59

// NVIC_Init(&NVIC_InitStructure);

}

void USART3_puts(unsignedchar *s) {

int i=0; Ctrl_Data(1);

while(s[i]) {

while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==0);//wait for buffer Emtry USART_SendData(USART3,s[i]); i++; } } 3. Phần mềm hiển thị LCD #include"../include/Main.h" externchar _Status; externunsignedchar Data[10]; externfloat PM25,PM10,TSP; externlong time_to_send_pc,time_to_display; externfloat T_LM;

void GLCD_Delay(float k) {

k=k*20;

while(k--); }

60 { SID((k & 0x01)); SCLK(1); GLCD_Delay(1); SCLK(0); GLCD_Delay(1); }

void GLCD_Send_Instruction(unsignedchar Ins) {

int i=0; SCLK(0);

CS(1); //Chip Enable

//Send Synchronizing Bit string -> Co the hieu la Start

GLCD_Send_Bit(1); GLCD_Send_Bit(1); GLCD_Send_Bit(1); GLCD_Send_Bit(1); GLCD_Send_Bit(1); //Write Instruction RS=0, RW=0 GLCD_Send_Bit(0);//RW GLCD_Send_Bit(0);//RS //Bit 8=0 GLCD_Send_Bit(0);//Bit 8 //Send 4 bit cao cua Instruction

for(i=7;i>=4;i--) {

GLCD_Send_Bit(Ins>>i); }

for(i=0;i<4;i++)//Fill 0

{

61 }

//Send 4 bit thap cua Instruction

for(i=3;i>=0;i--) {

GLCD_Send_Bit(Ins>>i); }

for(i=0;i<4;i++)//Fill 0

{

GLCD_Send_Bit(0); }

CS(0); //Disable ST7920

//delay de ST7920 thuc hien lenh

if(Ins==0x01)

GLCD_Delay(10);

else

GLCD_Delay(100); }

void GLCD_Send_Data(unsignedchar Data) {

int i=0; SCLK(0);

CS(1); //Chip Enable

//Send Synchronizing Bit string -> Co the hieu la Start

GLCD_Send_Bit(1); GLCD_Send_Bit(1); GLCD_Send_Bit(1); GLCD_Send_Bit(1); GLCD_Send_Bit(1); //Write Data RS=1, RW=0 GLCD_Send_Bit(0);//RW GLCD_Send_Bit(1);//RS //Bit 8=0

62 GLCD_Send_Bit(0);//Bit 8

//Send 4 bit cao cua Data

for(i=7;i>=4;i--) {

GLCD_Send_Bit(Data>>i); }

for(i=0;i<4;i++)//Fill 0

{

GLCD_Send_Bit(0); }

//Send 4 bit thap cua Data

for(i=3;i>=0;i--) {

GLCD_Send_Bit(Data>>i); }

for(i=0;i<4;i++)//Fill 0

{

GLCD_Send_Bit(0); }

CS(0);//Disable ST7920 //delay de ST7920 thuc hien lenh

GLCD_Delay(100); }

void GLCD_Init(void) {

GPIO_InitTypeDef GPIO_GLCD;

//Init GPIO : CS->Output, SID->Output, SCLK->Output //Step 1:Init Clock

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

//Step2: config GPIO

GPIO_GLCD.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_GLCD.GPIO_Speed=GPIO_Speed_2MHz;

63 GPIO_GLCD.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;

GPIO_Init(GPIOD,&GPIO_GLCD);

CS(0); SCLK(0); SID(0);

//Instruction

GLCD_Send_Instruction(0x0C);//Display ON, No Cur, No Blink

GLCD_Send_Instruction(0x01);//Display clear

GLCD_Send_Instruction(0x06);//Entry mode set

}

void GLCD_Gotoxy(unsignedchar x, unsignedchar y)//x=0-7,y=1-4

{ if(y<1) y=1; if(y>4) y=4; x&=0x0F; switch(y) { case 1:x|=0X80;break; case 2:x|=0X90;break; case 3:x|=0X88;break; case 4:x|=0X98;break; } GLCD_Send_Instruction(x); }

void GLCD_Putchar(unsignedchar c) {

64 GLCD_Send_Data(c);

}

void GLCD_Puts(unsignedchar *s) { int i=0; while(s[i]) { GLCD_Putchar(s[i++]); } }

void GLCD_Build_Front(unsignedchar *Data,unsignedchar Addr,unsignedchar x,

unsignedchar y) {

unsignedchar i;

if((Addr !=0) || (Addr!=2) || (Addr !=4)) return; GLCD_Send_Instruction(0x24);

GLCD_Send_Instruction(0x02); GLCD_Send_Instruction(0x20);

GLCD_Send_Instruction(Addr | 0x40);//Set CGRAM Address 0x00

for(i=0;i<32;i++) { GLCD_Send_Data(Data[i]); } GLCD_Gotoxy(x,y); GLCD_Send_Data(0x00); GLCD_Send_Data(Addr); }

void GLCD_Display_Image (unsignedchar *DData) {

65 unsignedint tmp=0; for(i=0;i<9;) { for(x=0;x<32;x++) { GLCD_Send_Instruction(0x24); GLCD_Send_Instruction((0x80+x)); GLCD_Send_Instruction((0x80+i)); GLCD_Send_Instruction(0x20); for(y=0;y<16;y++) GLCD_Send_Data(DData[tmp+y]); tmp+=16; } i+=8; } GLCD_Send_Instruction(0x26); GLCD_Send_Instruction(0x20); }

void GLCD_Update(void) {

char Dis[20]="",i=0;

int r;

if(_Status==1) {

//Calculate

PM25=(float)(((float)(Data[3])*256 + (float)Data[2])/10.0); PM10=(float)(((float)(Data[5])*256 + (float)Data[4])/10.0);

//srand(time(NULL));

r=rand()%43+3;

66

if(time_to_display<5000) {

GLCD_Gotoxy(0,1);

GLCD_Puts((unsignedchar*)" NONG DO BUI ");

//Display PM2.5

sprintf(Dis,"PM2.5=%0.1fuG/M3",PM25); GLCD_Gotoxy(0,2);

GLCD_Puts((unsignedchar*)Dis);

for(i=strlen(Dis);i<16;i++) { GLCD_Putchar(' '); } //Display PM10 sprintf(Dis,"PM10 =%0.1fuG/M3",PM10); GLCD_Gotoxy(0,3);

GLCD_Puts((unsignedchar*)Dis);

for(i=strlen(Dis);i<16;i++) { GLCD_Putchar(' '); } //Display TSP sprintf(Dis,"TSP =%0.1fuG/M3",TSP); GLCD_Gotoxy(0,4);

GLCD_Puts((unsignedchar*)Dis);

for(i=strlen(Dis);i<16;i++) { GLCD_Putchar(' '); } } if((time_to_display>=5000)&&(time_to_display<10000)) { GLCD_Gotoxy(0,1);

67 sprintf(Dis,"T=%0.2f",T_LM);

GLCD_Puts((unsignedchar*)Dis);

for(i=strlen(Dis);i<16;i++) { GLCD_Putchar(' '); } GLCD_Gotoxy(0,2); GLCD_Puts((unsignedchar*)" "); GLCD_Gotoxy(0,3); GLCD_Puts((unsignedchar*)" "); GLCD_Gotoxy(0,4); GLCD_Puts((unsignedchar*)" "); } if(time_to_display>=10000)time_to_display=0; //Reset Status _Status=0; } }

void GLCD_Clear(void) {

GLCD_Send_Instruction(0x01);//Display clear

}

4. Đoạn chƣơng trình trong Timer

#include"../include/Main.h"

long time_to_send_pc=0,time_to_display=0;

void Timer2_Init_TM(void) {

68 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

//uint16_t PrescalerValue = 0;

/************************TIM2********************************/ /* TIM2 clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

///////////////

/* Enable the TIM2 global Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

/* Compute the prescaler value */

//PrescalerValue = (uint16_t) (SystemCoreClock / 12000000) - 1;

/* Time base configuration */

TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* Prescaler configuration */ //TIM_PrescalerConfig(TIM2, PrescalerValue, TIM_PSCReloadMode_Immediate);

/* TIM2 enable counter */

TIM_Cmd(TIM2, ENABLE);

TIM_ITConfig(TIM2, TIM_FLAG_Update, ENABLE); }

69 { time_to_send_pc++; time_to_display++; TIM_ClearFlag(TIM2,TIM_IT_Update); }

Một phần của tài liệu Nghiên cứu và chế tạo thiết bị đo bụi liên tục ứng dụng trong giám sát môi trường công nghiệp (Trang 42 - 71)

Tải bản đầy đủ (PDF)

(71 trang)