网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月30日漏签0天
arduino吧 关注:75,364贴子:230,206
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 20回复贴,共1页
<<返回arduino吧
>0< 加载中...

一个刷脸的年代,没图你们是不会进来的——也谈U8g库的显示

  • 只看楼主
  • 收藏

  • 回复
  • vanezip
  • 颇具名气
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

U8g是一个强大的库,最开始做3D打印机使用的就是Marlin固件,12864LCD显示中文开始接触到了U8g,库里同时提供了一些工具,用于中文的显示,最终效果。
因为最近要为孩子做一些寒假的课外兴趣和动手能力辅导,又捡起了很久不用的C语言,代码基本都是自己写的,并没有做代码的优化,只是凭着感觉,有些不合理的地方还请大神们批评指正

这里用到了一个1.3inches的OLED显示屏,使用的是1U8GLIB_SH1106_128X64驱动,是U8g自带的

测试显示

温度传感器使用的是便宜的DHT11,当然DHT22也贵不了多少钱

时钟模块也使用了便宜的DS1302,因为只是了解掌握为目的,并没有项目要求,所以本着少花钱多办事的原则,尽量选用了一些便宜的传感器和模块

再次显示测试


  • vanezip
  • 颇具名气
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
源码都进行了标注,便于理解
/******************************************************************************
DS1302 RTC:
VCC +5v
GND GND
CLK pin 6
DAT pin 7
RST pin 8
0.96 OLED I2C:
VCC +5v
GND GND
SDA SDA
SCL SCL
TMP DHT11:
VCC +3.3v
GND GND
Out Analog pin A0
******************************************************************************/
#include "U8glib.h"
#include "DS1302.h"
#include "dht.h"
#define dht_apin A0 //HDT lib define outpupin
DS1302 rtcc; //DS1302
ds1302_struct rtc; //DS1302 display time in digital format
dht DHT; //DHT11
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C 0.9inche OLED
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C 1.3inche OLED
const u8g_fntpgm_uint8_t chinese_test[] U8G_FONT_SECTION("chinese_test") = {
0,16,16,0,254,0,0,0,0,0,161,173,0,13,255,0, //定义调用范围是“161~173”,即"\xa1" ~ "\xad"
0,15,14,28,16,0,255,35,248,18,8,18,8,131,248,66,
8,66,8,19,248,16,0,39,252,228,164,36,164,36,164,36,
164,47,254, //************汉字“温”,调用值"\xa1"
15,14,28,16,0,255,39,248,20,8,20,8,135,248,68,
8,68,8,23,248,17,32,33,32,233,36,37,40,35,48,33,
32,47,254, //************汉字“温”,调用值"\xa1"
15,16,32,16,0,254,1,0,0,128,63,254,34,32,34,
32,63,252,34,32,34,32,35,224,32,0,47,240,36,16,66,
32,65,192,134,48,56,14, //************汉字“度”,调用值"\xa3"
13,14,28,16,1,255,63,224,32,32,63,224,32,32,63,
224,2,0,34,0,63,240,66,0,130,0,63,224,2,0,2,
0,255,248, //************汉字“星”,调用值"\xa4"
14,16,32,16,0,254,34,0,34,124,127,68,34,68,34,
68,62,124,34,68,34,68,62,68,34,124,34,68,255,68,4,
132,34,132,65,20,130,8, //************汉字“期”,调用值"\xa5"
9,15,30,16,3,254,255,128,128,128,128,128,128,128,128,
128,128,128,255,128,128,128,128,128,128,128,128,128,128,128,128,
128,255,128,128,128, //************汉字“日”,调用值"\xa6"
12,16,32,16,2,254,31,240,16,16,16,16,16,16,16,
16,31,240,16,16,16,16,16,16,31,240,16,16,16,16,32,
16,32,16,64,80,128,32, //************汉字“月”,调用值"\xa7"
15,12,24,16,0,0,0,0,0,0,0,0,0,0,0,
0,255,254,0,0,0,0,0,0,0,0,0,0,0,0, //************汉字“一”,调用值"\xa8"
15,10,20,16,0,1,63,248,0,0,0,0,0,0,0, //************汉字“二”,调用值"\xa79"
0,0,0,0,0,0,0,0,0,255,254,
15,12,24,16,0,0,127,252,0,0,0,0,0,0,0,
0,63,248,0,0,0,0,0,0,0,0,0,0,255,254, //************汉字“三”,调用值"\xaa"
13,13,26,16,1,255,255,248,136,136,136,136,136,136,136,
136,136,136,144,136,144,120,160,8,192,8,128,8,255,248,128,
8, //************汉字“四”,调用值"\xab"
15,14,28,16,0,255,127,252,2,0,2,0,2,0,2,
0,63,240,4,16,4,16,4,16,4,16,8,16,8,16,8,
16,255,254, //************汉字“五”,调用值"\xac"
15,15,30,16,0,255,2,0,1,0,0,128,0,128,0,
0,255,254,0,0,0,0,4,64,4,32,8,16,8,8,16,
8,32,4,64,4 //************汉字“六”,调用值"\xad"
};


2025-07-30 04:22:38
广告
不感兴趣
开通SVIP免广告
  • vanezip
  • 颇具名气
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
void draw(void) {
u8g.setFont(chinese_test); //设置显示字体
u8g.drawStr(0, 14, "\xa1"); u8g.drawStr(43, 14, "\xa3");u8g.drawStr(72, 14, "\xa2"); //“温”“湿”“度”的位置显示
u8g.drawStr(24, 62, "\xa7"); u8g.drawStr(58, 62, "\xa6"); //“月”“日”的位置显示
u8g.drawStr(80, 62, "\xa4"); u8g.drawStr(96, 62, "\xa5"); //“星期”的位置显示
u8g.setFont(u8g_font_helvR14); //设置显示字体
u8g.drawStr(17, 14, ":"); u8g.drawStr(88, 14, ":"); //“温”“湿”“度”的冒号显示位置
u8g.setPrintPos(22, 14); u8g.print(DHT.temperature, 0); //温度值显示位置,调用DHT的库函数
u8g.setPrintPos(93, 14); u8g.print(DHT.humidity,0); u8g.drawStr(113, 14, "%"); //湿度度值显示位置,调用DHT的库函数,再显示湿度的单位“%”
u8g.setFont(u8g_font_osb18); //设置显示字体,本处定义字体是为了下面显示时间使用
ds1302_struct rtc; // ds1302库函数
rtcc.readDateTime((uint8_t *) &rtc); // ds1302库函数
char buffer[40]; //字符串,用来装读取的时间
//"time = %02d:%02d:%02d" //时间格式为2位10进制
sprintf( buffer, " %02d:%02d:%02d ", //sprintf字符串格式化函数,装入字符串
bcd2bin( rtc.h24.Hour10, rtc.h24.Hour), // ds1302库函数,小时,格式化为2位10进制,来自库 class public
bcd2bin( rtc.Minutes10, rtc.Minutes), // ds1302库函数,分钟,格式化为2位10进制,来自库 class public
bcd2bin( rtc.Seconds10, rtc.Seconds)); // ds1302库函数,秒,格式化为2位10进制,来自库 class public,sprintf结束
u8g.drawStr(4,40, buffer); // u8g库函数,输出位置x=4,y=40,输出字符串buffer包含小时、分、秒
u8g.setFont(u8g_font_helvR14); //设置显示字体,本处定义字体是为了下面显示月使用
sprintf(buffer, " %02d", //月格式为2位10进制
bcd2bin( rtc.Month10, rtc.Month)); // ds1302库函数,月,格式化为2位10进制,来自库 class public,sprintf结束
u8g.drawStr(0,62, buffer ); // u8g库函数,输出位置x=0,y=62,输出字符串buffer包含月
u8g.setFont(u8g_font_helvR14); //设置显示字体,本处定义字体是为了下面显示日使用
sprintf(buffer, " %02d", //月格式为2位10进制,“%”是格式说明符,%d就是以十进制的格式输入,
bcd2bin( rtc.Date10, rtc.Date)); // ds1302库函数,日,格式化为2位10进制,来自库 class public,sprintf结束
u8g.drawStr(34,62, buffer ); // u8g库函数,输出位置x=34,y=62,输出字符串buffer包含日
if( rtc.Day == 1){ //if条件语句,当ds1302库函数中“rtc.Day ”等于1
u8g.setFont(chinese_test); // u8g库函数,设置字体
u8g.drawStr(112, 62,"\xa8"); // u8g库函数,输出位置x=112,y=62,调用值"\xa8"即“一”
}else if(rtc.Day == 2){ //else条件语句,当ds1302库函数中“rtc.Day ”等于2
u8g.setFont(chinese_test); // u8g库函数,设置字体
u8g.drawStr(112, 62,"\xa9"); // u8g库函数,输出位置x=112,y=62,调用值"\xa9"即“二”
}else if(rtc.Day == 3){ //else条件语句,当ds1302库函数中“rtc.Day ”等于2
u8g.setFont(chinese_test); // u8g库函数,设置字体
u8g.drawStr(112, 62,"\xaa"); // u8g库函数,输出位置x=112,y=62,调用值"\xaa"即“三”
}else if(rtc.Day == 4){ //else条件语句,当ds1302库函数中“rtc.Day ”等于2
u8g.setFont(chinese_test); // u8g库函数,设置字体
u8g.drawStr(112, 62,"\xab"); // u8g库函数,输出位置x=112,y=62,调用值"\xab"即“四”
}else if(rtc.Day == 5){ //else条件语句,当ds1302库函数中“rtc.Day ”等于2
u8g.setFont(chinese_test); // u8g库函数,设置字体
u8g.drawStr(112, 62,"\xac"); // u8g库函数,输出位置x=112,y=62,调用值"\xac"即“五”
}else if(rtc.Day == 6){ //else条件语句,当ds1302库函数中“rtc.Day ”等于2
u8g.setFont(chinese_test); // u8g库函数,设置字体
u8g.drawStr(112, 62,"\xad"); // u8g库函数,输出位置x=112,y=62,调用值"\xad"即“六”
}else if(rtc.Day == 7){ //else条件语句,当ds1302库函数中“rtc.Day ”等于2
u8g.setFont(chinese_test); // u8g库函数,设置字体
u8g.drawStr(112, 62,"\xa6"); // u8g库函数,输出位置x=112,y=62,调用值"\xa6"即“日”
} //else条件语句结束
} //void draw(void)函数结束


  • vanezip
  • 颇具名气
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
void setup(void) { //void setup(void) 设置函数结束
// Serial.begin(9600); //设置通讯波特率,如果需要用于监听
} //void setup(void) 设置函数结束
void loop(void) { // void loop(void)主循环开始
DHT.read11(dht_apin); // Read apin on DHT11 or DHT22,设置温度传感器为DHT11(DHT.read11)或者DHT22(DHT.read22)
u8g.firstPage(); //u8g库显示开始
do {
draw(); //u8g库开始显示 draw()
} while( u8g.nextPage() ); //u8g库显示结束
delay(50); //每50毫秒刷新一次
}


  • -不违规昵称
  • 颇具盛名
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顶一个


  • vanezip
  • 颇具名气
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
把上次的RGB混色仪的图片也补上吧,这个是用MEGA2560加上了0.9inches的OLED,原因是用3个编码器需要3个中断口,UNO的那个已经把源码放上了,但是没图大家不怎么待见啊,一个刷脸的年代,没图还说个……
UNO的代码及解释:http://tieba.baidu.com/p/5510395289

开机画面二

运行画面

运行画面

开机画面一


  • vanezip
  • 颇具名气
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
上一个RGB混色的没有上图,这次一并把图片补全,提交了2次才发现不能带有上次帖子的贴吧地址,UNO的源码及注释已经发过了,不能发链接,就请自行查找吧,这个是UNO的升级版,使用了MEGA2560,因为使用了3个编码器所以需要3个中端口,其他的基本和UNO一致

开机画面二

显示

显示

开机画面一


  • swssuiop
  • 小有美名
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
赞👍。谢谢楼主


2025-07-30 04:16:38
广告
不感兴趣
开通SVIP免广告
  • ipdun
  • 富有美誉
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
详细,楼主好样的


  • 柴米油盐酱你
  • 锋芒毕露
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不错不错


  • 疯人院封神
  • 富有名气
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好贴


  • 可爱的工具人
  • 小有美名
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
贴主,现在出了u8g2的库


  • 可爱的工具人
  • 小有美名
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我觉得u8g2库,相对于u8glib 库更大


  • 对不起我是饿底
  • 崭露头角
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
u8g库那里能下载?


2025-07-30 04:10:38
广告
不感兴趣
开通SVIP免广告
  • 17489120aaa
  • 小有美名
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
还在吗楼主


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 20回复贴,共1页
<<返回arduino吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示