arduino + SSD1306OLED模块 + PYTHON OPENCV实现字模转换+实现COM串口通信实时显示

1,前期准备

  1. arduino mage2560开发板(随便什么arduino开发板都行)
  2. OLED显示屏
  3. 导线若干

2,引脚接线

arduino + SSD1306OLED模块 + PYTHON OPENCV实现字模转换+实现COM串口通信实时显示_第1张图片

  • VCC接3.3V
  • GND接GND
  • SCL接SCL
  • SDA接SDA

3,Arduino程序

我这块SSD1306模块是128*64分辨率,是0.96英寸,在编程之前需要安装Adafruit_SSD1306和Adafruit_GFX这两个库文件。

安装完后可以试试运行官方的示例文件,验证OLED是否接好,记住选择I2C示例程序
arduino + SSD1306OLED模块 + PYTHON OPENCV实现字模转换+实现COM串口通信实时显示_第2张图片
若不能点亮,试试将
在这里插入图片描述
此位置的地址改为0x3C或0x3D,若还不能点亮,那就是其他问题

arduino串口接收端主程序:

#include 
#include 
#include 
#include 

#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     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define imgbuffer 992


void setup() {
  Serial.begin(115200);
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    }
  display.clearDisplay();
  display.display();

}

void loop() {
  test_SSD1306();
}

void test_SSD1306(void){
  while (Serial.available() > 0){
          
          uint8_t logo1[1024] = {0};          
          Serial.readBytes(logo1,1024);
          //Serial.readBytesUntil(',',logo1,512);
          display.clearDisplay();
          display.drawBitmap(0,0,logo1,128,64,WHITE);
          display.display();
          Serial.flush();
                    
      }
}

4,Python程序

首先讲一下字模转换的方法(因为arduino通过字模显示图片)

arduino + SSD1306OLED模块 + PYTHON OPENCV实现字模转换+实现COM串口通信实时显示_第3张图片
比如我们要获取这个字的字模,我们先要设置他的分辨率,在这里设置的是16*16分辨率,而待会arduino上显示的是128*64分辨率

了解分辨率之后,接下来做的事就是了解这个字模的构成
我们都知道一个八位的二进制数可以储存8个0或1的状态,在字模中一个二进制就是一个像素点的亮或者暗,那么八位二进制就可以控制八个像素点,那么一个16*16的汉字就需要256个像素点来控制,也就是通过32个八位二进制或者是32个16进制来控制,在加上分辨率已知,像素值会从左往右从第一行到最后一行进行排列。
这就是字模

程序部分

import cv2
import numpy as np
from PIL import ImageGrab
import serial
import time

#获取屏幕
def capture(left, top, right, bottom):
    img = ImageGrab.grab(bbox=(left, top, right, bottom))
    img = cv2.cvtColor(np.array(img),cv2.COLOR_RGB2BGR)
    return img
#端口值设置为arduino端口
com = serial.Serial('COM4', 115200, timeout=1)
com.read()
while True:

	#获取整个屏幕,当然,如果你输入的是摄像头,或者是视频,那么输出到开发板上的就是摄像头和视频,
	img = capture(0, 0, 1920,1080)
	#这里我就不写了,毕竟只用更改一两行代码就能实现
     
    
    img = cv2.resize(img,(128,64)) #设置成OLED分辨率大小
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #下面获取二值图像后将其变为维度为1,元素为0或1的列表
    ret, mask = cv2.threshold(img,127, 255, cv2.THRESH_BINARY)
    mask2 = mask.flatten()
    mask2[mask2 == 255] = 1
    mask_str_list = []
    mask_str = ""
    #将列表转换转化为8位二进制,也就是16进制的字符串列表
    for i in range(len(mask2)):
        mask_str = mask_str + str(mask2[i])
        if (i + 1) % 8 == 0:
            mask_str_list.append(mask_str)
            mask_str = ""
	#将二进制转化为10进制
    list_dec = []
    for i in mask_str_list:
        list_dec.append(int(i, 2))
	#传入端口
    com.write(list_dec)
    #睡0.1s,传太快arduino会顶不住
    time.sleep(0.1)

    cv2.imshow("screen",img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

com.close()
cv2.destroyAllWindows()

效果展示

不知道为什么手机有频闪所以录制效果并不怎么好

看博客

老规矩BAD APPLE

专业团队

你可能感兴趣的:(哼哼啊啊啊啊啊)