原创 ESP32/ESP8266模块教程----OLED励志语录,自动换行

2024-10-27 03:15 264 3 3 分类: MCU/ 嵌入式 文集: ESP32
前言
平时做项目的时候,为了让项目显得更高级,可以调用励志语录让OLED屏幕显示出来,比如桌面摆件,挂件,副屏等,可以用的上
所以本期给大家分享一下ESP32/ESP8266,或者任何可以联网的单片机都可以使用,而且完全适配0.96寸OLED屏幕,不需要对屏幕进行复杂的编程

项目资源
(一)ESP32模块(各类联网的单片机)

(二)0.96寸OLED屏幕(SSD1306,4针脚IIC)

(三)励志语录API(适配0.96OLED自动换行)
示例:http://api.xemowo.top/api/yan/yan.php?oled=1

原理
(一)可联网芯片访问API网站,获取励志语录的API信息,励志语录API带有12000多条语录,可以避免短时间内重复出现相同的语录

(二)适配OLED屏幕
我们在代码里面,采用12的标准中文库,所以正好可以将屏幕分成4行,每行10个字,所以整块屏幕一次性可以显示40个字
所以在API内,首先选取40字内的语录,然后将每10个字分成一组
如图,one显示了10个字,然后剩下的就到two,以此类推,将语录分成几组
虽然整句话我们也可以在代码里面分组,但是这样大大加大了工作量,如果在API内分好了,在代码内只需要JSON解析一下即可

(三)JSON解析
API解析的内容都是JSON格式,所以需要在代码内将JSON解析出我们所需的内容
①首先加载自带的JSON解析库
②声明JSON内容的4个变量
③如果访问API成功
则StaticJsonDocument<500>doc       声明一个JsonDocument对象
String json = http.getString();             读取API信息
deserializeJson(doc, json);反序列化JSON数据
然后就可以将json数据保存到4个变量内

(四)OLED显示
对于SSD1306这个4针脚的OLED屏幕,我一般采用的U8G2库,这个库很好上手,且内置中文库,直接调用中文库,就可以显示中文(3000多常用)
然后声明IIC硬件的引脚,和U8G2的显示方向R0为正方向显示
设置中文字体,让U8G2开始工作
u8g2.setCursor (0, 55);  设置文字在屏幕的位置
u8g2.println(four);         设置显示的内容
u8g2.sendBuffer();       将内容上传到缓存区 
获取到API信息后,JSON解析后,将4段内容,放在OLED每一行上,每行的距离在15左右,可以根据自己的屏幕调整

(五)联网设置
对于不同芯片,不同代码平台,这部分可能不太一样,我就用ESP32来举例
采用2个库,一个是用于wifi的连接,另一个是用于http访问
设置wifi账号密码
http库要声明一下
SETUP部分一直循环连接WIFI,10秒刷新一次(不要太快,否则还没连上就刷新了)
连接成功后,设置URL地址(API地址)
LOOP部分一直访问API,每次结束延迟5S


项目代码
代码转载记得标注出处哦
下载地址:https://wwmg.lanzouj.com/itMSC28l2gqb
#include //wifi库
#include //json解析库
#include //http连接库
#include 

#include //u8g2oled库
#include 

#define BOARD_I2C_SCL   22
#define BOARD_I2C_SDA   21   
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ BOARD_I2C_SCL, /* data=*/ BOARD_I2C_SDA, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display

const char * ID = "XEMOWO_PC";//wifi账号
const char * PASSWORD = "1SUNjiajun";//wifi密码

const char*  one;//api第一行内容
const char*  two;//api第二行内容
const char*  three;//api第三行内容
const char*  four;//api第四行内容

String API = "";
String url_xinzhi = "";
String WeatherURL = "";


HTTPClient http;
String GitURL(String api)
{
  url_xinzhi =  "http://api.xemowo.top/api/yan/yan.php?oled=1";//oled=1则表示使用oled专属格式
  return url_xinzhi;
}



void ParseWeather(String url)
{  
  
  http.begin(url);
 
  int httpGet = http.GET();
  if(httpGet > 0)
  {
    Serial.printf("HTTPGET is %d",httpGet);
    
    if(httpGet == HTTP_CODE_OK)
    {
      StaticJsonDocument<500> doc;    
      

      String json = http.getString();
      Serial.println("解析");
      Serial.println(json);
        
      deserializeJson(doc, json);
     one = doc["one"]; // "人生就是一列开往坟墓"
     two = doc["two"]; // "的列车,路途上会有很"
     three = doc["three"]; // "多站,很难有人可以至"
     four = doc["four"]; // "始至终陪着走完。\n"
      
    }
    else
    {
      Serial.printf("ERROR1!!");
       ParseWeather(WeatherURL);
    }
  }
  else
  {
    Serial.printf("ERROR2!!");


     ParseWeather(WeatherURL);

  }
  http.end();
}






void setup() {
  // put your setup code here, to run once:
  u8g2.setFont( u8g2_font_wqy12_t_gb2312 );//设置为中文字体
  u8g2.begin();
  u8g2.enableUTF8Print();

  Serial.begin(115200);
  Serial.println("Init u8g2 ....");
  Serial.println("WiFi:");
  Serial.println(ID);
  Serial.println("PASSWORLD:");
  Serial.println(PASSWORD);


  WiFi.begin(ID,PASSWORD);

    u8g2.setCursor (0, 10);
    u8g2.println("连接wifi中");
    u8g2.sendBuffer();
    
  while(WiFi.status()!=WL_CONNECTED)
  {

    delay(10000);//延迟大一点,不然联网连不上!
    Serial.println("正在连接...");

    u8g2.setCursor (0, 10);
    u8g2.println("连接wifi中");
    u8g2.sendBuffer();
    
  }
 
  Serial.println("连接成功!");
  //==================wifi连接==================
  u8g2.clearBuffer();
  WeatherURL = GitURL(API); 
  



  delay(100);
}

void loop() {
    ParseWeather(WeatherURL);
    Serial.println(WeatherURL);
    u8g2.clearBuffer();//清平
    delay(10);
    
    u8g2.setCursor (0, 10);
    u8g2.println(one);

    u8g2.setCursor (0, 25);
    u8g2.println(two);

    u8g2.setCursor (0, 40);
    u8g2.println(three);

    u8g2.setCursor (0, 55);
    u8g2.println(four);   

    u8g2.sendBuffer();//将内容上传到缓存区


  
  delay(5000);
}


 

作者: 小恶魔owo, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-4067534.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条