首页 > 其他分享 >墨水屏显示温度

墨水屏显示温度

时间:2023-06-02 19:11:19浏览次数:20  
标签:显示 font temp max 墨水 u8g2Fonts now display 温度

main.cpp

#include <Arduino.h>
#include "GxEPD2_BW.h"
#include "U8g2_for_Adafruit_GFX.h"
#include <Adafruit_AHTX0.h>
#include <Ticker.h>
#include <LinkedList.h>

int listSize = 144;
int flushTime = 60 * 20; // 刷新间隔时间(秒) 20 分钟刷新一次,否则需要更改横坐标
int samplingTime = 15; // 采样间隔时间(秒),每 15 秒采样一次温度数并记录
                       // 到刷新时间后计算全部采样数据平均值,减少单次采样时温度抖动的影响
LinkedList<float> myList = LinkedList<float>();
LinkedList<float> avgTemperatureList = LinkedList<float>(); // 临时存放温度,用于减少偏差

Adafruit_AHTX0 aht;
sensors_event_t humidity, temp;
Ticker time1;
Ticker time2;

GxEPD2_BW<GxEPD2_290_T5D, GxEPD2_290_T5D::HEIGHT> display(GxEPD2_290_T5D(/*CS*/ SS, /*DC*/ 10, /*RST*/ 3, /*BUSY*/ 2));
U8G2_FOR_ADAFRUIT_GFX u8g2Fonts;

void writeFont(int16_t cursorX, int16_t cursorY, String str, const uint8_t font[])
{
  u8g2Fonts.setFont(font);
  int16_t ta = u8g2Fonts.getFontAscent();
  int16_t td = u8g2Fonts.getFontDescent();
  int16_t th = ta - td;

  u8g2Fonts.setCursor(cursorX, cursorY + th);
  u8g2Fonts.print(str);
}

void printStack()
{
  float now;
  float max;
  float min;

  // 计算最大和最小温度,用于动态修改 x 坐标范围
  for (uint16_t i = 0; i < myList.size(); i++)
  {
    now = myList.get(i);
    if (i == 0)
    {
      max = now;
      min = now;
    }
    else
    {
      if (max < now)
      {
        max = now;
      }
      if (now < min)
      {
        min = now;
      }
    }
  }

  // 最大值往上取 5 的倍数 e.g. 17.1 -> 20.0  23.3 -> 25.0
  int temp = max / 5;
  max = (temp + 1) * 5;

  // 最小值往下取 5 的倍数 e.g. 17.1 -> 15.0  23.3 -> 20.0
  temp = min / 5;
  min = temp * 5;

  writeFont(110, 265, String(max), u8g2_font_t0_15_tf);
  writeFont(10, 265, String(min), u8g2_font_t0_15_tf);

  // 画温度
  for (uint16_t i = 0; i < myList.size(); i++)
  {
    now = myList.get(i);
    // Serial.println(now);
    // 计算 x   (max -now) * 100 / (max - min) + 10(距顶端偏移量)
    int x = (100 - (max - now) * 100 / (max - min)) + 10;
    // 计算 y
    int y = (myList.size() - i) * 2;
    display.fillRect(x, y, 2, 2, GxEPD_BLACK);
  }

  // 划分时间
  // 12h
  display.fillRect(10, 72, 100, 1, GxEPD_BLACK);
  writeFont(0, 72 - 16, "12h", u8g2_font_6x10_tf);
  // 24h
  display.fillRect(10, 144, 100, 1, GxEPD_BLACK);
  writeFont(0, 144 - 16, "24h", u8g2_font_6x10_tf);
  // 36h
  display.fillRect(10, 216, 100, 1, GxEPD_BLACK);
  writeFont(0, 216 - 16, "36h", u8g2_font_6x10_tf);

  // 上下横线
  display.fillRect(10, 0, 1, 270, GxEPD_BLACK);
  display.fillRect(110, 0, 1, 270, GxEPD_BLACK);
}

void addTemperature2AvgList()
{
  aht.getEvent(&humidity, &temp);
  avgTemperatureList.add(temp.temperature);
}

/*
 获取统计间隔的平均温度,防止温度抖动
*/
float getAvgTemperature()
{
  if (avgTemperatureList.size() == 0)
  {
    aht.getEvent(&humidity, &temp);
    return temp.temperature;
  }

  LinkedList<float> tempList = LinkedList<float>();
  // 存入临时变量,防止累加完后计算平均温度前增加了数据,导致温度异常
  for (uint16_t i = 0; i < avgTemperatureList.size(); i++)
  {
    tempList.add(avgTemperatureList.get(i));
  }

  float sum = 0.0;
  for (uint16_t i = 0; i < tempList.size(); i++)
  {
    sum += tempList.get(i);
  }

  float avgTemperature = sum / tempList.size();

  tempList.clear();
  avgTemperatureList.clear();
  return avgTemperature;
}

void flushPaper()
{
  aht.getEvent(&humidity, &temp);

  // 控制数组最大的长度
  if (myList.size() >= listSize)
  {
    myList.shift();
  }

  myList.add(getAvgTemperature());

  display.firstPage();
  do
  {
    // 当前的温度和湿度
    writeFont(112, 0, String(temp.temperature), u8g2_font_t0_15_tf);
    writeFont(112, 50, String(humidity.relative_humidity), u8g2_font_t0_15_tf);

    printStack();
  } while (display.nextPage());
  display.hibernate();
}

void setup()
{
  Serial.begin(115200);
  Serial.println("begin...");

  display.init(115200);
  display.setRotation(0);
  // display.setPartialWindow(0, 0, 128, 296); // 局部刷新
  display.setFullWindow(); // 全局刷新
  u8g2Fonts.begin(display);
  u8g2Fonts.setFontMode(0);
  u8g2Fonts.setFontDirection(1);
  u8g2Fonts.setForegroundColor(GxEPD_BLACK);
  u8g2Fonts.setBackgroundColor(GxEPD_WHITE);

  if (!aht.begin())
  {
    Serial.println("Could not find AHT? Check wiring");

    display.firstPage();
    do
    {
      writeFont(50, 50, "Could not find AHT", u8g2_font_t0_15_tf);
    } while (display.nextPage());
    display.hibernate();
    return;
  }
  Serial.println("AHT10 or AHT20 found");

  time1.attach(flushTime, flushPaper);
  delay(1000);
  time2.attach(samplingTime, addTemperature2AvgList);
}

void loop()
{
}

platform.io

[env:esp32-c3-devkitm-1]
platform = espressif32
board = esp32-c3-devkitm-1
framework = arduino
board_build.flash_mode = dio
lib_ldf_mode = deep+
monitor_speed = 115200
lib_deps = 
	zinggjm/GxEPD2@^1.5.0
	olikraus/U8g2_for_Adafruit_GFX@^1.8.0
	olikraus/U8g2@^2.34.15
	adafruit/Adafruit AHTX0@^2.0.3
	ivanseidel/[email protected]+sha.dac3874d28

标签:显示,font,temp,max,墨水,u8g2Fonts,now,display,温度
From: https://www.cnblogs.com/manastudent/p/17452741.html

相关文章

  • 欧奈儿行业 RPS 排名,一图览全貌 2023-06-02,半导体排名显示继续提升
    自动复盘2023-06-02k线图是最好的老师,点击详情图可以看到行业20日RPS的排名,最底下子图是行业rps走势线据我观察,成交额超过100亿,成功几率比较高,一般有买点标注的,走势还可以公众hao:醉卧梦星河欧奈尔行业RPS排名天天更新追踪主力行业趋......
  • frame framset 的页面显示不了 空白
    frameframset的页面显示不了空白 例如php文件输出这样,<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><he......
  • AI安防视频汇聚融合平台EasyCVR v3.2版本托盘显示优化
    EasyCVR基于云边端协同,可支持海量视频的轻量化接入与汇聚管理。平台兼容性强、拓展度高,可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联等功能。为了便于用户二次开发、调用与集成,我们也提供了丰富的A......
  • vue中(input组件)textarea文本提交到后端数据库,前端输出保存换行回车及修改显示
    1.修改css中white-space属性为“pre-warp”在css中white-space属性用来控制容器的文本中带有空白符、制表符、换行符等的显示,取值有:normal:默认,忽略文本中所有的空白、换行符;只有文本存在<br>或文本达到框的约束时,文本才会换行nowrap:和normal类似,忽略文本中所有的空白、换行......
  • idea - 文件后面显示 0%classes,0% lines covered -解决
    这是因为不小心按了 可以ctrl+Alt+F6 选择"nocoverage "按钮即可......
  • vue多行文本显示省略号加展开收起按钮
    getClientRects()获取文本的行数和宽高等信息,只能获取行内元素的 nextTick(()=>{    constlineRows=document.querySelector('.abc').getClientRects();    //如果行数超出2||行数是2&&最后一行宽度超过dom宽度-展开收起按钮的width就是多了,要显示展开......
  • 伪元素显示变量值的方法
    1.使用attr引用父元素属性<lidata-name="小明">li::after{content:attr(data-name);}2.非content属性可以直接引用css变量<listyle="--width:40px"></li>li::after{content:attr(data-name);width:var(--width)}3.co......
  • 树莓派温度检测
    树莓派温度检测一、shell命令  登录树莓派之后使用指令查看CPU温度,依次输入以下指令:  #进入目录cd/sys/class/thermal/thermal_zone0  #查看温度cattemp  #树莓派返回  47236这时温度是47.236摄氏度。二、终端一条命令vcg......
  • 问题解决:Ubuntu18.04显示器分辨率不正常
    在Ubuntu18.04下出现显示器分辨率不正确的情况,只能选择1024x768的分辨率,没有其它选项,显示器本身可以支持1920x1080的分辨率。经查询,采用cvt,xrandr的方法不成功,显示xrandr:Failedtogetsizeofgammaforoutputdefault的错误,采用修改grub的方法如下解决方法修改/etc/defaul......
  • Allegro隐藏铺铜或显示铺铜
    在我们在PCB完成后,我们会进行DRC检查,在铺铜网络存在显示时,找DRC标志符号不容易发现,如果要是把铺铜隐藏,PCB中只显示导线,焊盘,过孔。大大的减少了我们的检查DRC的困难。下面我们来进行铺铜隐藏或显示操作,执行Setup> Preferences…如下图所示,只要把对应的命令勾上,铜片将会隐藏。......