tom 发表于 2013-7-14 20:31:00

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

本帖最后由 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

/*
LCDArduino
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 )


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

unsignedchar 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;
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上显示不出来,求助?

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

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


/*
LCDArduino
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 )



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

unsignedchar 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;
DHT11.read(DHT11PIN);
snprintf(tws, sizeof(tws), "%2d%.2s%2d%.2s",(DHT11.temperature-2),str2,DHT11.humidity,str2);
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上显示不出来,求助?

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

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


/*
LCDArduino
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 )



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

unsignedchar 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;
DHT11.read(DHT11PIN);
snprintf(tws, sizeof(tws), "%2d%.2s%2d%.2s",(DHT11.temperature-2),str2,DHT11.humidity,str2);
LCDA.DisplayString(r,c,(unsigned char *)tws,sizeof(tws));
}
void my_test()//显示温度、湿度值
{
double temp=0;//定义中间变量
char str; //定义温度值存储数组,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);



}



caizixian 发表于 2013-7-14 21:56:14

呵呵,没学过C++吧,int怎么能转成char数组??

caizixian 发表于 2013-7-14 21:57:21

用gcvt
double a=123.45;
char *ptr;
gcvt(a,5,ptr);
Serial.println(ptr);

tom 发表于 2013-7-16 22:00:38

caizixian 发表于 2013-7-14 21:57 static/image/common/back.gif
用gcvt
double a=123.45;
char *ptr;


本想用,但是编译时找不到gcvt,
只能放弃了。

書雲 发表于 2017-12-3 16:53:58

楼主dtostrf是哪里的?哪个库里的?为什么我把你的代码复制下后它没变色也没定义,这个在别的程序也能直接使用吗?是DHT11库里的?:'(:'(:'(:'(
页: [1]
查看完整版本: 求助,DHT11的温度和湿度如何显示到12864液晶显示器上?