1. 程式人生 > >esp8266+oled (ssd1306)驅動及顯示

esp8266+oled (ssd1306)驅動及顯示

0x00 OLED改電阻

將電阻R3拆掉焊接到到R1位置;R8兩端用錫短接,dc,cs管腳接地;res管腳通過一個io去控制完成復位;復位方法先將RES管腳保持低電平200ms;然後將RES管腳操持高平完成復位操作,然後對OLED進行初始化操作;這樣就可以用iic通訊了,這樣就可以用iic通訊了;D0=SCL; D1=SDA


img

  • 改電阻是最頭疼的了,這電阻也太小了。

0x01 ArduinoIDE

  • > 先需要esp8266的庫,才能驅動NodeMCU
  • > adafruit ssd1306 的庫
  • > ESP8266 and ESP32 oled drive
  • > 還有一個老外寫的沒啥用的庫acrobotic 1306

0x02 寫驅動

然後就看樣程寫驅動了,後臺值歷的c語言。


#include <Wire.h>
#include <ACROBOTIC_SSD1306.h>

String indate ="";
String val="";

void setup()
{
  Wire.begin(); 
  Serial.begin(115200);
  oled.init();                      // Initialze SSD1306 OLED display
  oled.clearDisplay();              // Clear screen
Serial.println("init seccess"); } void loop() { while(Serial.available()>0){ indate+=char(Serial.read()); delay(2); if(Serial.available()<=0){ Serial.println(indate); } } if(indate.length()>0){ val=indate; oled.clearDisplay(); Serial.println("display:"
+val); oled.setTextXY(2,0); oled.putString(val); } indate=""; }

python 的串列埠通訊

pip install pyserial
#!/usr/bin/env python
# coding:utf-8
import serial
import time

ser=serial.Serial("COM3",115200,timeout=1)

a=str.encode("mxhnb");
ser.write(a)
time.sleep(2)
ser.close()

上圖
img

0x03 顯示硬體資訊

替代工作管理員

下位機燒入的程式(對indate資訊進行解析,顯示)

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET LED_BUILTIN
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2

#define LOGO16_GLCD_HEIGHT 16 
#define LOGO16_GLCD_WIDTH  16 

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

String indate ="";
String val="";
//indate規定格式cpu?mem?time

//time規定格式%m%d%H%M

void setup(){
    Serial.begin(115200);
    // initialize with the I2C addr 0x3C (for the 128x64)

    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.clearDisplay();
    test();
}
void loop(){
    uint8_t color=WHITE;
    while(Serial.available()>0){
        indate+=char(Serial.read());
        delay(2);
        if(Serial.available()<=0){
            Serial.println(indate);
        }
    }
    if(indate.length()>0){
        val=indate;

        display.clearDisplay();
        Serial.println("display:"+val);


        int cpuP=(val.substring(0,1)-'0')*10+(val.substring(1,2)-'0');
        display.drawRect(1,1,100,20,color);
        display.fillRect(1,1,cpuP,20,color%2);
        display.setTextSize(2);
        display.setTextColor(color);
        display.setCursor(102,1);
        display.println(val.substring(0,2));
        //cpu

        int memP=(val.substring(3,4)-'0')*10+(val.substring(4,5)-'0');
        display.drawRect(1,25,100,20,color);
        display.fillRect(1,25,val.substring(3,5),20,color%2);
        display.setTextSize(2);
        display.setTextColor(color);
        display.setCursor(102,25);
        display.println(val.substring(3,5));
        //mem

        display.setTextSize(1);
        display.setTextColor(color);
        display.setCursor(1,47);
        display.println(val.substring(6));
        //time

        display.display();
        delay(200);
        //統一顯示

    }
    indate="";

}
void test(){
    display.drawPixel(10,20,WHITE);
    display.display();
    display.clearDisplay();
    delay(2000);
    display.drawRect(1,1,20,20,WHITE);
    display.display();
}
/*Content-Type: text/html
String stringOne = "Content-Type: text/html";
if (stringOne.substring(19) == "html") {
    Serial.println("It's an html file"); 
} 
if (stringOne.substring(14,18) == "text") {
    Serial.println("It's a text-based file"); 
}
display.write("a"); 寫字元
display.drawPixel 寫畫素
display.println("aaaa"); 寫字串
display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE);*/

上位機呼叫python的若干個庫

#!/usr/bin/env python
# coding:utf-8
import serial
import time
import psutil

ser=serial.Serial("COM3",115200,timeout=1)

def GetMemorystate():
    phymem=psutil.virtual_memory()
    string=int(int(phymem.used/1024/1024)/int(phymem.total/1024/1024)*100)
    string=str(string)
    return (string)

def GetCPUstate():
    cpuP=psutil.cpu_percent(0.2,False)
    cpuP='%02d'%(cpuP)
    return (cpuP)
def GetTime():
    string=time.strftime('%m%d %H:%M',time.localtime(time.time()))
    return (string)

while (1):
    aimsP=str(GetCPUstate()+'?'+GetMemorystate()+'?'+GetTime())
    print ('上位機輸出:',aimsP)
    aimsF=str.encode(aimsP)
    ser.write(aimsF)
    time.sleep(1)

最終效果
img