新聞中心

        EEPW首頁 > 光電顯示 > 業界動態 > 基于TOPWAY液晶屏的水質檢測儀設計

        基于TOPWAY液晶屏的水質檢測儀設計

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

        四、軟件設計

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

        1、驅動編寫

        根據協議內容,編寫寫16位數字變量的驅動


        /**

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

            idx += sizeof(uint32_t);


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

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

        }


        左推進寫曲線數據


        /**

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

        }


        跳轉頁面的驅動


        /**

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

        }


        設置時間的驅動


        /**

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

        }


        讀取時間的驅動


        /**

        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數據的程序

        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://下發數據

                    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去采集值,轉化為電壓之后,根據擬合后的公式直接轉換為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(&hadc150);  //等待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_valuevol);

              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_bufFILTER_N); //中值平均濾波

              printf("sensor log:ph %drn"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 = 0i<FILTER_Ni++)

            {

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

            }

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

            lcd_send_pv16(0x080002pv.te);//給LCD發送數據

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

            printf("sensor log:te %drn"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 = 0i<FILTER_Ni++)

            {

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

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

            }

            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左推進發送曲線

            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、LCE操作流程圖

        五、展示

        主界面

        水質曲線界面

        環境溫濕度曲線界面

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


        上一頁 1 2 下一頁

        關鍵詞: TOPWAY LCD 水質儀

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 哈巴河县| 高安市| 乌鲁木齐县| 宝坻区| 孟村| 海阳市| 永济市| 绍兴县| 宜春市| 鄂尔多斯市| 中超| 永嘉县| 马尔康县| 托里县| 天柱县| 双桥区| 荥经县| 宜丰县| 乐陵市| 开原市| 娱乐| 盐津县| 浮梁县| 富川| 康定县| 勃利县| 高雄市| 镇平县| 苏州市| 南充市| 克东县| 广宁县| 建昌县| 太湖县| 祁阳县| 盐亭县| 邯郸市| 靖江市| 灵宝市| 乐昌市| 龙门县|