Bezdrátový teploměr využívající 433 MHz RF spojení pomocí Arduina

Vyzkoušejte Náš Nástroj Pro Odstranění Problémů





V tomto příspěvku budeme konstruovat bezdrátový teploměr založený na Arduinu, který dokáže monitorovat teplotu v místnosti a teplotu vnějšího prostředí. Data jsou přenášena a přijímána přes RF spojení 433 MHz.

Použití 433MHz RF modulu a snímače DHT11

Navrhovaný projekt využívá Arduino jako mozek a srdce jako Vysílací / přijímací modul 433 MHz .



Projekt je rozdělen na dva samostatné okruhy, jeden s přijímačem 433 MHz, LCD displejem a čidlem DHT11, které budou umístěny uvnitř místnosti a také měří pokojovou teplotu .

Další obvod má 433MHz vysílač, Senzor DHT11 pro měření venkovní teploty okolí. Oba okruhy mají po jednom arduinu.



Okruh umístěný uvnitř místnosti zobrazí hodnoty vnitřní a vnější teploty na LCD.

Nyní se podívejme na 433 MHz modul vysílače / přijímače.

Vysílací / přijímací modul 433 MHz.

Vysílací a přijímací moduly jsou zobrazeny výše, je schopen jednostranné komunikace (jedním způsobem). Přijímač má 4 piny Vcc, GND a DATA piny. Existují dva kolíky DATA, jsou stejné a můžeme výstup dat z jednoho ze dvou kolíků.

Vysílač je mnohem jednodušší, má pouze vstupní kolíky Vcc, GND a DATA. K oběma modulům musíme připojit anténu, která je popsána na konci článku, aniž by mezi nimi byla navázána anténní komunikace za několik palců.

Nyní se podívejme, jak tyto moduly komunikují.

Nyní předpokládejme, že na vstupní datový kolík vysílače aplikujeme hodinový pulz 100 Hz. Přijímač obdrží přesnou repliku signálu na datovém kolíku přijímače.

To je jednoduché, že? Jo ... ale tento modul pracuje na AM a je citlivý na hluk. Z pozorování autora, pokud datový kolík vysílače zůstal bez signálu po dobu delší než 250 milisekund, produkční datový kolík přijímače vytváří náhodné signály.

Je tedy vhodný pouze pro nekritické datové přenosy. Tento projekt však s tímto modulem funguje velmi dobře.

Pojďme nyní ke schématům.

PŘIJÍMAČ:


připojení Arduino k LCD displeji. 10K potenciometr

Výše uvedený obvod je připojení Arduino k LCD displeji. K nastavení kontrastu LCD displeje je k dispozici 10K potenciometr.

Bezdrátový teploměr využívající 433 MHz RF Link a Arduino

Výše uvedený je obvod přijímače. K tomuto arduinu by měl být připojen LCD displej.

Před sestavením kódu si prosím stáhněte následující soubory knihovny

Radio Head: github.com/PaulStoffregen/RadioHead

Knihovna senzorů DHT: https://arduino-info.wikispaces.com/file/detail/DHT-lib.zip

Program pro přijímač:

//--------Program Developed by R.Girish-----//
#include
#include
#include
#include
#define DHTxxPIN A0
LiquidCrystal lcd(12,11,5,4,3,2)
RH_ASK driver(2000, 7, 9, 10)
int ack = 0
dht DHT
void setup()
{
Serial.begin(9600)
lcd.begin(16,2)
if (!driver.init())
Serial.println('init failed')
}
void loop()
{
ack = 0
int chk = DHT.read11(DHTxxPIN)
switch (chk)
{
case DHTLIB_ERROR_CONNECT:
ack = 1
lcd.setCursor(0,0)
lcd.print('INSIDE:')
lcd.print('NO DATA')
delay(1000)
break
}
if(ack == 0)
{
lcd.setCursor(0,0)
lcd.print('INSIDE:')
lcd.print(DHT.temperature)
lcd.print(' C')
delay(2000)
}
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN]
uint8_t buflen = sizeof(buf)
if (driver.recv(buf, &buflen))
{
int i
String str = ''
for(i = 0 i {
str += (char)buf[i]
}
lcd.setCursor(0,1)
lcd.print('OUTSIDE:')
lcd.print(str)
Serial.println(str)
delay(2000)
}
}
//--------Program Developed by R.Girish-----//

Vysílač:

Bezdrátový vysílač teploměru

Výše uvedené je schéma vysílače, které je poměrně jednoduché jako přijímač. Zde používáme další arduino desku. Čidlo DHT11 snímá venkovní teplotu okolí a odesílá zpět do modulu přijímače.

Vzdálenost mezi vysílačem a přijímačem by neměla být větší než 10 metrů. Pokud mezi nimi budou nějaké překážky, může se snížit dosah přenosu.

Program pro vysílač:

//------Program Developed by R.Girish----//
#include
#include
#define DHTxxPIN A0
#include
int ack = 0
RH_ASK driver(2000, 9, 2, 10)
dht DHT
void setup()
{
Serial.begin(9600)
if (!driver.init())
Serial.println('init failed')
}
void loop()
{
ack = 0
int chk = DHT.read11(DHTxxPIN)
switch (chk)
{
case DHTLIB_ERROR_CONNECT:
ack = 1
const char *temp = 'NO DATA'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
break
}
if(ack == 0)
{
if(DHT.temperature == 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()
}
if(DHT.temperature == 18)
{
const char *temp = '18.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 19)
{
const char *temp = '19.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 20)
{
const char *temp = '20.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 21)
{
const char *temp = '21.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 22)
{
const char *temp = '22.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 23)
{
const char *temp = '23.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 24)
{
const char *temp = '24.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 25)
{
const char *temp = '25.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 26)
{
const char *temp = '26.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 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()
}
if(DHT.temperature == 31)
{
const char *temp = '31.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 32)
{
const char *temp = '32.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 33)
{
const char *temp = '33.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 34)
{
const char *temp = '34.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 35)
{
const char *temp = '35.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 36)
{
const char *temp = '36.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 37)
{
const char *temp = '37.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 38)
{
const char *temp = '38.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 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()
}
if(DHT.temperature == 44)
{
const char *temp = '44.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
delay(500)
if(DHT.temperature == 45)
{
const char *temp = '45.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 46)
{
const char *temp = '46.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 47)
{
const char *temp = '47.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 48)
{
const char *temp = '48.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 49)
{
const char *temp = '49.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
if(DHT.temperature == 50)
{
const char *temp = '50.00 C'
driver.send((uint8_t *)temp, strlen(temp))
driver.waitPacketSent()
}
delay(500)
}
}
//------Program Developed by R.Girish----//

Konstrukce antény:

Pokud stavíte projekty pomocí tohoto 433 MHz moduly , pro dobrý dosah dodržujte níže uvedené konstrukční podrobnosti.

433 MHz RF anténa

Použijte jednožilový vodič, který by měl být dostatečně pevný, aby podporoval tuto strukturu. Pro pájení můžete také použít izolovaný měděný drát s odstraněnou izolací ve spodní části. Vytvořte dva z nich, jeden pro vysílač a druhý pro přijímač.

Autorův prototyp bezdrátového teploměru využívající Arduino a 433 MHz RF Link:

Prototyp bezdrátového teploměru využívající 433 MHz RF Link a Arduino


Předchozí: Antikorozní sondy pro regulátor hladiny vody Další: L293 Quad Half-H Driver IC Pinout, datový list, aplikační obvod