这个实验主要是将HX711称重模块检测到的数据,通过单片机显示在3.5寸LCD屏幕上。
1.1 硬 件:
1.2 软 件:
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设计和命令测试。工具栏包含多种控件,方便用户快速开发和应用。
软件工具的模块有:
2.3 LCD屏幕显示温度实例
以温度page页面,显示温度变量为例。
TFTlcd.SetThermometerValue(page_Id,9,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 接线:
Uno I2C接线:
官方资料的Arduno Uno 与屏幕的接线不存在问题,UNO板子上面有引出对应的I2C通信接口,同时A4\A5引脚也可以用。
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的电源干扰
耗电量(含稳压电源电路):
工作电压范围:2.6~5.5V
工作温度范围:-20~+85℃
16管脚的SOP-16封装
3.3 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.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();
// }
}
参考资料