【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官方对其售卖的板子,提供的支持确实非常完善,让开发者可以很方便的就把各项功能给使用起来,这一点值得点赞。
后面将继续把玩这块好设备,继续给大家分享。
|