0x00 OLED改电阻
将电阻R3拆掉焊接到到R1位置;R8两端用锡短接,dc,cs管脚接地;res管脚通过一个io去控制完成复位;复位方法先将RES管脚保持低电平200ms;然后将RES管脚操持高平完成复位操作,然后对OLED进行初始化操作;这样就可以用iic通信了,这样就可以用iic通信了;D0=SCL; D1=SDA
- 改电阻是最头疼的了,这电阻也太小了。
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()
上图
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)
最终效果