這個實驗主要是將HX711稱重模塊檢測到的數據,通過單片機顯示在3.5寸LCD屏幕上。
1. 準備工作
1.1 硬 件:
- Arduino x 1
- hx711 稱重傳感器 x 1
- 3.5寸LCD屏幕 x 1
1.2 軟 件:
- Arduino IDE(開發環境)
- VisualLcds (UI設計)
2 . vLcds組態屏
2.1 什麼是3.5寸vLcds HMI 組態屏?
官方資料下載
網盤資料下載 提取碼:qz6i
(資料文件夾中打開:vLCD_I2C_Package\說明文檔\vLcds I2C接口顯示屏入門指南)
人機界面(HMI)產品由硬件和軟件兩部分組成,硬件部分包括處理器、顯示單元、輸入單元、通訊接口、數道據存貯單元等,其中處理器的性能決定了HMI產品的性能高 低,是HMI的核心單元。根據HMI的產品等級不同,處理器可分別選用8位、16位、32位的處理器。
HMI軟件一般分爲兩部分,即運行於內HMI硬件中的 系統軟件和運行於PC機Windows操作系統下的畫面組態軟件。使用者都必須先使用HMI的畫面組態軟件製作“工容程文件 ”,再通過PC機和HMI 產品的串行通訊口,把編制好的“工程文件”下載到HMI的處理器中運行。
2.2 Visual Lcd Studio 介紹
Visual Lcd Studio 軟件是用於TFT顯示模塊UI設計的PC應用工具,適合和各種尺寸的LCD屏幕。分別支持URAT,SPI,I2C,RS485接口屏的UI設計和命令測試。工具欄包含多種控件,方便用戶快速開發和應用。
軟件工具的模塊有:
- 編輯欄:UI設計的編輯工具
- 工具欄: 各種控件工具
- 控件屬性:控件屬性的編輯欄
- 界面編輯: 界面編輯區域
- 頁面列表:編輯頁面列表
- 圖片列表:導入圖片的列表,用於UI設計(可以導入PS設計好的圖片)
- 編譯輸出:編譯工程的輸出窗口
2.3 LCD屏幕顯示溫度實例
以溫度page頁面,顯示溫度變量爲例。
- 新建組態屏項目設計UI ,注意ID設置
- 關鍵函數
TFTlcd.SetThermometerValue(page_Id,9,value);
- page_Id :屏幕頁面的 page_Id
- 9 : 控件_Id
- value : 溫度變量
2.4 關鍵代碼
else if(page_Id == Temperture_PAGE)
{
value =20;
for(i=0;i<=10;i+=1)
{
TFTlcd.SetThermometerValue(page_Id,9,value);
TFTlcd.SetNumberValue(page_Id,11,value-20);
value +=10;
delay(200);
}
value =120;
for(i=0;i<=10;i+=1)
{
TFTlcd.SetThermometerValue(page_Id,9,value);
TFTlcd.SetNumberValue(page_Id,11,value-20);
value -=10;
delay(200);
}
}
注意:以官方資料爲準。若出現按照官方資料中的示例設計屏幕UI、單片機源程序編譯\下載都沒有問題,屏幕仍然不能顯示傳感器數據的問題,試一試檢查線路連接的問題,說明單片機和屏幕通過I2C通信有問題。
補充:賣家的資料裏面關於I2C引腳接線出了問題,難怪我之前測試的時候,屏幕上老是顯示不了傳感器變量數據,原來是是因爲arduino 單片機 I2C接線出了問題,導致屏幕與單片機沒有進行通信。資料上面的接線如下:
Nano I2C 接線:
- A4 SDA (數據線)
- A5 SCL(時鐘線)
下面是官方資料上的錯誤接線:
Uno I2C接線:
- A4 SDA (數據線)
- A5 SCL(時鐘線)
官方資料的Arduno Uno 與屏幕的接線不存在問題,UNO板子上面有引出對應的I2C通信接口,同時A4\A5引腳也可以用。
3 . HX711模塊
3.1 HX711簡介
(HX711壓力傳感器模塊資料 提取碼:qjy4)
HX711是一款專爲高精度電子秤而設計的24位A/D轉換器芯片。與同類型其它芯片相比,該芯片集成了包括穩壓電源、片內時鐘振盪器等其它同類型芯片所需要的外圍電路,具有集成度高、響應速度快、抗干擾性強等優點。降低了電子秤的整機成本,提高了整機的性能和可靠性。該芯片與後端MCU芯片的接口和編程非常簡單,所有控制信號由管腳驅動,無需對芯片內部的寄存器編程。輸入選擇開關可任意選取通道A或通道B,與其內部的低噪聲可編程放大器相連。通道A的可編程增益爲128或64,對應的滿額度差分輸入信號幅值分別爲±20mV或±40mV。通道B則爲固定的32增益,用於系統參數檢測。芯片內提供的穩壓電源可以直接向外部傳感器和芯片內的A/D轉換器提供電源,系統板上無需另外的模擬電源。芯片內的時鐘振盪器不需要任何外接器件。上電自動復位功能簡化了開機的初始化過程。
3.2 HX711芯片特點
-
兩路可選擇差分輸入
-
片內低噪聲可編程放大器,可選增益爲64和128
-
片內穩壓電路可直接向外部傳感器和芯片內A/D轉換器提供電源
-
片內時鐘振盪器無需任何外接器件,必要時也可使用外接晶振或時鐘
-
上電自動復位電路
-
簡單的數字控制和串口通訊:所有控制由管腳輸入,芯片內寄存器無需編程
-
可選擇10Hz或80Hz的輸出數據速率
-
同步抑制50Hz和60Hz的電源干擾
-
耗電量(含穩壓電源電路):
- 典型工作電流:1.7mA
- 斷電電流:1μA
-
工作電壓範圍:2.6~5.5V
-
工作溫度範圍:-20~+85℃
-
16管腳的SOP-16封裝
3.3 HX711引腳及功能
3.4 HX711應用電路
HX711芯片應用於計價秤的一個參考電路圖。該方案使用內部時鐘振盪器(XI=0),10Hz的輸出數據速率(RATE=0)。電源(2.7~5.5V)直接取用與MCU芯片相同的供電電源。通道A與傳感器相連,通道B通過片外分壓電阻(未在圖一中顯示)與電池相連,用於檢測電池電壓。
3.5 關鍵代碼
//****************************************************
//讀取HX711
//****************************************************
unsigned long HX711_Read(void) //增益128
{
unsigned long count;
unsigned char i;
bool Flag = 0;
digitalWrite(HX711_DT, HIGH);
delayMicroseconds(1);
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
count=0;
while(digitalRead(HX711_DT)); //INPUT , AD轉換未結束則等待,否則開始讀取
for(i=0;i<24;i++)//24位
{
digitalWrite(HX711_SCK, HIGH); //發送脈衝
delayMicroseconds(1);
count=count<<1; //下降沿來時變量Count左移一位,右側補零
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
if(digitalRead(HX711_DT))
count++;
}
digitalWrite(HX711_SCK, HIGH);
count ^= 0x800000;//第25個脈衝下降沿來時,轉換數據
delayMicroseconds(1);
digitalWrite(HX711_SCK, LOW);
delayMicroseconds(1);
return(count);
}
4. 輕軌擁擠度顯示
4.1 框架圖
4.2 程序流程圖
4.3 關鍵代碼
void loop()
{
int i ;
unsigned int value_1;//定義value_1爲無符號整形
int value_2,value_3,value_4;
/********************************************************/
// Weight = Get_Weight(); //計算放在傳感器上的重物重量
// Serial.print(float(Weight/1000),3); //串口顯示重量
// Serial.print(" kg\n"); //顯示單位
// Serial.print("\n"); //顯示單位
// delay(1000); //延時1s
/********************************************************/
Weight = Get_Weight(); //計算放在傳感器上的重物重量
Serial.print("壓力重量:");
Serial.print(Weight); //顯示
Serial.print("\n"); //
// if(Weight <= 0)//設置數值範圍在0~1023,0~25之間
// { Weight = 0; }
// if(Weight >= 1023)
// { Weight = 25; }
// value_1 = random(0,25);
value_1 = map((int)Weight,0,1023,0,50);//將壓力傳感器0~1023的數值裝換至0~50
value_2 = random(52, 76);//random隨機函數,設置其他車廂的人數值爲52~76的隨機數
value_3 = random(77, 100);
value_4 = random(26, 51);
Serial.print("屏幕重量:");
Serial.print(value_1); //顯示
Serial.print("\n"); //
// Serial.println("ProcessMessage");
TFTlcd.SetPage(page_id_2);//page2爲常顯示頁面
TFTlcd.SetNumberValue(page_id_2,Num_id_1,value_1);//page2,NO.1,value1分別爲:頁面2的第一號車廂顯示value人數數值
TFTlcd.SetNumberValue(page_id_2,Num_id_2,value_2);
TFTlcd.SetNumberValue(page_id_2,Num_id_3,value_3);
TFTlcd.SetNumberValue(page_id_2,Num_id_4,value_4);
TFTlcd.SetBatteryValue(page_id_2,Bry_id_1,value_1);//NO.1
TFTlcd.SetBatteryValue(page_id_2,Bry_id_2,value_2+1);
TFTlcd.SetBatteryValue(page_id_2,Bry_id_3,value_3+1);
TFTlcd.SetBatteryValue(page_id_2,Bry_id_4,value_4+1);
delay(5000);
//
// data_size = TFTlcd.queue_find_cmd(cmd_buffer,CMD_MAX_SIZE);
//
// if(data_size>0)//receive command
// {
// Serial.println(data_size, HEX);
// Serial.println(F("ProcessMessage"));
// ProcessMessage((PCTRL_MSG)cmd_buffer, data_size);//command process
// }
//
// if(update_en)
// {
// Serial.println(F("UpdateUI"));
// update_en = 0;
// delay(100);
// UpdateUI();
// }
}
參考資料