新聞中心

        EEPW首頁 > 光電顯示 > 業(yè)界動態(tài) > 基于TOPWAY液晶屏的水質(zhì)檢測儀設(shè)計

        基于TOPWAY液晶屏的水質(zhì)檢測儀設(shè)計

        作者:shihengrui 時間:2022-04-13 來源:電子產(chǎn)品世界 收藏

        四、軟件設(shè)計

        本文引用地址:http://www.104case.com/article/202204/433019.htm

        1、驅(qū)動編寫

        根據(jù)協(xié)議內(nèi)容,編寫寫16位數(shù)字變量的驅(qū)動


        /**

        brief 發(fā)送16位變量

        param adr:變量地址

        param dt:發(fā)送的變量

        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);//大小端轉(zhuǎn)換

            memcpy((uint8_t*)&send_buf[idx], (uint8_t*)&adrsizeof(uint32_t));

            idx += sizeof(uint32_t);


            dt = ntohs(dt);//大小端轉(zhuǎn)換

            memcpy((uint8_t*)&send_buf[idx], (uint8_t*)&dt2);

            idx += 2;

            send_buf[idx++] = 0xcc;

            send_buf[idx++] = 0x33;

            send_buf[idx++] = 0xc3;

            send_buf[idx++] = 0x3c;

            send_data1(send_bufidx);

        }


        左推進寫曲線數(shù)據(jù)


        /**

        brief LCD左推進寫曲線數(shù)據(jù)

        param adr:變量地址

        param adr_curve:插入位置

        param dt:發(fā)送的變量

        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*)&adrsizeof(uint32_t));

            idx += sizeof(uint32_t);


            adr_curve = ntohs(adr_curve);

            memcpy((uint8_t*)&send_buf[idx], (uint8_t*)&adr_curvesizeof(uint16_t));

            idx += sizeof(uint16_t);


            dt = ntohs(dt);

            memcpy((uint8_t*)&send_buf[idx], (uint8_t*)&dtsizeof(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_bufidx);

        }


        跳轉(zhuǎn)頁面的驅(qū)動


        /**

        brief LCD跳轉(zhuǎn)頁面

        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*)&pagesizeof(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_bufidx);

        }


        設(shè)置時間的驅(qū)動


        /**

        brief LCD設(shè)置時間

        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_rtcsizeof(MYRTC));

            idx += sizeof(MYRTC);


            send_buf[idx++] = 0xcc;

            send_buf[idx++] = 0x33;

            send_buf[idx++] = 0xc3;

            send_buf[idx++] = 0x3c;

            send_data1(send_bufidx);

        }


        讀取時間的驅(qū)動


        /**

        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_bufidx);

        }


        接收LCD數(shù)據(jù)的程序

        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_buff0lcd_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://下發(fā)數(shù)據(jù)

                    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_buff0lcd_rx.len);

                lcd_rx.len = 0;

            }

        }


        2、PH值采集

        這里用的傳感器是模擬信號,可以直接使用單片機的AD去采集值,轉(zhuǎn)化為電壓之后,根據(jù)擬合后的公式直接轉(zhuǎn)換為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單次轉(zhuǎn)換

            HAL_ADC_PollForConversion(&hadc150);  //等待ADC轉(zhuǎn)換完成

            if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))

            {

              adc_value = HAL_ADC_GetValue(&hadc1);   //讀取ADC轉(zhuǎn)換數(shù)據(jù)

              vol = ((double)adc_value/4096)*3.3*2;//轉(zhuǎn)化為實際電壓值

              printf("sensor log:adc_value = %d, vol = %.2fV.n"adc_valuevol);

              ph_buf[FILTER_N] = (uint16_t)((5.9647*vol+22.255)*10);//轉(zhuǎn)換為PH值

              for (i = 0; i <FILTER_N; i++)

              {

                  ph_buf[i] = ph_buf[i + 1];   // 所有數(shù)據(jù)左移,低位仍掉

              }

              pv.ph = MedianFilter(ph_bufFILTER_N); //中值平均濾波

              printf("sensor log:ph %drn"pv.ph);

            }

            lcd_send_pv16(0x080000,pv.ph);//給LCD發(fā)送數(shù)據(jù)

            lcd_send_curve(0x060000,224,pv.ph);//給LCD左推進發(fā)送曲線

            timer_ph += PH_COLLECT_TIME;

          }

        }


        3、池水溫度值采集

        使用的是經(jīng)典的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 = 0i<FILTER_Ni++)

            {

                te_buf[i] = te_buf[i + 1];   // 所有數(shù)據(jù)左移,低位仍掉

            }

            pv.te = MedianFilter(te_bufFILTER_N); //中值平均濾波

            lcd_send_pv16(0x080002pv.te);//給LCD發(fā)送數(shù)據(jù)

            lcd_send_curve(0x0600e0,224,pv.te+100);//給LCD左推進發(fā)送曲線

            printf("sensor log:te %drn"pv.te);

            timer_ds18b20 += DS_COLLECT_TIME;

          }

        }

        4、環(huán)境溫濕度值采集

        使用的是國產(chǎn)的AHT10,IIC協(xié)議獲取溫濕度,程序如下

        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 = 0i<FILTER_Ni++)

            {

                hum_buf[i] = hum_buf[i + 1];   // 所有數(shù)據(jù)左移,低位仍掉

                tem_buf[i] = tem_buf[i + 1];   // 所有數(shù)據(jù)左移,低位仍掉

            }

            pv.tem = MedianFilter(tem_bufFILTER_N); //中值平均濾波

            pv.hum = MedianFilter(hum_bufFILTER_N); //中值平均濾波


            printf("sensor log:tem %drn"pv.tem);

            printf("sensor log:hum %drn"pv.hum);

           


            lcd_send_curve(0x0602a0,224,pv.tem+100);//給LCD左推進發(fā)送曲線

            lcd_send_curve(0x0601c0,224,pv.hum);//給LCD左推進發(fā)送曲線

           

            lcd_send_pv16(0x080004,pv.hum);//給LCD發(fā)送數(shù)據(jù)

            lcd_send_pv16(0x080006,pv.tem);//給LCD發(fā)送數(shù)據(jù)


            timer_aht += AHT_COLLECT_TIME;

          }

        }


        5、LCE操作流程圖

        五、展示

        主界面

        水質(zhì)曲線界面

        環(huán)境溫濕度曲線界面

        效果杠杠的,大屏高分辨率,操作簡單高效,真是一次完美的開發(fā)體驗?。?!


        上一頁 1 2 下一頁

        關(guān)鍵詞: TOPWAY LCD 水質(zhì)儀

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 略阳县| 图们市| 武汉市| 长子县| 乃东县| 荥阳市| 榕江县| 莒南县| 乌恰县| 遵化市| 穆棱市| 鄄城县| 龙川县| 隆昌县| 平顺县| 宁城县| 汾西县| 霍州市| 贵南县| 德阳市| 武汉市| 巴彦淖尔市| 庄浪县| 禄丰县| 灵宝市| 宁河县| 贺州市| 同江市| 都江堰市| 新竹市| 福安市| 巴马| 响水县| 弥渡县| 丹东市| 商河县| 布拖县| 桃园县| 景宁| 襄汾县| 静乐县|