屏幕硬件
0.96寸 I2C IIC通信 128*64 OLED液晶屏模块
老版本的驱动是SSD1306
新版本的驱动是SSD1315
一、 ESP8266
开发工具:Mixly 2.0
实现功能:连接WiFi,屏幕显示IP
1. 硬件连线
2. 图形化开发
生成的代码
#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