1回答

2收藏

[原创] 【 钛极小龟】---II2C通讯(OLED屏)

物联网 物联网 4284 人阅读 | 1 人回复 | 2019-01-18

本帖最后由 独活草 于 2020-8-27 10:59 编辑

   今天先拿小龟的OLED显示屏来练手,参照钛极官网的教程,自己搭建工程,简单敲了几行代码:显示屏出字啦!so easy !


附上我的代码:
import java.io.IOException;
import tijos.framework.devicecenter.TiI2CMaster;
import tijos.framework.transducer.oled.TiOLED_UG2864;
import tijos.framework.util.Delay;

public class TiOLED_IIC_Test {
        public static void main(String[] args) {               
      String screen1 = "Hi, I am Mrs.Wang ";
      String screen2 = "I am a programmer of java";
      String screen3 = "I like TiJOS so much!";   
      try {
          // I2C主机总线资源分配,I2C PORT0
          TiI2CMaster i2cm0 = TiI2CMaster.open(0);
          // I2C主机总线资源与屏幕对象绑定,屏幕地址:0x3C
          TiOLED_UG2864 oled = new TiOLED_UG2864(i2cm0, 0x3C);   
          // 屏幕开启并清屏
          oled.turnOn();        
          oled.clear();
          // 通过屏幕循环打印
          while (true) {
              // 显示第1屏内容,等待2秒后清屏
              oled.output(screen1);
              Delay.msDelay(2000);
              oled.clear();
              // 显示第2屏内容,等待2秒后清屏
              oled.output(screen2);
              Delay.msDelay(2000);
              oled.clear();
              // 显示第3屏内容,等待2秒后清屏
              oled.output(screen3);
              Delay.msDelay(2000);
              oled.clear();
          }
      } catch (IOException e) {
          e.printStackTrace();
      }
        }
}
************************************************************************************************
不得不说,有了钛极详细的教程,应用起来很快。耐不住寂寞的我扒了下代码发现以下几点:
1:OLED 的IIC接口硬件电路:

OLED模块的核心控制器为SSD1306 芯片,其工作在IIC模式下, 端口”D/C#“ 作SA0,用于从地址选择;
参看上面电路图,”D/C#“ 接到了低电平; R/W#=0,为写入模式。


可以看出 SSD1306的从机地址为:(7个Bit) 011 1100 ,换成十六进制就是 ox3C
***************************************************************************************************

小龟电路板上有两处用到了IIC通讯,一处是光照强度传感器BH1750,另一处就是OLED;

说说 IIC 总线:
IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。
IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。



2:OLED屏的地址官方直接给出了是 0x3C , (应该是链接到IIC总线上的OLED设备地址;这个地址就固定了? 能否修改?)
3:若要OELD 显示中文,在小龟的代码里是否方便处理?
4:官方在 package tijos.framework.transducer.oled 包的 TiOLED_UG2864.java  OLED对象类中封装了两个方法用于显示 String 内容:     output(String text)  和   print(int lineId, int columnId, String text)
     
oled.output( ) 这个函数:默认屏显示的起始行号、列号都是0;
如果想自己定制显示内容的起始行号、列号,可以使用 oled.print( )这个函数。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
         * Output string text, <br>
         * position automatic movement
         *
         * @param text
         *            string text[IN]
         * @throws IOException
         */
        public void output(String text) throws IOException {        
                int matrixTotal = text.length();
                if (matrixTotal <= 0)
                        return;        
                int matrixIndex = 0;
                byte[][] dotMatrix = dotMatrixObj.convert(text);
                synchronized (i2cmObj) {
                        int lineId = currentLineId;
                        int columnId = currentColumnId;
                        while (matrixTotal-- > 0) {
                                oledWriteAsc16(lineId, columnId, dotMatrix[matrixIndex++]);
                                currentColumnId = columnId;
                                columnId++;
                                if (columnId >= 16) {
                                        columnId = 0;
                                        currentLineId = lineId;
                                        lineId++;
                                        if (lineId >= 4)
                                                lineId = 0;
                                }
                        }
                }
        }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
         * Print string text,<br>
         * position automatic movement,<br>
         * data that exceeds the length will be automatically deleted
         *
         * @param lineId
         *            line index[IN],range:0-3
         * @param columnId
         *            column index[IN],range:0-15
         * @param text
         *            string text[IN]
         * @throws IOException
         */
        public void print(int lineId, int columnId, String text) throws IOException {
                if (lineId < 0 || lineId > 3)
                        lineId = 3;
                if (columnId < 0 || columnId > 15)
                        columnId = 15;
                if (text.length() <= 0) {
                        synchronized (i2cmObj) {
                                currentColumnId = columnId;
                                currentLineId = lineId;
                        }
                        return;
                }
                int matrixLeft = 64 - (lineId * 16 + columnId);
                if (matrixLeft > text.length())
                        matrixLeft = text.length();
                int matrixIndex = 0;
                byte[][] dotMatrix = dotMatrixObj.convert(text);
                synchronized (i2cmObj) {
                        while (matrixLeft-- > 0) {
                                oledWriteAsc16(lineId, columnId, dotMatrix[matrixIndex++]);
                                currentColumnId = columnId;
                                columnId++;
                                if (columnId >= 16) {
                                        columnId = 0;
                                        currentLineId = lineId;
                                        lineId++;
                                        if (lineId >= 4)
                                                lineId = 0;
                                }
                        }
                }
        }

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
看样子想让屏显示汉字,就要改写这个 byte[][] convert( String text) 方法了,该方法在 tijos.framework.util.text.TiDotMatrix 这个类中定义,貌似官方未公布这个类的源码。。。。

顺便看下OLED类定义
public TiOLED_UG2864(TiI2CMaster i2c, int address) throws IOException {
                dotMatrixObj = new TiDotMatrix(TiDotMatrix.ASC16);
                oledAddress = address;
                currentLineId = 0;
                currentColumnId = 0;
                i2c.setWorkBaudrate(400);
                i2cmObj = i2c;
        }

官网在这个类中,写死了 IIC 通讯的波特率是400kbit/s默认屏显示的起开始行号、列号都是0。更多关于钛极IIC总线的使用可查参看 http://dev.tijos.net/docstore/tijos-development-guide/tijos.framework.devicecenter.TiI2CMaster/

好吧,今晚先研究到这,改天再研究下支持中文显示的方法。




















分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

请叫我冻冻

发表于 2021-1-24 13:57:44 | 只看该作者

楼主你好,我在使用钛极小龟的时候,连接设备显示连接不上,我按照图片里的提示操作也是连接不上,能否有办法解决?

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条