本帖最后由 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的范例修改而来 - #include <dht11.h>
- dht11 DHT11;
- #define DHT11PIN 7 //DHT11 PIN 7 连接UNO 7
- /*
- LCD Arduino
- PIN1 = GND
- PIN2 = 5V
- RS(CS) = 8;
- RW(SID)= 9;
- EN(CLK) = 3;
- PIN15 PSB = GND;
- */
-
- #include "LCD12864RSPI.h"
- #define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
- int num1,num2;//num1,湿度整数部分. num2为温度整数部分
- unsigned char msg1[]={
- 0xCA, 0xAA,
- 0xB6, 0xC8
- }; //湿度
-
- unsigned char msg2[]={
- 0xCE, 0xC2,
- 0xB6, 0xC8
- }; //温度
-
-
- unsigned char msg11[] ={};
- unsigned char msg22[]={};
-
- void setup()
- {
- num1=55;
-
- num2=99;
-
-
- // itoa(num1,str1*,10);
- // itoa(num2,str2*,10);
- Serial.begin(9600);
-
-
-
- LCDA.Initialise(); // 屏幕初始化
- delay(100);
- Serial.println("DHT11 TEST PROGRAM ");
- Serial.print("LIBRARY VERSION: ");
- Serial.println(DHT11LIB_VERSION);
- Serial.println();
-
-
- }
-
- void loop()
- {
- LCDA.CLEAR();//清屏
- delay(100);
-
- Serial.println("\n");
-
- int chk = DHT11.read(DHT11PIN);
-
- Serial.print("Read sensor: ");
- switch (chk)
- {
- case DHTLIB_OK:
- Serial.println("OK");
- break;
- case DHTLIB_ERROR_CHECKSUM:
- Serial.println("Checksum error");
- break;
- case DHTLIB_ERROR_TIMEOUT:
- Serial.println("Time out error");
- break;
- default:
- Serial.println("Unknown error");
- break;
- }
-
-
- Serial.print("Humidity (%): ");
- Serial.println((float)DHT11.humidity, 2);
- Serial.print("Temperature (oC): ");
- Serial.println((float)DHT11.temperature-2, 2);
- delay(2000);
-
-
-
- LCDA.DisplayString(0,2,msg1,AR_SIZE(msg1));//第一行第三格开始,显示文字 湿度
- LCDA.DisplayString(2,0,msg2,AR_SIZE(msg2));//第三行第十一格开始,显示文字 温度
-
-
- LCDA.DisplayString(0,5,(unsigned char *)DHT11.humidity,3);
- LCDA.DisplayString(2,5,(unsigned char *)(DHT11.temperature-2),3);
- /* char str[4];
- double temp =0;
- dtostrf(temp,4,2,str);
- LCDA.DisplayString(1,1,(unsigned char *)str,sizeof(str));
- */
-
-
- delay(3000);
-
-
- }
复制代码
用这个程序编译没有问题,下载 后,串口能正常显示温度和湿度,
它会在第一行显示汉字湿度和第三行显示汉字温度,
但是应当显示湿度的地方,显示的却是乱码。
有办法解决吗?
我曾尝试定义 unsigned char * st1[];
但是无法将DHT11.humidity,这个数据类型转换成unsigned char * ,导至LCDA.DisplayString这个函数无法用。
问题已经解决了现在把Arduino代码贴出来留作存档,
- /*DHT11温度和湿度在12864上显示不出来,求助?
-
- */
- /*参考了 绿林网页[url]http://www.geek-workshop.com/thread-2737-1-1.html[/url]的代码
- 终于可以显示dht11传来的数字了
- 主要用了void s_wsd(int r,int c)这个函数,和这个字符数组str2[][2]
- */
- #include <dht11.h>
- dht11 DHT11;
- #define DHT11PIN 7 //DHT11 PIN 7 连接UNO 7
- /*
- LCD Arduino
- PIN1 = GND
- PIN2 = 5V
- RS(CS) = 8;
- RW(SID)= 9;
- EN(CLK) = 3;
- PIN15 PSB = GND;
- */
- #include "LCD12864RSPI.h"
- #define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
- // ⊙℃%:
- unsigned char str2[][2]={
- 0x20,0x20,0xA1,0xD1,0xa1,0xe6,0xa3,0xa5,0xA3,0xBA};
- unsigned char msg1[]={
- 0xCA, 0xAA,
- 0xB6, 0xC8
- }; //湿度
- unsigned char msg2[]={
- 0xCE, 0xC2,
- 0xB6, 0xC8
- }; //温度
- void s_wsd(int r,int c)//在12864的X,Y坐标点显示Dht11的温度和湿度
- {
- char tws[11];
- DHT11.read(DHT11PIN);
- snprintf(tws, sizeof(tws), "%2d%.2s %2d%.2s",(DHT11.temperature-2),str2[2],DHT11.humidity,str2[3]);
- LCDA.DisplayString(r,c,(unsigned char *)tws,sizeof(tws));
- }
- void setup()
- {
- Serial.begin(9600);
- LCDA.Initialise(); // 屏幕初始化
- delay(100);
- Serial.println("DHT11 TEST PROGRAM ");
- Serial.print("LIBRARY VERSION: ");
- Serial.println(DHT11LIB_VERSION);
- Serial.println();
- }
- void loop()
- {
- LCDA.CLEAR();//清屏
- delay(100);
- Serial.println("\n");
- int chk = DHT11.read(DHT11PIN);
- Serial.print("Read sensor: ");
- switch (chk)
- {
- case DHTLIB_OK:
- Serial.println("OK");
- break;
- case DHTLIB_ERROR_CHECKSUM:
- Serial.println("Checksum error");
- break;
- case DHTLIB_ERROR_TIMEOUT:
- Serial.println("Time out error");
- break;
- default:
- Serial.println("Unknown error");
- break;
- }
- Serial.print("Humidity (%): ");
- Serial.println((float)DHT11.humidity, 2);
- Serial.print("Temperature (oC): ");
- Serial.println((float)DHT11.temperature-2, 2);
- delay(2000);
- //以下是显示温度和湿度
- LCDA.DisplayString(0,0,msg2,sizeof(msg2));//在第一行0,0 显示汉字温度
- LCDA.DisplayString(0,3,msg1,sizeof(msg1));//在第一行0,3 显示汉字湿度
- s_wsd(2,0);//在第三行显示具体的温度和湿度值
- //注:这个坐标值汉字和温度、湿度值正好上下对齐了。
- delay(3000);
- }
- 又修改了程序,现完整的附上来,
- 免得忘记。
- /*DHT11温度和湿度在12864上显示不出来,求助?
-
- */
- /*参考了 绿林网页[url]http://www.geek-workshop.com/thread-2737-1-1.html[/url]的代码
- 终于可以显示dht11传来的数字了
- 主要用了这个函数,和这个字符数组str2[][2]
- 参考了其它人的程序,这个也可以用 void my_test()
- */
- #include <dht11.h>
- dht11 DHT11;
- #define DHT11PIN 7 //DHT11 PIN 7 连接UNO 7
- /*
- LCD Arduino
- PIN1 = GND
- PIN2 = 5V
- RS(CS) = 8;
- RW(SID)= 9;
- EN(CLK) = 3;
- PIN15 PSB = GND;
- */
- #include "LCD12864RSPI.h"
- #define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
- // ⊙℃%:
- unsigned char str2[][2]={
- 0x20,0x20,0xA1,0xD1,0xa1,0xe6,0xa3,0xa5,0xA3,0xBA};
- unsigned char msg1[]={
- 0xCA, 0xAA,
- 0xB6, 0xC8
- }; //湿度
- unsigned char msg2[]={
- 0xCE, 0xC2,
- 0xB6, 0xC8
- }; //温度
- void s_wsd(int r,int c)//在12864的X,Y坐标点显示Dht11的温度和湿度
- {
- char tws[11];
- DHT11.read(DHT11PIN);
- snprintf(tws, sizeof(tws), "%2d%.2s %2d%.2s",(DHT11.temperature-2),str2[2],DHT11.humidity,str2[3]);
- LCDA.DisplayString(r,c,(unsigned char *)tws,sizeof(tws));
- }
- void my_test()//显示温度、湿度值
- {
- double temp=0;//定义中间变量
- char str[4]; //定义温度值存储数组,4位,其中3位为数字,1位为小数点
- DHT11.read(DHT11PIN);
- temp=DHT11.temperature-2;
- dtostrf(temp,4,2,str);//将获取的数值转化为字符型数组
- LCDA.DisplayString(3,0,(unsigned char *)str,sizeof(str)); //在第四行第三位显示温度值
- temp=0;
- temp=DHT11.humidity;//将湿度值 赋给中间变量temp
- dtostrf(temp,4,2,str);//将获取的数值转化为字符型数组
- LCDA.DisplayString(3,3,(unsigned char *)str,sizeof(str)); //在第四行第7位显示湿度值
- }
- void setup()
- {
- Serial.begin(9600);
- LCDA.Initialise(); // 屏幕初始化
- delay(100);
- Serial.println("DHT11 TEST PROGRAM ");
- Serial.print("LIBRARY VERSION: ");
- Serial.println(DHT11LIB_VERSION);
- Serial.println();
- }
- void loop()
- {
- LCDA.CLEAR();//清屏
- delay(100);
- Serial.println("\n");
- int chk = DHT11.read(DHT11PIN);
- Serial.print("Read sensor: ");
- switch (chk)
- {
- case DHTLIB_OK:
- Serial.println("OK");
- break;
- case DHTLIB_ERROR_CHECKSUM:
- Serial.println("Checksum error");
- break;
- case DHTLIB_ERROR_TIMEOUT:
- Serial.println("Time out error");
- break;
- default:
- Serial.println("Unknown error");
- break;
- }
- Serial.print("Humidity (%): ");
- Serial.println((float)DHT11.humidity, 2);
- Serial.print("Temperature (oC): ");
- Serial.println((float)DHT11.temperature-2, 2);
- delay(2000);
- //以下是显示温度和湿度
- LCDA.DisplayString(0,0,msg2,sizeof(msg2));//在第一行0,0 显示汉字温度
- LCDA.DisplayString(0,3,msg1,sizeof(msg1));//在第一行0,3 显示汉字湿度
- //s_wsd(2,0);//在第三行显示具体的温度和湿度值
- my_test();
- //注:这个坐标值汉字和温度、湿度值正好上下对齐了。
- delay(3000);
- }
复制代码 |