12864屏与ESP8266应用笔记-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9978|回复: 3

12864屏与ESP8266应用笔记

[复制链接]
发表于 2018-12-11 00:18 | 显示全部楼层 |阅读模式
本帖最后由 bomb 于 2019-1-4 20:22 编辑

    花了好几天研究12864和8266,终于驯服了这几个模块,中间遇到了不少问题,特写下本文,一来备忘,二来抛砖引玉,有什么不足不对的地方还望坛友们批评建议。
1  0.96寸 IIC 12864 OLED显示屏模块
    手头这块oled12864主控芯片为SSD1306,IIC通讯,有四个引脚,分别是VCC电源,GND接地,SCL时钟和SDA信号。
1.1 oled12864与arduino
    arduino使用u8g2库的话驱动起来十分简单,arduino的A4和A5引脚分别对应SDA和SCL,只要接好对应引脚,随意打开u8g2的一个例程将U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
前的注释去掉,上传即可。(注:上传完毕后必须重启arduino才能显示)
1285803329.jpg
12864arduino.jpg

1.2 oled12864与ESP8266
    由于ESP8266可以使用arduino的IDE所以用法和uno无异,手头刚好有一块ESP8266-12,这次我改用Adafruit_ssd1306syp这个库(库文件见附件),该库是专为ssd1306写的,而且可以在代码处自定义SDA和SCL不用修改库文件,使用十分方便。(注:使用ESP8266-12一般不会用串口连12864,这样接只是我在试验串口能不能驱动12864)
iko.PNG

Untitled Sketch_bb.jpg


    8266-12管脚图如下   
781388-0c0dceae54c47a74.png

    当然ESP8266-01也能驱动12864,但是ESP8266-01只有2个IO管脚,分别是GPIO0和GPIO2,其中GPIO0用于下载不能使用,而驱动12864OLED使用IIC通讯的话需要至少两个管脚,SCL和SDA。    不过如果不使用串口通讯的话,我们可以利用RX和TX口,TX对应内部管脚GPIO1,RX对应内部管脚GPIO3;我们在和12864通讯的时候,可以直接使用这两个管脚,只需要把SCL定义为1,SDA定义为3即可。这里我花了一晚上才成功,犯了两个错误:一是忘记将CH_PD拉高结果8266不工作;二是连接的杜邦线质量差,信号不稳定,换了好几根才解决。
timg.jpg

    烧录ESP8266-01用的是某宝烂大街的8266转接器,烧录时GPIO0必须接地,但是这个转接器没有这个功能,所以我在两个引脚接口之间加了根铜丝做桥,再把8266插上去就能成功烧录了。
1054508481.jpg

连接图如下:
546492433.jpg
ESP8266_starter_bb.jpg

以下为示例代码:

[mw_shl_code=arduino,true]#include <Adafruit_ssd1306syp.h>
#define SDA_PIN 3
#define SCL_PIN 1
Adafruit_ssd1306syp display(SDA_PIN,SCL_PIN);
void setup()
{
  delay(1000);
  display.initialize();
}
void loop()
{
  display.drawLine(0, 0, 127, 63,WHITE);
  display.update();
  delay(1000);
  display.clear();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Hello, world!");
  display.setTextColor(BLACK, WHITE); // 'inverted' text
  display.println(5201314);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("0x"); display.println(0xFFFFFFFF, HEX);
  display.update();
  delay(2000);
  display.clear();
}[/mw_shl_code]

2  12864点阵 COB SPI模块

    除了上述OLED屏外,手头还有一块COB屏,13个引脚,带中文字库,不过目前只研究到普通的SPI方式驱动。
2.1 引脚判别
   当时需要这个尺寸的屏幕就买了,没想到店家不提供任何资料(说没有还说得理直气壮我也是无语了)一切只能自己摸索,从为数不多的信息得知,该模块的驱动IC是ST7565R。本以为SPI模式引脚都差不多,但是拿到这个模块我就犯迷糊了,一个CS,一个RS您俩哪个是片选啊。
444.jpg

    后来在网上查了些资料,才发现SPI引脚的命名那叫一个混乱,大致总结如下,大家感受一下。
名称 符号 功能
片选CS、RS 低电平有效
复位 RSE 低电平复位
数据/指令选择
A0、DC、RSH:数据,L:指令
时钟SCK、SCL、 D0、CLK、E 串行时钟信号
数据SDA、D1、SI、MOSI 、DATA、R\W 串行数据信号
电源正极VDD、VCC输入电源
电源负极 VSS、GND 电源地

    可以发现,RS即用来表示片选,也用来表示数据/命令选择,但是,CS一定是片选,以这个规律,我使用u8g2库,按以下对应接线
SCL—>clock
SI—>data
CS—>cs
RS—>dc
RSE—>reset
    如此接线后写入u8g2例程屏幕就能显示了。经我测试该模块使用
U8X8_ST7565_NHD_C12864_4W_SW_SPI u8x8(/* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
显示效果最好。
437097333.jpg


2.2 调整V0电压
    解决引脚问题后又遇到一个新问题,液晶显示很淡,一般12864对比度是通过调整V0引脚电压控制的,但SPI屏没有V0引脚,需要修改u8g2库里的参数。
    如果u8g2是通过arduino库管理器安装的话,打开路径C:\Users\administrator\Documents\Arduino\libraries\U8g2\src\clib就能找到对应的c语言文件。
    st7565对应的的是:u8x8_d_st7565.c。
    打开后找到对应的常数赋值,我上面用的是ST7565_NHD_C12864,所以找到
static const uint8_t u8x8_d_st7565_nhd_c12864_init_seq[],发现里面有一条代码
[mw_shl_code=c,true]U8X8_C(0x024),/* set V0 voltage resistor ratio to large*/[/mw_shl_code]
    这里可以设置V0,加大括号里的16进制数就能让屏幕颜色变浓。
159140679.jpg

    完整代码如下,还有很多可以设置的地方以后慢慢研究:
[mw_shl_code=c,true]static const uint8_t u8x8_d_st7565_nhd_c12864_init_seq[] = {
   
  U8X8_START_TRANSFER(),                     /* enable chip, delay is part of the transfer start */
  
  U8X8_C(0x0e2),                                    /* soft reset */
  U8X8_C(0x0ae),                                /* display off */
  U8X8_C(0x040),                                /* set display start line to 0 */
  
  U8X8_C(0x0a1),                                /* ADC set to reverse */
  U8X8_C(0x0c0),                                /* common output mode */
  // Flipmode
  //U8X8_C(0x0a0),                                /* ADC set to reverse */
  //U8X8_C(0x0c8),                                /* common output mode */
  
  U8X8_C(0x0a6),                                /* display normal, bit val 0: LCD pixel off. */
  U8X8_C(0x0a2),                                /* LCD bias 1/9 */
  U8X8_C(0x02f),                                /* all power  control circuits on */
  U8X8_CA(0x0f8, 0x000),                /* set booster ratio to 4x */
  U8X8_C(0x024),                                /* set V0 voltage resistor ratio to large调整对比度*/
  U8X8_CA(0x081, 180),                        /* set contrast, contrast value NHD C12864, see issue 186, increased contrast to 180 (issue 219) */
  
  U8X8_C(0x0ae),                                /* display off */
  U8X8_C(0x0a5),                                /* enter powersafe: all pixel on, issue 142 */
  
  U8X8_END_TRANSFER(),                     /* disable chip */
  U8X8_END()                                     /* end of sequence */
};[/mw_shl_code]












Adafruit_ssd1306syp.zip

10.45 KB, 下载次数: 137

SSD1306库

发表于 2019-4-16 21:49 | 显示全部楼层
楼主你好,问下Adafruit_ssd1306syp库可以显示中文吗?
发表于 2020-3-10 10:57 | 显示全部楼层

楼主你好,问下Adafruit_ssd1306syp库怎么不可以绘图呀】
 楼主| 发表于 2020-3-18 09:07 | 显示全部楼层
djnz 发表于 2020-3-10 10:57
楼主你好,问下Adafruit_ssd1306syp库怎么不可以绘图呀】

可以的,你打开Adafruit_GFX.h文件,里面都有定义
[mw_shl_code=arduino,true]    drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
    drawCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
      uint16_t color),
    fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color),
    fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername,
      int16_t delta, uint16_t color),
    drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
      int16_t x2, int16_t y2, uint16_t color),
    fillTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1,
      int16_t x2, int16_t y2, uint16_t color),
    drawRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
      int16_t radius, uint16_t color),
    fillRoundRect(int16_t x0, int16_t y0, int16_t w, int16_t h,
      int16_t radius, uint16_t color),
    drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap,
      int16_t w, int16_t h, uint16_t color),
    drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color,
      uint16_t bg, uint8_t size),
    setCursor(int16_t x, int16_t y),
    setTextColor(uint16_t c),
    setTextColor(uint16_t c, uint16_t bg),
    setTextSize(uint8_t s),
    setTextWrap(boolean w),
    setRotation(uint8_t r);[/mw_shl_code]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 06:42 , Processed in 0.082972 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表