磁动力电子网-雕刻机DIY论坛,单片机论坛,CNCDIY,DIYCNC

 找回密码
 加入磁动力

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 334|回复: 9

[应用实例] 野路子Arduino第四弹:桌面温湿度计

[复制链接]
发表于 2018-12-19 14:04:27 | 显示全部楼层 |阅读模式
给闺女的生日礼物~简陋了点,重在心意~
这算是制作的最轻松的一个作品了~哈哈~进入正题~

物料清单:
Arduino-NANO:1片
0.96"OLED显示屏-I2C接口:1张
DHT11温湿度传感器:1枚

照片展示:

温度.jpg

湿度.jpg

背面.jpg

wx_camera_1544097577871.jpg

wx_camera_1544097602866.jpg

=======================================================
使用库:
1.U8g2库 用于驱动OLED显示屏 功能强大 详情前往链接细看:https://github.com/olikraus/u8g2
2.DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library

代码:(抄袭了U8g2自带的天气范例)
  1. #include <Arduino.h>
  2. #include <U8g2lib.h>

  3. #ifdef U8X8_HAVE_HW_SPI
  4. #include <SPI.h>
  5. #endif
  6. #ifdef U8X8_HAVE_HW_I2C
  7. #include <Wire.h>
  8. #endif

  9. U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
  10. //U8G2_SSD1306_128X64_ALT0_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);   // same as the NONAME variant, but may solve the "every 2nd line skipped" problem

  11. typedef u8g2_uint_t u8g_uint_t;

  12. #define SECONDS 10
  13. uint8_t flip_color = 0;
  14. uint8_t draw_color = 1;

  15. void draw_set_screen(void) {
  16.   // graphic commands to redraw the complete screen should be placed here  
  17.   u8g2.setColorIndex(flip_color);
  18.   u8g2.drawBox( 0, 0, u8g2.getWidth(), u8g2.getHeight() );
  19. }

  20. //======================================
  21. #include "DHT.h"
  22. #define DHTPIN 2     // what digital pin we're connected to
  23. //#define DHTTYPE DHT11   // DHT 11
  24. #define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
  25. //#define DHTTYPE DHT21   // DHT 21 (AM2301)
  26. DHT dht(DHTPIN, DHTTYPE);
  27. //======================================

  28. void setup(void) {
  29. //    Serial.begin(9600);
  30.   dht.begin();       

  31.   u8g2.begin();
  32.   u8g2.enableUTF8Print();

  33.   // flip screen, if required
  34.   // u8g2.setRot180();

  35.   // assign default color value
  36.   draw_color = 1;         // pixel on
  37.   
  38. }


  39. #define SUN  0
  40. #define SUN_CLOUD  1
  41. #define CLOUD 2
  42. #define RAIN 3
  43. #define THUNDER 4

  44. void drawWeatherSymbol(u8g2_uint_t x, u8g2_uint_t y, uint8_t symbol)
  45. {
  46.   // fonts used:
  47.   // u8g2_font_open_iconic_embedded_6x_t
  48.   // u8g2_font_open_iconic_weather_6x_t
  49.   // encoding values, see: https://github.com/olikraus/u8g2/wiki/fntgrpiconic
  50.   
  51.   switch(symbol)
  52.   {
  53.     case SUN:
  54.       u8g2.setFont(u8g2_font_open_iconic_weather_6x_t);
  55.       u8g2.drawGlyph(x, y, 69);
  56.       break;
  57.     case SUN_CLOUD:
  58.       u8g2.setFont(u8g2_font_open_iconic_weather_6x_t);
  59.       u8g2.drawGlyph(x, y, 65);
  60.       break;
  61.     case CLOUD:
  62.       u8g2.setFont(u8g2_font_open_iconic_weather_6x_t);
  63.       u8g2.drawGlyph(x, y, 64);
  64.       break;
  65.     case RAIN:
  66.       u8g2.setFont(u8g2_font_open_iconic_weather_6x_t);
  67.       u8g2.drawGlyph(x, y, 67);
  68.       break;
  69.     case THUNDER:
  70.       u8g2.setFont(u8g2_font_open_iconic_embedded_6x_t);
  71.       u8g2.drawGlyph(x, y, 67);
  72.       break;      
  73.   }
  74. }

  75. void drawWeather(uint8_t symbol, int degree)
  76. {
  77. if (symbol==SUN)
  78.   {  
  79.   drawWeatherSymbol(0, 48, symbol);
  80.   u8g2.setFont(u8g2_font_logisoso32_tf);
  81.   u8g2.setCursor(48+3, 42);
  82.   u8g2.print(degree);
  83.   u8g2.print("°C");   // requires enableUTF8Print()
  84.   }
  85. else
  86.   {
  87.   drawWeatherSymbol(0, 48, symbol);
  88.   u8g2.setFont(u8g2_font_logisoso32_tf);
  89.   u8g2.setCursor(48+3, 42);
  90.   u8g2.print(degree);
  91.   u8g2.print("°%");   // requires enableUTF8Print()
  92.   }
  93. }

  94. /*
  95.   Draw a string with specified pixel offset.
  96.   The offset can be negative.
  97.   Limitation: The monochrome font with 8 pixel per glyph
  98. */
  99. void drawScrollString(int16_t offset, const char *s)
  100. {
  101.   static char buf[36];  // should for screen with up to 256 pixel width
  102.   size_t len;
  103.   size_t char_offset = 0;
  104.   u8g2_uint_t dx = 0;
  105.   size_t visible = 0;
  106.   len = strlen(s);
  107.   if ( offset < 0 )
  108.   {
  109.     char_offset = (-offset)/8;
  110.     dx = offset + char_offset*8;
  111.     if ( char_offset >= u8g2.getDisplayWidth()/8 )
  112.       return;
  113.     visible = u8g2.getDisplayWidth()/8-char_offset+1;
  114.     strncpy(buf, s, visible);
  115.     buf[visible] = '\0';
  116.     u8g2.setFont(u8g2_font_8x13_mf);
  117.     u8g2.drawStr(char_offset*8-dx, 62, buf);
  118.   }
  119.   else
  120.   {
  121.     char_offset = offset / 8;
  122.     if ( char_offset >= len )
  123.       return; // nothing visible
  124.     dx = offset - char_offset*8;
  125.     visible = len - char_offset;
  126.     if ( visible > u8g2.getDisplayWidth()/8+1 )
  127.       visible = u8g2.getDisplayWidth()/8+1;
  128.     strncpy(buf, s+char_offset, visible);
  129.     buf[visible] = '\0';
  130.     u8g2.setFont(u8g2_font_8x13_mf);
  131.     u8g2.drawStr(-dx, 62, buf);
  132.   }
  133.   
  134. }

  135. void draw(const char *s, uint8_t symbol, int degree)
  136. {
  137.   int16_t offset = -(int16_t)u8g2.getDisplayWidth();
  138.   int16_t len = strlen(s);
  139.   for(;;)
  140.   {
  141.     u8g2.firstPage();
  142.     do {
  143.       drawWeather(symbol, degree);
  144.       drawScrollString(offset, s);
  145.     } while ( u8g2.nextPage() );
  146.     delay(20);
  147.     offset+=2;
  148.     if ( offset > len*8+1 )
  149.       break;
  150.   }
  151. }


  152. void loop(void) {
  153.   float t = dht.readTemperature();
  154.   float h = dht.readHumidity();
  155.   
  156. //  Serial.print("Humidity: ");
  157. //  Serial.print(h);
  158. //  Serial.print(" %\t");
  159. //  Serial.print("Temperature: ");
  160. //  Serial.print(t);
  161. //  Serial.print(" *C ");

  162.   
  163.     draw("I Love You MyBaby.", SUN, t);
  164.     draw("Happy Birthday 2018", RAIN, h);

  165. //  draw("What a beautiful day!", SUN, 27);
  166. //  draw("The sun's come out!", SUN_CLOUD, 19);
  167. //  draw("It's raining cats and dogs.", RAIN, 8);
  168. //  draw("That sounds like thunder.", THUNDER, 12);
  169. //  draw("It's stopped raining", CLOUD, 15);
  170.   
  171.   
  172.   
  173. }
复制代码



回复

使用道具 举报

 楼主| 发表于 2018-12-19 14:09:01 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2018-12-19 15:01:07 | 显示全部楼层
天气信息是基于湿度和温度吗
回复 支持 反对

使用道具 举报

发表于 2018-12-19 15:16:46 | 显示全部楼层
生日快乐!
回复

使用道具 举报

 楼主| 发表于 2018-12-19 15:46:20 | 显示全部楼层

谢谢于总~
回复 支持 反对

使用道具 举报

发表于 2018-12-19 15:50:00 | 显示全部楼层
生日快乐

点评

谢谢浩哥~  发表于 2018-12-19 15:59
回复

使用道具 举报

 楼主| 发表于 2018-12-19 15:51:47 | 显示全部楼层
明浩 发表于 2018-12-19 15:01
天气信息是基于湿度和温度吗

估计只是在天气图标后面显示一下温度湿度。
真要正确显示天气,还得联网从气象网站的接口上获取。要是自己做气象站工程量好大啊......
那节目留着以后慢慢研究,还可以多水几贴~
回复 支持 反对

使用道具 举报

发表于 2018-12-20 14:38:32 | 显示全部楼层
ESP8266有一个项目可以连网显示的,也是用这种屏
回复 支持 反对

使用道具 举报

发表于 2018-12-21 09:06:21 | 显示全部楼层
很想玩单片机可是英文语句一个都看不懂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入磁动力

本版积分规则

QQ|小黑屋|手机版|Archiver|www.cdle.net 磁动力电子网 2001-2017 ( 粤ICP备10098153号

粤公网安备 44040402000001号

GMT+8, 2019-3-19 11:27

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.