数码之家

 找回密码
 立即注册
搜索
查看: 3101|回复: 16

[工仪] arduino 绘制图形温湿度表

[复制链接]
发表于 2019-8-21 14:13:06 来自手机浏览器 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wei27311 于 2019-8-22 11:16 编辑

一直很喜欢模拟仪表
用arduino和电子模块
终于可以实现根据测量值绘制模拟仪表
wechat_upload15663691695d5ce591ed062
wechat_upload15663691895d5ce5a581c47
wechat_upload15663691915d5ce5a714514
wechat_upload15663691915d5ce5a7d4cea

打赏

参与人数 2家元 +58 收起 理由
jf201006 + 18 謝謝分享
家睦 + 40

查看全部打赏

本帖被以下淘专辑推荐:

  • · MCU|主题: 24, 订阅: 18
 楼主| 发表于 2019-8-22 10:48:42 | 显示全部楼层
本帖最后由 wei27311 于 2019-8-22 11:19 编辑
  1. #include <dht11.h> //DHT11库
  2. #include "U8g2lib.h" //u8g2lib库
  3. #define DHT11PIN 2 //定义DHT11输入脚
  4. U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); //适合0.96寸iic oled屏 SCL A5 SDA A4
  5. dht11 DHT11; //实例DHT11对象

  6. //画出左边湿度模拟仪表
  7. void draw(int value) {
  8.   int cx = 30; //圆心x
  9.   int cy = 32; //圆心y
  10.   int cr = 30; //圆半径
  11.   float angle = value*2.8; //DHT11 湿度量程20-95% 95%时角度为270度 (270/95)≈2.8
  12.   float rad = angle/180*PI; //角度转换为弧度
  13.   float lx = cx+(cr-5)*cos(rad);  //计算指针目标x
  14.   float ly = cy+(cr-5)*sin(rad);  //计算指针目标y
  15.   u8g2.drawCircle(cx,cy,cr,U8G2_DRAW_LOWER_RIGHT); //画右下1/4圆弧
  16.   u8g2.drawCircle(cx,cy,cr,U8G2_DRAW_LOWER_LEFT);  //画左下1/4圆弧
  17.   u8g2.drawCircle(cx,cy,cr,U8G2_DRAW_UPPER_LEFT);  //画左上1/4圆弧
  18.   u8g2.drawDisc(cx,cy,3,U8G2_DRAW_ALL);//中心小圆
  19.   //画刻度
  20.   for(float i=0;i<=80;i+=20){
  21.     float v = i*2.8;
  22.     float rad = v/180*PI;
  23.     u8g2.drawLine(cx+(cr-5)*cos(rad),cy+(cr-5)*sin(rad),cx+cr*cos(rad),cy+cr*sin(rad));
  24.   }
  25.   u8g2.drawLine(cx+(cr-5)*cos(4.72),cy+(cr-5)*sin(4.72),cx+cr*cos(4.72),cy+cr*sin(4.72));//由于刻度循环间隔不能画出最大值刻度 所以单独画95刻度
  26.   u8g2.drawLine(cx,cy,lx,ly);//画出指针
  27.   u8g2.setFont(u8g2_font_courR10_tn);//设置字体
  28.   u8g2.setCursor(cx+10, cy-10);//字体显示位置
  29.   u8g2.print(value);//显示湿度
  30. }

  31. //画出右边温度模拟仪表
  32. void draw2(int value) {
  33.   int cx = 95;
  34.   int cy = 32;
  35.   int cr = 30;
  36.   float angle = value*5.4;
  37.   float rad = angle/180*PI;
  38.   float lx = cx+(cr-5)*cos(rad);
  39.   float ly = cy+(cr-5)*sin(rad);
  40.   u8g2.drawCircle(cx,cy,cr,U8G2_DRAW_LOWER_RIGHT);
  41.   u8g2.drawCircle(cx,cy,cr,U8G2_DRAW_LOWER_LEFT);
  42.   u8g2.drawCircle(cx,cy,cr,U8G2_DRAW_UPPER_LEFT);
  43.   u8g2.drawDisc(cx,cy,3,U8G2_DRAW_ALL);//中心小圆
  44.   //画刻度
  45.   for(float i=0;i<=50;i+=10){
  46.     float v = i*5.4;
  47.     float rad = v/180*PI;
  48.     u8g2.drawLine(cx+(cr-5)*cos(rad),cy+(cr-5)*sin(rad),cx+cr*cos(rad),cy+cr*sin(rad));
  49.   }
  50.   u8g2.drawLine(cx,cy,lx,ly);//指针
  51.   u8g2.setFont(u8g2_font_courR10_tn);
  52.   u8g2.setCursor(cx+10, cy-10);
  53.   u8g2.print(value);
  54. }

  55. void setup(void) {
  56.   u8g2.begin();
  57.   pinMode(DHT11PIN,OUTPUT);     
  58. }

  59. void loop(void) {
  60.   int chk = DHT11.read(DHT11PIN);                 //将读取到的值赋给chk
  61.   int tem=(float)DHT11.temperature;               //将温度值赋值给tem
  62.   int hum=(float)DHT11.humidity;
  63.   u8g2.clearBuffer();// clear the internal memory
  64.   draw(hum);
  65.   draw2(tem);
  66.   u8g2.sendBuffer();
  67. }
复制代码


模拟航空仪表 在小oled中读数最直观
wechat_upload15664424005d5e03a0218cd

打赏

参与人数 1家元 +14 收起 理由
温力口 + 14 谢谢分享,折腾的不错。。。。.

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-22 23:05:22 | 显示全部楼层
本帖最后由 wei27311 于 2019-8-22 23:07 编辑
  1. #include <dht11.h> //DHT11库
  2. #include "U8g2lib.h" //u8g2lib库
  3. #define DHT11PIN 2 //定义DHT11输入脚
  4. U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); //适合0.96寸iic oled屏 SCL A5 SDA A4
  5. dht11 DHT11; //实例DHT11对象

  6. void draw(int value) {
  7.   int cx = 30;
  8.   int cy = 32;
  9.   int cr = 30;
  10.   float angle = 150+value*2.526;
  11.   float rad = angle/180*PI;
  12.   float lx = cx+(cr-5)*cos(rad);
  13.   float ly = cy+(cr-5)*sin(rad);
  14.   u8g2.drawCircle(cx,cy,cr,U8G2_DRAW_ALL);
  15.   for(float i=0;i<=80;i+=20){
  16.     float v = i*2.526+150;
  17.     float rad = v/180*PI;
  18.     u8g2.drawLine(cx+(cr-5)*cos(rad),cy+(cr-5)*sin(rad),cx+cr*cos(rad),cy+cr*sin(rad));
  19.   }
  20.   u8g2.drawLine(cx+(cr-5)*cos(6.80),cy+(cr-5)*sin(6.80),cx+cr*cos(6.80),cy+cr*sin(6.80));//由于刻度循环间隔不能画出最大值刻度 所以单独画95刻度
  21.   u8g2.drawLine(cx+(cr-19)*cos(rad),cy+(cr-19)*sin(rad),lx,ly);
  22.   u8g2.setFont(u8g2_font_courR10_tn);
  23.   u8g2.setCursor(23,36);
  24.   u8g2.print(value);
  25. }

  26. void draw2(int value) {
  27.   float cx = 97;
  28.   float cy = 32;
  29.   float cr = 30;
  30.   float angle = 150+value*4.8;
  31.   float rad = angle/180*PI;
  32.   float lx = cx+(cr-5)*cos(rad);
  33.   float ly = cy+(cr-5)*sin(rad);
  34.   u8g2.drawCircle(cx,cy,cr,U8G2_DRAW_ALL);
  35.   for(float i=0;i<=50;i+=10){
  36.     float v = i*4.8+150;
  37.     float rad = v/180*PI;
  38.     u8g2.drawLine(cx+(cr-5)*cos(rad),cy+(cr-5)*sin(rad),cx+cr*cos(rad),cy+cr*sin(rad));
  39.   }
  40.   u8g2.drawLine(cx+(cr-19)*cos(rad),cy+(cr-19)*sin(rad),lx,ly);
  41.   u8g2.setFont(u8g2_font_courR10_tn);
  42.   u8g2.setCursor(90,36);
  43.   u8g2.print(value);
  44. }

  45. void setup(void) {
  46.   u8g2.begin();
  47.   pinMode(DHT11PIN,OUTPUT);      
  48. }

  49. void loop(void) {
  50.   int chk = DHT11.read(DHT11PIN);                 //将读取到的值赋给chk
  51.   int tem=(float)DHT11.temperature;               //将温度值赋值给tem
  52.   int hum=(float)DHT11.humidity;
  53.   u8g2.clearBuffer();// clear the internal memory
  54.   draw(hum);
  55.   draw2(tem);
  56.   u8g2.sendBuffer();
  57. }
复制代码


模拟汽车仪表盘
wechat_upload15664864125d5eaf8c645a3
回复 支持 反对

使用道具 举报

发表于 2019-8-21 14:57:14 | 显示全部楼层
哈哈,不错啊:loveliness:
回复 支持 反对

使用道具 举报

发表于 2019-8-21 15:05:09 | 显示全部楼层

别闲逛了,快点回去憋
回复 支持 反对

使用道具 举报

发表于 2019-8-21 15:10:26 | 显示全部楼层
石墨 发表于 2019-8-21 15:05
别闲逛了,快点回去憋

哈哈,我都不着急,你急什么:titter:
回复 支持 反对

使用道具 举报

发表于 2019-8-21 15:14:54 | 显示全部楼层
人艰不拆了 发表于 2019-8-21 15:10
哈哈,我都不着急,你急什么

等着看你的大作啊,别虎头蛇尾太监了
回复 支持 反对

使用道具 举报

发表于 2019-8-21 16:04:46 | 显示全部楼层
来点源程序学学呢?
回复 支持 反对

使用道具 举报

发表于 2019-8-22 10:28:37 | 显示全部楼层
来点源程序学学呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-22 10:49:05 | 显示全部楼层
wower 发表于 2019-8-22 10:28
来点源程序学学呢?

我已经发了源代码
回复 支持 反对

使用道具 举报

发表于 2019-8-22 12:15:24 | 显示全部楼层
wei27311 发表于 2019-8-22 10:49
我已经发了源代码

谢谢,学习一下
回复 支持 反对

使用道具 举报

发表于 2019-9-1 07:41:42 | 显示全部楼层
这几天屏到了研究一把
回复 支持 反对

使用道具 举报

发表于 2019-9-8 20:13:06 | 显示全部楼层
这个指令什么意思?
int hum=(float)DHT11.humidity
回复 支持 反对

使用道具 举报

发表于 2019-9-9 09:42:41 | 显示全部楼层
arduino真是好东西,我这水平只能简单点亮个发光二级管,做个寻迹小车。还得继续学习。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 21:28:36 来自手机浏览器 | 显示全部楼层
ld165246050 发表于 2019-9-9 09:42
arduino真是好东西,我这水平只能简单点亮个发光二级管,做个寻迹小车。还得继续学习。 ...

寻迹小车比这个难多了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-9 21:29:47 来自手机浏览器 | 显示全部楼层
彭大伟 发表于 2019-9-8 20:13
这个指令什么意思?
int hum=(float)DHT11.humidity


dht11是对象 .后面是对象的属性
意思是把这个对象的湿度属性赋值给hum这个变量
回复 支持 反对

使用道具 举报

发表于 2019-9-9 23:11:08 | 显示全部楼层
谢谢分享,折腾的不错。。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-27 05:05 , Processed in 0.187201 second(s), 18 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表