在此帖子中,我们将建造一个基于Arduino的无线温度计,可以监控室温和外部环境温度。通过433 MHz RF链路发送和接收数据。
采用433MHz射频模块和DHT11传感器
拟议的项目利用Arduino作为大脑和心脏433 MHz发射器/接收器模块。
该项目分为两个独立的电路,其中一个带有433 MHz的接收机,LCD显示和DHT11传感器,将被放置在房间内测量室温。
另一个电路有433MHz发射器,DHT11传感器用于测量外部环境温度。两个电路都有一个Arduino。
放置在室内的电路将在LCD上显示内部和外部温度读数。
现在让我们看看433兆赫发射机/接收机模块。
发射和接收模块如图所示;它能够进行单工通信(单向)。接收器有4个引脚Vcc, GND和DATA引脚。有两个DATA引脚,它们是相同的,我们可以从两个引脚中的任何一个输出数据。
变送器更简单,只有Vcc, GND和数据输入管脚。我们必须将天线连接到两个模块,这是在文章的最后描述的,没有天线之间的通信将不会建立超过几英寸。
现在让我们看看这些模块是如何通信的。
现在假设我们将100Hz的时钟脉冲应用到发射器的数据输入管脚上。接收器将在接收器的数据引脚接收到信号的精确复制。
这是简单的对吗?是的,但是这个模块在调幅时工作,容易受噪音影响。根据作者的观察,如果发射机的数据引脚离开时没有任何信号超过250毫秒,接收机的数据输出引脚就会产生随机信号。
因此,它只适用于非关键数据传输。然而,这个项目与这个模块工作得非常好。
现在让我们看原理图。
接收方:
以上电路是arduino到LCD显示的连接。提供10K电位器调节液晶显示对比度。
以上是接收器电路。LCD显示屏应连接到此Arduino。
在编译代码之前,请下载以下库文件
电台负责人:github.com/PaulStoffregen/RadioHead
DHT传感器库:https://arduino-info.wikispaces.com/file/detail/dht-lib.zip
接收机方案。
//-------- r.g riish开发的程序-----//
# include < LiquidCrystal.h >
#include
# include < SPI.h >
# include < dht.h >
#定义DHTxxPIN A0
液晶LCD(12,11,5,4,3,2);
RH_ASK驱动程序(2000,7,9,10);
Int ack = 0;
dht dht;
无效的设置()
{
Serial.Begin(9600);
LCD.BEGIN(16,2);
如果(! driver.init ())
系列。println(“初始化失败”);
}
void循环()
{
ack = 0;
int chk = dht.read11(dhtxxpin);
开关(CHK)
{
案例dhtlib_error_connect:
ack = 1;
lcd.setCursor (0,0);
lcd.print(“:”);
液晶显示器。打印(没有数据);
延迟(1000);
休息;
}
如果(ack = = 0)
{
lcd.setCursor (0,0);
lcd.print(“:”);
lcd.print (DHT.temperature);
液晶显示器。打印(“C”);
延迟(2000);
}
uint8_t buf [rh_ask_max_message_len];
Uint8_t buflen = sizeof(buf);
如果司机。recv (buf &buflen))
{
int我;
string str =“”;
for(i = 0; i
str + = (char)缓冲区(我);
}
lcd.setCursor (0,1);
lcd.print(“外:”);
lcd.print (str);
以(str);
延迟(2000);
}
}
//-------- r.g riish开发的程序-----//
发射机:
以上是发射器的示意图,其与接收器相当简单。在这里,我们正在使用另一个Arduino板。DHT11传感器将在外观温度范围内感,并发送回接收器模块。
发射机与接收机之间的距离不应超过10米。如果它们之间有任何障碍,传播范围可能会缩小。
发射机的程序:
// ------- r.girish开发的计划---- //
#include
# include < dht.h >
#定义DHTxxPIN A0
# include < SPI.h >
Int ack = 0;
RH_ASK驱动程序(2000,9,2,10);
dht dht;
无效的设置()
{
Serial.Begin(9600);
如果(! driver.init ())
系列。println(“初始化失败”);
}
void循环()
{
ack = 0;
int chk = dht.read11(dhtxxpin);
开关(CHK)
{
案例dhtlib_error_connect:
ack = 1;
const char * temp =“无数据”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
休息;
}
如果(ack = = 0)
{
如果(DHT)。温度= = 15)
{
const char *temp = "15.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
if(dht.temperature == 16)
{
const char *temp = "16.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
if(dht.temperature == 17)
{
const char *temp = "17.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 18)
{
const char * temp =“18.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 19)
{
const char *temp = "19.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 20)
{
const char *temp = "20.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 21)
{
const char * temp =“21.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 22)
{
const char *temp = "22.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitpacketsent();;
}
如果(DHT)。温度= = 23)
{
const char * temp =“23.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 24)
{
const char *temp = "24.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 25)
{
const char * temp =“25.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 26)
{
const char *temp = "26.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 27)
{
const char * temp =“27.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
if(dht.temperature == 28)
{
const char *temp = "28.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
if(dht.temperature == 29)
{
const char * temp =“29.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
if(dht.temperature == 30)
{
const char *temp = "30.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 31)
{
const char *temp = "31.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 32)
{
const char * temp =“32.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 33)
{
const char *temp = "33.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 34)
{
const char *temp = "34.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 35)
{
const char *temp = "35.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 36)
{
const char * temp =“36.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 37)
{
const char *temp = "37.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 38)
{
const char *temp = "38.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 39)
{
const char *temp = "39.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
if(dht.temperature == 40)
{
const char *temp = "40.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
if(dht.temperature == 41)
{
const char * temp =“41.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
if(dht.temperature == 42)
{
const char *temp = "42.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
if(dht.temperature == 43)
{
const char * temp =“43.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 44)
{
const char * temp =“44.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
延迟(500);
如果(DHT)。温度= = 45)
{
const char *temp = "45.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 46)
{
const char * temp =“46.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 47)
{
const char *temp = "47.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 48)
{
const char *temp = "48.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 49)
{
const char * temp =“49.00 c”;
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
如果(DHT)。温度= = 50)
{
const char *temp = "50.00 C";
driver.send((uint8_t *)temp,strlen(temp));
driver.waitPacketSent ();
}
延迟(500);
}
}
// ------- r.girish开发的计划---- //
天线的结构:
如果您正在使用此项目构建项目433 MHz的模块,严格遵循以下结构细节为良好的范围。
使用单个芯线,应足够坚固以支持这种结构。您还可以使用绝缘铜线在底部拆下的绝缘材料以进行焊接连接。制作其中的两个,一个用于发射机,另一个用于接收器。
作者的无线温度计原型使用Arduino和433 MHz RF链接:
我只是尝试了2米的电线,它工作得很好,我只是用了24 AWG实心。我明天试试大一点的绞线。我很高兴有这个解决方案!非常感谢!
太棒了,诺曼,继续努力。
嗨Swagatam!我一直在使用433MHz RX / TX电路并有一些问题。我尝试了具有HT12E和HT 12D编码器/解码器的多个系统。有些工作和其他人没有。所以我决定尝试为射频远程控制继电器做好准备模块。再次,一些工作和其他人需要在15毫米下工作。我将天线更改为1/4波(173mm)和1/2波(346mm),成功。我无法让全波天线工作。最佳是发射器上的1/4波和接收器上的1/2波。在使用这些单位的同时,我注意到,如果我在发送时用手触摸发射器的天线,距离范围加倍甚至三倍。 How can I duplicate this without touching the antenna? Am I adding capacitance with my body? Please explain, so I can get greater distance with these wireless modules. I want to trigger the transmitter with a transistor, so I will not be there to touch the antenna. Thanks!
Hi Norman,这看起来很奇怪,我也使用过一些现成的RF 433MHz模块,但我从来没有遇到过这样的问题,我可以通过适当增加Tx/Rx天线轻松地从每个模块获得大约60米的距离。确保你的单位只来自知名品牌公司。
根据我的说法,简单灵活的电线作为这些装置的天线是最好的。只需将2米长的柔性电线与现有的盘绕天线端连接起来,就可以看到不同之处,您可以立即看到射程的增强。
我不认为这是身体的电容,而是我们的身体也像一个架空的天线,有很大的辐射面积,有助于更好地辐射信号。
谢谢!我要试试。什么AWG线,应该是实心线吗?它应该是直的还是盘绕的像他们的天线线盘绕?我现在使用的电线是24awg,是实心的,是直的。
任何普通的软线都可以尝试,例如14/36线,即14股36 SWG线。我更喜欢使用多股电线,这工作更好,特别是由于他们的灵活性,允许容易调整和优化他们的方向。