极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27550|回复: 4

求助,DHT11的温度和湿度如何显示到12864液晶显示器上?

[复制链接]
发表于 2013-7-14 20:31:00 | 显示全部楼层 |阅读模式
本帖最后由 tom 于 2013-8-6 23:30 编辑

求助,DHT11的温度和湿度如何显示到12864液晶显示器上?

硬件,Arduino (2012版Mango) + Dht11传感器模块(自制)+12864(使用串口接线)

硬件接线
Dht11传感器模块接在7号端口上。
Dht11 VCC 接Arduino VCC
Dht11 GND 接Arduino GND


12864使用串口接法
vss 接Arduino GND
VCC 接Arduino 3.3V
RS  接Arduino数据端口8
RW  接Arduino数据端口9
EN   接Arduino数据端口3
PIN15 PSB 接Arduino GND
库使用弘毅的arduino学习笔记15 - 12864液晶实验 链接如下:
http://www.geek-workshop.com/thread-91-1-1.html

IDE使用1.0.2和它配套的12864库(LCD12864RSPI_1.0.zip )

以下是我的代码,根据dht11的范例修改而来
  1. #include <dht11.h>
  2. dht11 DHT11;
  3. #define DHT11PIN 7 //DHT11 PIN 7 连接UNO 7

  4. /*
  5. LCD  Arduino
  6. PIN1 = GND
  7. PIN2 = 5V
  8. RS(CS) = 8;
  9. RW(SID)= 9;
  10. EN(CLK) = 3;
  11. PIN15 PSB = GND;
  12. */

  13. #include "LCD12864RSPI.h"
  14. #define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )


  15. int num1,num2;//num1,湿度整数部分. num2为温度整数部分

  16. unsigned  char msg1[]={
  17.   0xCA, 0xAA,
  18.   0xB6, 0xC8
  19.      };                    //湿度

  20. unsigned char msg2[]={
  21.   0xCE, 0xC2,
  22.   0xB6, 0xC8
  23.      };                    //温度


  24. unsigned char msg11[] ={};
  25. unsigned char msg22[]={};
  26.   


  27. void setup()
  28. {
  29.    num1=55;
  30.   
  31.   num2=99;
  32.   
  33.   
  34. //  itoa(num1,str1*,10);
  35. // itoa(num2,str2*,10);
  36.   Serial.begin(9600);
  37.   

  38.   
  39.   LCDA.Initialise(); // 屏幕初始化
  40.   delay(100);

  41.   Serial.println("DHT11 TEST PROGRAM ");
  42.   Serial.print("LIBRARY VERSION: ");
  43.   Serial.println(DHT11LIB_VERSION);
  44.   Serial.println();
  45.   
  46.   
  47. }

  48. void loop()
  49. {
  50.   LCDA.CLEAR();//清屏
  51. delay(100);
  52.   
  53.   Serial.println("\n");

  54.   int chk = DHT11.read(DHT11PIN);

  55.   Serial.print("Read sensor: ");
  56.   switch (chk)
  57.   {
  58.     case DHTLIB_OK:
  59.                 Serial.println("OK");
  60.                 break;
  61.     case DHTLIB_ERROR_CHECKSUM:
  62.                 Serial.println("Checksum error");
  63.                 break;
  64.     case DHTLIB_ERROR_TIMEOUT:
  65.                 Serial.println("Time out error");
  66.                 break;
  67.     default:
  68.                 Serial.println("Unknown error");
  69.                 break;
  70.   }

  71.   
  72.   Serial.print("Humidity (%): ");
  73.   Serial.println((float)DHT11.humidity, 2);
  74.   Serial.print("Temperature (oC): ");
  75.   Serial.println((float)DHT11.temperature-2, 2);
  76.   delay(2000);


  77.   
  78.    LCDA.DisplayString(0,2,msg1,AR_SIZE(msg1));//第一行第三格开始,显示文字 湿度
  79.    LCDA.DisplayString(2,0,msg2,AR_SIZE(msg2));//第三行第十一格开始,显示文字 温度
  80.    
  81.   
  82.    LCDA.DisplayString(0,5,(unsigned char *)DHT11.humidity,3);
  83.      LCDA.DisplayString(2,5,(unsigned char *)(DHT11.temperature-2),3);
  84. /*  char str[4];
  85.   double temp =0;
  86.   dtostrf(temp,4,2,str);
  87.   LCDA.DisplayString(1,1,(unsigned char *)str,sizeof(str));
  88.   */
  89.   
  90.   
  91.   delay(3000);
  92.   

  93.   
  94. }
复制代码

用这个程序编译没有问题,下载 后,串口能正常显示温度和湿度,
它会在第一行显示汉字湿度和第三行显示汉字温度,


但是应当显示湿度的地方,显示的却是乱码。

有办法解决吗?

我曾尝试定义 unsigned char * st1[];

但是无法将DHT11.humidity,这个数据类型转换成unsigned char * ,导至LCDA.DisplayString这个函数无法用。



问题已经解决了现在把Arduino代码贴出来留作存档,

  1. /*DHT11温度和湿度在12864上显示不出来,求助?

  2. */
  3. /*参考了 绿林网页[url]http://www.geek-workshop.com/thread-2737-1-1.html[/url]的代码
  4. 终于可以显示dht11传来的数字了
  5. 主要用了void s_wsd(int r,int c)这个函数,和这个字符数组str2[][2]
  6. */
  7. #include <dht11.h>
  8. dht11 DHT11;

  9. #define DHT11PIN 7 //DHT11 PIN 7 连接UNO 7


  10. /*
  11. LCD  Arduino
  12. PIN1 = GND
  13. PIN2 = 5V
  14. RS(CS) = 8;
  15. RW(SID)= 9;
  16. EN(CLK) = 3;
  17. PIN15 PSB = GND;
  18. */

  19. #include "LCD12864RSPI.h"
  20. #define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )



  21. //  ⊙℃%:
  22. unsigned char str2[][2]={
  23.   0x20,0x20,0xA1,0xD1,0xa1,0xe6,0xa3,0xa5,0xA3,0xBA};

  24. unsigned  char msg1[]={
  25.   0xCA, 0xAA,
  26.   0xB6, 0xC8
  27. };                    //湿度

  28. unsigned char msg2[]={
  29.   0xCE, 0xC2,
  30.   0xB6, 0xC8
  31. };                    //温度




  32. void s_wsd(int r,int c)//在12864的X,Y坐标点显示Dht11的温度和湿度
  33. {
  34.   char tws[11];
  35.   DHT11.read(DHT11PIN);
  36.   snprintf(tws, sizeof(tws), "%2d%.2s  %2d%.2s",(DHT11.temperature-2),str2[2],DHT11.humidity,str2[3]);
  37.   LCDA.DisplayString(r,c,(unsigned char *)tws,sizeof(tws));
  38. }

  39. void setup()
  40. {

  41.   Serial.begin(9600);



  42.   LCDA.Initialise(); // 屏幕初始化
  43.   delay(100);

  44.   Serial.println("DHT11 TEST PROGRAM ");
  45.   Serial.print("LIBRARY VERSION: ");
  46.   Serial.println(DHT11LIB_VERSION);
  47.   Serial.println();


  48. }

  49. void loop()
  50. {
  51.   LCDA.CLEAR();//清屏
  52.   delay(100);

  53.   Serial.println("\n");

  54.   int chk = DHT11.read(DHT11PIN);

  55.   Serial.print("Read sensor: ");
  56.   switch (chk)
  57.   {
  58.   case DHTLIB_OK:
  59.     Serial.println("OK");
  60.     break;
  61.   case DHTLIB_ERROR_CHECKSUM:
  62.     Serial.println("Checksum error");
  63.     break;
  64.   case DHTLIB_ERROR_TIMEOUT:
  65.     Serial.println("Time out error");
  66.     break;
  67.   default:
  68.     Serial.println("Unknown error");
  69.     break;
  70.   }


  71.   Serial.print("Humidity (%): ");
  72.   Serial.println((float)DHT11.humidity, 2);
  73.   Serial.print("Temperature (oC): ");
  74.   Serial.println((float)DHT11.temperature-2, 2);
  75.   delay(2000);




  76.   //以下是显示温度和湿度
  77.   LCDA.DisplayString(0,0,msg2,sizeof(msg2));//在第一行0,0 显示汉字温度
  78.   LCDA.DisplayString(0,3,msg1,sizeof(msg1));//在第一行0,3 显示汉字湿度


  79.   s_wsd(2,0);//在第三行显示具体的温度和湿度值

  80.   //注:这个坐标值汉字和温度、湿度值正好上下对齐了。

  81.   delay(3000);



  82. }



  83. 又修改了程序,现完整的附上来,
  84. 免得忘记。
  85. /*DHT11温度和湿度在12864上显示不出来,求助?

  86. */
  87. /*参考了 绿林网页[url]http://www.geek-workshop.com/thread-2737-1-1.html[/url]的代码
  88. 终于可以显示dht11传来的数字了
  89. 主要用了这个函数,和这个字符数组str2[][2]
  90. 参考了其它人的程序,这个也可以用 void my_test()
  91. */
  92. #include <dht11.h>
  93. dht11 DHT11;

  94. #define DHT11PIN 7 //DHT11 PIN 7 连接UNO 7


  95. /*
  96. LCD  Arduino
  97. PIN1 = GND
  98. PIN2 = 5V
  99. RS(CS) = 8;
  100. RW(SID)= 9;
  101. EN(CLK) = 3;
  102. PIN15 PSB = GND;
  103. */

  104. #include "LCD12864RSPI.h"
  105. #define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )



  106. //  ⊙℃%:
  107. unsigned char str2[][2]={
  108.   0x20,0x20,0xA1,0xD1,0xa1,0xe6,0xa3,0xa5,0xA3,0xBA};

  109. unsigned  char msg1[]={
  110.   0xCA, 0xAA,
  111.   0xB6, 0xC8
  112. };                    //湿度

  113. unsigned char msg2[]={
  114.   0xCE, 0xC2,
  115.   0xB6, 0xC8
  116. };                    //温度




  117. void s_wsd(int r,int c)//在12864的X,Y坐标点显示Dht11的温度和湿度
  118. {
  119.   char tws[11];
  120.   DHT11.read(DHT11PIN);
  121.   snprintf(tws, sizeof(tws), "%2d%.2s  %2d%.2s",(DHT11.temperature-2),str2[2],DHT11.humidity,str2[3]);
  122.   LCDA.DisplayString(r,c,(unsigned char *)tws,sizeof(tws));
  123. }
  124. void my_test()//显示温度、湿度值
  125. {
  126.   double temp=0;//定义中间变量
  127.   char str[4]; //定义温度值存储数组,4位,其中3位为数字,1位为小数点
  128.   DHT11.read(DHT11PIN);

  129.   temp=DHT11.temperature-2;
  130.   dtostrf(temp,4,2,str);//将获取的数值转化为字符型数组
  131.   LCDA.DisplayString(3,0,(unsigned char *)str,sizeof(str)); //在第四行第三位显示温度值

  132.   temp=0;
  133.   temp=DHT11.humidity;//将湿度值 赋给中间变量temp
  134.   dtostrf(temp,4,2,str);//将获取的数值转化为字符型数组
  135.   LCDA.DisplayString(3,3,(unsigned char *)str,sizeof(str)); //在第四行第7位显示湿度值

  136. }

  137. void setup()
  138. {

  139.   Serial.begin(9600);



  140.   LCDA.Initialise(); // 屏幕初始化
  141.   delay(100);

  142.   Serial.println("DHT11 TEST PROGRAM ");
  143.   Serial.print("LIBRARY VERSION: ");
  144.   Serial.println(DHT11LIB_VERSION);
  145.   Serial.println();


  146. }

  147. void loop()
  148. {
  149.   LCDA.CLEAR();//清屏
  150.   delay(100);

  151.   Serial.println("\n");

  152.   int chk = DHT11.read(DHT11PIN);

  153.   Serial.print("Read sensor: ");
  154.   switch (chk)
  155.   {
  156.   case DHTLIB_OK:
  157.     Serial.println("OK");
  158.     break;
  159.   case DHTLIB_ERROR_CHECKSUM:
  160.     Serial.println("Checksum error");
  161.     break;
  162.   case DHTLIB_ERROR_TIMEOUT:
  163.     Serial.println("Time out error");
  164.     break;
  165.   default:
  166.     Serial.println("Unknown error");
  167.     break;
  168.   }


  169.   Serial.print("Humidity (%): ");
  170.   Serial.println((float)DHT11.humidity, 2);
  171.   Serial.print("Temperature (oC): ");
  172.   Serial.println((float)DHT11.temperature-2, 2);
  173.   delay(2000);




  174.   //以下是显示温度和湿度
  175.   LCDA.DisplayString(0,0,msg2,sizeof(msg2));//在第一行0,0 显示汉字温度
  176.   LCDA.DisplayString(0,3,msg1,sizeof(msg1));//在第一行0,3 显示汉字湿度


  177.   //s_wsd(2,0);//在第三行显示具体的温度和湿度值
  178.   my_test();
  179.   //注:这个坐标值汉字和温度、湿度值正好上下对齐了。

  180.   delay(3000);



  181. }



复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-7-14 21:56:14 | 显示全部楼层
呵呵,没学过C++吧,int怎么能转成char数组??
回复 支持 反对

使用道具 举报

发表于 2013-7-14 21:57:21 | 显示全部楼层
用gcvt
[pre lang="c" line="1"]double a=123.45;
char *ptr;
gcvt(a,5,ptr);
Serial.println(ptr);[/code]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-16 22:00:38 | 显示全部楼层
caizixian 发表于 2013-7-14 21:57
用gcvt
double a=123.45;
char *ptr;

本想用,但是编译时找不到gcvt,
只能放弃了。
回复 支持 反对

使用道具 举报

发表于 2017-12-3 16:53:58 | 显示全部楼层
楼主dtostrf是哪里的?哪个库里的?为什么我把你的代码复制下后它没变色也没定义,这个在别的程序也能直接使用吗?是DHT11库里的?
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 22:20 , Processed in 0.041192 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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