【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块11

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验九十三:0.96寸I2C IIC通信128*64显示器 OLED液晶屏模块

在这里插入图片描述

知识点:OLED(OrganicLight-Emitting Diode)
又称为有机电激光显示、有机发光半导体(OrganicElectroluminesence Display,OLED)。OLED属于一种电流型的有机发光器件,是通过载流子的注入和复合而致发光的现象,发光强度与注入的电流成正比。OLED在电场的作用下,阳极产生的空穴和阴极产生的电子就会发生移动,分别向空穴传输层和电子传输层注入,迁移到发光层。当二者在发光层相遇时,产生能量激子,从而激发发光分子最终产生可见光。一般而言,OLED可按发光材料分为两种:小分子OLED和高分子OLED(也可称为PLED)。OLED是一种利用多层有机薄膜结构产生电致发光的器件,它很容易制作,而且只需要低的驱动电压,这些主要的特征使得OLED在满足平面显示器的应用上显得非常突出。OLED显示屏比LCD更轻薄、亮度高、功耗低、响应快、清晰度高、柔性好、发光效率高,能满足消费者对显示技术的新需求。全球越来越多的显示器厂家纷纷投入研发,大大的推动了OLED的产业化进程。

在这里插入图片描述
OLED特点
(1)功耗低——与LCD相比,OLED不需要背光源,而背光源在LCD中是比较耗能的一部分,所以OLED是比较节能的。例如,24in的AMOLED模块功耗仅仅为440mw,而24in的多晶硅LCD模块达到了605mw。
(2)响应速度快——OLED技术与其他技术相比,其响应速度快,响应时间可以达到微秒级别。较高的响应速度更好的实现了运动的图像。根据有关的数据分析,其响应速度达到了液晶显示器响应速度的1000倍左右。
(3)较宽的视角——与其他显示相比,由于OLED是主动发光的,所以在很大视角范围内画面是不会显示失真的。其上下,左右的视角宽度超过170度。
(4)能实现高分辨率显示——大多高分辨率的OLED显示采用的是有源矩阵也就是AMOLED,它的发光层可以是吸纳26万真彩色的高分辨率,并且随着科学技术的发展,其分辨率在以后会得到更高的提升。
(5)宽温度特性——与LCD相比,OLED可以在很大的温度范围内进行工作,根据有关的技术分析,温度在-40摄氏度到80摄氏度都是可以正常运行的。这样就可以降低地域限制,在极寒地带也可以正常使用。
(6)OLED能够实现软屏——OLED可以在塑料、树脂等不同的柔性衬底材料上进行生产,将有机层蒸镀或涂布在塑料基衬上,就可以实现软屏。
(7)OLED成品的质量比较轻——与其他产品相比,OLED的质量比较小,厚度与LCD相比是比较小的,其抗震系数较高,能够适应较大的加速度,振动等比较恶劣的环境。

在这里插入图片描述

Arduino实验接线示意图

在这里插入图片描述
在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验九十三: 0.96寸I2C IIC通信128*64显示器 OLED液晶屏模块
项目三十六:以单绘图模式绘制笛卡尔图

实验开源代码

/*【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)实验九十七: 0.96寸I2C IIC通信128*64显示器 OLED液晶屏模块项目三十六:以单绘图模式绘制笛卡尔图实验接线方法:oled模块    Ardunio UnoGND---------GND接地线VCC---------5V 接电源SDA---------A4SCL ------- A5
*/#include <Arduino.h>
#include <OLED_SSD1306_Chart.h>
#include <Adafruit_I2CDevice.h> //Include this to avoid compile errors in Platformio#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)#define BAUDRATE 9600#define SDA_PIN A4
#define SCL_PIN A5OLED_SSD1306_Chart display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);char actualThickness;void setup()
{// put your setup code here, to run once:
#if defined ESP8266Wire.begin(SDA_PIN, SCL_PIN);
#elseWire.begin();
#endifdisplay.begin(SSD1306_SWITCHCAPVCC, 0x3c);display.clearDisplay();display.setChartCoordinates(0, 60);      //Chart lower left coordinates (X, Y)display.setChartWidthAndHeight(123, 55); //Chart width = 123 and height = 60display.setXIncrement(5);                //Distance between Y points will be 5pxdisplay.setYLimits(50, 100);             //Ymin = 0 and Ymax = 100display.setYLimitLabels("50", "100");    //Setting Y axis labelsdisplay.setYLabelsVisible(true);display.setAxisDivisionsInc(12, 6);    //Each 12 px a division will be painted in X axis and each 6px in Y axisdisplay.setPlotMode(SINGLE_PLOT_MODE); //Set single plot mode// display.setPointGeometry(POINT_GEOMETRY_CIRCLE);actualThickness = NORMAL_LINE;display.setLineThickness(actualThickness);display.drawChart(); //Update the buffer to draw the cartesian chartdisplay.display();
}void loop()
{// put your main code here, to run repeatedly:auto value = random(50) + 50;if (!display.updateChart(value)) //Value between Ymin and Ymax will be added to chart{display.clearDisplay(); //If chart is full, it is drawn againif (actualThickness == NORMAL_LINE){actualThickness = LIGHT_LINE;}else if (actualThickness == LIGHT_LINE){actualThickness = NORMAL_LINE;}display.setLineThickness(actualThickness);display.drawChart();}delay(100);
}

Arduino实验场景图

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验九十三: 0.96寸I2C IIC通信128*64显示器 OLED液晶屏模块
项目三十七:双绘图模式绘制笛卡尔图表

实验开源代码

/*【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)实验九十七: 0.96寸I2C IIC通信128*64显示器 OLED液晶屏模块项目三十七:双绘图模式绘制笛卡尔图表实验接线方法:oled模块    Ardunio UnoGND---------GND接地线VCC---------5V 接电源SDA---------A4SCL ------- A5
*/#include <Arduino.h>
#include <OLED_SSD1306_Chart.h>
#include <Adafruit_I2CDevice.h>#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)#define BAUDRATE 9600#define SDA_PIN A4
#define SCL_PIN A5OLED_SSD1306_Chart display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);bool mid_line_visible = false;void setup()
{
// put your setup code here, to run once:
#if defined ESP8266Wire.begin(SDA_PIN, SCL_PIN);
#elseWire.begin();
#endifdisplay.begin(SSD1306_SWITCHCAPVCC, 0x3c);display.clearDisplay();display.setChartCoordinates(0, 60);      //Chart lower left coordinates (X, Y)display.setChartWidthAndHeight(123, 60); //Chart width = 123 and height = 60display.setXIncrement(5);                //Distance between Y points will be 5pxdisplay.setYLimits(0, 100);              //Ymin = 0 and Ymax = 100 for first chartdisplay.setYLimits(0, 100, 1);           //Ymin = 0 and Ymax = 100 for second chartdisplay.setYLimitLabels("0", "100");display.setYLimitLabels("0", "100", 1);display.setAxisDivisionsInc(12, 6); //Each 12 px a division will be painted in X axis and each 6px in Y axisdisplay.setYLabelsVisible(true);display.setPlotMode(DOUBLE_PLOT_MODE); //Set double plot modedisplay.setMidLineVisible(mid_line_visible);display.setLineThickness(LIGHT_LINE);display.setLineThickness(NORMAL_LINE, 1);display.drawChart(); //Update the buffer to draw the cartesian chartdisplay.display();
}void loop()
{// put your main code here, to run repeatedly:auto value0 = random(100);auto value1 = random(100);if (!display.updateChart(value0, value1)) //Value between Ymin and Ymax will be added to chart{display.clearDisplay(); //If chart is full, it is drawn againmid_line_visible = !mid_line_visible;display.setMidLineVisible(mid_line_visible);display.drawChart();}delay(100);
}

Arduino实验场景图

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
实验九十三: 0.96寸I2C IIC通信128*64显示器 OLED液晶屏模块
项目三十八:使用 BitBang_I2C 库扫描和识别 I2C 总线上的设备

实验开源代码

/*【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)实验九十七: 0.96寸I2C IIC通信128*64显示器 OLED液晶屏模块项目三十八:使用 BitBang_I2C 库扫描和识别 I2C 总线上的设备实验接线方法:oled模块    Ardunio UnoGND---------GND接地线VCC---------5V 接电源SDA---------A4SCL ------- A5
*///使用Bit Bang I2C 库。你可以在这里找到它:
// https://github.com/bitbank2/BitBang_I2C
#include <BitBang_I2C.h>// Arbitrary pins I used for testing with an ATmega328p
// Define as -1, -1 to use the Wire library over the default I2C interface
#define SDA_PIN A4
#define SCL_PIN A5
// M5Stack Atom Grove connector pin assignments
//#define SDA_PIN 32 
//#define SCL_PIN 26
// M5Stack Atom internal I2C connected to the IMU
//#define SDA_PIN 25
//#define SCL_PIN 21
// M5Stack Core2 internal I2C
//#define SDA_PIN 21
//#define SCL_PIN 22
//
// If you don't need the explicit device names displayed, disable this code by
// commenting out the next line
//
#define SHOW_NAME
#ifdef SHOW_NAME
const char *szNames[]  = {"Unknown","SSD1306","SH1106","VL53L0X","BMP180", "BMP280","BME280","MPU-60x0", "MPU-9250", "MCP9808","LSM6DS3", "ADXL345", "ADS1115","MAX44009","MAG3110", "CCS811", "HTS221", "LPS25H", "LSM9DS1","LM8330", "DS3231", "LIS3DH","LIS3DSH","INA219","SHT3X","HDC1080","MPU6886","BME680", "AXP202", "AXP192", "24AA02XEXX", "DS1307", "MPU688X", "FT6236G", "FT6336G", "FT6336U", "FT6436", "BM8563"};
#endifBBI2C bbi2c;void setup() {Serial.begin(115200);memset(&bbi2c, 0, sizeof(bbi2c));bbi2c.bWire = 0; // use bit bang, not wire librarybbi2c.iSDA = SDA_PIN;bbi2c.iSCL = SCL_PIN;I2CInit(&bbi2c, 100000L);delay(100); // allow devices to power up
}void loop() {
uint8_t map[16];
uint8_t i;
int iDevice, iCount;Serial.println("开始I2C扫描");I2CScan(&bbi2c, map); // get bitmap of connected I2C devicesif (map[0] == 0xfe) // something is wrong with the I2C bus{Serial.println("I2C 引脚不正确或总线被坏设备拉低;无法运行扫描");}else{iCount = 0;for (i=1; i<128; i++) // skip address 0 (general call address) since more than 1 device can respond{if (map[i>>3] & (1 << (i & 7))) // device found{iCount++;Serial.print("设备找到 在0x");Serial.print(i, HEX);iDevice = I2CDiscoverDevice(&bbi2c, i);Serial.print(", 类型 = ");#ifdef SHOW_NAMESerial.println(szNames[iDevice]); // show the device name as a string#elseSerial.println(iDevice); // show the device name as the enum index#endif}} // for iSerial.print(iCount, DEC);Serial.println("个,找到设备!");}delay(5000);
}

实验串口返回情况

在这里插入图片描述

BitBang_I2C库
https://github.com/bitbank2/BitBang_I2C
这段代码的目的是提供一个简单的 C 库,它可以在任何系统上的任何 2 个 GPIO 引脚上对 I2C 协议进行 bit-bang。除了标准 GPIO 功能之外,I2C 协议不需要引脚的任何特殊功能。写它的原因是为了轻松访问各种不一定公开 I2C 接口的微控制器上的 I2C 设备。这在包括 AVR、ESP32 和 nRF5 微控制器在内的各种项目中都派上用场。

引脚访问函数可以是本机版本的封装函数(例如在 nRF5 SDK 上) 在 AVR 微控制器上,digitalWrite/digitalRead/pinMode 函数有点慢,因为它们根据表检查引脚编号并执行其他任务。该库包含加快速度的逻辑。通过将引脚编号指定为端口名称 + 位,库将在 AVR 微控制器上运行得更快。例如,在 Arduino Uno (ATmega328P) 上,I/O 引脚 9 实际上是 I/O 端口 B,位 1。要使用直接引脚方法,您可以将引脚编号指定为0xB1。在 ATtiny85 上,这是唯一支持的引脚编号,因此不会链接到 Wire 库(以节省 FLASH 空间)。

这个最新版本允许您将此库用于位爆炸 I2C 或间接使用 Wire 库。由于每个 BBI2C 对象都是独立的,因此您可以拥有任意数量的总线,在 bit-bang 和硬件 I2C 的任意组合上运行。

用法:
首先使用 SDA/SCL 所需的引脚编号以及所需的时钟频率初始化 BBI2C 结构。bWire 标志告诉库在设置为 true 时使用硬件 I2C。如果使用硬件 I2C(线库),可以将引脚编号设置0xff为使用默认 I2C 引脚或支持多个 I2C 总线的系统上的特定引脚。400Khz 以上的频率是可能的,但不一定准确。幸运的是,I2C 设备并不真正关心确切的时钟频率,只关心信号在给定周期内是稳定的。

例如:

<p>BBI2C bbi2c;</p><p>bbi2c.bWire = 0 ; //使用位敲击</p><p>bbi2c.iSDA = 10 ; // GPIO 引脚 10 上的 SDA </p><p>bbi2c.iSCL = 11 ; // GPIO 引脚 11 上的 SCL </p><p>I2CInit (&bbi2c, 100000 ); // SDA=pin 10, SCL=pin 11, 100K 时钟</p>

与其公开启动和停止 I2C 事务的函数,我决定通过提供隐藏 I2C 协议细节的复合函数来简化它。为了扫描设备的 I2C 总线,我提供了 I2CScan() 函数,该函数返回一个位图(16 字节 x 8 位),其中为它找到的每个设备设置了一个位。像这样调用它:

unsigned char ucMap[16];
I2CScan(&bbi2c, ucMap);

要检测单个地址是否处于活动状态,请使用

I2CTest(addr)

要识别设备,请使用

I2CDiscoverDevice(uint8_t iAddress)

要对 I2C 设备读取和写入数据,请使用以下函数:

<p>I2CRead (&bbi2c, uint8_t u8Address, uint8_t *pu8Data, int iLength);</p><p>I2CReadRegister (&bbi2c, uint8_t iAddr, uint8_t u8Register, uint8_t *pData, int iLen);</p><p>I2CWrite (&bbi2c, uint8_t iAddr, uint8_t *pData, int iLen);</p>

目前有 29 台设备被发现功能识别:

SSD1306
SH1106
VL53L0X
BMP180
BMP280
BME280
BME680
MPU6000
MPU9250
MCP9808
LSM6DS3
ADXL345
ADS1115
MAX44009
MAG3110
CCS811
HTS221
LPS25H
LSM9DS1
LM8330
DS3231
DS1307
LIS3DH
LIS3DSH
INA219
SHT3X
HDC1080
AXP192
AXP202
24AAXXXE64

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/9588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django模板语法和请求

1、在django关于模板文件加载顺序 创建的django项目下会有一个seeetings.py的文件 如果在seeetings.py 中加了 os.path.join(BASE_DIR,‘templates’)&#xff0c;如果是pycharm创建的django项目会加上&#xff0c;就会默认先去根目录找templates目录下的html文件&#xff0c…

安全学习DAY06_抓包技术-HTTPHTTPS

抓包技术-HTTP&HTTPS HTTP&HTTPS抓包针对Web&APP&小程序&PC应用等 本节目的&#xff1a; 掌握几种抓包工具证书安装操作掌握几种HTTP&HTTPS抓包工具的使用学会Web&#xff0c;APP&#xff0c;小程序&#xff0c;PC应用等抓包了解本节课抓包是针对哪些…

EAP设备自动化控制系统在设备数采和控制方面的优势

随着科技的不断进步和工业自动化的发展&#xff0c;EAP&#xff08;Equipment Automation Program&#xff09;设备自动化控制系统在各个行业中扮演着越来越重要的角色。作为连接MES&#xff08;Manufacturing Execution System&#xff09;和设备层的沟通桥梁&#xff0c;EAP系…

Chatgpt Web API 创建对话,免费,不计token数量,模仿网页提交对话

Chatgpt API 是收费的&#xff0c;按token使用量计费 Chatgpt Web API 免费的&#xff0c;只要有账号就可以使用。 curl https://chat.openai.com/backend-api/conversation \-H authority: chat.openai.com \-H accept: text/event-stream \-H accept-language: zh-CN,zh;q…

了解Unity编辑器之组件篇Mesh(三)

Mesh&#xff1a;是一种三维模型的表示形式&#xff0c;它由一系列顶点、三角形&#xff08;或其他多边形&#xff09;和相关属性组成。Mesh用于表示物体的外观和形状&#xff0c;它是可见物体的基本组成部分。通过操作Mesh&#xff0c;开发者可以实现各种视觉效果、物理模拟和…

Swagger如何将接口分组?

如果不分组管理端和用户端是混在一起的&#xff0c;不好查看。 在 docket创建的时候&#xff0c;加一行分组代码。 .groupName("用户端接口") 如果你加完之后&#xff0c;重启&#xff0c;报错。 这应该是你访问的网址仍是旧网址。 http://localhost:8080/doc.html#…

MySQL高可用之MHA集群

目录 一、MHA概述 1.1 什么是 MHA 1.2 MHA 的组成 1.3 MHA 的特点 二、MySQL MHA搭建准备 2.1 实验思路 2.2 实验准备 MHA一主两从高可用集群示意图&#xff1a; 三、搭建 MySQL MHA 3.1 配置主从复制 1、四台服务器都关闭防火墙 2、修改 Master、Slave1、Slave2 节…

汇编语言(第4版)实验7 寻址方式在结构化数据访问中的应用

参考答案&#xff1a; ①经分析&#xff0c;完整程序代码如下。 assume cs:codesg data segmentdb 1975,1976,1977,1978,1979,1980,1981,1982,1983db 1984,1985,1986,1987,1988,1989,1990,1991,1992db 1993,1994,1995dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140…

微服务笔记---Nacos集群搭建

微服务笔记---Nacos集群搭建 Nacos集群搭建1.集群结构图2.搭建集群2.1.初始化数据库2.2.下载nacos2.3.配置Nacos2.4.启动2.5.nginx反向代理2.6.优化 Nacos集群搭建 1.集群结构图 官方给出的Nacos集群图&#xff1a; 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理…

Clion开发STM32之W5500系列(DNS服务封装)

概述 在w5500基础库中进行封装&#xff0c;通过域名的方式获取实际的ip地址用于动态获取ntp的ip地址 DNS封装 头文件 /*******************************************************************************Copyright (c) [scl]。保留所有权利。****************************…

7.26作业

用fread和fwrite实现文件拷贝 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<head.h> int main(int argc, const char *argv[]) {FILE* fpfopen("./11.txt","w");FILE* fp1fopen("./12.txt",&quo…

idea的Plugins中搜索不到插件

1、ctrlalts 打开设置 ; 2、搜索框输入plugins; 3、点击plugins; 4、点齿轮按钮&#xff0c;选择HTTP Proxy settings; 如下操作&#xff1a; 5、刷新DNS&#xff0c;ipconfig /flushdns 6、重新打开idea 的plugins 插件列表出来了

无涯教程-jQuery - jQuery.ajax( options )方法函数

jQuery.ajax(options)方法使用HTTP请求加载远程页面。 $.ajax()返回它创建的XMLHttpRequest。在大多数情况下&#xff0c;您不需要该对象直接进行操作&#xff0c;但是如果您需要手动中止请求&#xff0c;则可以使用该对象。 jQuery.ajax( options ) - 语法 $.ajax( options…

51单片机--LCD1602

LCD1602的介绍 LCD1602是一种字符型液晶显示模块&#xff0c;通常用于嵌入式系统、单片机等领域。它由LCD&#xff08;液晶显示屏&#xff09;、HD44780控制驱动主电路及其扩展驱动电路、少量电阻、电容元件等组成。 LCD1602具有以下特点和功能&#xff1a; 显示能力&#xf…

面试总结-Redis篇章(八)——Redis分布式锁

JAVA 面试总结-Redis分布式锁 模拟抢券场景 通过下面方法添加Synchronized锁来防止上述情况&#xff0c;如果上面是单体服务没有问题&#xff0c;但是如果项目是集群部署&#xff0c;会出现下面的问题&#xff0c;因为Synchronized是属于本地的锁端口8080和8081同时访问&#x…

Qt 第二讲 登录框完善,登录成功后,进入新的界面;新建工程文件,默认提供的代码注释信息;前两讲思维导图

一&#xff0c;代码完善 头文件 #ifndef ZUOYE_H #define ZUOYE_H#include <QWidget> #include <QDebug> #include <QIcon> #include <QPushButton> #include <QLineEdit> #include <QLabel> //#include <QTextToSpeech>QT_BEGIN_…

⛳ 面向对象面试题

面向对象面试题目录 ⛳ 面向对象面试题&#x1f69c; 一&#xff0c;成员变量&#xff0c;局部变量&#xff0c;类变量存储在内存的什么地方&#xff1f;&#x1f43e; 1.1&#xff0c;类变量&#xff08;静态成员变量&#xff09;&#x1f4dd; 1.2&#xff0c;成员变量⭐ 1.3…

网络安全进阶学习第七课——文件包含漏洞

文章目录 一、文件包含概念二、文件包含漏洞原理三、文件包含分类文件包含分为两种&#xff1a; 四、与文件包含相关的配置文件&#xff1a;&#xff08;php.ini文件&#xff09;五、与文件包含有关的函数1、include()2、include_once()3、require()4、require_once() 六、文件…

iTOP-STM32MP157开发板Linux Misc驱动-编译驱动程序

这里我们以 stm32mp157 开发板为例&#xff0c;将杂项设备驱动编译成模块&#xff0c;请参考本手册第三十七章 Linux 内核模块。我们将 misc.c 文件拷贝到 Ubuntu 的/home/nfs/03 目录下。将上次编译 helloworld 的 Makefile 文 件拷贝到 misc.c 同级目录下&#xff0c;修改 …

解决Unable to load authentication plugin ‘caching_sha2_password‘

连接Mysql8时报错&#xff1a; java.sql.SQLException: Unable to load authentication plugin caching_sha2_password.原因 不同版本的认证插件不同造成的 8版本前是&#xff1a;default_authentication_pluginmysql_native_password 8版本后是&#xff1a;default_authenti…