774|6

253

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

【DigiKey“智造万物,快乐不停”创意大赛】M5Paper 温湿度显示牌 [复制链接]

  本帖最后由 HonestQiao 于 2023-11-1 02:19 编辑

M5Paper有石墨屏,还自带了I2C接口的SHT30,通过M5 Stack官方提供的M5Paper支持包,在Arduino开发环境中就能很方便的调用屏幕,在读取SHT30的数据,就能够制作一个简易的温湿度显示牌。

 

一、M5Paper支持模块

在之前的分享:【新提醒】【DigiKey“智造万物,快乐不停”创意大赛】M5Paper开发环境的建立,说过Arduino开发环境的建立,核心就是安装

链接已隐藏,如需查看请登录或者注册
模块。

这个模块,提供了一些核心系统支持功能,包括:

系统管理、电源管理、按键读取、石墨屏显示、触摸读取、SHT30温湿度信息等。

 

要在Arduino程序中调用该模块,直接使用下面的语句即可:

#include <M5EPD.h>

调用后,在代码中,就可以用 M5 这个对象,直接来与硬件打交道了,如初始化设备:

M5.begin();

 

二、石墨屏控制

要控制石墨屏,使用M5EPD提供的EPD驱动和Canvas模块即可。

控制石墨屏之前,先要进行其初始化:

    M5.RTC.begin();
    M5.EPD.SetRotation(0);
    M5.EPD.Clear(true);

 

其中:

* M5.RTC.begin():表示RTC时钟初始化

* M5.EPD.SetRotation(0):表示悬着方向,0为横屏,每次90度旋转

* M5.EPD.Clear(true):清屏

 

然后,需要使用Canvas来在屏幕上进行输出:

    M5EPD_Canvas canvas0(&M5.EPD);

    canvas0.createCanvas(400, 300);
    canvas0.setTextSize(3);
    canvas0.drawString("M5Paper Weather Board", 0, 0);
    canvas0.drawString("Temp *C = ", 0, 100);
    canvas0.drawString("Hum. % = ", 0, 200);
    canvas0.pushCanvas(200, 100, UPDATE_MODE_GL16);

 

上述代码中,首先生成了一个canvas0对象,然后使用createCanvas(w, h)创建一个制定宽度和高度的canvas,最后使用pushCanvas(x,y,UPDATE_MODE_GL16)来绘制到屏幕上。另外,还可以使用deleteCanvas()来删除当前的canvas。

 

在这个canvas上,可以使用 canvas0.drawString(str, x', y') 来输出字符串到该canvas上,注意,此处的x'、y'是相对这个canvas的左上角的,不是相对于屏幕的。

输出字符串之前,还可以设定字体、字号等。具体可以查看M5EPD的详细文档。

 

三、SHT30温湿度传感器信息读取

M5EPD模块,本身也提供了直接调用温湿度传感器的方式,非常简单:

M5.SHT30.Begin();

M5.SHT30.UpdateData();
float tem = M5.SHT30.GetTemperature();
float  um = M5.SHT30.GetRelHumidity();

上述代码逻辑较为简单,就是先初始化,然后每次读取钱,先更新一下数据,在读取温度值和湿度值。

 

另外,因为使用的是ESP32,SHT30是I2C接口的,那么不使用M5EPD模块,也是一样可以读取的。

此时,可以使用Adafruit_SHT31模块,在Arduino IDE中直接安装即可:

 

 

使用该模块,从SHT30读取温湿度信息,也很方便,代码如下:

Adafruit_SHT31 sht31 = Adafruit_SHT31();

sht31.begin(0x44);

  float t = sht31.readTemperature();
  float h = sht31.readHumidity();

 

通过上面的步骤,就能读取温湿度信息了。

 

四、简易温湿度信息显示牌:

能够在石墨屏上输出文字信息了,也能够读取SHT30温湿度传感器的数据了,那么将他们整合,在屏幕上输出读取到的信息即可,整合后的代码如下:

/*************************************************** 
  This is an example for the SHT31-D Humidity & Temp Sensor

  Designed specifically to work with the SHT31-D sensor from Adafruit
  ----> https://www.adafruit.com/products/2857

  These sensors use I2C to communicate, 2 pins are required to  
  interface
 ****************************************************/
 
 #include <M5EPD.h>

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"

#define SHT30_PIN_SDA 21
#define SHT30_PIN_SCL 22

bool enableHeater = false;
uint8_t loopCnt = 0;

String buf = "";

Adafruit_SHT31 sht31 = Adafruit_SHT31();

M5EPD_Canvas canvas0(&M5.EPD);
M5EPD_Canvas canvas(&M5.EPD);

void M5_init(void) {
    // 开始运行
    M5.begin();

    // 开启RTC
    M5.RTC.begin();  //Init the RTC.  初始化 RTC

    // 清屏
    M5.EPD.Clear(true);

    // 旋转:竖向
    // M5.EPD.SetRotation(90);

    // 全屏
    // canvas.createCanvas(540, 960);
    // 清除
    // canvas.deleteCanvas();

    // 旋转:横向
    M5.EPD.SetRotation(0);

    // set the new size of the scene-element (canvas)
    canvas0.createCanvas(400, 300);
    canvas0.setTextSize(3);
    canvas0.drawString("M5Paper Weather Board", 0, 0);
    canvas0.drawString("Temp *C = ", 0, 100);
    canvas0.drawString("Hum. % = ", 0, 200);
    canvas0.pushCanvas(200, 100, UPDATE_MODE_GL16);
    // kill canvas overlay main image
    // canvas.deleteCanvas();
}
void setup() {
  Serial.begin(9600);

  while (!Serial)
    delay(10);     // will pause Zero, Leonardo, etc until serial console opens

  M5_init();

  Wire.setPins(SHT30_PIN_SDA, SHT30_PIN_SCL);

  Serial.println("SHT31 test");
  if (!sht31.begin(0x44)) {   // Set to 0x45 for alternate i2c addr
    Serial.println("Couldn't find SHT31");
    while (1) delay(1);
  }

  Serial.print("Heater Enabled State: ");
  if (sht31.isHeaterEnabled())
    Serial.println("ENABLED");
  else
    Serial.println("DISABLED");
}


void loop() {
  // char buf[100];
  float t = sht31.readTemperature();
  float h = sht31.readHumidity();

  canvas.deleteCanvas();
  canvas.createCanvas(100, 200);
  canvas.setTextSize(3);

  if (! isnan(t)) {  // check if 'is not a number'
    Serial.print("Temp *C = "); Serial.print(t); Serial.print("\t\t");
    // snprintf(buf, sizeof(buf), "Temp *C = %s", "")
    buf = String(t);
    canvas.drawString(buf, 0, 0);
  } else { 
    Serial.println("Failed to read temperature");
  }
  
  if (! isnan(h)) {  // check if 'is not a number'
    Serial.print("Hum. % = "); Serial.println(h);
    buf = String(h);
    canvas.drawString(buf, 0, 100);
  } else { 
    Serial.println("Failed to read humidity");
  }
  canvas.pushCanvas(400, 200, UPDATE_MODE_GL16);
  delay(1000);

  // Toggle heater enabled state every 30 seconds
  // An ~3.0 degC temperature increase can be noted when heater is enabled
  if (loopCnt >= 30) {
    enableHeater = !enableHeater;
    sht31.heater(enableHeater);
    Serial.print("Heater Enabled State: ");
    if (sht31.isHeaterEnabled())
      Serial.println("ENABLED");
    else
      Serial.println("DISABLED");

    loopCnt = 0;
  }
  loopCnt++;
}

上述代码逻辑也比较简单明了,就不做过多的说明了。

不过,在这段代码的后面,每读取30次输出后,会启动SHT30上内置的加热器,加热一下,防止水汽凌结,这样读取的数据更准确。

 

将上述代码编译后下载到M5Paper,最终效果如下:

 

这些功能和代码,是在坐火车的时候,看完书无聊了,顺手研究了实例后简单改写的。

 

 

五、总结

M5 Stack官方对其售卖的板子,提供的支持确实非常完善,让开发者可以很方便的就把各项功能给使用起来,这一点值得点赞。

后面将继续把玩这块好设备,继续给大家分享。

最新回复

乔帮主,你这次作品有点灌水了,感觉复杂度不符合你往期作品水准  详情 回复 发表于 2023-12-15 11:19
点赞(1) 关注
 
 

回复
举报

6060

帖子

7

TA的资源

版主

沙发
 

这墨水屏看着真的很舒服  

点评

显示效果的非常的不错。  详情 回复 发表于 2023-12-14 23:46
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

6841

帖子

11

TA的资源

版主

板凳
 
乔老师,高铁上都可以出作品,佩服呀,分享的作品也是非常的棒!

点评

好好学习,天天向上!不虚度时光!  详情 回复 发表于 2023-12-14 23:47
 
 
 

回复

253

帖子

4

TA的资源

纯净的硅(初级)

4
 
秦天qintian0303 发表于 2023-11-1 08:20 这墨水屏看着真的很舒服  

显示效果的非常的不错。

 
 
 

回复

253

帖子

4

TA的资源

纯净的硅(初级)

5
 
lugl4313820 发表于 2023-11-1 19:11 乔老师,高铁上都可以出作品,佩服呀,分享的作品也是非常的棒!

好好学习,天天向上!不虚度时光!

 
 
 

回复

55

帖子

4

TA的资源

一粒金砂(中级)

6
 
乔帮主,你这次作品有点灌水了,感觉复杂度不符合你往期作品水准

点评

这个不是最终作品啊,只是中间学习过程的分享哦。 看看这篇: 【DigiKey“智造万物,快乐不停”创意大赛】M5Paper 超低功耗素雅网络相册 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.c  详情 回复 发表于 2023-12-16 21:19
 
 
 

回复

253

帖子

4

TA的资源

纯净的硅(初级)

7
 
爱吃鱼的加菲猫 发表于 2023-12-15 11:19 乔帮主,你这次作品有点灌水了,感觉复杂度不符合你往期作品水准

这个不是最终作品啊,只是中间学习过程的分享哦。

看看这篇:

【DigiKey“智造万物,快乐不停”创意大赛】M5Paper 超低功耗素雅网络相册 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表