在这篇文章中,我们将构建一个基于Arduino的无线温度计,该温度计可以监视室温和外部环境温度。数据通过433 MHz RF链接传输并接收。
使用433MHz RF模块和DHT11传感器
拟议的项目将Arduino用作大脑和心脏433 MHz发射器/接收器模块。
该项目分为两个单独的电路,一个电路具有433 MHz接收器,LCD显示器和DHT11传感器,该传感器将放置在房间内,还将测量室温。
另一个电路具有433MHz发射器,DHT11传感器用于测量外部环境温度。两个电路都有一个Arduino。
放置在房间内的电路将在LCD上显示内部和外部温度读数。
现在,让我们看一下433 MHz发射器/接收器模块。
发射器和接收器模块如上所述;它能够进行单纯通信(一种方式)。接收器有4个引脚VCC,GND和数据引脚。有两个数据引脚,它们是相同的,我们可以从两个引脚中的任何一个中输出数据。
发射器要简单得多,它仅具有VCC,GND和数据输入引脚。我们必须将天线连接到文章末尾描述的两个模块,而不会在几英寸以上建立天线通信。
现在,让我们看看这些模块如何通信。
现在假设我们将100Hz的时钟脉冲应用于发射机的数据输入引脚。接收器将在接收器的数据引脚处收到信号的精确副本。
这很简单吧?是的……但是这个模块可在AM上起作用,并且容易受到噪音的影响。根据作者的观察,如果发射机的数据引脚没有任何信号超过250毫秒,则接收器数据输出引脚会产生随机信号。
因此,它仅适用于非关键数据传输。但是,该项目与此模块非常有效。
现在让我们继续进行原理图。
接收者:
上面的电路是Arduino到LCD显示连接。提供10K电位器用于调整LCD显示的对比度。
以上是接收器电路。LCD显示器应连接到此Arduino。
在编译代码之前,请下载以下库文件
广播负责人:github.com/paulstoffregen/radiohead
DHT传感器库:https://arduino-info.wikispaces.com/file/detail/detail/dht-lib.zip
接收器程序:
// --------由R.Girish开发的程序----- //
#include
#include
#include
#include
#Define dhtxxpin a0
LiquidCrystal LCD(12,11,5,4,3,2);
Rh_ask驱动程序(2000、7、9、10);
int ack = 0;
DHT DHT;
void setup()
{
Serial.Begin(9600);
lcd.Begin(16,2);
如果(!driver.init())
serial.println(“启动失败”);
}
void loop()
{
ack = 0;
int chk = dht.Read11(dhtxxpin);
开关(CHK)
{
case dhtlib_error_connect:
ack = 1;
lcd.setcursor(0,0);
lcd.print(“内部:”);
lcd.print(“无数据”);
延迟(1000);
休息;
}
if(ack == 0)
{
lcd.setcursor(0,0);
lcd.print(“内部:”);
lcd.print(dht.temperature);
lcd.print(“ c”);
延迟(2000);
}
uint8_t buf [rh_ask_max_message_len];
uint8_t buflen = sizeof(buf);
if(driver.recv(buf,&buflen))
{
int i;
字符串str =“”;
for(i = 0; i
str +=(char)buf [i];
}
lcd.setcursor(0,1);
lcd.print(“外部:”);
lcd.print(str);
serial.println(str);
延迟(2000);
}
}
// --------由R.Girish开发的程序----- //
发射机:
以上是发射器的示意图,它与接收器相当简单。在这里,我们使用了另一个Arduino板。DHT11传感器将感觉到外部温度并发送回接收器模块。
发射器和接收器之间的距离不应超过10米。如果它们之间有任何障碍,则传输范围可能会减少。
发射器程序:
// ------程序由R.Girish开发---- //
#include
#include
#Define dhtxxpin a0
#include
int ack = 0;
Rh_ask驱动程序(2000,9,2,10);
DHT DHT;
void setup()
{
Serial.Begin(9600);
如果(!driver.init())
serial.println(“启动失败”);
}
void loop()
{
ack = 0;
int chk = dht.Read11(dhtxxpin);
开关(CHK)
{
case dhtlib_error_connect:
ack = 1;
const char *temp =“无数据”;
驱动程序。
driver.waitpacketsent();
休息;
}
if(ack == 0)
{
if(dht.temperature == 15)
{
const char *temp =“ 15.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 16)
{
const char *temp =“ 16.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 17)
{
const char *temp =“ 17.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 18)
{
const char *temp =“ 18.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 19)
{
const char *temp =“ 19.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 20)
{
const char *temp =“ 20.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 21)
{
const char *temp =“ 21.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 22)
{
const char *temp =“ 22.00 c”;
驱动程序。
driver.waitpacketsent();;
}
if(dht.temperature == 23)
{
const char *temp =“ 23.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 24)
{
const char *temp =“ 24.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 25)
{
const char *temp =“ 25.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 26)
{
const char *temp =“ 26.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 27)
{
const char *temp =“ 27.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 28)
{
const char *temp =“ 28.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 29)
{
const char *temp =“ 29.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 30)
{
const char *temp =“ 30.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 31)
{
const char *temp =“ 31.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 32)
{
const char *temp =“ 32.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 33)
{
const char *temp =“ 33.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 34)
{
const char *temp =“ 34.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 35)
{
const char *temp =“ 35.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 36)
{
const char *temp =“ 36.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 37)
{
const char *temp =“ 37.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 38)
{
const char *temp =“ 38.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 39)
{
const char *temp =“ 39.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 40)
{
const char *temp =“ 40.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 41)
{
const char *temp =“ 41.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 42)
{
const char *temp =“ 42.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 43)
{
const char *temp =“ 43.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 44)
{
const char *temp =“ 44.00 c”;
驱动程序。
driver.waitpacketsent();
}
延迟(500);
if(dht.temperature == 45)
{
const char *temp =“ 45.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 46)
{
const char *temp =“ 46.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 47)
{
const char *temp =“ 47.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 48)
{
const char *temp =“ 48.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 49)
{
const char *temp =“ 49.00 c”;
驱动程序。
driver.waitpacketsent();
}
if(dht.temperature == 50)
{
const char *temp =“ 50.00 c”;
驱动程序。
driver.waitpacketsent();
}
延迟(500);
}
}
// ------程序由R.Girish开发---- //
天线的构造:
如果您正在使用此项目建立项目433 MHz模块,严格遵循以下构造细节。
使用一条应足够坚固以支撑此结构的单核线。您也可以使用隔热铜线,并在底部除去隔热材料以进行焊接。制作其中两个,一个用于发射器,另一个用于接收器。
作者的无线温度计原型使用Arduino和433 MHz RF链接:
嗨,斯瓦加塔姆!我一直在使用433MHz RX/TX电路,并有一些问题。我尝试了使用HT12E&HT 12D编码器/解码器的几个系统。有些工作,有些工作则没有。因此,我决定尝试用于RF遥控继电器的现成模块。同样,有些工作和其他工作需要在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!
嗨,诺曼,这看起来很奇怪……我还使用了许多现成的RF 433MHz模块,但我从未遇到过它们的任何此类问题,我可以通过适当地增加TX/RX来轻松获得大约60米的范围。天线。确保您的单位仅来自知名和品牌公司。
据我说,简单的柔性电线是这些单元的触角。只需将2米长的柔性电线与现有的盘绕天线末端连接,然后看到差异,您可能会立即见证增强的范围。
我认为它不是身体的电容,而是我们的身体也像具有较大辐射区域的高架天线,这有助于以更好的效率辐射信号。
谢谢!我会尝试的。什么AWG电线应该是实心芯线?当它们的天线线被盘绕时,它应该是笔直还是盘绕?我现在使用的电线为24 AWG,是坚固的核心,是直的。
可以尝试任何普通的柔性线,例如14/36线,即14股36 SWG电线。我更喜欢使用多链线更好,尤其是由于它们的灵活性,它可以轻松调整和优化其方向。
我刚刚尝试了2米的电线,它运行效果很好,我只使用了24个AWG实心芯。明天我将尝试更大的搁浅电线。我很高兴有这个解决方案!非常感谢!
那太好了诺曼……继续做好工作。