【评测】基于UNO开发板的DGUS串口屏使用与评测
大家好,我是萌萌哒的新人Bill。今天很高兴得为大家带来基于DFRobot的uno开发板的DUGS串口屏的评测。之前搜了一下,DFRobot貌似还没有关于触控屏方面的测试,这次的操作有点复杂,不过总体的难度其实不高,而且最后的效果还是不错的,大家有机会可以尝试一下。PS:如果这次大家觉得这篇评测前后的行文风格不一致,大家可以尽情去投诉Angelo,写惯了技术文档,要写一篇思路广、欢乐多的评测还真是难啊,大家多多包涵下。废话不多说,先上一段完成后的效果视频吧。http://player.youku.com/player.php/sid/XODkyNzI0MTA4/v.swf这里我一共写了两个页面,第一个页面显示温度,第二页面显示湿度,可以点击通过右下角的小图标来相互切换。温度页面有个曲线显示的功能,能够不断刷新当前的温度;湿度页面有个类似仪表盘的百分比显示功能。理论上效果还能做的更酷炫点,不过楼主不仅眼残、而且手残,在做一下午的美工,画了无数弯弯的直线后终于放弃了。嗯。。。反正我们数据符合比例就行了。。。
简单的介绍完了后,我们该展示怎么搭建这个项目吧,首先你需要如下的部件和工具
然后连接图如下配置
然后因为DGUS屏默认的串口通讯方式为RS232,而arduino的为TTL,所以你需要把下图中红色框中的引脚焊上才能正常通讯。
系统完成后的示意图如下(偷偷告诉大家一个小技巧,我搭建的时候连了BT/APC上的串口端口,这样TX、RX端还可以再连一个USB转串口来监听双方的通讯,来进行debug)
系统搭建完成后,我们首先配置DGUS上的程序。下面的网盘里有DGUS基本操作和软件,其中的DGUS配置软件视频教程大家可以重点看下1_新建工程及打开工程.wmv,2_图标库生成.wmv,3_基本触控.wmv,4_数据显示及录入修改.wmv,9_曲线显示.wmv,12_仪表盘.wmv,17_串口通信.wmv1.DGUS开发资料: 云盘链接: http://pan.baidu.com/s/1dD1mMel2.DGUS开发配套软件: 云盘链接 http://pan.baidu.com/s/1dD5pNLf3.视频教程: 云盘链接 http://pan.baidu.com/s/1kTwWhnh
这里我只是介绍下,如果配置我们这工程。首先你需要做好页面,这次做的比较简单的。我是网上随便搜点图图标,然后用windows自带的画图工具随便摆下大致就好了。然后第一张图的坐标和第二张的刻度表之所以看起来比较挫,是因为网上没有找到合适的。。。
画好图后,我们打开。选择共管理中的新建工程屏幕属性设置根据型号来定,这里的尺寸是480X272。然后我们点击欢迎使用回到初始界面,点击DGUS配置工具中的图片转换,选择Add来添加之前做好的页面图片,Images Conversion来转换图片,注意左上的Size内的分辨率应为480x272。然后把生成的图片文件重命名,第一页为0.bmp,第二页为1.bmp以此类推。图片转换完毕后点击加入图片。点击上方按钮设置好。如果采用不同波特率或者串口帧R3或者RA,代码的相对应部分也要进行修改根据DWIN的教学视频配置好6个控件。其中有难点的1、2、3、4号控件的配置图如下
最后,大家喜闻乐见的配置好的DGUS文件把test文件夹下内容复制到一张空microsd卡,然后插到DGUS屏上的sd卡槽上即可。接下来arduino上的代码。#include <DFRobotDGUSLcd.h>
#include <SHT1x.h>
// Specify data and clock connections and instantiate SHT1x object
#define dataPin10
#define clockPin 11
SHT1x sht1x(dataPin, clockPin);
DFRobotDGUSLcd cmdTemperature(WriteVal,0x0000); //the address of the variable that shows temperature in the LCD is 0x0000
DFRobotDGUSLcd cmdTemperatureFlow(WriteChannel,0x01); //use channel 0 to show the curve
DFRobotDGUSLcd cmdHumidity(WriteVal,0x0020); //the address of the variable that shows humidity in the LCD is 0x0020
DFRobotDGUSLcd cmdHumidityPanel(WriteVal,0x0010); //the address of the variable that shows humidity panel in the LCD is 0x0010
void setup()
{
pinMode(13, OUTPUT);
Serial.begin(115200);
cmdTemperature.begin(Serial);
}
void loop()
{
float temp_c;
float temp_f;
float humidity;
// Read values from the sensor
temp_c = sht1x.readTemperatureC();
temp_f = sht1x.readTemperatureF();
humidity = sht1x.readHumidity();
//write the serial stream
cmdTemperature.write(sht1x.readTemperatureC() *100);
cmdTemperatureFlow.write(0,temp_c *100);
cmdHumidity.write(humidity*100);
cmdHumidityPanel.write(humidity);
delay(500);
// Print the values to the serial port
Serial.print("Temperature: ");
Serial.print(temp_c, DEC);
Serial.print("C / ");
Serial.print(temp_f, DEC);
Serial.print("F. Humidity: ");
Serial.print(humidity);
Serial.println("%");
}以及我写的库文件DFRobotDGUSLcd.h和DFRobotDGUSLcd.cpp的代码,基本DGUS的串口5条指令都基本实现了,但更复杂的则有待于完善DFRobotDGUSLcd.h#ifndef _SERIAL_LCD__
#define _SERIAL_LCD__
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#define WriteReg 0x80
#define ReadReg0x81
#define WriteVal 0x82
#define ReadVal0x83
#define WriteChannel 0x84
class DFRobotDGUSLcd
{
private:
uint8_t R3;//frame head1
uint8_t RA; //frame head2
uint8_t cmdLength;//command length
uint8_t cmdType; //command Type 0x80-0x84 Write Control Register;Read Control Register;Write Variable;Read Variable&Write Channel
uint8_t address; //the address of the value to write or read for command 0x80-0x81
//the control byte for command 0x84--write channel
// each bit of address determines whether the corresponding channel is on or off
// eg.0x00 means all channel is off;0x11 means channel 0 and channel 1 is on
uint16_tdata; // data for command 0x80-0x83 to send
uint8_t cmdCRC;// not used
uint16_tchannel; // vector to store the data of 8 channels
Stream*_serial;
public:
DFRobotDGUSLcd():R3(0xFF),RA(0x00){} //default head is 0xFF 0x00
DFRobotDGUSLcd(unsigned int cmdType, unsigned int address):R3(0xFF),RA(0x00),cmdType(cmdType),address(address), _serial(&Serial){}
DFRobotDGUSLcd(uint8_t R3,uint8_t RA,uint8_t cmdType, uint8_t address, uint16_t data);
void begin(Stream &theSerial);
void write(unsigned int data);
void write(unsigned int channelNum, unsigned int data);
void sendCmd(void);
void sendCmd(unsigned int cmdType,unsigned address, unsigned data);
void setHead(unsigned int R3,unsigned int RA);
void setType(unsigned int cmdType);
void setData(unsigned int data);
void setAddress(unsigned int address);
void setChannelData(unsigned int channelNum, unsigned int data);
};
#endifDFRobotDGUSLcd.cpp#include "DFRobotDGUSLcd.h"
/*********************************************************************
Constructor
*********************************************************************/
DFRobotDGUSLcd::DFRobotDGUSLcd(uint8_t R3,uint8_t RA,uint8_t cmdType, uint8_t address, uint16_t data)
{
this->R3 = R3;
this->RA = RA;
this->cmdType = cmdType;
this->address = address;
this->data = data;
switch(cmdType)
{
case WriteReg:
case ReadReg:
case WriteChannel:
cmdLength = 4;
break;
case WriteVal:
case ReadVal:
cmdLength = 5;
break;
}
}
/*********************************************************************
Set the serial port, default port is _serial
*********************************************************************/
void DFRobotDGUSLcd::begin(Stream &theSerial)
{
_serial=&theSerial;
}
/*********************************************************************
Set the type of the command
#define WriteReg 0x80
#define ReadReg0x81
#define WriteVal 0x82
#define ReadVal0x83
#define WriteChannel 0x84
*********************************************************************/
void DFRobotDGUSLcd::setType(unsigned int cmdType)
{
this->cmdType = cmdType;
}
/*********************************************************************
Set the data to send for command
#define WriteReg 0x80
#define ReadReg0x81
#define WriteVal 0x82
#define ReadVal0x83
*********************************************************************/
void DFRobotDGUSLcd::setData(unsigned int data)
{
this->data = data &0xFFFF;
}
/*********************************************************************
Set the frame head of command
the value should be the same of the value in the LCD Config file
*********************************************************************/
void DFRobotDGUSLcd::setHead(unsigned int RA, unsigned int R3)
{
this->RA = RA;
this->R3 = R3;
}
/*********************************************************************
Set the address of the value to write or read for command 0x80-0x81
the control byte for command 0x84--write channel
each bit of address determines whether the corresponding channel is on or off
eg.0x00 means all channel is off;0x11 means channel 0 and channel 1 is on
*********************************************************************/
void DFRobotDGUSLcd::setAddress(unsigned int address)
{
this->address = address &0xFFFF;
}
/*********************************************************************
Set the data of the channels
*********************************************************************/
void DFRobotDGUSLcd::setChannelData(unsigned int channelNum, unsigned int data)
{
channel = data;
}
/*********************************************************************
Write and send the data
*********************************************************************/
void DFRobotDGUSLcd::write(unsigned int data)
{
setData(data);
sendCmd();
}
/*********************************************************************
Set the data of the corresponding Channel and send the serial flow
*********************************************************************/
void DFRobotDGUSLcd::write(unsigned int channelNum, unsigned int data)
{
setChannelData(0, data);
sendCmd();
}
/*********************************************************************
Set command through serial port1
*********************************************************************/
void DFRobotDGUSLcd::sendCmd(void)
{
uint8_t addressHigh;
uint8_t addressLow;
uint8_t dataHigh;
uint8_t dataLow;
unsigned int temp = address;
unsigned int channelNum = 0;
_serial->write(R3);
_serial->write(RA);
switch(cmdType)
{
case WriteReg:
case ReadReg:
cmdLength = 4;
break;
case WriteChannel:
cmdLength = 3;
while(temp != 0)
{
if(temp & 0x01 == 1)
cmdLength++;
temp = temp>>1;
}
if (cmdLength == 3)
cmdLength++;
break;
case WriteVal:
case ReadVal:
cmdLength = 5;
break;
}
_serial->write(cmdLength);
_serial->write(cmdType);
switch(cmdType)
{
case WriteReg:
case ReadReg:
_serial->write(address&0xFF);
addressHigh = address / 0x100;
addressLow= address % 0x100;
_serial->write(dataHigh);
_serial->write(dataLow);
break;
case WriteVal:
case ReadVal:
addressHigh = address / 0x100;
addressLow= address % 0x100;
dataHigh = data / 0x100;
dataLow= data % 0x100;
_serial->write(addressHigh);
_serial->write(addressLow);
_serial->write(dataHigh);
_serial->write(dataLow);
break;
case WriteChannel:
_serial->write(address);
temp = address;
if( temp == 0)
{
_serial->write(channel);
_serial->write(channel);
}
while(temp != 0)
{
if(temp & 0x01 == 1)
{
dataHigh = channel / 0x100;
dataLow = channel % 0x100;
_serial->write(dataHigh);
_serial->write(dataLow);
}
temp = temp>>1;
channelNum++;
}
break;
}
}
/*********************************************************************
Set command through serial port2
*********************************************************************/
void DFRobotDGUSLcd::sendCmd(unsigned int cmdType,unsigned address, unsigned data)
{
this->cmdType = cmdType;
this->address = address;
this->data = data;
sendCmd();
}最后,我们还需要使用温度传感器的库文件https://www.dfrobot.com.cn/images/upload/File/20141021121450ctcz4q.rar希望大家搭建顺利,有什么问题可以联系我。
最后,这里我其实只用了像串口屏发送指令的功能,实际上大家还可以来读取串口屏的反馈信息来进行交互,例如用串口屏来模拟手柄、控制其他传感器等等功能。大家有什么好想法也来讨论,886
word版:) 厉害 66 厉害呀66666
页:
[1]