它是利用光學傳感器、離子選擇性傳感器對水質進行檢測,并将結果清晰展示在液晶屏幕上,可以通過觸摸屏幕操作和控制。該設備被廣泛的應用于地表水、工業污水、飲用水源水質監測、調查和篩選領域。其優點是操作簡便,顯示結果清晰直觀,除了實時的顯示,還可以形成記憶曲線,用于長期的跟蹤和研究。
本項目是基于Topway的7寸智能液晶顯示模塊(Smart LCD),型号HMT070ETD-1D
分辨率:1024x600接口:RS232 RJ45工作電壓:11V~26V工作溫度:-20°C ~ 70°C寬視角:是外形尺寸:185.9mm x 109.5mm x 25.4mm尺寸:7"視窗 :154.21mm x 85.92mm觸摸屏:CTP
一、項目需求分析:1. 采集數據(定時采集水體的PH值和溫度,以及環境的溫濕度)2. 顯示在屏幕上(将采集的值實時顯示在屏幕上)3. 曲線展示(以曲線的形式将一段時間内的變量值顯示在屏幕上)
二、項目流程1、屏幕内容設計1)一張背景圖作為顯示時間、日期和實時數據的主頁
2)2個圖标和2個坐标軸作為水質曲線頁面
3)2個圖标和2個坐标軸作為溫度和濕度的顯示頁面
4)使用TOPWAY SGTools工具創建工程
導入圖片和圖标
5)選擇字庫,菜單欄中的工具-字體設置中可以選擇合适的字庫
6)創建所有頁面
控件使用情況如下:
7)編輯圖标
調整控件可以使用工具欄中的對齊工具,可以拯救強迫症患者
8)添加變量并綁定編輯
根據實際使用情況新建變量,這裡隻使用了16位數字變量和曲線變量
在對應的控件屬性VP地址裡綁定對應的變量的地址,同時也可以修改顔色大小等。
9)添加觸摸鍵
10)使用TOPWAY的屏内RTC時鐘功能, 并使用"RTC鍵盤(PIP)”替代,讓開發設計更加便捷。
1) 編寫LCD 驅動程序
根據協議内容,編寫16位數字變量的動
/**brief LCD發送16位變量param adr:變量地址param dt:發送的變量return 無*/voidlcd_send_pv16(uint32_tadr,uint16_tdt){uint8_tsend_buf[32];uint8_tidx = 0;
send_buf[idx ] = 0xaa;send_buf[idx ] = 0x3d;adr = ntohl(adr);//大小端轉換memcpy((uint8_t*)&send_buf[idx], (uint8_t*)&adr, sizeof(uint32_t));idx = sizeof(uint32_t);
dt = ntohs(dt);//大小端轉換memcpy((uint8_t*)&send_buf[idx], (uint8_t*)&dt, 2);idx = 2;send_buf[idx ] = 0xcc;send_buf[idx ] = 0x33;send_buf[idx ] = 0xc3;send_buf[idx ] = 0x3c;send_data1(send_buf, idx);}
LCD左推進寫曲線數據
/**brief LCD左推進寫曲線數據param adr:變量地址param adr_curve:插入位置param dt:發送的變量return 無*/voidlcd_send_curve(uint32_tadr,uint16_tadr_curve,uint16_tdt){uint8_tsend_buf[64];uint8_tidx = 0;
send_buf[idx ] = 0xaa;send_buf[idx ] = 0x4e;adr = ntohl(adr);memcpy((uint8_t*)&send_buf[idx], (uint8_t*)&adr, sizeof(uint32_t));idx = sizeof(uint32_t);
adr_curve = ntohs(adr_curve);memcpy((uint8_t*)&send_buf[idx], (uint8_t*)&adr_curve, sizeof(uint16_t));idx = sizeof(uint16_t);
dt = ntohs(dt);memcpy((uint8_t*)&send_buf[idx], (uint8_t*)&dt, sizeof(uint16_t));idx = sizeof(uint16_t);
send_buf[idx ] = 0xcc;send_buf[idx ] = 0x33;send_buf[idx ] = 0xc3;send_buf[idx ] = 0x3c;send_data1(send_buf, idx);}
跳轉頁面的驅動
/**brief LCD跳轉頁面param page:頁面地址return 無*/voidlcd_send_page(uint16_tpage){uint8_tsend_buf[64];uint8_tidx = 0;
send_buf[idx ] = 0xaa;send_buf[idx ] = 0x70;page = ntohs(page);memcpy((uint8_t*)&send_buf[idx], (uint8_t*)&page, sizeof(uint16_t));idx = sizeof(uint16_t);send_buf[idx ] = 0xcc;send_buf[idx ] = 0x33;send_buf[idx ] = 0xc3;send_buf[idx ] = 0x3c;send_data1(send_buf, idx);}
設置時間的驅動
/**brief LCD設置時間param page 無return 無*/voidlcd_send_time(void){uint8_tsend_buf[64];uint8_tidx = 0;
send_buf[idx ] = 0xaa;send_buf[idx ] = 0x9c;
memcpy((uint8_t*)&send_buf[idx], (uint8_t*)&my_rtc, sizeof(MYRTC));idx = sizeof(MYRTC);
send_buf[idx ] = 0xcc;send_buf[idx ] = 0x33;send_buf[idx ] = 0xc3;send_buf[idx ] = 0x3c;send_data1(send_buf, idx);}
讀取時間的驅動
/**brief LCD讀取時間param page 無return 無*/voidlcd_read_time(void){uint8_tsend_buf[64];uint8_tidx = 0;
send_buf[idx ] = 0xaa;send_buf[idx ] = 0x9b;send_buf[idx ] = 0xcc;send_buf[idx ] = 0x33;send_buf[idx ] = 0xc3;send_buf[idx ] = 0x3c;send_data1(send_buf, idx);}
接收LCD數據的程序
voidlcd_pro(void){staticuint32_ttimer_lcd = 0;if (timer6 - timer_lcd<9)return;timer_lcd = timer6;if (lcd_rx.len<5)return;if (lcd_rx.rx_buff[0] != 0xaa){memset((uint8_t*)&lcd_rx.rx_buff, 0, lcd_rx.len);lcd_rx.len = 0;return;}else{switch (lcd_rx.rx_buff[1]){case0x79://觸摸lcd.page = lcd_rx.rx_buff[3];lcd.touch_id = lcd_rx.rx_buff[4];break;case0x77://下發數據if(lcd_rx.rx_buff[3] == 0x08){if(lcd_rx.rx_buff[5] == 0x0A)//年{my_rtc.year = lcd_rx.rx_buff[7];}elseif(lcd_rx.rx_buff[5] == 0x0C)//月{my_rtc.month = lcd_rx.rx_buff[7];}elseif(lcd_rx.rx_buff[5] == 0x0E)//日{my_rtc.day = lcd_rx.rx_buff[7];}elseif(lcd_rx.rx_buff[5] == 0x10)//時{my_rtc.hour = lcd_rx.rx_buff[7];}elseif(lcd_rx.rx_buff[5] == 0x12)//分{my_rtc.min = lcd_rx.rx_buff[7];}elseif(lcd_rx.rx_buff[5] == 0x14)//秒{my_rtc.sec = lcd_rx.rx_buff[7];}lcd_send_time();}break;case0x9B://讀取時間memcpy((uint8_t*)&my_rtc, (uint8_t*)&lcd_rx.rx_buff[2], sizeof(MYRTC));break;default:break;}memset((uint8_t*)&lcd_rx.rx_buff, 0, lcd_rx.len);lcd_rx.len = 0;}}
2) PH值采集
這裡用的傳感器是模拟信号,可以直接使用單片機的AD去采集值,轉化為電壓之後,根據拟合後的公式直接轉換為PH值,程序如下
voidph_pro(void){staticuint32_ttimer_ph = 0;uint16_tadc_value = 0;floatvol = 0.0;if (timer6 - timer_ph>PH_COLLECT_TIME){HAL_ADC_Start(&hadc1); //啟動ADC單次轉換HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC轉換完成if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)){adc_value = HAL_ADC_GetValue(&hadc1); //讀取ADC轉換數據vol = ((double)adc_value/4096)*3.3*2;//轉化為實際電壓值printf("sensor log:adc_value = %d, vol = %.2fV.\n", adc_value, vol);ph_buf[FILTER_N] = (uint16_t)((5.9647*vol 22.255)*10);//轉換為PH值for (i = 0; i <FILTER_N; i ){ph_buf[i] = ph_buf[i 1]; // 所有數據左移,低位仍掉}pv.ph = MedianFilter(ph_buf, FILTER_N); //中值平均濾波printf("sensor log:ph %d\r\n", pv.ph);}lcd_send_pv16(0x080000,pv.ph);//給LCD發送數據lcd_send_curve(0x060000,224,pv.ph);//給LCD左推進發送曲線timer_ph = PH_COLLECT_TIME;}}
3) 水溫數據采集
使用的是經典的DS18B20,單總線獲取溫度,程序如下
voidds18b20_pro(void){uint16_ti = 0;staticuint32_ttimer_ds18b20 = 0;if (timer6 - timer_ds18b20>DS_COLLECT_TIME){te_buf[FILTER_N] = DS18B20_Get_Temp();for (i = 0; i<FILTER_N; i ){te_buf[i] = te_buf[i 1]; // 所有數據左移,低位仍掉}pv.te = MedianFilter(te_buf, FILTER_N); //中值平均濾波lcd_send_pv16(0x080002, pv.te);//給LCD發送數據lcd_send_curve(0x0600e0,224,pv.te 100);//給LCD左推進發送曲線printf("sensor log:te %d\r\n", pv.te);timer_ds18b20 = DS_COLLECT_TIME;}
4) 環境溫度數據采集
使用的是國産的AHT10,IIC協議獲取溫濕度,程序如下
voidaht_pro(void){uint16_ti = 0;staticuint32_ttimer_aht = 0;if (timer6 - timer_aht>AHT_COLLECT_TIME){AHT10ReadData(&tem_buf[FILTER_N], &hum_buf[FILTER_N]);for (i = 0; i<FILTER_N; i ){hum_buf[i] = hum_buf[i 1]; // 所有數據左移,低位仍掉tem_buf[i] = tem_buf[i 1]; // 所有數據左移,低位仍掉}pv.tem = MedianFilter(tem_buf, FILTER_N); //中值平均濾波pv.hum = MedianFilter(hum_buf, FILTER_N); //中值平均濾波
printf("sensor log:tem %d\r\n", pv.tem);printf("sensor log:hum %d\r\n", pv.hum);
lcd_send_curve(0x0602a0,224,pv.tem 100);//給LCD左推進發送曲線lcd_send_curve(0x0601c0,224,pv.hum);//給LCD左推進發送曲線lcd_send_pv16(0x080004,pv.hum);//給LCD發送數據lcd_send_pv16(0x080006,pv.tem);//給LCD發送數據
timer_aht = AHT_COLLECT_TIME;}}
5) LCD操作流程圖
1) 主頁
2) 水質曲線界面
3) 環境溫濕度曲線界面
本項目用到的硬件:NUCLEO-G070RB及硬件擴展闆、PH溫度采集傳感器、Topway智能顯示模塊HMT070ETD-1D(串口屏);
開發工具及版本:TOPWAY SGTools V9.35、STM32CuBeMx V6.4.0 、KEILMDK V5.25、PhotoShop。
其中TOPWAY智能顯示屏HMT070ETD-1D讓工程師擺脫繁瑣的UI和觸摸屏編程,主機隻需要通過簡單的串口命令把數據傳輸到智能顯示屏,屏幕把顯示、接收用戶輸入等工作全部接管過來。編程,它具有如下産品特點:支持寬電壓供電工作;同時支持PC下載和U盤升級兩種模式;支持遠程協議通信控制,遠程顯示工程升級;支持電容屏支持多功能觸摸按鍵;支持Lua腳本多功能開發;使用SGTools工具便捷使得開發過程十分簡便。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!