热度 3
2024-10-27 03:15
265 次阅读|
0 个评论
前言 平时做项目的时候,为了让项目显得更高级,可以调用励志语录让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 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 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 ; // "人生就是一列开往坟墓" two = doc ; // "的列车,路途上会有很" three = doc ; // "多站,很难有人可以至" four = doc ; // "始至终陪着走完。\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: u8g 2. setFont ( u8g2_font_wqy12_t_gb2312 ); //设置为中文字体 u8g 2. begin (); u8g 2. enableUTF8Print (); Serial. begin ( 115200 ); Serial. println ( "Init u8g2 ...." ); Serial. println ( "WiFi:" ); Serial. println (ID); Serial. println ( "PASSWORLD:" ); Serial. println (PASSWORD); WiFi. begin (ID,PASSWORD); u8g 2. setCursor ( 0 , 10 ); u8g 2. println ( "连接wifi中" ); u8g 2. sendBuffer (); while (WiFi. status ()!=WL_CONNECTED) { delay ( 10000 ); //延迟大一点,不然联网连不上! Serial. println ( "正在连接..." ); u8g 2. setCursor ( 0 , 10 ); u8g 2. println ( "连接wifi中" ); u8g 2. sendBuffer (); } Serial. println ( "连接成功!" ); //==================wifi连接================== u8g 2. clearBuffer (); WeatherURL = GitURL (API); delay ( 100 ); } void loop () { ParseWeather (WeatherURL); Serial. println (WeatherURL); u8g 2. clearBuffer (); //清平 delay ( 10 ); u8g 2. setCursor ( 0 , 10 ); u8g 2. println (one); u8g 2. setCursor ( 0 , 25 ); u8g 2. println (two); u8g 2. setCursor ( 0 , 40 ); u8g 2. println (three); u8g 2. setCursor ( 0 , 55 ); u8g 2. println (four); u8g 2. sendBuffer (); //将内容上传到缓存区 delay ( 5000 ); }