所有关于电路
项目

做一个无线和Arduino温度计

2015年10月29日通过Jens Christoffersen

学习如何使用一个433 mhz接口328 p-pu射频模块。在本文中,我们将做一个电路DHT11传感器和射频发射机。我们也会与一个433 mhz射频接收器接收电路和液晶显示。

学习如何使用一个433 mhz接口328 p-pu射频模块。在本文中,我将做一个电路DHT11传感器和射频发射机。我也会做一个接收电路,433 mhz射频接收机和液晶显示器。

需求

介绍

在本文中,我将向您展示如何做一个电路测量温度和相对湿度和发送这些度量与现成的433 mhz射频模块。DHT11的温度和湿度传感器。你可以阅读关于传感器的另一篇文章在这里

有很多方法可以用一个发送少量的数据Arduino或其他ATMega-microcontrollers。其中一个是使用一个已经像RCSwitch图书馆,电台司令,或者VirtualWire。也可以用单片机内置的UART发送原始数据功能。使用内置的UART并不推荐,因为接收器将接收各种各样的噪声,所以单片机不会按你所希望的方式。在本文中,我使用VirtualWire图书馆发送和接收数据。图书馆和Arduino IDE 1.6.2 1.6.5工作。

433 mhz的发射机模块将振动噪声和传输时不传输数据。它还可能干扰其他射频应用程序。为了防止这样的事情发生,我把它当它传送,并把它当它不是传输。

*请注意,所有的代码在本文底部的压缩形式

硬件

我们需要2块图。一个用于发射电路和接收电路。

发送器:

我想要:

  • 一种程序单片机- > ISP
  • 一个传感器来测量温度和湿度- > DHT11
  • 一个单片机处理数据- > ATMega328p
  • 一种方法来把这个无线射频模块- > 433 mhz

接收方:

我想要:

  • 方法接收射频信号- > 433 mhz射频模块
  • 一种方法来处理接收的数据- > Arduino兆
  • 一种方式来显示温度和湿度- > 16 x2液晶

原理图

发射机(点击大图):

在这个例子中,我不打算把单片机上的未使用的针垫为进一步发展。这只会使在案板上。

接收方:

请注意,接收器是一个Arduino大型,不在示意图。按照示意图上的标签连接到Arduino兆。

零件清单

发送器:

接收方:

软件

首先是发射机软件:

/ / # Include <VirtualWire包括所需的库。h > # include <DHT。h > / /引入# define dhtPin 4 # define dhtType DHT11 # define txPowerPin 8 / /使用DHT库DHT DHT (dhtPin dhtType);/ /变量char msg0 [3];char msg1 [3];int tem = 0;int哼= 0;/ /设置函数-运行一次无效的设置(){pinMode (txPowerPin、输出);pinMode (txPowerPin、低);vw_setup (4800);/ / VirtualWire通信速度vw_set_tx_pin (9); // VirtualWire transmit pin } // Loop function - runs forever void loop() { digitalWrite(txPowerPin, HIGH); hum = dht.readHumidity(); // Variable holding humidity tem = dht.readTemperature(); // Variable holding temperature itoa(hum, msg1, 10); // Converting humidity to an array of chars itoa(tem, msg0, 10); // Converting the temperature to an array of chars strcat(msg0, msg1); // Adding/joining the two arrays vw_send((uint8_t *)msg0, strlen(msg0)); // Sending the msg vw_wait_tx(); // Wait for tx to finish digitalWrite(txPowerPin, LOW); delay(5000); // Wait five seconds and it again }

把湿度和温度在一个发送声明中,我加入他们一起因为这是单向沟通。首先,数据读入变量为整数,那么整数转换为一个字符数组,最后它们连接在一起。在接收端,数据将被分成单个字符。通过这样做,我将自己限制在2位度。如果传感器与小于10的环境oC,我将得到一些垃圾字符显示。例如,如果温度是20oC和湿度是45%,它发送2045,这很好。如果温度是9oC和湿度是78%,它将发送978 x,其中x表示随机字符。我挑战读者改变软件发送正确的数据,当温度小于10oC。

接收机软件:

/ / # Include <VirtualWire包括所需的库。h > # include <LiquidCrystal。h > / /定义液晶连接RS 9 # define E 10 # # define定义D4 5 # define D5 6 # define D6 7 # define D7 8 LiquidCrystal液晶(RS, E, D4、D5 D6, D7);/ /“画”的程度标志字节degreesymbol [8] = {B01100、B10010 B10010, B01100, B00000, B00000, B00000, B00000};/ /变量int tem = 0;int我;/ /设置函数-运行一次无效的设置(){lcd.begin(16日2);/ /定义LCD液晶。degreesymbol createChar(1日);/ /创建符号的地方1 Serial.begin程度(9600);/ /用于调试目的vw_setup (4800); // VirtualWire communication speed vw_rx_start(); // Getting redy to receive vw_set_rx_pin(2); // VirtualWiore receive pin lcd.clear(); // Clear the LCD } // Loop function - runs forever void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; // Variable to hold the received data uint8_t buflen = VW_MAX_MESSAGE_LEN; // Variable to hold the length of the received data lcd.setCursor(0,0); lcd.print("Temp: "); if (vw_get_message(buf, &buflen)) // If data is received { for (i=0;i<2;i++) // Get the two first bytes { Serial.write(buf[i]); // Debugging purpose lcd.write(buf[i]); // Write the first bytes on the LCD } Serial.println(); // Debugging purpose lcd.write(1); // Write the degree symbol on the LCD lcd.print(" C"); lcd.setCursor(0,1); lcd.print("Hum: "); for (i=2;i<4;i++) // Get the two last bytes { Serial.write(buf[i]); // Debugging lcd.write(buf[i]); // Write the last bytes on the LCD } lcd.print("% RH"); } } 

一个有趣的方式使用LiquidCrystal库是使自定义字符。createChar,我做的程度的象征。用同样的方法,你可以使自己的符号。自定义符号或字符,你声明这是一个字节,“画”的像素。1和0。

在setup()函数用createChar您创建它。createChar接受两个参数:一个位置来保存的数量您创建的字符和字符的名称。我的情况是:液晶。degreesymbol createChar(1日);然后发送到象征与lcd.write-command液晶显示器。

结论

在这篇文章中,我使用了一个DHT11温度和湿度传感器。温度和湿度转换为一个字符数组,然后发送一个433 mhz发射机。在接收端,数组的字符被分成双并显示在液晶显示屏。获得学位的象征,我使用了LiquidCrystal图书馆createChar函数。

下载

图片和视频

发送器:

接收方:

自己尝试这个项目!BOM。

12个评论
  • 瑞奇你 2016年3月5日

    代码帮助我很多,不得不改变一下因为我使用lm35传感器。我只有一个问题,为您的代码你发送湿度和温度,我想发送临时,最大和最小temp. strcat我试着用你的方式,但它仅适用于如果我添加两个数组。因此我只能显示温度和最大或最小值有一个方法我可以加3使用strcat数组。或有另一种方式。你能让它简单,我一个新的编程。谢谢你!

    喜欢的。 回复
  • Luukas Palm-Leis 2016年的10月28日

    有可能使用一个标准的Arduino程序328芯片传输独立的接口,而不是使用MKII程序员?那么简单的把泡包从Arduino和交换在不同接收机的程序吗?

    喜欢的。 回复