OLED屏幕使用

mtain 2024年10月17日 160次浏览

屏幕硬件
0.96寸 I2C IIC通信 128*64 OLED液晶屏模块
老版本的驱动是SSD1306
新版本的驱动是SSD1315

一、 ESP8266

开发工具:Mixly 2.0
实现功能:连接WiFi,屏幕显示IP

1. 硬件连线

acf8d2406b312cbd2074d3514ee3bb0.jpg

2. 图形化开发

image.png

生成的代码


#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <U8g2lib.h>
#include <Wire.h>

 ESP8266WiFiMulti wifiMulti;
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);

void page1() {
  u8g2.setFont(u8g2_font_timR08_tf);
  u8g2.setFontPosTop();
  u8g2.setCursor(0,0);
  u8g2.print("IP:");
  u8g2.setCursor(12,0);
  u8g2.print(WiFi.localIP());
}

void setup(){
  WiFi.begin("xxx", "xxxxxx");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Local IP:");
  Serial.print(WiFi.localIP());

  Serial.println("Wait for Smartconfig");
wifiMulti.run();
WiFi.setAutoConnect(true);
if (WiFi.status() == WL_CONNECTED) {
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
 }
else{
 WiFi.mode(WIFI_STA);
 WiFi.beginSmartConfig();
 while(!WiFi.smartConfigDone()){
Serial.print(".");
delay(500);
}
Serial.println("SmartConfig Success");
Serial.printf("SSID:%s", WiFi.SSID().c_str());
Serial.printf("PSW:%s", WiFi.psk().c_str());
wifiMulti.addAP(WiFi.SSID().c_str(),WiFi.psk().c_str());
}

  Serial.begin(9600);
  Serial.write(WiFi.status());
  u8g2.setI2CAddress(0x3C*2);
  u8g2.begin();
  u8g2.enableUTF8Print();

}

void loop(){
  u8g2.firstPage();
  do
  {
    page1();
  }while(u8g2.nextPage());

}

二、香橙派

硬件:香橙派OrangePi_3_LTS_H6
实现功能:显示WiFi连接的IP地址

按官方文档一步步操作

1. 安装wiringOP

git clone https://github.com/orangepi-xunlong/wiringOP

cd wiringOP
sudo ./build clean
sudo ./build


# 查看引脚
gpio readall

2. 接线

sda 引脚 对应 3 号引脚
sck 引脚 对应 5 号引脚
vcc 引脚 对应 1 号引脚
gnd 引脚 对应 6 号引脚

3. 打开i2c0

在/boot/orangepiEnv.txt 中加入下面红色字体部分的配置,然后重启 Linux 系统就可以打开 i2c0。
orangepi@orangepi:~$ sudo vim /boot/orangepiEnv.txt
overlays=i2c0

4. 测试i2c

apt install -y i2c-tools

# 会输出屏幕地址,例如:3C
i2cdetect -y 0

5. C语言代码测试oled

git clone https://github.com/orangepi-xunlong/wiringOP
cd wiringOP
./build clean && ./build

cd examples
make oled_demo
./oled_demo /dev/i2c-0

在example目录下,新建oled_ip,并编译,实现屏幕显示IP

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>
#include "oled.h"
#include "font.h"

#define ETH_NAME        "wlan0"

int oled_show(struct display_info *disp) {
	int i;
	char buf[100];
    int sock;
    struct sockaddr_in sin;
    struct ifreq ifr;
    
    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock == -1)
    {
            perror("socket");
            return -1;                
    }
    
    strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);
    ifr.ifr_name[IFNAMSIZ - 1] = 0;
    
    if (ioctl(sock, SIOCGIFADDR, &ifr) < 0)
    {
            perror("ioctl");
            return -1;
    }

    memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
    fprintf(stdout, "wlan0: %s\n", inet_ntoa(sin.sin_addr));


	oled_putstrto(disp, 0, 9+1, inet_ntoa(sin.sin_addr));
    disp->font = font1;
    oled_send_buffer(disp);
	//oled_putpixel(disp, 60, 45);
	//oled_putstr(disp, 1, "hello");

return 0;
}

void show_error(int err, int add) {
	//const gchar* errmsg;
	//errmsg = g_strerror(errno);
	printf("\nERROR: %i, %i\n\n", err, add);
	//printf("\nERROR\n");
}

void show_usage(char *progname) {
	printf("\nUsage:\n%s <I2C bus device node >\n", progname);
}


int main(int argc, char **argv) {
	int e;
	char filename[32];
	struct display_info disp;

	if (argc < 2) {
		show_usage(argv[0]);
		
		return -1;
	}

	memset(&disp, 0, sizeof(disp));
	sprintf(filename, "%s", argv[1]);
	disp.address = OLED_I2C_ADDR;
	disp.font = font2;

	e = oled_open(&disp, filename);

	if (e < 0) {
		show_error(1, e);
	} else {
		e = oled_init(&disp);
	if (e < 0) {
		show_error(2, e);
	} else {
		printf("---------start--------\n");
		if (oled_show(&disp) < 0)
			show_error(3, 777);
			printf("----------end---------\n");
		}
	}
        
    return 0;
}

网上更为完美的代码: https://github.com/Temperature6/OPi4_RTDevInfo

参考文章:https://blog.csdn.net/weixin_54859557/article/details/142072253

6. 使用python实现

遇见报错:RuntimeError: Could not determine platform.
示例代码:https://github.com/adafruit/Adafruit_Python_SSD1306.git
参考文章:https://www.elecfans.com/d/1930430.html