bill_hong 发表于 2015-2-16 13:29:01

【评测】基于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

bill_hong 发表于 2015-2-16 13:59:29

word版:)

DAVID 发表于 2019-4-28 09:52:47

厉害

诺威 发表于 2019-5-7 17:09:01

66

MOKfcGBj 发表于 2020-8-1 15:34:57

厉害呀66666
页: [1]
查看完整版本: 【评测】基于UNO开发板的DGUS串口屏使用与评测