求助,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);
}
呵呵,没学过C++吧,int怎么能转成char数组?? 用gcvt
double a=123.45;
char *ptr;
gcvt(a,5,ptr);
Serial.println(ptr); caizixian 发表于 2013-7-14 21:57 static/image/common/back.gif
用gcvt
double a=123.45;
char *ptr;
本想用,但是编译时找不到gcvt,
只能放弃了。 楼主dtostrf是哪里的?哪个库里的?为什么我把你的代码复制下后它没变色也没定义,这个在别的程序也能直接使用吗?是DHT11库里的?:'(:'(:'(:'(
页:
[1]